Merge branch '0.9.1-beta' of git@scm.dev.nokia.troll.no:creator/mainline into 0.9.1-beta

This commit is contained in:
mae
2008-12-05 12:13:01 +01:00
11 changed files with 154 additions and 76 deletions

View File

@@ -814,21 +814,26 @@
a pointer to some private data structure, you will see a list of children, a pointer to some private data structure, you will see a list of children,
signals and slots. signals and slots.
Similarily, instead of showing a bunch of pointers and ints, Similarly, instead of displaying many pointers and integers, Qt Creator's
a QHash or QMap will display its contents in an orderly fashion, debugger will display the contents of a QHash or QMap in an orderly manner.
a QFileInfo will expose e.g. access data, and the otherwise Also, the debugger will display access data for QFileInfo and provide
"opaque" QVariant gives access to the "real" contents. access to the "real" contents of QVariant.
The \gui{Locals and Watchers View} can be used to change the The \gui{Locals and Watchers} view can be used to change the contents of
contents of variables of simple data types like int or float variables of simple data types such as \c int or \c float when the program
while the program is stopped. To do so, click into the 'Value' is stopped. To do so, click on the \gui Value column, modify the value
column, modify the value there, and hit \key{Return}. with the inplace editor, and hit \key Enter (or \key Return).
\section2 Modules \section2 Modules
The \gui{Modules View} is hidden by default and only useful in By default, the \gui Modules view is hidden as it is only useful with the
experimental delayed debug information loading feature. You can turn this
feature on by selecting \gui{Fast Debugger Start}
The \gui Modules view is hidden by default and only useful in
connection with the experimental feature of delayed debug connection with the experimental feature of delayed debug
information loading. This feature is accessible by selecting information loading. This feature is accessible by selecting
\gui{Debug} and \gui{Fast Debugger Start}. When using the \gui{Debug} and \gui{Fast Debugger Start}. When using the
@@ -849,29 +854,28 @@
commands commands
\section1 A Walkthrough for the Debugger Frontend
\section1 A short walk through the debugger frontend In our \l{Writing a Simple Program with Qt Creator}{TextFinder} example, we
read a text file into a QString and then display it with a QTextEdit.
In our \l{Writing a Simple Program with Qt Creator}{TextFinder} Suppose, you would like to look at this QString, \c{line}, and see what
example, we read a text file into a QString and then display it with a data it actually stores. Follow the steps described below to place a
QTextEdit. Suppose, you would like to look at this QString, \c{line}, breakpoint and view the QString object's data.
and see what data it actually stores. Follow the steps described below
to place a break point and view the QString object's data.
\table \table
\row \row
\i \inlineimage qtcreator-setting-breakpoint1.png \i \inlineimage qtcreator-setting-breakpoint1.png
\i \bold{Setting a Breakpoint} \i \bold{Setting a Breakpoint}
First, we set a breakpoint on the line where we invoke First, we set a breakpoint on the line where we invoke
\l{QTextEdit::}{setPlainText()} by clicking between the line number and \l{QTextEdit::}{setPlainText()} by clicking between the line number and the
the window border. Then, select \gui{Start Debugging} from the window border. Then, select \gui{Start Debugging} from the \gui{Debug} menu
\gui{Debug} menu or press \key{F5}. or press \key{F5}.
\endtable \endtable
Breakpoints are visible in the \gui{Breakpoints} view, shown below, in Breakpoints are visible in the \gui{Breakpoints} view, shown below, in
\gui{Debug} mode. If you wish to remove a breakpoint, simply right \gui{Debug} mode. If you wish to remove a breakpoint, simply right-click on
click on it and select \gui{Delete breakpoint} from the context menu. it and select \gui{Delete breakpoint} from the context menu.
\image qtcreator-setting-breakpoint2.png \image qtcreator-setting-breakpoint2.png
@@ -880,10 +884,10 @@
\image qtcreator-watcher.png \image qtcreator-watcher.png
Suppose we modify our \c{on_findButton_clicked()} function to move back Suppose we modify our \c{on_findButton_clicked()} function to move back to
to the start of the document and continue searching once the cursor the start of the document and continue searching once the cursor hits the
hits the end of the document. Adding this functionality can be done end of the document. Adding this functionality can be done with the code
with the code snippet below: snippet below:
\code \code
void TextFinder::on_findButton_clicked() void TextFinder::on_findButton_clicked()
@@ -915,9 +919,9 @@
} }
\endcode \endcode
However, if you compile and run this code, the application will not However, if you compile and run this code, the application will not work
work correctly due to a logic error. To locate this logic error, you correctly due to a logic error. To locate this logic error, you can step
can step through the code using the following buttons: through the code using the following buttons:
\image qtcreator-debugging-buttons.png \image qtcreator-debugging-buttons.png
*/ */
@@ -931,20 +935,20 @@
\title Tips and Tricks \title Tips and Tricks
\bold{Quick mode switch} \bold{Quickly Switching between Modes}
You can quickly switch between modes by pressing \key{Ctrl+1}, You can quickly switch between modes by pressing \key{Ctrl+1},
\key{Ctrl+2}, etc. \key{Ctrl+2}, and so on.
\bold{Other keyboard shortcuts} \bold{Keyboard Shortcuts}
There are a lot of other \l{keyboard-shortcuts}{keyboard shortcuts}. Qt Creator provides a lot of useful keyboard shortcuts. A complete list can
be found \l{Keyboard Shortcuts}{here}.
\bold{Command line} \bold{Running Qt Creator from the Command Line}
You can start Qt Creator from a command prompt with an already You can start Qt Creator from a command prompt with an existing session or
existing session or \c{.pro} file by giving the name as argument on the \c{.pro} file by giving the name as argument on the command line.
command line.
\bold{Sidebar} \bold{Sidebar}

View File

@@ -33,26 +33,65 @@
#include "filenamevalidatinglineedit.h" #include "filenamevalidatinglineedit.h"
#include <QtCore/QRegExp>
#include <QtCore/QDebug>
namespace Core { namespace Core {
namespace Utils { namespace Utils {
FileNameValidatingLineEdit::FileNameValidatingLineEdit(QWidget *parent) :
BaseValidatingLineEdit(parent)
{
}
/* Validate a file base name, check for forbidden characters/strings. */
static const char *notAllowedChars = "/?:&\\*\"|#%<> ";
static const char *notAllowedSubStrings[] = {".."};
// Naming a file like a device name will break on Windows, even if it is // Naming a file like a device name will break on Windows, even if it is
// "com1.txt". Since we are cross-platform, we generally disallow such file // "com1.txt". Since we are cross-platform, we generally disallow such file
// names. // names.
static const char *notAllowedStrings[] = {"CON", "AUX", "PRN", "COM1", "COM2", "LPT1", "LPT2" }; static const QRegExp &windowsDeviceNoSubDirPattern()
{
static const QRegExp rc(QLatin1String("CON|AUX|PRN|COM1|COM2|LPT1|LPT2|NUL"),
Qt::CaseInsensitive);
Q_ASSERT(rc.isValid());
return rc;
}
bool FileNameValidatingLineEdit::validateFileName(const QString &name, QString *errorMessage /* = 0*/) static const QRegExp &windowsDeviceSubDirPattern()
{
static const QRegExp rc(QLatin1String(".*[/\\\\]CON|.*[/\\\\]AUX|.*[/\\\\]PRN|.*[/\\\\]COM1|.*[/\\\\]COM2|.*[/\\\\]LPT1|.*[/\\\\]LPT2|.*[/\\\\]NUL"),
Qt::CaseInsensitive);
Q_ASSERT(rc.isValid());
return rc;
}
// ----------- FileNameValidatingLineEdit
FileNameValidatingLineEdit::FileNameValidatingLineEdit(QWidget *parent) :
BaseValidatingLineEdit(parent),
m_allowDirectories(false),
m_unused(0)
{
}
bool FileNameValidatingLineEdit::allowDirectories() const
{
return m_allowDirectories;
}
void FileNameValidatingLineEdit::setAllowDirectories(bool v)
{
m_allowDirectories = v;
}
/* Validate a file base name, check for forbidden characters/strings. */
#ifdef Q_OS_WIN
# define SLASHES "/\\"
#else
# define SLASHES "/"
#endif
static const char *notAllowedCharsSubDir = "?:&*\"|#%<> ";
static const char *notAllowedCharsNoSubDir = "?:&*\"|#%<> "SLASHES;
static const char *notAllowedSubStrings[] = {".."};
bool FileNameValidatingLineEdit::validateFileName(const QString &name,
bool allowDirectories,
QString *errorMessage /* = 0*/)
{ {
if (name.isEmpty()) { if (name.isEmpty()) {
if (errorMessage) if (errorMessage)
@@ -60,6 +99,7 @@ bool FileNameValidatingLineEdit::validateFileName(const QString &name, QString *
return false; return false;
} }
// Characters // Characters
const char *notAllowedChars = allowDirectories ? notAllowedCharsSubDir : notAllowedCharsNoSubDir;
for (const char *c = notAllowedChars; *c; c++) for (const char *c = notAllowedChars; *c; c++)
if (name.contains(QLatin1Char(*c))) { if (name.contains(QLatin1Char(*c))) {
if (errorMessage) if (errorMessage)
@@ -76,22 +116,22 @@ bool FileNameValidatingLineEdit::validateFileName(const QString &name, QString *
return false; return false;
} }
} }
// Strings // Windows devices
const int notAllowedStringCount = sizeof(notAllowedStrings)/sizeof(const char *); bool matchesWinDevice = windowsDeviceNoSubDirPattern().exactMatch(name);
for (int s = 0; s < notAllowedStringCount; s++) { if (!matchesWinDevice && allowDirectories)
const QLatin1String notAllowedString(notAllowedStrings[s]); matchesWinDevice = windowsDeviceSubDirPattern().exactMatch(name);
if (name == notAllowedString) { if (matchesWinDevice) {
if (errorMessage) if (errorMessage)
*errorMessage = tr("The name must not be '%1'.").arg(QString(notAllowedString)); *errorMessage = tr("The name must not match that of a MS Windows device. (%1).").
return false; arg(windowsDeviceNoSubDirPattern().pattern().replace(QLatin1Char('|'), QLatin1Char(',')));
} return false;
} }
return true; return true;
} }
bool FileNameValidatingLineEdit::validate(const QString &value, QString *errorMessage) const bool FileNameValidatingLineEdit::validate(const QString &value, QString *errorMessage) const
{ {
return validateFileName(value, errorMessage); return validateFileName(value, m_allowDirectories, errorMessage);
} }
} // namespace Utils } // namespace Utils

View File

@@ -43,14 +43,23 @@ class QWORKBENCH_UTILS_EXPORT FileNameValidatingLineEdit : public BaseValidating
{ {
Q_OBJECT Q_OBJECT
Q_DISABLE_COPY(FileNameValidatingLineEdit) Q_DISABLE_COPY(FileNameValidatingLineEdit)
Q_PROPERTY(bool allowDirectories READ allowDirectories WRITE setAllowDirectories)
public: public:
explicit FileNameValidatingLineEdit(QWidget *parent = 0); explicit FileNameValidatingLineEdit(QWidget *parent = 0);
static bool validateFileName(const QString &name, QString *errorMessage /* = 0*/); static bool validateFileName(const QString &name,
bool allowDirectories = false,
QString *errorMessage = 0);
bool allowDirectories() const;
void setAllowDirectories(bool v);
protected: protected:
virtual bool validate(const QString &value, QString *errorMessage) const; virtual bool validate(const QString &value, QString *errorMessage) const;
private:
bool m_allowDirectories;
void *m_unused;
}; };
} // namespace Utils } // namespace Utils

View File

@@ -123,7 +123,7 @@ void FileWizardPage::slotActivated()
bool FileWizardPage::validateBaseName(const QString &name, QString *errorMessage /* = 0*/) bool FileWizardPage::validateBaseName(const QString &name, QString *errorMessage /* = 0*/)
{ {
return FileNameValidatingLineEdit::validateFileName(name, errorMessage); return FileNameValidatingLineEdit::validateFileName(name, false, errorMessage);
} }
} // namespace Utils } // namespace Utils

View File

@@ -346,6 +346,21 @@ void NewClassWidget::setFormExtension(const QString &e)
m_d->m_formExtension = fixSuffix(e); m_d->m_formExtension = fixSuffix(e);
} }
bool NewClassWidget::allowDirectories() const
{
return m_d->m_ui.headerFileLineEdit->allowDirectories();
}
void NewClassWidget::setAllowDirectories(bool v)
{
// We keep all in sync
if (allowDirectories() != v) {
m_d->m_ui.sourceFileLineEdit->setAllowDirectories(v);
m_d->m_ui.headerFileLineEdit->setAllowDirectories(v);
m_d->m_ui.formFileLineEdit->setAllowDirectories(v);
}
}
void NewClassWidget::slotValidChanged() void NewClassWidget::slotValidChanged()
{ {
const bool newValid = isValid(); const bool newValid = isValid();

View File

@@ -73,6 +73,7 @@ class QWORKBENCH_UTILS_EXPORT NewClassWidget : public QWidget
Q_PROPERTY(QString formExtension READ formExtension WRITE setFormExtension DESIGNABLE true) Q_PROPERTY(QString formExtension READ formExtension WRITE setFormExtension DESIGNABLE true)
Q_PROPERTY(bool formInputCheckable READ formInputCheckable WRITE setFormInputCheckable DESIGNABLE true) Q_PROPERTY(bool formInputCheckable READ formInputCheckable WRITE setFormInputCheckable DESIGNABLE true)
Q_PROPERTY(bool formInputChecked READ formInputChecked WRITE setFormInputChecked DESIGNABLE true) Q_PROPERTY(bool formInputChecked READ formInputChecked WRITE setFormInputChecked DESIGNABLE true)
Q_PROPERTY(bool allowDirectories READ allowDirectories WRITE setAllowDirectories)
// Utility "USER" property for wizards containing file names. // Utility "USER" property for wizards containing file names.
Q_PROPERTY(QStringList files READ files DESIGNABLE false USER true) Q_PROPERTY(QStringList files READ files DESIGNABLE false USER true)
public: public:
@@ -97,7 +98,7 @@ public:
QString sourceExtension() const; QString sourceExtension() const;
QString headerExtension() const; QString headerExtension() const;
QString formExtension() const; QString formExtension() const;
bool allowDirectories() const;
bool isValid(QString *error = 0) const; bool isValid(QString *error = 0) const;
@@ -125,6 +126,7 @@ public slots:
void setSourceExtension(const QString &e); void setSourceExtension(const QString &e);
void setHeaderExtension(const QString &e); void setHeaderExtension(const QString &e);
void setFormExtension(const QString &e); void setFormExtension(const QString &e);
void setAllowDirectories(bool v);
/* Suggest a class name from the base class by stripping the leading 'Q' /* Suggest a class name from the base class by stripping the leading 'Q'
* character. This will happen automagically if the base class combo * character. This will happen automagically if the base class combo

View File

@@ -45,7 +45,7 @@ ProjectNameValidatingLineEdit::ProjectNameValidatingLineEdit(QWidget *parent)
bool ProjectNameValidatingLineEdit::validateProjectName(const QString &name, QString *errorMessage /* = 0*/) bool ProjectNameValidatingLineEdit::validateProjectName(const QString &name, QString *errorMessage /* = 0*/)
{ {
// Validation is file name + checking for dots // Validation is file name + checking for dots
if (!FileNameValidatingLineEdit::validateFileName(name, errorMessage)) if (!FileNameValidatingLineEdit::validateFileName(name, false, errorMessage))
return false; return false;
// We don't want dots in the directory name for some legacy Windows // We don't want dots in the directory name for some legacy Windows

View File

@@ -73,6 +73,7 @@ ClassNamePage::ClassNamePage(const QString &sourceSuffix,
m_newClassWidget->setBaseClassEditable(true); m_newClassWidget->setBaseClassEditable(true);
m_newClassWidget->setFormInputVisible(false); m_newClassWidget->setFormInputVisible(false);
m_newClassWidget->setNamespacesEnabled(true); m_newClassWidget->setNamespacesEnabled(true);
m_newClassWidget->setAllowDirectories(true);
connect(m_newClassWidget, SIGNAL(validChanged()), connect(m_newClassWidget, SIGNAL(validChanged()),
this, SLOT(slotValidChanged())); this, SLOT(slotValidChanged()));

View File

@@ -40,13 +40,13 @@ using namespace CPlusPlus;
using namespace CppTools::Internal; using namespace CppTools::Internal;
SearchSymbols::SearchSymbols(): SearchSymbols::SearchSymbols():
symbolsToSearchFor(ClassesMethodsFunctionsAndEnums) symbolsToSearchFor(Classes | Functions | Enums)
{ {
} }
void SearchSymbols::setSymbolsToSearchFor(SymbolType type) void SearchSymbols::setSymbolsToSearchFor(SymbolTypes types)
{ {
symbolsToSearchFor = type; symbolsToSearchFor = types;
} }
QList<ModelItemInfo> SearchSymbols::operator()(Document::Ptr doc, const QString &scope) QList<ModelItemInfo> SearchSymbols::operator()(Document::Ptr doc, const QString &scope)
@@ -69,7 +69,7 @@ QString SearchSymbols::switchScope(const QString &scope)
bool SearchSymbols::visit(Enum *symbol) bool SearchSymbols::visit(Enum *symbol)
{ {
if (symbolsToSearchFor != ClassesMethodsFunctionsAndEnums) if (!(symbolsToSearchFor & Enums))
return false; return false;
QString name = symbolName(symbol); QString name = symbolName(symbol);
@@ -89,7 +89,7 @@ bool SearchSymbols::visit(Enum *symbol)
bool SearchSymbols::visit(Function *symbol) bool SearchSymbols::visit(Function *symbol)
{ {
if (symbolsToSearchFor != ClassesMethodsFunctionsAndEnums) if (!(symbolsToSearchFor & Functions))
return false; return false;
QString name = symbolName(symbol); QString name = symbolName(symbol);
@@ -131,6 +131,9 @@ bool SearchSymbols::visit(Declaration *symbol)
bool SearchSymbols::visit(Class *symbol) bool SearchSymbols::visit(Class *symbol)
{ {
if (!(symbolsToSearchFor & Classes))
return false;
QString name = symbolName(symbol); QString name = symbolName(symbol);
QString previousScope = switchScope(name); QString previousScope = switchScope(name);
QIcon icon = icons.iconForSymbol(symbol); QIcon icon = icons.iconForSymbol(symbol);

View File

@@ -80,15 +80,16 @@ class SearchSymbols: public std::unary_function<CPlusPlus::Document::Ptr, QList<
protected CPlusPlus::SymbolVisitor protected CPlusPlus::SymbolVisitor
{ {
public: public:
// TODO: Probably should use QFlags
enum SymbolType { enum SymbolType {
Classes, Classes = 0x1,
ClassesMethodsFunctionsAndEnums Functions = 0x2,
Enums = 0x4
}; };
Q_DECLARE_FLAGS(SymbolTypes, SymbolType)
SearchSymbols(); SearchSymbols();
void setSymbolsToSearchFor(SymbolType type); void setSymbolsToSearchFor(SymbolTypes types);
QList<ModelItemInfo> operator()(CPlusPlus::Document::Ptr doc) QList<ModelItemInfo> operator()(CPlusPlus::Document::Ptr doc)
{ return operator()(doc, QString()); } { return operator()(doc, QString()); }
@@ -117,9 +118,11 @@ private:
CPlusPlus::Overview overview; CPlusPlus::Overview overview;
CPlusPlus::Icons icons; CPlusPlus::Icons icons;
QList<ModelItemInfo> items; QList<ModelItemInfo> items;
SymbolType symbolsToSearchFor; SymbolTypes symbolsToSearchFor;
}; };
Q_DECLARE_OPERATORS_FOR_FLAGS(SearchSymbols::SymbolTypes)
} // namespace Internal } // namespace Internal
} // namespace CppTools } // namespace CppTools

View File

@@ -63,6 +63,7 @@ FormClassWizardPage::FormClassWizardPage(QWidget * parent) :
m_ui->newClassWidget->setBaseClassInputVisible(false); m_ui->newClassWidget->setBaseClassInputVisible(false);
m_ui->newClassWidget->setNamespacesEnabled(true); m_ui->newClassWidget->setNamespacesEnabled(true);
m_ui->newClassWidget->setAllowDirectories(true);
connect(m_ui->newClassWidget, SIGNAL(validChanged()), this, SLOT(slotValidChanged())); connect(m_ui->newClassWidget, SIGNAL(validChanged()), this, SLOT(slotValidChanged()));