Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline

This commit is contained in:
Jarek Kobus
2008-12-11 13:49:12 +01:00
262 changed files with 4081 additions and 2621 deletions

View File

@@ -1674,7 +1674,10 @@ static void qDumpQObjectSignal(QDumper &d)
d.beginHash(); d.beginHash();
P(d, "name", "[" << i << "] slot"); P(d, "name", "[" << i << "] slot");
P(d, "type", ""); P(d, "type", "");
P(d, "value", conn.receiver->metaObject()->method(conn.method).signature()); if (conn.receiver)
P(d, "value", conn.receiver->metaObject()->method(conn.method).signature());
else
P(d, "value", "<invalid receiver>");
P(d, "numchild", "0"); P(d, "numchild", "0");
d.endHash(); d.endHash();
d.beginHash(); d.beginHash();
@@ -1861,17 +1864,25 @@ static void qDumpQSet(QDumper &d)
n = 100; n = 100;
d << ",children=["; d << ",children=[";
int i = 0; int i = 0;
for (int bucket = 0; bucket != hd->numBuckets; ++bucket) { for (int bucket = 0; bucket != hd->numBuckets && i <= 10000; ++bucket) {
for (node = hd->buckets[bucket]; node->next; node = node->next) { for (node = hd->buckets[bucket]; node->next; node = node->next) {
d.beginHash(); d.beginHash();
P(d, "name", "[" << i << "]"); P(d, "name", "[" << i << "]");
P(d, "type", d.innertype); P(d, "type", d.innertype);
P(d, "exp", "(('QHashNode<" << d.innertype P(d, "exp", "(('"NS"QHashNode<" << d.innertype
<< ",QHashDummyValue>'*)" << ","NS"QHashDummyValue>'*)"
<< static_cast<const void*>(node) << ")->key" << static_cast<const void*>(node) << ")->key"
); );
d.endHash(); d.endHash();
++i; ++i;
if (i > 10000) {
d.beginHash();
P(d, "name", "Warning:");
P(d, "value", "<incomplete>");
P(d, "type", "");
d.endHash();
break;
}
} }
} }
d << "]"; d << "]";

Binary file not shown.

View File

@@ -23,6 +23,8 @@
\o \inlineimage qtcreator.png \o \inlineimage qtcreator.png
\o Qt Creator includes a wide range of useful features. Among them are: \o Qt Creator includes a wide range of useful features. Among them are:
\list 1 \list 1
\o \bold{Smart Code Editor}: The code editor provides syntax
highlighting as well as code completion.
\o \bold{Qt4 Project Generating Wizard}: This wizard allows the user \o \bold{Qt4 Project Generating Wizard}: This wizard allows the user
to generate a project for a console application, a GUI application, to generate a project for a console application, a GUI application,
or a C++ library. or a C++ library.
@@ -48,7 +50,7 @@
\o \l{Creating a Project in Qt Creator} \o \l{Creating a Project in Qt Creator}
\o \l{Build Settings} \o \l{Build Settings}
\o \l{Writing a Simple Program with Qt Creator} \o \l{Writing a Simple Program with Qt Creator}
\o \l{Quick Navigation} \o \l{Navigating Quickly Around Your Code}
\o \l{Debugging with Qt Creator} \o \l{Debugging with Qt Creator}
\o \l{Tips and Tricks} \o \l{Tips and Tricks}
\o \l{Glossary} \o \l{Glossary}
@@ -64,86 +66,85 @@
\title A Quick Tour Around Qt Creator \title A Quick Tour Around Qt Creator
The labeled screenshot below shows some of the components of Qt Creator, The labeled screenshot below shows some of the components of Qt Creator, in
in \gui Edit mode. \gui Edit mode.
\image qtcreator-breakdown.png \image qtcreator-breakdown.png
\seection1 The Mode Selectors \section1 The Mode Selectors
When working in Qt Creator, you can be in one of five modes: \bold Project, When working in Qt Creator, you can be in one of six modes: \bold Welcome,
\bold Edit, \bold Debug, \bold Help, and \bold Output. \bold Edit, \bold Debug, \bold Projects, \bold Help, and \bold Output.
Mode selectors allow you to quickly switch between tasks: Editing, Mode selectors allow you to quickly switch between tasks: Editing, browsing
browsing the Qt manual, setting up the build environment, etc. You can the Qt Creator manual, setting up the build environment, etc. You can
activate a mode by either clicking on its mode selector, or using the activate a mode by either clicking on its mode selector, or using the
\l{keyboard-shortcuts}{corresponding shortcut}. Certain actions also \l{keyboard-shortcuts}{corresponding shortcut}. Certain actions also
trigger a mode change, e.g., \gui{Debug}/\gui{Start Debugging} will switch trigger a mode change, e.g., \gui{Debug}/\gui{Start Debugging} will switch
to the \gui Debug mode. to the \gui Debug mode.
\list \list
\o \gui{Welcome Mode} - Displays a welcome screen allowing you to quickly \o \gui{Welcome Mode} - Displays a welcome screen allowing you to quickly
load recent sessions or individual projects. This is the first mode load recent sessions or individual projects. This is the mode you will see
displayed if Qt Creator is run without command line switches. if Qt Creator is run without command line switches.
\o \gui{Edit Mode} - You can edit both project and source files here. An \o \gui{Edit Mode} - Lets you edit both project and source files. A sidebar
optional sidebar on the left provides different views to navigate between on the left provides different views to navigate between files.
files.
\o \gui{Debug Mode} - Provides various ways to inspect the state of the \o \gui{Debug Mode} - Provides various ways to inspect the state of the
program while debugging. See \l{qtcreator-debugging}{Debugging With Qt program while debugging. See \l{qtcreator-debugging}{Debugging With Qt
Creator} for a hands-on description of the mode. Creator} for a hands-on description of how to use this mode.
\o \gui{Build & Run Mode} - Lets you configure how projects can be built \o \gui{Projects Mode} - Lets you configure how projects can be built and
and executed. Under the list of projects, there are tabs to configure the executed. Under the list of projects, there are tabs to configure the
build and run settings. build, run, and editor settings.
\o \gui{Help Mode} - Shows any documentation registered by Qt Assistant, \o \gui{Help Mode} - Shows any documentation registered by Qt Assistant,
such as the Qt library and Qt Creator documentation. such as the Qt library and Qt Creator documentation.
\o \gui{Output Mode} - Lets you examine various logs in detail, for example \o \gui{Output Mode} - Lets you examine various data in detail, for example
the task list, the compiler and application output. Some of these logs can build issues as well as compile and application output. This information
also be viewed in the output panes. is also available in the output panes.
\endlist \endlist
\section1 The Output Panes \section1 The Output Panes
The task pane in Qt Creator can display one out of four different panes: The task pane in Qt Creator can display one of four different panes:
Task List, Search Results, Application Output, and Compile Output. These \gui{Build Issues}, \gui{Search Results}, \gui{Application Output}, and
panes are available in all modes. \gui{Compile}. These panes are available in all modes.
\section2 Task List \section2 Build Issues
The Task List provides a list of important tasks such as error messages The {Build Issues} pane provides a list of issues, e.g., error messages or
that need to be fixed. It filters out irrelevant output from the compiler warnings that need to be fixed. It filters out irrelevant output from the
and collects them in the form of tasks. compiler and collects them in an organized way.
\image qtcreator-task-list.png \image qtcreator-build-issues.png
\section2 Search Results \section2 Search Results
The Search Results pane displays the results for global searches such as The \gui{Search Results} pane displays the results for global searches such
searching within a current document, files on disk, or all projects. as searching within a current document, files on disk, or all projects. In
In the screenshot below, we searched for all occurrences of \c{textfinder} the screenshot below, we searched for all occurrences of \c{textfinder}
within the "/TextFinder" folder. within the \c{"/TextFinder"} folder.
\image qtcreator-search-pane.png \image qtcreator-search-pane.png
\section2 Application Output \section2 Application Output
This pane displays the status of the program when it is executed, as The \gui{Application Output} pane displays the status of the program when
well as debug output, for example, output from qDebug(). it is executed and debug output, e.g., output from qDebug().
\image qtcreator-application-output.png \image qtcreator-application-output.png
\section2 Compile Output \section2 Compile
The Compile Output provides all the output from the compiler. In other The \gui{Compile} pane provides all the output from the compiler. In other
words, it is a more verbose version of the Task List. words, it is a more verbose version of information displayed in the
\gui{Build Issues}
\image qtcreator-compile-pane.png \image qtcreator-compile-pane.png
@@ -521,7 +522,7 @@
\page creator-navigation.html \page creator-navigation.html
\nextpage creator-debugging.html \nextpage creator-debugging.html
\title Quick Navigation \title Navigating Quickly Around Your Code
With Qt Creator, navigating to different locations in your project or on With Qt Creator, navigating to different locations in your project or on
your disk, such as files, classes and methods, is trivial using the input your disk, such as files, classes and methods, is trivial using the input
@@ -613,7 +614,7 @@
\page creator-debugging.html \page creator-debugging.html
\nextpage creator-tips.html \nextpage creator-tips.html
\title Debugging With Qt Creator \title Debugging with Qt Creator
\table \table
\row \row
@@ -677,9 +678,9 @@
\list \list
\o At a particular line you want the program to stop -- click on the \o At a particular line you want the program to stop -- click on the
left margin or press \key F9 (\key F8 for Mac Os X). left margin or press \key F9 (\key F8 for Mac OS X).
\o At the name of a function that you want the program to stop -- enter \o At a function that you want the program to stop -- enter the
the function's name in \gui{Set Breakpoint at Function...} under the function's name in \gui{Set Breakpoint at Function...} under the
\gui Debug menu. \gui Debug menu.
\endlist \endlist
@@ -744,7 +745,7 @@
When the program being debugged is stopped, Qt Creator displays the nested When the program being debugged is stopped, Qt Creator displays the nested
function calls leading to the current position as a \e call stack trace. function calls leading to the current position as a \e call stack trace.
This stack trace is built up from \e call stack frames, each representing a This stack trace is built up from \e{call stack frames}, each representing a
particular function. For each function, Qt Creator will try to retrieve the particular function. For each function, Qt Creator will try to retrieve the
file name and line number of the corresponding source files. This data is file name and line number of the corresponding source files. This data is
shown in the \gui Stack view. shown in the \gui Stack view.
@@ -765,11 +766,10 @@
\section2 Threads \section2 Threads
The \gui Thread view displays the state of the program being debugged one If a multi-threaded program is stopped, the \gui Thread view or the
thread at a time. If a multi-threaded program is stopped, the \gui Thread combobox named \gui Thread in the debugger's status bar can be used to
view or the combobox named \gui Thread in the debugger's status bar can switch from one thread to another. The \gui Stack view will adjust itself
be used to switch from one thread to another. The \gui Stack view will accordingly.
adjust itself accordingly.
\section2 Locals and Watchers \section2 Locals and Watchers
@@ -851,8 +851,7 @@
function, the latter the current state of the CPU registers. function, the latter the current state of the CPU registers.
Both views are mainly useful in connection with the low-level Both views are mainly useful in connection with the low-level
\gui{Step single instruction} and \gui{Step over single instruction} \gui{Step single instruction} and \gui{Step over single instruction}
commands commands.
\section1 A Walkthrough for the Debugger Frontend \section1 A Walkthrough for the Debugger Frontend
@@ -947,27 +946,27 @@
\bold{Running Qt Creator from the Command Line} \bold{Running Qt Creator from the Command Line}
You can start Qt Creator from a command prompt with an existing session or You can start Qt Creator from a command prompt with the name of an existing
\c{.pro} file by giving the name as argument on the command line. session or \c{.pro} file by giving the name as argument on the command
line.
\bold{Sidebar} \bold{Show and Hide the Sidebar}
You can hide/unhide the sidebar in the edit and debug mode You can show and hide the the sidebar in \gui Edit and \gui Debug mode by
by clicking on the corresponding icon on the left bottom. clicking on the corresponding icon, or by pressing \key{Alt+0}.
Keyboard shortcut is \key{Alt+0}.
\bold{Display signals and slots} \bold{Display Signals and Slots}
If you have an instance of a class derived from QObject and If you have an instance of a class that is derived from QObject, and you
want to find all other objects connected to one of its you would like to find all other objects connected to one of your object's
slots by Qt's signals-and-slots mechanism, enable slots using Qt's signals and slots mechanism -- you can enable
\gui{Debug} and \gui{Use Custom Display for Qt Objects}. \gui{Use Custom Display for Qt Objects} feature under the \gui Debug menu.
In the \gui{Locals and Watchers View}, expand the object's
entry and open the wanted slot in the "slots" subitem. The
objects connect to this slot are exposed as children of
this slot. The same works with signals.
\bold{Low level display} In the \gui{Locals and Watchers} view, expand the object's entry and open
the slot in the \e slots subitem. The objects connected to this slot are
exposed as children of the slot. This method works with signals too.
\bold{Display Low Level Data}
If the special debugging of Qt objects fails due to data If the special debugging of Qt objects fails due to data
corruption within the debugged objects, you can switch the corruption within the debugged objects, you can switch the
@@ -983,33 +982,38 @@
\title Glossary \title Glossary
\bold{System Qt} \table
\header
\o Term
\o Meaning
\target glossary-system-qt \row
The version of Qt installed on your system. \o System Qt \target glossary-system-qt
This is the one whose \c qmake command is found in the \c PATH. \o The version of Qt installed on your system. This is the Qt
version for the \c qmake command found in your \c PATH.
\bold{Default Qt} \row
\o Default Qt \target glossary-default-qt
\o The version of Qt configured in \gui{Tools -> Options -> Qt 4
-> Default Qt Version}. This is the Qt version used by your
new projects. It defaults to System Qt.
\target glossary-default-qt \row
The version of Qt configured in \gui{Tools \o Project Qt \target glossary-project-qt
-> Options -> Qt 4 -> Default Qt Version}. This is the version \o The version of Qt configured in \gui{Build&Run -> Build
used by new projects. It defaults to the System Qt. Settings -> Build Configurations}. This is the Qt version that
is actually used by a particular project. It defaults to
Default Qt.
\bold{Project Qt} \row
\o Shadow Build \target glossary-shadow-build
\target glossary-project-qt \o Shadow building means building a project in a separate
The version of Qt configured in \gui{Build&Run directory, the \e{build directory}. The build directory is
-> Build Settings -> Build Configurations}. This is the version different from the source directory. One of the benefits of
actually used by the project. It defaults to the Default Qt. shadow building is that it keeps your source directory clean.
Shadow building is the best practice if you need many build
\bold{Shadow Build} configurations for a single set of source.
\endtable
\target glossary-shadow-build
Shadow building means building the project not in the source directory,
but in a seperate \bold{build directory}. This has the benefit of keeping
the source directory clean. It is also considered "best practice" if
you need many build configurations for a single set of sources.
*/ */

View File

@@ -239,7 +239,7 @@ static void appendFileData(QIODevice *out, const QString &fileName)
static void appendFileData(QIODevice *out, QIODevice *in) static void appendFileData(QIODevice *out, QIODevice *in)
{ {
Q_ASSERT(!in->isSequential()); QTC_ASSERT(!in->isSequential(), return);
qint64 size = in->size(); qint64 size = in->size();
QByteArray &b = theBuffer(size); QByteArray &b = theBuffer(size);
rawRead(in, b.data(), size); rawRead(in, b.data(), size);

View File

@@ -45,7 +45,7 @@ QString CGI::encodeURL(const QString &rawText)
enc.reserve(utf.length()); // Make sure we at least have space for a normal US-ASCII URL enc.reserve(utf.length()); // Make sure we at least have space for a normal US-ASCII URL
QByteArray::const_iterator it = utf.constBegin(); QByteArray::const_iterator it = utf.constBegin();
while(it != utf.constEnd()) { while (it != utf.constEnd()) {
char ch = *it; char ch = *it;
if (('A' <= ch && ch <= 'Z') if (('A' <= ch && ch <= 'Z')
|| ('a' <= ch && ch <= 'z') || ('a' <= ch && ch <= 'z')
@@ -54,7 +54,7 @@ QString CGI::encodeURL(const QString &rawText)
else if (ch == ' ') else if (ch == ' ')
enc.append('+'); enc.append('+');
else { else {
switch(ch) { switch (ch) {
case '-': case '_': case '-': case '_':
case '(': case ')': case '(': case ')':
case '.': case '!': case '.': case '!':
@@ -80,15 +80,15 @@ QString CGI::decodeURL(const QString &urlText)
{ {
QByteArray dec; QByteArray dec;
QString::const_iterator it = urlText.constBegin(); QString::const_iterator it = urlText.constBegin();
while(it != urlText.constEnd()) { while (it != urlText.constEnd()) {
ushort ch = (*it).unicode(); ushort ch = (*it).unicode();
switch(ch) { switch (ch) {
case '%': case '%':
{ {
char c1 = char(0x00ff & (*(++it)).unicode()); char c1 = char(0x00ff & (*(++it)).unicode());
char c2 = char(0x00ff & (*(++it)).unicode()); char c2 = char(0x00ff & (*(++it)).unicode());
ushort v = 0; ushort v = 0;
if('A' <= c1 && c1 <= 'Z') if ('A' <= c1 && c1 <= 'Z')
v = c1 - 'A' + 10; v = c1 - 'A' + 10;
else if ('a' <= c1 && c1 <= 'z') else if ('a' <= c1 && c1 <= 'z')
v = c1 - 'a' + 10; v = c1 - 'a' + 10;
@@ -97,7 +97,7 @@ QString CGI::decodeURL(const QString &urlText)
else else
continue; // Malformed URL! continue; // Malformed URL!
v <<= 4; // c1 was MSB half v <<= 4; // c1 was MSB half
if('A' <= c2 && c2 <= 'Z') if ('A' <= c2 && c2 <= 'Z')
v |= c2 - 'A' + 10; v |= c2 - 'A' + 10;
else if ('a' <= c2 && c2 <= 'z') else if ('a' <= c2 && c2 <= 'z')
v |= c2 - 'a' + 10; v |= c2 - 'a' + 10;
@@ -123,7 +123,7 @@ QString CGI::decodeURL(const QString &urlText)
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------
inline const char *unicodeToHTML(ushort unicode_char) inline const char *unicodeToHTML(ushort unicode_char)
{ {
switch(unicode_char) { switch (unicode_char) {
// Latin ------------------------------- // Latin -------------------------------
case 0x0022: return "quot"; // (34 ) quotation mark = APL quote case 0x0022: return "quot"; // (34 ) quotation mark = APL quote
case 0x0026: return "amp"; // (38 ) ampersand case 0x0026: return "amp"; // (38 ) ampersand

View File

@@ -66,10 +66,8 @@ FileDataList splitDiffToFiles(const QByteArray &data)
// The algorithm works like this: // The algorithm works like this:
// On the first match we only get the filename of the first patch part // On the first match we only get the filename of the first patch part
// On the second match (if any) we get the diff content, and the name of the next file patch // On the second match (if any) we get the diff content, and the name of the next file patch
//
while (-1 != (splitIndex = splitExpr.indexIn(strData,splitIndex))) {
while(-1 != (splitIndex = splitExpr.indexIn(strData,splitIndex))) {
if (!filename.isEmpty()) { if (!filename.isEmpty()) {
QString content = strData.mid(previousSplit, splitIndex - previousSplit); QString content = strData.mid(previousSplit, splitIndex - previousSplit);
ret.append(FileData(filename, content.toLatin1())); ret.append(FileData(filename, content.toLatin1()));

View File

@@ -125,7 +125,7 @@ QString View::getComment()
QByteArray View::getContent() QByteArray View::getContent()
{ {
QByteArray newContent; QByteArray newContent;
for(int i = 0; i < m_ui.uiPatchList->count(); ++i) { for (int i = 0; i < m_ui.uiPatchList->count(); ++i) {
QListWidgetItem *item = m_ui.uiPatchList->item(i); QListWidgetItem *item = m_ui.uiPatchList->item(i);
if (item->checkState() != Qt::Unchecked) if (item->checkState() != Qt::Unchecked)
newContent += m_parts.at(i).content; newContent += m_parts.at(i).content;
@@ -159,7 +159,7 @@ int View::show(const QString &user, const QString &description, const QString &c
QByteArray content; QByteArray content;
m_parts = parts; m_parts = parts;
m_ui.uiPatchList->clear(); m_ui.uiPatchList->clear();
foreach(const FileData part, parts) { foreach (const FileData part, parts) {
QListWidgetItem *itm = new QListWidgetItem(part.filename, m_ui.uiPatchList); QListWidgetItem *itm = new QListWidgetItem(part.filename, m_ui.uiPatchList);
itm->setCheckState(Qt::Checked); itm->setCheckState(Qt::Checked);
itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); itm->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);

View File

@@ -511,6 +511,12 @@ Identifier *Control::findOrInsertIdentifier(const char *chars)
return findOrInsertIdentifier(chars, length); return findOrInsertIdentifier(chars, length);
} }
Control::IdentifierIterator Control::firstIdentifier() const
{ return d->identifiers.begin(); }
Control::IdentifierIterator Control::lastIdentifier() const
{ return d->identifiers.end(); }
StringLiteral *Control::findOrInsertStringLiteral(const char *chars, unsigned size) StringLiteral *Control::findOrInsertStringLiteral(const char *chars, unsigned size)
{ return d->stringLiterals.findOrInsertLiteral(chars, size); } { return d->stringLiterals.findOrInsertLiteral(chars, size); }

View File

@@ -151,6 +151,11 @@ public:
Identifier *findOrInsertIdentifier(const char *chars, unsigned size); Identifier *findOrInsertIdentifier(const char *chars, unsigned size);
Identifier *findOrInsertIdentifier(const char *chars); Identifier *findOrInsertIdentifier(const char *chars);
typedef const Identifier *const *IdentifierIterator;
IdentifierIterator firstIdentifier() const;
IdentifierIterator lastIdentifier() const;
StringLiteral *findOrInsertStringLiteral(const char *chars, unsigned size); StringLiteral *findOrInsertStringLiteral(const char *chars, unsigned size);
StringLiteral *findOrInsertStringLiteral(const char *chars); StringLiteral *findOrInsertStringLiteral(const char *chars);

View File

@@ -30,19 +30,22 @@
** version 1.2, included in the file GPL_EXCEPTION.txt in this package. ** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
** **
***************************************************************************/ ***************************************************************************/
#include "formresizer.h" #include "formresizer.h"
#include "sizehandlerect.h" #include "sizehandlerect.h"
#include "widgethostconstants.h" #include "widgethostconstants.h"
#include <utils/qtcassert.h>
#include <QtDesigner/QDesignerFormWindowInterface> #include <QtDesigner/QDesignerFormWindowInterface>
#include <QtGui/QResizeEvent> #include <QtGui/QResizeEvent>
#include <QtGui/QPalette> #include <QtGui/QPalette>
#include <QtGui/QLayout> #include <QtGui/QLayout>
#include <QtGui/QFrame> #include <QtGui/QFrame>
#include <QtGui/QResizeEvent> #include <QtGui/QResizeEvent>
#include <QtCore/QDebug>
enum { debugFormResizer=0 }; enum { debugFormResizer = 0 };
using namespace SharedTools::Internal; using namespace SharedTools::Internal;
@@ -140,7 +143,7 @@ void FormResizer::setFormWindow(QDesignerFormWindowInterface *fw)
if (debugFormResizer) if (debugFormResizer)
qDebug() << "FormResizer::setFormWindow " << fw; qDebug() << "FormResizer::setFormWindow " << fw;
QVBoxLayout *layout = qobject_cast<QVBoxLayout *>(m_frame->layout()); QVBoxLayout *layout = qobject_cast<QVBoxLayout *>(m_frame->layout());
Q_ASSERT(layout); QTC_ASSERT(layout, return);
if (layout->count()) if (layout->count())
delete layout->takeAt(0); delete layout->takeAt(0);
m_formWindow = fw; m_formWindow = fw;

View File

@@ -95,8 +95,10 @@ private:
QSortFilterProxyModel *proxyModel; QSortFilterProxyModel *proxyModel;
}; };
class TreeView : public QTreeView { class TreeView : public QTreeView
{
Q_OBJECT Q_OBJECT
public: public:
TreeView(QWidget* parent = 0) : QTreeView(parent) {} TreeView(QWidget* parent = 0) : QTreeView(parent) {}
void subclassKeyPressEvent(QKeyEvent* event) void subclassKeyPressEvent(QKeyEvent* event)
@@ -159,18 +161,18 @@ class BookmarkManager : public QObject
Q_OBJECT Q_OBJECT
public: public:
BookmarkManager(QHelpEngineCore* helpEngine); BookmarkManager(QHelpEngineCore *helpEngine);
~BookmarkManager(); ~BookmarkManager();
BookmarkModel* treeBookmarkModel(); BookmarkModel *treeBookmarkModel();
BookmarkModel* listBookmarkModel(); BookmarkModel *listBookmarkModel();
void saveBookmarks(); void saveBookmarks();
QStringList bookmarkFolders() const; QStringList bookmarkFolders() const;
QModelIndex addNewFolder(const QModelIndex& index); QModelIndex addNewFolder(const QModelIndex &index);
void removeBookmarkItem(QTreeView *treeView, const QModelIndex& index); void removeBookmarkItem(QTreeView *treeView, const QModelIndex& index);
void showBookmarkDialog(QWidget* parent, const QString &name, const QString &url); void showBookmarkDialog(QWidget *parent, const QString &name, const QString &url);
void addNewBookmark(const QModelIndex& index, const QString &name, const QString &url); void addNewBookmark(const QModelIndex &index, const QString &name, const QString &url);
void setupBookmarkModels(); void setupBookmarkModels();
private slots: private slots:

View File

@@ -409,7 +409,7 @@ QVariant HelpViewer::loadResource(int type, const QUrl &name)
void HelpViewer::openLinkInNewTab() void HelpViewer::openLinkInNewTab()
{ {
if(lastAnchor.isEmpty()) if (lastAnchor.isEmpty())
return; return;
parentWidget->setSourceInNewTab(QUrl(lastAnchor)); parentWidget->setSourceInNewTab(QUrl(lastAnchor));

View File

@@ -33,6 +33,8 @@
#include "indenter.h" #include "indenter.h"
#include <utils/qtcassert.h>
using namespace SharedTools::IndenterInternal; using namespace SharedTools::IndenterInternal;
// --- Constants // --- Constants
@@ -55,12 +57,12 @@ Constants::Constants() :
"|(?:public|protected|private|signals|Q_SIGNALS|default)(?:\\s+slots|\\s+Q_SLOTS)?\\s*" "|(?:public|protected|private|signals|Q_SIGNALS|default)(?:\\s+slots|\\s+Q_SLOTS)?\\s*"
")?:.*")) ")?:.*"))
{ {
m_literal.setMinimal( true ); m_literal.setMinimal(true);
m_inlineCComment.setMinimal( true ); m_inlineCComment.setMinimal(true);
Q_ASSERT(m_literal.isValid()); QTC_ASSERT(m_literal.isValid(), return);
Q_ASSERT(m_label.isValid()); QTC_ASSERT(m_label.isValid(), return);
Q_ASSERT(m_inlineCComment.isValid()); QTC_ASSERT(m_inlineCComment.isValid(), return);
Q_ASSERT(m_braceX.isValid()); QTC_ASSERT(m_braceX.isValid(), return);
Q_ASSERT(m_iflikeKeyword.isValid()); QTC_ASSERT(m_iflikeKeyword.isValid(), return);
Q_ASSERT(m_caseLabel.isValid()); QTC_ASSERT(m_caseLabel.isValid(), return);
} }

View File

@@ -174,7 +174,7 @@ int main(int argc, char **argv)
return 1; return 1;
} }
foreach(QString fileName, fileNames) foreach (const QString &fileName, fileNames)
if (const int rc = format(fileName)) if (const int rc = format(fileName))
return rc; return rc;

View File

@@ -33,6 +33,8 @@
#include "procommandmanager.h" #include "procommandmanager.h"
#include <utils/qtcassert.h>
using namespace Qt4ProjectManager::Internal; using namespace Qt4ProjectManager::Internal;
ProCommandGroup::ProCommandGroup(const QString &name) ProCommandGroup::ProCommandGroup(const QString &name)
@@ -76,7 +78,7 @@ ProCommandManager::~ProCommandManager()
void ProCommandManager::beginGroup(const QString &name) void ProCommandManager::beginGroup(const QString &name)
{ {
Q_ASSERT(!m_group); QTC_ASSERT(!m_group, return);
if (m_pos != m_groups.count()) { if (m_pos != m_groups.count()) {
int removecount = m_groups.count() - m_pos; int removecount = m_groups.count() - m_pos;
@@ -95,7 +97,7 @@ bool ProCommandManager::hasGroup() const
void ProCommandManager::endGroup() void ProCommandManager::endGroup()
{ {
Q_ASSERT(m_group); QTC_ASSERT(m_group, return);
m_groups.append(m_group); m_groups.append(m_group);
m_pos = m_groups.count(); m_pos = m_groups.count();
@@ -106,7 +108,7 @@ void ProCommandManager::endGroup()
bool ProCommandManager::command(ProCommand *cmd) bool ProCommandManager::command(ProCommand *cmd)
{ {
Q_ASSERT(m_group); QTC_ASSERT(m_group, return false);
if (cmd->redo()) { if (cmd->redo()) {
m_group->appendCommand(cmd); m_group->appendCommand(cmd);

View File

@@ -139,7 +139,7 @@ bool ProEditor::eventFilter(QObject *, QEvent *event)
if (event->type() == QEvent::ShortcutOverride) { if (event->type() == QEvent::ShortcutOverride) {
QKeyEvent *k = static_cast<QKeyEvent*>(event); QKeyEvent *k = static_cast<QKeyEvent*>(event);
if (k->modifiers() == Qt::ControlModifier) { if (k->modifiers() == Qt::ControlModifier) {
switch(k->key()) { switch (k->key()) {
case Qt::Key_X: case Qt::Key_X:
cut(); return true; cut(); return true;
case Qt::Key_C: case Qt::Key_C:
@@ -168,11 +168,8 @@ void ProEditor::updatePasteAction()
bool pasteEnabled = false; bool pasteEnabled = false;
const QMimeData *data = QApplication::clipboard()->mimeData(); const QMimeData *data = QApplication::clipboard()->mimeData();
if (data) { if (data && data->hasFormat(QLatin1String("application/x-problock")))
if (data->hasFormat(QLatin1String("application/x-problock"))) { pasteEnabled = true;
pasteEnabled = true;
}
}
m_pasteAction->setEnabled(pasteEnabled); m_pasteAction->setEnabled(pasteEnabled);
} }

View File

@@ -732,13 +732,10 @@ bool ProEditorModel::insertItem(ProItem *item, int row, const QModelIndex &paren
void ProEditorModel::markProFileModified(QModelIndex index) void ProEditorModel::markProFileModified(QModelIndex index)
{ {
while(index.isValid()) while (index.isValid()) {
{ if (proItem(index)->kind() == ProItem::BlockKind) {
if( proItem(index)->kind() == ProItem::BlockKind)
{
ProBlock * block = proBlock(index); ProBlock * block = proBlock(index);
if(block->blockKind() == ProBlock::ProFileKind) if (block->blockKind() == ProBlock::ProFileKind) {
{
ProFile * file = static_cast<ProFile *>(block); ProFile * file = static_cast<ProFile *>(block);
file->setModified(true); file->setModified(true);
return; return;
@@ -791,9 +788,9 @@ QString ProEditorModel::expressionToString(ProBlock *block, bool display) const
{ {
QString result; QString result;
QList<ProItem*> items = block->items(); QList<ProItem*> items = block->items();
for(int i=0; i<items.count(); ++i) { for (int i = 0; i < items.count(); ++i) {
ProItem *item = items.at(i); ProItem *item = items.at(i);
switch(item->kind()) { switch (item->kind()) {
case ProItem::FunctionKind: { case ProItem::FunctionKind: {
ProFunction *v = static_cast<ProFunction*>(item); ProFunction *v = static_cast<ProFunction*>(item);
result += v->text(); result += v->text();
@@ -808,14 +805,16 @@ QString ProEditorModel::expressionToString(ProBlock *block, bool display) const
} else { } else {
result += v->text(); result += v->text();
} }
break; } break;
}
case ProItem::OperatorKind: { case ProItem::OperatorKind: {
ProOperator *v = static_cast<ProOperator*>(item); ProOperator *v = static_cast<ProOperator*>(item);
if (v->operatorKind() == ProOperator::NotOperator) if (v->operatorKind() == ProOperator::NotOperator)
result += QLatin1Char('!'); result += QLatin1Char('!');
else else
result += QLatin1Char('|'); result += QLatin1Char('|');
break; } break;
}
case ProItem::ValueKind: case ProItem::ValueKind:
case ProItem::BlockKind: case ProItem::BlockKind:
break; // ### unhandled break; // ### unhandled
@@ -847,7 +846,7 @@ QList<ProItem *> ProEditorModel::stringToExpression(const QString &exp) const
bool c = false; bool c = false;
QString tmpstr; QString tmpstr;
for (int i=0; i<exp.length(); ++i) { for (int i = 0; i < exp.length(); ++i) {
QChar tmpchar = exp.at(i); QChar tmpchar = exp.at(i);
if (tmpchar == '(') ++p; if (tmpchar == '(') ++p;
else if (tmpchar == ')') --p; else if (tmpchar == ')') --p;

View File

@@ -35,6 +35,8 @@
#include "proparserutils.h" #include "proparserutils.h"
#include "proitems.h" #include "proitems.h"
#include <utils/qtcassert.h>
#include <QtCore/QByteArray> #include <QtCore/QByteArray>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QDir> #include <QtCore/QDir>
@@ -332,7 +334,7 @@ void ProFileEvaluator::Private::insertOperator(const char op)
updateItem(); updateItem();
ProOperator::OperatorKind opkind; ProOperator::OperatorKind opkind;
switch(op) { switch (op) {
case '!': case '!':
opkind = ProOperator::NotOperator; opkind = ProOperator::NotOperator;
break; break;
@@ -532,21 +534,21 @@ bool ProFileEvaluator::Private::visitEndProFile(ProFile * pro)
evaluateFile(mkspecDirectory + "/features/default_post.prf", &ok); evaluateFile(mkspecDirectory + "/features/default_post.prf", &ok);
QStringList processed; QStringList processed;
while(1) { while (1) {
bool finished = true; bool finished = true;
QStringList configs = values("CONFIG"); QStringList configs = values("CONFIG");
for(int i = configs.size()-1; i >= 0; --i) { for (int i = configs.size()-1; i >= 0; --i) {
const QString config = configs[i].toLower(); const QString config = configs[i].toLower();
if(!processed.contains(config)) { if (!processed.contains(config)) {
processed.append(config); processed.append(config);
evaluateFile(mkspecDirectory + "/features/" + config + ".prf", &ok); evaluateFile(mkspecDirectory + "/features/" + config + ".prf", &ok);
if(ok) { if (ok) {
finished = false; finished = false;
break; break;
} }
} }
} }
if(finished) if (finished)
break; break;
} }
} }
@@ -683,7 +685,7 @@ bool ProFileEvaluator::Private::visitProFunction(ProFunction *func)
QString text = func->text(); QString text = func->text();
int lparen = text.indexOf(QLatin1Char('(')); int lparen = text.indexOf(QLatin1Char('('));
int rparen = text.lastIndexOf(QLatin1Char(')')); int rparen = text.lastIndexOf(QLatin1Char(')'));
Q_ASSERT(lparen < rparen); QTC_ASSERT(lparen < rparen, return false);
QString arguments = text.mid(lparen + 1, rparen - lparen - 1); QString arguments = text.mid(lparen + 1, rparen - lparen - 1);
QString funcName = text.left(lparen); QString funcName = text.left(lparen);

View File

@@ -173,41 +173,41 @@ static QStringList split_arg_list(QString params)
const QChar *params_data = params.data(); const QChar *params_data = params.data();
const int params_len = params.length(); const int params_len = params.length();
int last = 0; int last = 0;
while(last < params_len && ((params_data+last)->unicode() == SPACE while (last < params_len && ((params_data+last)->unicode() == SPACE
/*|| (params_data+last)->unicode() == TAB*/)) /*|| (params_data+last)->unicode() == TAB*/))
++last; ++last;
for(int x = last, parens = 0; x <= params_len; x++) { for (int x = last, parens = 0; x <= params_len; x++) {
unicode = (params_data+x)->unicode(); unicode = (params_data+x)->unicode();
if(x == params_len) { if (x == params_len) {
while(x && (params_data+(x-1))->unicode() == SPACE) while (x && (params_data+(x-1))->unicode() == SPACE)
--x; --x;
QString mid(params_data+last, x-last); QString mid(params_data+last, x-last);
if(quote) { if (quote) {
if(mid[0] == quote && mid[(int)mid.length()-1] == quote) if (mid[0] == quote && mid[(int)mid.length()-1] == quote)
mid = mid.mid(1, mid.length()-2); mid = mid.mid(1, mid.length()-2);
quote = 0; quote = 0;
} }
args << mid; args << mid;
break; break;
} }
if(unicode == LPAREN) { if (unicode == LPAREN) {
--parens; --parens;
} else if(unicode == RPAREN) { } else if (unicode == RPAREN) {
++parens; ++parens;
} else if(quote && unicode == quote) { } else if (quote && unicode == quote) {
quote = 0; quote = 0;
} else if(!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) { } else if (!quote && (unicode == SINGLEQUOTE || unicode == DOUBLEQUOTE)) {
quote = unicode; quote = unicode;
} else if(!parens && !quote && unicode == COMMA) { } else if (!parens && !quote && unicode == COMMA) {
QString mid = params.mid(last, x - last).trimmed(); QString mid = params.mid(last, x - last).trimmed();
args << mid; args << mid;
last = x+1; last = x+1;
while(last < params_len && ((params_data+last)->unicode() == SPACE while (last < params_len && ((params_data+last)->unicode() == SPACE
/*|| (params_data+last)->unicode() == TAB*/)) /*|| (params_data+last)->unicode() == TAB*/))
++last; ++last;
} }
} }
for(int i = 0; i < args.count(); i++) for (int i = 0; i < args.count(); i++)
unquote(&args[i]); unquote(&args[i]);
return args; return args;
} }
@@ -227,22 +227,22 @@ static QStringList split_value_list(const QString &vals, bool do_semicolon=false
const QChar *vals_data = vals.data(); const QChar *vals_data = vals.data();
const int vals_len = vals.length(); const int vals_len = vals.length();
for(int x = 0, parens = 0; x < vals_len; x++) { for (int x = 0, parens = 0; x < vals_len; x++) {
QChar c = vals_data[x]; QChar c = vals_data[x];
if (x != vals_len-1 && c == BACKSLASH && if (x != vals_len-1 && c == BACKSLASH &&
vals_data[x+1].unicode() == '\'' || vals_data[x+1] == DOUBLEQUOTE) { vals_data[x+1].unicode() == '\'' || vals_data[x+1] == DOUBLEQUOTE) {
build += vals_data[x++]; // get that 'escape' build += vals_data[x++]; // get that 'escape'
} else if (!quote.isEmpty() && c == quote.top()) { } else if (!quote.isEmpty() && c == quote.top()) {
quote.pop(); quote.pop();
} else if(c == SINGLEQUOTE || c == DOUBLEQUOTE) { } else if (c == SINGLEQUOTE || c == DOUBLEQUOTE) {
quote.push(c); quote.push(c);
} else if(c == RPAREN) { } else if (c == RPAREN) {
--parens; --parens;
} else if(c == LPAREN) { } else if (c == LPAREN) {
++parens; ++parens;
} }
if(!parens && quote.isEmpty() && ((do_semicolon && c == SEMICOLON) || if (!parens && quote.isEmpty() && ((do_semicolon && c == SEMICOLON) ||
vals_data[x] == Option::field_sep)) { vals_data[x] == Option::field_sep)) {
ret << build; ret << build;
build.clear(); build.clear();
@@ -250,7 +250,7 @@ static QStringList split_value_list(const QString &vals, bool do_semicolon=false
build += vals_data[x]; build += vals_data[x];
} }
} }
if(!build.isEmpty()) if (!build.isEmpty())
ret << build; ret << build;
return ret; return ret;
} }
@@ -262,7 +262,7 @@ static QStringList qmake_mkspec_paths()
QByteArray qmakepath = qgetenv("QMAKEPATH"); QByteArray qmakepath = qgetenv("QMAKEPATH");
if (!qmakepath.isEmpty()) { if (!qmakepath.isEmpty()) {
const QStringList lst = splitPathList(QString::fromLocal8Bit(qmakepath)); const QStringList lst = splitPathList(QString::fromLocal8Bit(qmakepath));
for(QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it) for (QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it)
ret << ((*it) + concat); ret << ((*it) + concat);
} }
ret << QLibraryInfo::location(QLibraryInfo::DataPath) + concat; ret << QLibraryInfo::location(QLibraryInfo::DataPath) + concat;

View File

@@ -137,7 +137,7 @@ void ProWriter::writeBlock(ProBlock *block, const QString &indent)
if (block->blockKind() & ProBlock::VariableKind) { if (block->blockKind() & ProBlock::VariableKind) {
ProVariable *v = static_cast<ProVariable*>(block); ProVariable *v = static_cast<ProVariable*>(block);
m_out << v->variable(); m_out << v->variable();
switch(v->variableOperator()) { switch (v->variableOperator()) {
case ProVariable::AddOperator: case ProVariable::AddOperator:
m_out << QLatin1String(" += "); break; m_out << QLatin1String(" += "); break;
case ProVariable::RemoveOperator: case ProVariable::RemoveOperator:
@@ -165,12 +165,12 @@ void ProWriter::writeBlock(ProBlock *block, const QString &indent)
} }
QList<ProItem*> items = block->items(); QList<ProItem*> items = block->items();
for (int i=0; i<items.count(); ++i) { for (int i = 0; i < items.count(); ++i) {
m_writeState &= ~LastItem; m_writeState &= ~LastItem;
m_writeState &= ~FirstItem; m_writeState &= ~FirstItem;
if (i == 0) if (i == 0)
m_writeState |= FirstItem; m_writeState |= FirstItem;
if (i == (items.count()-1)) if (i == items.count() - 1)
m_writeState |= LastItem; m_writeState |= LastItem;
writeItem(items.at(i), newindent); writeItem(items.at(i), newindent);
} }

View File

@@ -104,7 +104,7 @@ QDomNode ProXmlParser::createItemNode(QDomDocument doc, ProItem *item) const
tag = doc.createElement(QLatin1String("block")); tag = doc.createElement(QLatin1String("block"));
} }
foreach(ProItem *child, block->items()) { foreach (ProItem *child, block->items()) {
QDomNode childNode = createItemNode(doc, child); QDomNode childNode = createItemNode(doc, child);
if (!childNode.isNull()) if (!childNode.isNull())
tag.appendChild(childNode); tag.appendChild(childNode);

View File

@@ -131,7 +131,7 @@ void ValueEditor::initialize()
connect(m_itemListWidget, SIGNAL(itemChanged(QListWidgetItem *)), connect(m_itemListWidget, SIGNAL(itemChanged(QListWidgetItem *)),
this, SLOT(updateItemChanges(QListWidgetItem *))); this, SLOT(updateItemChanges(QListWidgetItem *)));
foreach(ProVariableInfo *varinfo, m_infomanager->variables()) { foreach (ProVariableInfo *varinfo, m_infomanager->variables()) {
m_varComboBox->addItem(varinfo->name(), varinfo->id()); m_varComboBox->addItem(varinfo->name(), varinfo->id());
} }

View File

@@ -33,13 +33,16 @@
#include "resourcefile_p.h" #include "resourcefile_p.h"
#include <QtCore/QtAlgorithms> #include <utils/qtcassert.h>
#include <QtCore/QFile>
#include <QtCore/QTextStream>
#include <QtCore/QCoreApplication> #include <QtCore/QCoreApplication>
#include <QtCore/QDir>
#include <QtCore/QMimeData>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QFile>
#include <QtCore/QMimeData>
#include <QtCore/QtAlgorithms>
#include <QtCore/QTextStream>
#include <QtGui/QIcon> #include <QtGui/QIcon>
#include <QtGui/QImageReader> #include <QtGui/QImageReader>
@@ -109,14 +112,14 @@ bool ResourceFile::load()
const QString language = relt.attribute(QLatin1String("lang")); const QString language = relt.attribute(QLatin1String("lang"));
const int idx = indexOfPrefix(prefix); const int idx = indexOfPrefix(prefix);
Prefix * p = NULL; Prefix * p = 0;
if (idx == -1) { if (idx == -1) {
p = new Prefix(prefix, language); p = new Prefix(prefix, language);
m_prefix_list.append(p); m_prefix_list.append(p);
} else { } else {
p = m_prefix_list[idx]; p = m_prefix_list[idx];
} }
Q_ASSERT(p != NULL); QTC_ASSERT(p, return false);
QDomElement felt = relt.firstChildElement(QLatin1String("file")); QDomElement felt = relt.firstChildElement(QLatin1String("file"));
for (; !felt.isNull(); felt = felt.nextSiblingElement(QLatin1String("file"))) { for (; !felt.isNull(); felt = felt.nextSiblingElement(QLatin1String("file"))) {
@@ -151,7 +154,7 @@ bool ResourceFile::save()
const QStringList name_list = prefixList(); const QStringList name_list = prefixList();
foreach (QString name, name_list) { foreach (const QString &name, name_list) {
FileList file_list; FileList file_list;
QString lang; QString lang;
foreach (Prefix *pref, m_prefix_list) { foreach (Prefix *pref, m_prefix_list) {
@@ -164,7 +167,7 @@ bool ResourceFile::save()
QDomElement relt = doc.createElement(QLatin1String("qresource")); QDomElement relt = doc.createElement(QLatin1String("qresource"));
root.appendChild(relt); root.appendChild(relt);
relt.setAttribute(QLatin1String("prefix"), name); relt.setAttribute(QLatin1String("prefix"), name);
if(!lang.isEmpty()) if (!lang.isEmpty())
relt.setAttribute(QLatin1String("lang"), lang); relt.setAttribute(QLatin1String("lang"), lang);
foreach (const File *f, file_list) { foreach (const File *f, file_list) {
@@ -247,9 +250,9 @@ bool ResourceFile::isEmpty() const
QStringList ResourceFile::fileList(int pref_idx) const QStringList ResourceFile::fileList(int pref_idx) const
{ {
Q_ASSERT((pref_idx >= 0) && (pref_idx < m_prefix_list.count()));
const FileList &abs_file_list = m_prefix_list.at(pref_idx)->file_list;
QStringList result; QStringList result;
QTC_ASSERT(pref_idx >= 0 && pref_idx < m_prefix_list.count(), return result);
const FileList &abs_file_list = m_prefix_list.at(pref_idx)->file_list;
foreach (const File *abs_file, abs_file_list) foreach (const File *abs_file, abs_file_list)
result.append(relativePath(abs_file->name)); result.append(relativePath(abs_file->name));
return result; return result;
@@ -258,9 +261,9 @@ QStringList ResourceFile::fileList(int pref_idx) const
void ResourceFile::addFile(int prefix_idx, const QString &file, int file_idx) void ResourceFile::addFile(int prefix_idx, const QString &file, int file_idx)
{ {
Prefix * const p = m_prefix_list[prefix_idx]; Prefix * const p = m_prefix_list[prefix_idx];
Q_ASSERT(p != NULL); QTC_ASSERT(p, return);
FileList &files = p->file_list; FileList &files = p->file_list;
Q_ASSERT((file_idx >= -1) && (file_idx <= files.size())); QTC_ASSERT(file_idx >= -1 && file_idx <= files.size(), return);
if (file_idx == -1) if (file_idx == -1)
file_idx = files.size(); file_idx = files.size();
files.insert(file_idx, new File(p, absolutePath(file))); files.insert(file_idx, new File(p, absolutePath(file)));
@@ -272,7 +275,7 @@ void ResourceFile::addPrefix(const QString &prefix, int prefix_idx)
if (indexOfPrefix(fixed_prefix) != -1) if (indexOfPrefix(fixed_prefix) != -1)
return; return;
Q_ASSERT((prefix_idx >= -1) && (prefix_idx <= m_prefix_list.size())); QTC_ASSERT(prefix_idx >= -1 && prefix_idx <= m_prefix_list.size(), return);
if (prefix_idx == -1) if (prefix_idx == -1)
prefix_idx = m_prefix_list.size(); prefix_idx = m_prefix_list.size();
m_prefix_list.insert(prefix_idx, new Prefix(fixed_prefix)); m_prefix_list.insert(prefix_idx, new Prefix(fixed_prefix));
@@ -280,7 +283,7 @@ void ResourceFile::addPrefix(const QString &prefix, int prefix_idx)
void ResourceFile::removePrefix(int prefix_idx) void ResourceFile::removePrefix(int prefix_idx)
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return);
Prefix * const p = m_prefix_list.at(prefix_idx); Prefix * const p = m_prefix_list.at(prefix_idx);
delete p; delete p;
m_prefix_list.removeAt(prefix_idx); m_prefix_list.removeAt(prefix_idx);
@@ -288,39 +291,39 @@ void ResourceFile::removePrefix(int prefix_idx)
void ResourceFile::removeFile(int prefix_idx, int file_idx) void ResourceFile::removeFile(int prefix_idx, int file_idx)
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return);
FileList &fileList = m_prefix_list[prefix_idx]->file_list; FileList &fileList = m_prefix_list[prefix_idx]->file_list;
Q_ASSERT((file_idx >= 0) && (file_idx < fileList.count())); QTC_ASSERT(file_idx >= 0 && file_idx < fileList.count(), return);
delete fileList.at(file_idx); delete fileList.at(file_idx);
fileList.removeAt(file_idx); fileList.removeAt(file_idx);
} }
void ResourceFile::replacePrefix(int prefix_idx, const QString &prefix) void ResourceFile::replacePrefix(int prefix_idx, const QString &prefix)
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return);
m_prefix_list[prefix_idx]->name = fixPrefix(prefix); m_prefix_list[prefix_idx]->name = fixPrefix(prefix);
} }
void ResourceFile::replaceLang(int prefix_idx, const QString &lang) void ResourceFile::replaceLang(int prefix_idx, const QString &lang)
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return);
m_prefix_list[prefix_idx]->lang = lang; m_prefix_list[prefix_idx]->lang = lang;
} }
void ResourceFile::replaceAlias(int prefix_idx, int file_idx, const QString &alias) void ResourceFile::replaceAlias(int prefix_idx, int file_idx, const QString &alias)
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return);
FileList &fileList = m_prefix_list.at(prefix_idx)->file_list; FileList &fileList = m_prefix_list.at(prefix_idx)->file_list;
Q_ASSERT((file_idx >= 0) && (file_idx < fileList.count())); QTC_ASSERT(file_idx >= 0 && file_idx < fileList.count(), return);
fileList[file_idx]->alias = alias; fileList[file_idx]->alias = alias;
} }
void ResourceFile::replaceFile(int pref_idx, int file_idx, const QString &file) void ResourceFile::replaceFile(int pref_idx, int file_idx, const QString &file)
{ {
Q_ASSERT((pref_idx >= 0) && (pref_idx < m_prefix_list.count())); QTC_ASSERT(pref_idx >= 0 && pref_idx < m_prefix_list.count(), return);
FileList &fileList = m_prefix_list.at(pref_idx)->file_list; FileList &fileList = m_prefix_list.at(pref_idx)->file_list;
Q_ASSERT((file_idx >= 0) && (file_idx < fileList.count())); QTC_ASSERT(file_idx >= 0 && file_idx < fileList.count(), return);
fileList[file_idx]->name = file; fileList[file_idx]->name = file;
} }
@@ -336,7 +339,7 @@ int ResourceFile::indexOfPrefix(const QString &prefix) const
int ResourceFile::indexOfFile(int pref_idx, const QString &file) const int ResourceFile::indexOfFile(int pref_idx, const QString &file) const
{ {
Q_ASSERT((pref_idx >= 0) && (pref_idx < m_prefix_list.count())); QTC_ASSERT(pref_idx >= 0 && pref_idx < m_prefix_list.count(), return -1);
Prefix * const p = m_prefix_list.at(pref_idx); Prefix * const p = m_prefix_list.at(pref_idx);
File equalFile(p, absolutePath(file)); File equalFile(p, absolutePath(file));
return p->file_list.indexOf(&equalFile); return p->file_list.indexOf(&equalFile);
@@ -370,16 +373,16 @@ bool ResourceFile::contains(const QString &prefix, const QString &file) const
return false; return false;
if (file.isEmpty()) if (file.isEmpty())
return true; return true;
Q_ASSERT((pref_idx >= 0) && (pref_idx < m_prefix_list.count())); QTC_ASSERT(pref_idx >= 0 && pref_idx < m_prefix_list.count(), return false);
Prefix * const p = m_prefix_list.at(pref_idx); Prefix * const p = m_prefix_list.at(pref_idx);
Q_ASSERT(p != NULL); QTC_ASSERT(p, return false);
File equalFile(p, absolutePath(file)); File equalFile(p, absolutePath(file));
return p->file_list.contains(&equalFile); return p->file_list.contains(&equalFile);
} }
bool ResourceFile::contains(int pref_idx, const QString &file) const bool ResourceFile::contains(int pref_idx, const QString &file) const
{ {
Q_ASSERT((pref_idx >= 0) && (pref_idx < m_prefix_list.count())); QTC_ASSERT(pref_idx >= 0 && pref_idx < m_prefix_list.count(), return false);
Prefix * const p = m_prefix_list.at(pref_idx); Prefix * const p = m_prefix_list.at(pref_idx);
File equalFile(p, absolutePath(file)); File equalFile(p, absolutePath(file));
return p->file_list.contains(&equalFile); return p->file_list.contains(&equalFile);
@@ -409,49 +412,49 @@ int ResourceFile::prefixCount() const
QString ResourceFile::prefix(int idx) const QString ResourceFile::prefix(int idx) const
{ {
Q_ASSERT((idx >= 0) && (idx < m_prefix_list.count())); QTC_ASSERT((idx >= 0) && (idx < m_prefix_list.count()), return QString());
return m_prefix_list.at(idx)->name; return m_prefix_list.at(idx)->name;
} }
QString ResourceFile::lang(int idx) const QString ResourceFile::lang(int idx) const
{ {
Q_ASSERT((idx >= 0) && (idx < m_prefix_list.count())); QTC_ASSERT(idx >= 0 && idx < m_prefix_list.count(), return QString());
return m_prefix_list.at(idx)->lang; return m_prefix_list.at(idx)->lang;
} }
int ResourceFile::fileCount(int prefix_idx) const int ResourceFile::fileCount(int prefix_idx) const
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return 0);
return m_prefix_list.at(prefix_idx)->file_list.size(); return m_prefix_list.at(prefix_idx)->file_list.size();
} }
QString ResourceFile::file(int prefix_idx, int file_idx) const QString ResourceFile::file(int prefix_idx, int file_idx) const
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return QString());
FileList &fileList = m_prefix_list.at(prefix_idx)->file_list; FileList &fileList = m_prefix_list.at(prefix_idx)->file_list;
Q_ASSERT((file_idx >= 0) && (file_idx < fileList.count())); QTC_ASSERT(file_idx >= 0 && file_idx < fileList.count(), return QString());
return fileList.at(file_idx)->name; return fileList.at(file_idx)->name;
} }
QString ResourceFile::alias(int prefix_idx, int file_idx) const QString ResourceFile::alias(int prefix_idx, int file_idx) const
{ {
Q_ASSERT((prefix_idx >= 0) && (prefix_idx < m_prefix_list.count())); QTC_ASSERT(prefix_idx >= 0 && prefix_idx < m_prefix_list.count(), return QString());
FileList &fileList = m_prefix_list.at(prefix_idx)->file_list; FileList &fileList = m_prefix_list.at(prefix_idx)->file_list;
Q_ASSERT((file_idx >= 0) && (file_idx < fileList.count())); QTC_ASSERT(file_idx >= 0 && file_idx < fileList.count(), return QString());
return fileList.at(file_idx)->alias; return fileList.at(file_idx)->alias;
} }
void * ResourceFile::prefixPointer(int prefixIndex) const void * ResourceFile::prefixPointer(int prefixIndex) const
{ {
Q_ASSERT((prefixIndex >= 0) && (prefixIndex < m_prefix_list.count())); QTC_ASSERT(prefixIndex >= 0 && prefixIndex < m_prefix_list.count(), return 0);
return m_prefix_list.at(prefixIndex); return m_prefix_list.at(prefixIndex);
} }
void * ResourceFile::filePointer(int prefixIndex, int fileIndex) const void * ResourceFile::filePointer(int prefixIndex, int fileIndex) const
{ {
Q_ASSERT((prefixIndex >= 0) && (prefixIndex < m_prefix_list.count())); QTC_ASSERT(prefixIndex >= 0 && prefixIndex < m_prefix_list.count(), return 0);
FileList &fileList = m_prefix_list.at(prefixIndex)->file_list; FileList &fileList = m_prefix_list.at(prefixIndex)->file_list;
Q_ASSERT((fileIndex >= 0) && (fileIndex < fileList.count())); QTC_ASSERT(fileIndex >= 0 && fileIndex < fileList.count(), return 0);
return fileList.at(fileIndex); return fileList.at(fileIndex);
} }
@@ -497,28 +500,28 @@ QModelIndex ResourceModel::index(int row, int column, const QModelIndex &parent)
if (column != 0) if (column != 0)
return QModelIndex(); return QModelIndex();
void * internalPointer = NULL; void * internalPointer = 0;
if (parent.isValid()) { if (parent.isValid()) {
void * const pip = parent.internalPointer(); void * const pip = parent.internalPointer();
if (pip == NULL) if (pip == 0)
return QModelIndex(); return QModelIndex();
// File node // File node
Node * const node = reinterpret_cast<Node *>(pip); Node * const node = reinterpret_cast<Node *>(pip);
Prefix * const prefix = node->prefix(); Prefix * const prefix = node->prefix();
Q_ASSERT(prefix != NULL); QTC_ASSERT(prefix, return QModelIndex());
if ((row < 0) || (row >= prefix->file_list.count())) if (row < 0 || row >= prefix->file_list.count())
return QModelIndex(); return QModelIndex();
const int prefixIndex = m_resource_file.prefixPointerIndex(prefix); const int prefixIndex = m_resource_file.prefixPointerIndex(prefix);
const int fileIndex = row; const int fileIndex = row;
internalPointer = m_resource_file.filePointer(prefixIndex, fileIndex); internalPointer = m_resource_file.filePointer(prefixIndex, fileIndex);
} else { } else {
// Prefix node // Prefix node
if ((row < 0) || (row >= m_resource_file.prefixCount())) if (row < 0 || row >= m_resource_file.prefixCount())
return QModelIndex(); return QModelIndex();
internalPointer = m_resource_file.prefixPointer(row); internalPointer = m_resource_file.prefixPointer(row);
} }
Q_ASSERT(internalPointer != NULL); QTC_ASSERT(internalPointer, return QModelIndex());
return createIndex(row, 0, internalPointer); return createIndex(row, 0, internalPointer);
} }
@@ -528,16 +531,16 @@ QModelIndex ResourceModel::parent(const QModelIndex &index) const
return QModelIndex(); return QModelIndex();
void * const internalPointer = index.internalPointer(); void * const internalPointer = index.internalPointer();
if (internalPointer == NULL) if (internalPointer == 0)
return QModelIndex(); return QModelIndex();
Node * const node = reinterpret_cast<Node *>(internalPointer); Node * const node = reinterpret_cast<Node *>(internalPointer);
Prefix * const prefix = node->prefix(); Prefix * const prefix = node->prefix();
Q_ASSERT(prefix != NULL); QTC_ASSERT(prefix, return QModelIndex());
bool const isFileNode = (prefix != node); bool const isFileNode = (prefix != node);
if (isFileNode) { if (isFileNode) {
const int row = m_resource_file.prefixPointerIndex(prefix); const int row = m_resource_file.prefixPointerIndex(prefix);
Q_ASSERT(row >= 0); QTC_ASSERT(row >= 0, return QModelIndex());
return createIndex(row, 0, prefix); return createIndex(row, 0, prefix);
} else { } else {
return QModelIndex(); return QModelIndex();
@@ -550,7 +553,7 @@ int ResourceModel::rowCount(const QModelIndex &parent) const
void * const internalPointer = parent.internalPointer(); void * const internalPointer = parent.internalPointer();
Node * const node = reinterpret_cast<Node *>(internalPointer); Node * const node = reinterpret_cast<Node *>(internalPointer);
Prefix * const prefix = node->prefix(); Prefix * const prefix = node->prefix();
Q_ASSERT(prefix != NULL); QTC_ASSERT(prefix, return 0);
bool const isFileNode = (prefix != node); bool const isFileNode = (prefix != node);
if (isFileNode) { if (isFileNode) {
@@ -609,7 +612,7 @@ QVariant ResourceModel::data(const QModelIndex &index, int role) const
Node * const node = reinterpret_cast<Node *>(internalPointer); Node * const node = reinterpret_cast<Node *>(internalPointer);
Prefix const * const prefix = node->prefix(); Prefix const * const prefix = node->prefix();
File const * const file = node->file(); File const * const file = node->file();
Q_ASSERT(prefix != NULL); QTC_ASSERT(prefix, return QVariant());
bool const isFileNode = (prefix != node); bool const isFileNode = (prefix != node);
QVariant result; QVariant result;
@@ -622,14 +625,14 @@ QVariant ResourceModel::data(const QModelIndex &index, int role) const
// Prefix node // Prefix node
stringRes = prefix->name; stringRes = prefix->name;
const QString &lang = prefix->lang; const QString &lang = prefix->lang;
if(!lang.isEmpty()) if (!lang.isEmpty())
appendParenthesized(lang, stringRes); appendParenthesized(lang, stringRes);
} else { } else {
// File node // File node
Q_ASSERT(file != NULL); QTC_ASSERT(file, return result);
stringRes = QFileInfo(file->name).fileName(); stringRes = QFileInfo(file->name).fileName();
const QString alias = file->alias; const QString alias = file->alias;
if(!alias.isEmpty()) if (!alias.isEmpty())
appendParenthesized(alias, stringRes); appendParenthesized(alias, stringRes);
} }
result = stringRes; result = stringRes;
@@ -638,7 +641,7 @@ QVariant ResourceModel::data(const QModelIndex &index, int role) const
case Qt::DecorationRole: case Qt::DecorationRole:
if (isFileNode) { if (isFileNode) {
// File node // File node
Q_ASSERT(file != NULL); QTC_ASSERT(file, return result);
const QString path = m_resource_file.absolutePath(file->name); const QString path = m_resource_file.absolutePath(file->name);
if (iconFileExtension(path)) { if (iconFileExtension(path)) {
const QIcon icon(path); const QIcon icon(path);
@@ -650,11 +653,11 @@ QVariant ResourceModel::data(const QModelIndex &index, int role) const
case Qt::ToolTipRole: case Qt::ToolTipRole:
if (isFileNode) { if (isFileNode) {
// File node // File node
Q_ASSERT(file != NULL); QTC_ASSERT(file, return result);
QString conv_file = m_resource_file.relativePath(file->name); QString conv_file = m_resource_file.relativePath(file->name);
QString stringRes = conv_file.replace(QDir::separator(), QLatin1Char('/')); QString stringRes = conv_file.replace(QDir::separator(), QLatin1Char('/'));
const QString &alias_file = file->alias; const QString &alias_file = file->alias;
if(!alias_file.isEmpty()) if (!alias_file.isEmpty())
appendParenthesized(alias_file, stringRes); appendParenthesized(alias_file, stringRes);
result = stringRes; result = stringRes;
@@ -679,12 +682,12 @@ void ResourceModel::getItem(const QModelIndex &index, QString &prefix, QString &
void * const internalPointer = index.internalPointer(); void * const internalPointer = index.internalPointer();
Node * const node = reinterpret_cast<Node *>(internalPointer); Node * const node = reinterpret_cast<Node *>(internalPointer);
Prefix * const p = node->prefix(); Prefix * const p = node->prefix();
Q_ASSERT(p != NULL); QTC_ASSERT(p, return);
bool const isFileNode = (p != node); bool const isFileNode = (p != node);
if (isFileNode) { if (isFileNode) {
File * const f = node->file(); File *const f = node->file();
Q_ASSERT(f != NULL); QTC_ASSERT(f, return);
if (!f->alias.isEmpty()) if (!f->alias.isEmpty())
file = f->alias; file = f->alias;
else else
@@ -696,7 +699,7 @@ void ResourceModel::getItem(const QModelIndex &index, QString &prefix, QString &
QString ResourceModel::lang(const QModelIndex &index) const QString ResourceModel::lang(const QModelIndex &index) const
{ {
if(!index.isValid()) if (!index.isValid())
return QString(); return QString();
return m_resource_file.lang(index.row()); return m_resource_file.lang(index.row());
@@ -704,14 +707,14 @@ QString ResourceModel::lang(const QModelIndex &index) const
QString ResourceModel::alias(const QModelIndex &index) const QString ResourceModel::alias(const QModelIndex &index) const
{ {
if(!index.isValid() || !index.parent().isValid()) if (!index.isValid() || !index.parent().isValid())
return QString(); return QString();
return m_resource_file.alias(index.parent().row(), index.row()); return m_resource_file.alias(index.parent().row(), index.row());
} }
QString ResourceModel::file(const QModelIndex &index) const QString ResourceModel::file(const QModelIndex &index) const
{ {
if(!index.isValid() || !index.parent().isValid()) if (!index.isValid() || !index.parent().isValid())
return QString(); return QString();
return m_resource_file.file(index.parent().row(), index.row()); return m_resource_file.file(index.parent().row(), index.row());
} }
@@ -852,7 +855,7 @@ void ResourceModel::changePrefix(const QModelIndex &model_idx, const QString &pr
if (m_resource_file.prefix(prefix_idx) == ResourceFile::fixPrefix(prefix)) if (m_resource_file.prefix(prefix_idx) == ResourceFile::fixPrefix(prefix))
return; return;
if(m_resource_file.contains(prefix)) if (m_resource_file.contains(prefix))
return; return;
m_resource_file.replacePrefix(prefix_idx, prefix); m_resource_file.replacePrefix(prefix_idx, prefix);
@@ -880,7 +883,7 @@ void ResourceModel::changeAlias(const QModelIndex &index, const QString &alias)
if (!index.parent().isValid()) if (!index.parent().isValid())
return; return;
if(m_resource_file.alias(index.parent().row(), index.row()) == alias) if (m_resource_file.alias(index.parent().row(), index.row()) == alias)
return; return;
m_resource_file.replaceAlias(index.parent().row(), index.row(), alias); m_resource_file.replaceAlias(index.parent().row(), index.row(), alias);
emit dataChanged(index, index); emit dataChanged(index, index);

View File

@@ -36,10 +36,12 @@
#include "namespace_global.h" #include "namespace_global.h"
#include <utils/qtcassert.h>
#include <QtCore/QAbstractItemModel>
#include <QtCore/QMap>
#include <QtCore/QString> #include <QtCore/QString>
#include <QtCore/QStringList> #include <QtCore/QStringList>
#include <QtCore/QMap>
#include <QtCore/QAbstractItemModel>
#include "shared_global_p.h" #include "shared_global_p.h"
@@ -66,11 +68,11 @@ class Node
protected: protected:
Node(File *file, Prefix *prefix) : m_file(file), m_prefix(prefix) Node(File *file, Prefix *prefix) : m_file(file), m_prefix(prefix)
{ {
Q_ASSERT(m_prefix != NULL); QTC_ASSERT(m_prefix, return);
} }
public: public:
File * file() { return m_file; } File *file() { return m_file; }
Prefix * prefix() { Q_ASSERT(m_prefix != NULL); return m_prefix; } Prefix *prefix() { return m_prefix; }
private: private:
File *m_file; File *m_file;
Prefix *m_prefix; Prefix *m_prefix;

View File

@@ -32,16 +32,20 @@
***************************************************************************/ ***************************************************************************/
#include "resourceview.h" #include "resourceview.h"
#include "undocommands_p.h" #include "undocommands_p.h"
#include <QtGui/QHeaderView> #include <utils/qtcassert.h>
#include <QtGui/QMenu>
#include <QtCore/QDebug>
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtGui/QMouseEvent>
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QInputDialog>
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtCore/QtDebug> #include <QtGui/QHeaderView>
#include <QtGui/QInputDialog>
#include <QtGui/QMenu>
#include <QtGui/QMouseEvent>
#include <QtGui/QUndoStack> #include <QtGui/QUndoStack>
namespace SharedTools { namespace SharedTools {
@@ -308,14 +312,14 @@ void ResourceView::findSamePlacePostDeletionModelIndex(int &row, QModelIndex &pa
EntryBackup * ResourceView::removeEntry(const QModelIndex &index) EntryBackup * ResourceView::removeEntry(const QModelIndex &index)
{ {
Q_ASSERT(m_qrcModel != NULL); QTC_ASSERT(m_qrcModel, return 0);
return m_qrcModel->removeEntry(index); return m_qrcModel->removeEntry(index);
} }
void ResourceView::addFiles(int prefixIndex, const QStringList &fileNames, int cursorFile, void ResourceView::addFiles(int prefixIndex, const QStringList &fileNames, int cursorFile,
int &firstFile, int &lastFile) int &firstFile, int &lastFile)
{ {
Q_ASSERT(m_qrcModel != NULL); QTC_ASSERT(m_qrcModel, return);
m_qrcModel->addFiles(prefixIndex, fileNames, cursorFile, firstFile, lastFile); m_qrcModel->addFiles(prefixIndex, fileNames, cursorFile, firstFile, lastFile);
// Expand prefix node // Expand prefix node
@@ -327,11 +331,11 @@ void ResourceView::addFiles(int prefixIndex, const QStringList &fileNames, int c
void ResourceView::removeFiles(int prefixIndex, int firstFileIndex, int lastFileIndex) void ResourceView::removeFiles(int prefixIndex, int firstFileIndex, int lastFileIndex)
{ {
Q_ASSERT((prefixIndex >= 0) && (prefixIndex < m_qrcModel->rowCount(QModelIndex()))); QTC_ASSERT(prefixIndex >= 0 && prefixIndex < m_qrcModel->rowCount(QModelIndex()), return);
const QModelIndex prefixModelIndex = m_qrcModel->index(prefixIndex, 0, QModelIndex()); const QModelIndex prefixModelIndex = m_qrcModel->index(prefixIndex, 0, QModelIndex());
Q_ASSERT(prefixModelIndex != QModelIndex()); QTC_ASSERT(prefixModelIndex != QModelIndex(), return);
Q_ASSERT((firstFileIndex >= 0) && (firstFileIndex < m_qrcModel->rowCount(prefixModelIndex))); QTC_ASSERT(firstFileIndex >= 0 && firstFileIndex < m_qrcModel->rowCount(prefixModelIndex), return);
Q_ASSERT((lastFileIndex >= 0) && (lastFileIndex < m_qrcModel->rowCount(prefixModelIndex))); QTC_ASSERT(lastFileIndex >= 0 && lastFileIndex < m_qrcModel->rowCount(prefixModelIndex), return);
for (int i = lastFileIndex; i >= firstFileIndex; i--) { for (int i = lastFileIndex; i >= firstFileIndex; i--) {
const QModelIndex index = m_qrcModel->index(i, 0, prefixModelIndex); const QModelIndex index = m_qrcModel->index(i, 0, prefixModelIndex);
@@ -476,7 +480,7 @@ bool ResourceView::load(QString fileName)
const QFileInfo fi(fileName); const QFileInfo fi(fileName);
m_qrcModel->setFileName(fi.absoluteFilePath()); m_qrcModel->setFileName(fi.absoluteFilePath());
if(!fi.exists()) if (!fi.exists())
return false; return false;
const bool result = m_qrcModel->reload(); const bool result = m_qrcModel->reload();
@@ -501,9 +505,8 @@ void ResourceView::changePrefix(const QModelIndex &index)
QString const prefixAfter = QInputDialog::getText(this, tr("Change Prefix"), tr("Input Prefix:"), QString const prefixAfter = QInputDialog::getText(this, tr("Change Prefix"), tr("Input Prefix:"),
QLineEdit::Normal, prefixBefore, &ok); QLineEdit::Normal, prefixBefore, &ok);
if (ok) { if (ok)
addUndoCommand(preindex, PrefixProperty, prefixBefore, prefixAfter); addUndoCommand(preindex, PrefixProperty, prefixBefore, prefixAfter);
}
} }
void ResourceView::changeLang(const QModelIndex &index) void ResourceView::changeLang(const QModelIndex &index)
@@ -522,7 +525,7 @@ void ResourceView::changeLang(const QModelIndex &index)
void ResourceView::changeAlias(const QModelIndex &index) void ResourceView::changeAlias(const QModelIndex &index)
{ {
if(!index.parent().isValid()) if (!index.parent().isValid())
return; return;
bool ok = false; bool ok = false;
@@ -531,9 +534,8 @@ void ResourceView::changeAlias(const QModelIndex &index)
QString const aliasAfter = QInputDialog::getText(this, tr("Change File Alias"), tr("Alias:"), QString const aliasAfter = QInputDialog::getText(this, tr("Change File Alias"), tr("Alias:"),
QLineEdit::Normal, aliasBefore, &ok); QLineEdit::Normal, aliasBefore, &ok);
if (ok) { if (ok)
addUndoCommand(index, AliasProperty, aliasBefore, aliasAfter); addUndoCommand(index, AliasProperty, aliasBefore, aliasAfter);
}
} }
QString ResourceView::currentAlias() const QString ResourceView::currentAlias() const
@@ -570,7 +572,7 @@ QString ResourceView::getCurrentValue(NodeProperty property) const
case AliasProperty: return currentAlias(); case AliasProperty: return currentAlias();
case PrefixProperty: return currentPrefix(); case PrefixProperty: return currentPrefix();
case LanguageProperty: return currentLanguage(); case LanguageProperty: return currentLanguage();
default: Q_ASSERT(false); return QString(); // Kill warning default: QTC_ASSERT(false, /**/); return QString(); // Kill warning
} }
} }
@@ -581,19 +583,20 @@ void ResourceView::changeValue(const QModelIndex &nodeIndex, NodeProperty proper
case AliasProperty: m_qrcModel->changeAlias(nodeIndex, value); return; case AliasProperty: m_qrcModel->changeAlias(nodeIndex, value); return;
case PrefixProperty: m_qrcModel->changePrefix(nodeIndex, value); return; case PrefixProperty: m_qrcModel->changePrefix(nodeIndex, value); return;
case LanguageProperty: m_qrcModel->changeLang(nodeIndex, value); return; case LanguageProperty: m_qrcModel->changeLang(nodeIndex, value); return;
default: Q_ASSERT(false); default: QTC_ASSERT(false, /**/);
} }
} }
void ResourceView::advanceMergeId() { void ResourceView::advanceMergeId()
{
m_mergeId++; m_mergeId++;
if (m_mergeId < 0) { if (m_mergeId < 0)
m_mergeId = 0; m_mergeId = 0;
}
} }
void ResourceView::addUndoCommand(const QModelIndex &nodeIndex, NodeProperty property, void ResourceView::addUndoCommand(const QModelIndex &nodeIndex, NodeProperty property,
const QString &before, const QString &after) { const QString &before, const QString &after)
{
QUndoCommand * const command = new ModifyPropertyCommand(this, nodeIndex, property, QUndoCommand * const command = new ModifyPropertyCommand(this, nodeIndex, property,
m_mergeId, before, after); m_mergeId, before, after);
m_history->push(command); m_history->push(command);

View File

@@ -92,7 +92,7 @@ bool ModifyPropertyCommand::mergeWith(const QUndoCommand * command)
{ {
const ModifyPropertyCommand * const brother const ModifyPropertyCommand * const brother
= dynamic_cast<const ModifyPropertyCommand *>(command); = dynamic_cast<const ModifyPropertyCommand *>(command);
if (command == NULL || m_property != brother->m_property) if (command == 0 || m_property != brother->m_property)
return false; return false;
// Choose older command (this) and forgot the other // Choose older command (this) and forgot the other
@@ -101,7 +101,7 @@ bool ModifyPropertyCommand::mergeWith(const QUndoCommand * command)
void ModifyPropertyCommand::undo() void ModifyPropertyCommand::undo()
{ {
Q_ASSERT(m_view != NULL); QTC_ASSERT(m_view, return);
// Save current text in m_after for redo() // Save current text in m_after for redo()
m_after = m_view->getCurrentValue(m_property); m_after = m_view->getCurrentValue(m_property);
@@ -117,12 +117,12 @@ void ModifyPropertyCommand::redo()
return; return;
// Bring back text before undo // Bring back text before undo
Q_ASSERT(m_view != NULL); QTC_ASSERT(m_view, return);
m_view->changeValue(makeIndex(), m_property, m_after); m_view->changeValue(makeIndex(), m_property, m_after);
} }
RemoveEntryCommand::RemoveEntryCommand(ResourceView *view, const QModelIndex &index) RemoveEntryCommand::RemoveEntryCommand(ResourceView *view, const QModelIndex &index)
: ModelIndexViewCommand(view), m_entry(NULL), m_isExpanded(true) : ModelIndexViewCommand(view), m_entry(0), m_isExpanded(true)
{ {
storeIndex(index); storeIndex(index);
} }
@@ -142,9 +142,9 @@ void RemoveEntryCommand::redo()
void RemoveEntryCommand::undo() void RemoveEntryCommand::undo()
{ {
if (m_entry != NULL) { if (m_entry == 0) {
m_entry->restore(); m_entry->restore();
Q_ASSERT(m_view != NULL); QTC_ASSERT(m_view != 0, return);
const QModelIndex index = makeIndex(); const QModelIndex index = makeIndex();
m_view->setExpanded(index, m_isExpanded); m_view->setExpanded(index, m_isExpanded);
m_view->setCurrentIndex(index); m_view->setCurrentIndex(index);
@@ -155,7 +155,7 @@ void RemoveEntryCommand::undo()
void RemoveEntryCommand::freeEntry() void RemoveEntryCommand::freeEntry()
{ {
delete m_entry; delete m_entry;
m_entry = NULL; m_entry = 0;
} }
AddFilesCommand::AddFilesCommand(ResourceView *view, int prefixIndex, int cursorFileIndex, AddFilesCommand::AddFilesCommand(ResourceView *view, int prefixIndex, int cursorFileIndex,

View File

@@ -50,9 +50,9 @@ static PProcessIdToSessionId pProcessIdToSessionId = 0;
namespace SharedTools { namespace SharedTools {
const char* QtLocalPeer::ack = "ack"; const char *QtLocalPeer::ack = "ack";
QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) QtLocalPeer::QtLocalPeer(QObject *parent, const QString &appId)
: QObject(parent), id(appId) : QObject(parent), id(appId)
{ {
if (id.isEmpty()) if (id.isEmpty())
@@ -86,8 +86,6 @@ QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId)
lockFile.open(QIODevice::ReadWrite); lockFile.open(QIODevice::ReadWrite);
} }
bool QtLocalPeer::isClient() bool QtLocalPeer::isClient()
{ {
if (lockFile.isLocked()) if (lockFile.isLocked())
@@ -105,7 +103,6 @@ bool QtLocalPeer::isClient()
return false; return false;
} }
bool QtLocalPeer::sendMessage(const QString &message, int timeout) bool QtLocalPeer::sendMessage(const QString &message, int timeout)
{ {
if (!isClient()) if (!isClient())
@@ -113,7 +110,7 @@ bool QtLocalPeer::sendMessage(const QString &message, int timeout)
QLocalSocket socket; QLocalSocket socket;
bool connOk = false; bool connOk = false;
for(int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
// Try twice, in case the other instance is just starting up // Try twice, in case the other instance is just starting up
socket.connectToServer(socketName); socket.connectToServer(socketName);
connOk = socket.waitForConnected(timeout/2); connOk = socket.waitForConnected(timeout/2);
@@ -139,7 +136,6 @@ bool QtLocalPeer::sendMessage(const QString &message, int timeout)
return res; return res;
} }
void QtLocalPeer::receiveConnection() void QtLocalPeer::receiveConnection()
{ {
QLocalSocket* socket = server->nextPendingConnection(); QLocalSocket* socket = server->nextPendingConnection();

View File

@@ -34,6 +34,8 @@
#ifndef WRAP_HELPERS_H #ifndef WRAP_HELPERS_H
#define WRAP_HELPERS_H #define WRAP_HELPERS_H
#include <utils/qtcassert.h>
#include <QtScript/QScriptEngine> #include <QtScript/QScriptEngine>
#include <QtScript/QScriptContext> #include <QtScript/QScriptContext>
#include <QtScript/QScriptValue> #include <QtScript/QScriptValue>
@@ -87,7 +89,7 @@ template <class Wrapper, class Wrapped>
Wrapped * (Wrapper::*wrappedAccessor) () const) Wrapped * (Wrapper::*wrappedAccessor) () const)
{ {
Wrapped *wrapped = wrappedFromScriptValue(context->thisObject(), wrappedAccessor); Wrapped *wrapped = wrappedFromScriptValue(context->thisObject(), wrappedAccessor);
Q_ASSERT(wrapped); QTC_ASSERT(wrapped, return 0);
return wrapped; return wrapped;
} }
@@ -314,7 +316,7 @@ static void scriptValueToQObject(const QScriptValue &sv, SomeQObject * &p)
{ {
QObject *qObject = sv.toQObject(); QObject *qObject = sv.toQObject();
p = qobject_cast<SomeQObject*>(qObject); p = qobject_cast<SomeQObject*>(qObject);
Q_ASSERT(p); QTC_ASSERT(p, return);
} }
// Register a QObject-derived class which has Q_DECLARE_METATYPE(Ptr*) // Register a QObject-derived class which has Q_DECLARE_METATYPE(Ptr*)

View File

@@ -212,9 +212,9 @@ int main(int argc, char **argv)
pluginManager.setPluginPaths(pluginPaths); pluginManager.setPluginPaths(pluginPaths);
const QStringList arguments = app.arguments(); const QStringList arguments = app.arguments();
QMap<QString,QString> foundAppOptions; QMap<QString, QString> foundAppOptions;
if (arguments.size() > 1) { if (arguments.size() > 1) {
QMap<QString,bool> appOptions; QMap<QString, bool> appOptions;
appOptions.insert(QLatin1String(HELP_OPTION1), false); appOptions.insert(QLatin1String(HELP_OPTION1), false);
appOptions.insert(QLatin1String(HELP_OPTION2), false); appOptions.insert(QLatin1String(HELP_OPTION2), false);
appOptions.insert(QLatin1String(HELP_OPTION3), false); appOptions.insert(QLatin1String(HELP_OPTION3), false);

View File

@@ -32,6 +32,9 @@
***************************************************************************/ ***************************************************************************/
#include "CppDocument.h" #include "CppDocument.h"
#include <utils/qtcassert.h>
#include <Control.h> #include <Control.h>
#include <TranslationUnit.h> #include <TranslationUnit.h>
#include <DiagnosticClient.h> #include <DiagnosticClient.h>
@@ -138,24 +141,14 @@ void Document::addIncludeFile(const QString &fileName)
_includedFiles.append(fileName); _includedFiles.append(fileName);
} }
QByteArray Document::definedMacros() const void Document::appendMacro(const Macro &macro)
{ {
return _definedMacros; _definedMacros.append(macro);
} }
void Document::appendMacro(const QByteArray &macroName, const QByteArray &text) void Document::addMacroUse(const Macro &macro, unsigned offset, unsigned length)
{ {
int index = macroName.indexOf('('); _macroUses.append(MacroUse(macro, offset, offset + length));
if (index == -1)
_macroNames.insert(macroName);
else
_macroNames.insert(macroName.left(index));
_definedMacros += text;
}
void Document::addMacroUse(unsigned offset, unsigned length)
{
_macroUses.append(Block(offset, offset + length));
} }
TranslationUnit *Document::translationUnit() const TranslationUnit *Document::translationUnit() const
@@ -251,11 +244,6 @@ void Document::stopSkippingBlocks(unsigned stop)
_skippedBlocks.back() = Block(start, stop); _skippedBlocks.back() = Block(start, stop);
} }
QSet<QByteArray> Document::macroNames() const
{
return _macroNames;
}
bool Document::parse(ParseMode mode) bool Document::parse(ParseMode mode)
{ {
TranslationUnit::ParseMode m = TranslationUnit::ParseTranlationUnit; TranslationUnit::ParseMode m = TranslationUnit::ParseTranlationUnit;
@@ -285,7 +273,7 @@ bool Document::parse(ParseMode mode)
void Document::check() void Document::check()
{ {
Q_ASSERT(! _globalNamespace); QTC_ASSERT(!_globalNamespace, return);
Semantic semantic(_control); Semantic semantic(_control);

View File

@@ -36,6 +36,8 @@
#include <CPlusPlusForwardDeclarations.h> #include <CPlusPlusForwardDeclarations.h>
#include "pp-macro.h"
#include <QByteArray> #include <QByteArray>
#include <QList> #include <QList>
#include <QSet> #include <QSet>
@@ -45,6 +47,8 @@
namespace CPlusPlus { namespace CPlusPlus {
class Macro;
class CPLUSPLUS_EXPORT Document class CPLUSPLUS_EXPORT Document
{ {
Document(const Document &other); Document(const Document &other);
@@ -63,12 +67,8 @@ public:
QStringList includedFiles() const; QStringList includedFiles() const;
void addIncludeFile(const QString &fileName); void addIncludeFile(const QString &fileName);
QByteArray definedMacros() const; void appendMacro(const Macro &macro);
QSet<QByteArray> macroNames() const; void addMacroUse(const Macro &macro, unsigned offset, unsigned length);
void appendMacro(const QByteArray &macroName, const QByteArray &text);
void addMacroUse(unsigned offset, unsigned length);
Control *control() const; Control *control() const;
TranslationUnit *translationUnit() const; TranslationUnit *translationUnit() const;
@@ -81,6 +81,9 @@ public:
Scope *globalSymbols() const; // ### deprecate? Scope *globalSymbols() const; // ### deprecate?
Namespace *globalNamespace() const; Namespace *globalNamespace() const;
QList<Macro> definedMacros() const
{ return _definedMacros; }
Symbol *findSymbolAt(unsigned line, unsigned column) const; Symbol *findSymbolAt(unsigned line, unsigned column) const;
void setSource(const QByteArray &source); void setSource(const QByteArray &source);
@@ -173,12 +176,30 @@ public:
inline unsigned end() const inline unsigned end() const
{ return _end; } { return _end; }
bool contains(unsigned pos) const
{ return pos >= _begin && pos < _end; }
};
class MacroUse: public Block {
Macro _macro;
public:
inline MacroUse(const Macro &macro,
unsigned begin = 0,
unsigned end = 0)
: Block(begin, end),
_macro(macro)
{ }
const Macro &macro() const
{ return _macro; }
}; };
QList<Block> skippedBlocks() const QList<Block> skippedBlocks() const
{ return _skippedBlocks; } { return _skippedBlocks; }
QList<Block> macroUses() const QList<MacroUse> macroUses() const
{ return _macroUses; } { return _macroUses; }
private: private:
@@ -191,10 +212,9 @@ private:
TranslationUnit *_translationUnit; TranslationUnit *_translationUnit;
Namespace *_globalNamespace; Namespace *_globalNamespace;
QList<DiagnosticMessage> _diagnosticMessages; QList<DiagnosticMessage> _diagnosticMessages;
QByteArray _definedMacros; QList<Macro> _definedMacros;
QSet<QByteArray> _macroNames;
QList<Block> _skippedBlocks; QList<Block> _skippedBlocks;
QList<Block> _macroUses; QList<MacroUse> _macroUses;
}; };
} // end of namespace CPlusPlus } // end of namespace CPlusPlus

View File

@@ -61,11 +61,11 @@ Icons::Icons()
{ {
} }
QIcon Icons::iconForSymbol(Symbol *symbol) const QIcon Icons::iconForSymbol(const Symbol *symbol) const
{ {
if (symbol->isFunction() || (symbol->isDeclaration() && symbol->type()->isFunction())) if (symbol->isFunction() || (symbol->isDeclaration() && symbol->type()->isFunction()))
{ {
Function *function = symbol->asFunction(); const Function *function = symbol->asFunction();
if (!function) if (!function)
function = symbol->type()->asFunction(); function = symbol->type()->asFunction();

View File

@@ -47,7 +47,7 @@ class CPLUSPLUS_EXPORT Icons
public: public:
Icons(); Icons();
QIcon iconForSymbol(Symbol *symbol) const; QIcon iconForSymbol(const Symbol *symbol) const;
QIcon keywordIcon() const; QIcon keywordIcon() const;
QIcon macroIcon() const; QIcon macroIcon() const;

View File

@@ -34,6 +34,8 @@
#include "OverviewModel.h" #include "OverviewModel.h"
#include "Overview.h" #include "Overview.h"
#include <utils/qtcassert.h>
#include <Scope.h> #include <Scope.h>
#include <Semantic.h> #include <Semantic.h>
#include <Literals.h> #include <Literals.h>
@@ -74,20 +76,20 @@ Symbol *OverviewModel::globalSymbolAt(unsigned index) const
QModelIndex OverviewModel::index(int row, int column, const QModelIndex &parent) const QModelIndex OverviewModel::index(int row, int column, const QModelIndex &parent) const
{ {
if (! hasDocument()) { if (!parent.isValid()) {
return QModelIndex(); if (row == 0) // account for no symbol item
} else if (! parent.isValid()) { return createIndex(row, column);
Symbol *symbol = globalSymbolAt(row); Symbol *symbol = globalSymbolAt(row-1); // account for no symbol item
return createIndex(row, column, symbol); return createIndex(row, column, symbol);
} else { } else {
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer()); Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
Q_ASSERT(parentSymbol != 0); QTC_ASSERT(parentSymbol, return QModelIndex());
ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol(); ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol();
Q_ASSERT(scopedSymbol != 0); QTC_ASSERT(scopedSymbol, return QModelIndex());
Scope *scope = scopedSymbol->members(); Scope *scope = scopedSymbol->members();
Q_ASSERT(scope != 0); QTC_ASSERT(scope, return QModelIndex());
return createIndex(row, 0, scope->symbolAt(row)); return createIndex(row, 0, scope->symbolAt(row));
} }
@@ -96,12 +98,20 @@ QModelIndex OverviewModel::index(int row, int column, const QModelIndex &parent)
QModelIndex OverviewModel::parent(const QModelIndex &child) const QModelIndex OverviewModel::parent(const QModelIndex &child) const
{ {
Symbol *symbol = static_cast<Symbol *>(child.internalPointer()); Symbol *symbol = static_cast<Symbol *>(child.internalPointer());
Q_ASSERT(symbol != 0); if (!symbol) // account for no symbol item
return QModelIndex();
if (Scope *scope = symbol->scope()) { if (Scope *scope = symbol->scope()) {
Symbol *parentSymbol = scope->owner(); Symbol *parentSymbol = scope->owner();
if (parentSymbol && parentSymbol->scope()) if (parentSymbol && parentSymbol->scope()) {
return createIndex(parentSymbol->index(), 0, parentSymbol); QModelIndex index;
if (parentSymbol->scope() && parentSymbol->scope()->owner()
&& parentSymbol->scope()->owner()->scope()) // the parent doesn't have a parent
index = createIndex(parentSymbol->index(), 0, parentSymbol);
else //+1 to account for no symbol item
index = createIndex(parentSymbol->index() + 1, 0, parentSymbol);
return index;
}
} }
return QModelIndex(); return QModelIndex();
@@ -110,22 +120,27 @@ QModelIndex OverviewModel::parent(const QModelIndex &child) const
int OverviewModel::rowCount(const QModelIndex &parent) const int OverviewModel::rowCount(const QModelIndex &parent) const
{ {
if (hasDocument()) { if (hasDocument()) {
if (! parent.isValid()) { if (!parent.isValid()) {
return globalSymbolCount(); return globalSymbolCount()+1; // account for no symbol item
} else { } else {
if (!parent.parent().isValid() && parent.row() == 0) // account for no symbol item
return 0;
Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer()); Symbol *parentSymbol = static_cast<Symbol *>(parent.internalPointer());
Q_ASSERT(parentSymbol != 0); QTC_ASSERT(parentSymbol, return 0);
if (ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol()) { if (ScopedSymbol *scopedSymbol = parentSymbol->asScopedSymbol()) {
if (! scopedSymbol->isFunction()) { if (!scopedSymbol->isFunction()) {
Scope *parentScope = scopedSymbol->members(); Scope *parentScope = scopedSymbol->members();
Q_ASSERT(parentScope != 0); QTC_ASSERT(parentScope, return 0);
return parentScope->symbolCount(); return parentScope->symbolCount();
} }
} }
return 0;
} }
} }
if (!parent.isValid())
return 1; // account for no symbol item
return 0; return 0;
} }
@@ -136,6 +151,19 @@ int OverviewModel::columnCount(const QModelIndex &) const
QVariant OverviewModel::data(const QModelIndex &index, int role) const QVariant OverviewModel::data(const QModelIndex &index, int role) const
{ {
// account for no symbol item
if (!index.parent().isValid() && index.row() == 0) {
switch (role) {
case Qt::DisplayRole:
if (rowCount() > 1)
return tr("<Select Symbol>");
else
return tr("<No Symbols>");
default:
return QVariant();
} //switch
}
switch (role) { switch (role) {
case Qt::DisplayRole: { case Qt::DisplayRole: {
Symbol *symbol = static_cast<Symbol *>(index.internalPointer()); Symbol *symbol = static_cast<Symbol *>(index.internalPointer());

View File

@@ -45,12 +45,14 @@
#include <TypeVisitor.h> #include <TypeVisitor.h>
#include <NameVisitor.h> #include <NameVisitor.h>
#include <QList> #include <utils/qtcassert.h>
#include <QtDebug>
#include <QtCore/QList>
#include <QtCore/QtDebug>
using namespace CPlusPlus; using namespace CPlusPlus;
namespace { namespace {
typedef QList< QPair<Name *, FullySpecifiedType> > Substitution; typedef QList< QPair<Name *, FullySpecifiedType> > Substitution;
@@ -98,7 +100,7 @@ protected:
// types // types
virtual void visit(PointerToMemberType * /*ty*/) virtual void visit(PointerToMemberType * /*ty*/)
{ {
Q_ASSERT(0); QTC_ASSERT(false, /**/);
} }
virtual void visit(PointerType *ty) virtual void visit(PointerType *ty)
@@ -150,32 +152,32 @@ protected:
{ /* nothing to do*/ } { /* nothing to do*/ }
virtual void visit(Namespace *) virtual void visit(Namespace *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
virtual void visit(Class *) virtual void visit(Class *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
virtual void visit(Enum *) virtual void visit(Enum *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
// names // names
virtual void visit(NameId *) virtual void visit(NameId *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
virtual void visit(TemplateNameId *) virtual void visit(TemplateNameId *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
virtual void visit(DestructorNameId *) virtual void visit(DestructorNameId *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
virtual void visit(OperatorNameId *) virtual void visit(OperatorNameId *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
virtual void visit(ConversionNameId *) virtual void visit(ConversionNameId *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
virtual void visit(QualifiedNameId *) virtual void visit(QualifiedNameId *)
{ Q_ASSERT(0); } { QTC_ASSERT(false, /**/); }
}; };
} // end of anonymous namespace } // end of anonymous namespace

View File

@@ -48,6 +48,7 @@ TypeOfExpression::TypeOfExpression():
void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &documents) void TypeOfExpression::setDocuments(const QMap<QString, Document::Ptr> &documents)
{ {
m_documents = documents; m_documents = documents;
m_lookupContext = LookupContext();
} }
QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression, QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression,

View File

@@ -54,6 +54,9 @@ public:
/** /**
* Sets the documents used to evaluate expressions. Should be set before * Sets the documents used to evaluate expressions. Should be set before
* calling this functor. * calling this functor.
*
* Also clears the lookup context, so can be used to make sure references
* to the documents previously used are removed.
*/ */
void setDocuments(const QMap<QString, Document::Ptr> &documents); void setDocuments(const QMap<QString, Document::Ptr> &documents);

View File

@@ -21,7 +21,16 @@ HEADERS += \
TypeOfExpression.h \ TypeOfExpression.h \
TypePrettyPrinter.h \ TypePrettyPrinter.h \
ResolveExpression.h \ ResolveExpression.h \
LookupContext.h LookupContext.h \
pp-cctype.h \
pp-engine.h \
pp-fwd.h \
pp-macro-expander.h \
pp-scanner.h \
pp-client.h \
pp-environment.h \
pp-internal.h \
pp-macro.h
SOURCES += \ SOURCES += \
SimpleLexer.cpp \ SimpleLexer.cpp \
@@ -35,6 +44,9 @@ SOURCES += \
TypeOfExpression.cpp \ TypeOfExpression.cpp \
TypePrettyPrinter.cpp \ TypePrettyPrinter.cpp \
ResolveExpression.cpp \ ResolveExpression.cpp \
LookupContext.cpp LookupContext.cpp \
pp-engine.cpp \
pp-environment.cpp \
pp-macro-expander.cpp
RESOURCES += cplusplus.qrc RESOURCES += cplusplus.qrc

View File

@@ -53,22 +53,24 @@
#ifndef PP_CCTYPE_H #ifndef PP_CCTYPE_H
#define PP_CCTYPE_H #define PP_CCTYPE_H
#include <CPlusPlusForwardDeclarations.h>
#include <cctype> #include <cctype>
namespace rpp { namespace CPlusPlus {
inline bool pp_isalpha (int __ch) inline bool CPLUSPLUS_EXPORT pp_isalpha (int __ch)
{ return std::isalpha ((unsigned char) __ch) != 0; } { return std::isalpha ((unsigned char) __ch) != 0; }
inline bool pp_isalnum (int __ch) inline bool CPLUSPLUS_EXPORT pp_isalnum (int __ch)
{ return std::isalnum ((unsigned char) __ch) != 0; } { return std::isalnum ((unsigned char) __ch) != 0; }
inline bool pp_isdigit (int __ch) inline bool CPLUSPLUS_EXPORT pp_isdigit (int __ch)
{ return std::isdigit ((unsigned char) __ch) != 0; } { return std::isdigit ((unsigned char) __ch) != 0; }
inline bool pp_isspace (int __ch) inline bool CPLUSPLUS_EXPORT pp_isspace (int __ch)
{ return std::isspace ((unsigned char) __ch) != 0; } { return std::isspace ((unsigned char) __ch) != 0; }
} // namespace rpp } // namespace CPlusPlus
#endif // PP_CCTYPE_H #endif // PP_CCTYPE_H

View File

@@ -34,15 +34,17 @@
#ifndef PP_CLIENT_H #ifndef PP_CLIENT_H
#define PP_CLIENT_H #define PP_CLIENT_H
#include <CPlusPlusForwardDeclarations.h>
#include <QByteArray> #include <QByteArray>
#include <QString> #include <QString>
#include <QFile> #include <QFile>
namespace rpp { namespace CPlusPlus {
class Macro; class Macro;
class Client class CPLUSPLUS_EXPORT Client
{ {
Client(const Client &other); Client(const Client &other);
void operator=(const Client &other); void operator=(const Client &other);
@@ -60,7 +62,7 @@ public:
virtual ~Client() virtual ~Client()
{ } { }
virtual void macroAdded(const QByteArray &macroId, const QByteArray &text) = 0; virtual void macroAdded(const Macro &macro) = 0;
virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature. virtual void sourceNeeded(QString &fileName, IncludeType mode) = 0; // ### FIX the signature.
virtual void startExpandingMacro(unsigned offset, virtual void startExpandingMacro(unsigned offset,
@@ -74,6 +76,6 @@ public:
virtual void stopSkippingBlocks(unsigned offset) = 0; virtual void stopSkippingBlocks(unsigned offset) = 0;
}; };
} // namespace rpp } // namespace CPlusPlus
#endif // PP_CLIENT_H #endif // PP_CLIENT_H

View File

@@ -57,7 +57,6 @@
#include <QtDebug> #include <QtDebug>
#include <algorithm> #include <algorithm>
using namespace rpp;
using namespace CPlusPlus; using namespace CPlusPlus;
namespace { namespace {
@@ -165,7 +164,15 @@ protected:
bool process_primary() bool process_primary()
{ {
if ((*_lex)->is(T_INT_LITERAL)) { if ((*_lex)->is(T_INT_LITERAL)) {
_value.set_long(tokenSpell().toLong()); int base = 10;
const QByteArray spell = tokenSpell();
if (spell.at(0) == '0') {
if (spell.size() > 1 && (spell.at(1) == 'x' || spell.at(1) == 'X'))
base = 16;
else
base = 8;
}
_value.set_long(tokenSpell().toLong(0, base));
++(*_lex); ++(*_lex);
return true; return true;
} else if (isTokenDefined()) { } else if (isTokenDefined()) {
@@ -368,7 +375,7 @@ protected:
{ {
process_xor(); process_xor();
while ((*_lex)->is(T_CARET)) { while ((*_lex)->is(T_PIPE)) {
const Token op = *(*_lex); const Token op = *(*_lex);
++(*_lex); ++(*_lex);
@@ -482,12 +489,12 @@ void pp::operator () (const QByteArray &filename,
const QByteArray &source, const QByteArray &source,
QByteArray *result) QByteArray *result)
{ {
const QByteArray previousFile = env.current_file; const QByteArray previousFile = env.currentFile;
env.current_file = filename; env.currentFile = filename;
operator () (source, result); operator () (source, result);
env.current_file = previousFile; env.currentFile = previousFile;
} }
pp::State pp::createStateFromSource(const QByteArray &source) const pp::State pp::createStateFromSource(const QByteArray &source) const
@@ -519,7 +526,7 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
result->append(QByteArray::number(_dot->lineno)); result->append(QByteArray::number(_dot->lineno));
result->append(' '); result->append(' ');
result->append('"'); result->append('"');
result->append(env.current_file); result->append(env.currentFile);
result->append('"'); result->append('"');
result->append('\n'); result->append('\n');
} else { } else {
@@ -605,28 +612,29 @@ void pp::operator()(const QByteArray &source, QByteArray *result)
m->definition.constEnd(), m->definition.constEnd(),
result); result);
m->hidden = false;
if (client) if (client)
client->stopExpandingMacro(_dot->offset, *m); client->stopExpandingMacro(_dot->offset, *m);
m->hidden = false;
continue; continue;
} else { } else {
QByteArray tmp; QByteArray tmp;
m->hidden = true;
if (client) if (client)
client->startExpandingMacro(identifierToken->offset, client->startExpandingMacro(identifierToken->offset,
*m, spell); *m, spell);
m->hidden = true;
expand(m->definition.constBegin(), expand(m->definition.constBegin(),
m->definition.constEnd(), m->definition.constEnd(),
&tmp); &tmp);
m->hidden = false;
if (client) if (client)
client->stopExpandingMacro(_dot->offset, *m); client->stopExpandingMacro(_dot->offset, *m);
m->hidden = false;
m = 0; // reset the active the macro m = 0; // reset the active the macro
pushState(createStateFromSource(tmp)); pushState(createStateFromSource(tmp));
@@ -844,6 +852,8 @@ void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken)
} }
Macro macro; Macro macro;
macro.fileName = env.currentFile;
macro.line = env.currentLine;
macro.name = tokenText(*tk); macro.name = tokenText(*tk);
++tk; // skip T_IDENTIFIER ++tk; // skip T_IDENTIFIER
@@ -907,16 +917,8 @@ void pp::processDefine(TokenIterator firstToken, TokenIterator lastToken)
env.bind(macro); env.bind(macro);
QByteArray macroText; if (client)
macroText.reserve(64); client->macroAdded(macro);
macroText += "#define ";
macroText += macroId;
macroText += ' ';
macroText += macro.definition;
macroText += '\n';
client->macroAdded(macroId, macroText);
} }
void pp::processIf(TokenIterator firstToken, TokenIterator lastToken) void pp::processIf(TokenIterator firstToken, TokenIterator lastToken)
@@ -1020,13 +1022,10 @@ void pp::processUndef(TokenIterator firstToken, TokenIterator lastToken)
if (tk->is(T_IDENTIFIER)) { if (tk->is(T_IDENTIFIER)) {
const QByteArray macroName = tokenText(*tk); const QByteArray macroName = tokenText(*tk);
env.remove(macroName); const Macro *macro = env.remove(macroName);
QByteArray macroText; if (client && macro)
macroText += "#undef "; client->macroAdded(*macro);
macroText += macroName;
macroText += '\n';
client->macroAdded(macroName, macroText);
} }
} }

View File

@@ -62,7 +62,7 @@ namespace CPlusPlus {
class Token; class Token;
} }
namespace rpp { namespace CPlusPlus {
struct Value struct Value
{ {
@@ -134,7 +134,7 @@ namespace rpp {
#undef PP_DEFINE_BIN_OP #undef PP_DEFINE_BIN_OP
}; };
class pp class CPLUSPLUS_EXPORT pp
{ {
Client *client; Client *client;
Environment &env; Environment &env;
@@ -200,7 +200,7 @@ namespace rpp {
Value evalExpression(TokenIterator firstToken, Value evalExpression(TokenIterator firstToken,
TokenIterator lastToken, TokenIterator lastToken,
const QByteArray &source) const; const QByteArray &source) const;
QVector<CPlusPlus::Token> tokenize(const QByteArray &text) const; QVector<CPlusPlus::Token> tokenize(const QByteArray &text) const;
@@ -226,6 +226,6 @@ namespace rpp {
bool isQtReservedWord(const QByteArray &name) const; bool isQtReservedWord(const QByteArray &name) const;
}; };
} // namespace rpp } // namespace CPlusPlus
#endif // PP_ENGINE_H #endif // PP_ENGINE_H

View File

@@ -52,11 +52,14 @@
#include "pp-environment.h" #include "pp-environment.h"
#include "pp.h" #include "pp.h"
#include <utils/qtcassert.h>
#include <cstring> #include <cstring>
using namespace rpp; using namespace CPlusPlus;
Environment::Environment () Environment::Environment()
: currentLine(0), : currentLine(0),
hide_next(false), hide_next(false),
_macros(0), _macros(0),
@@ -67,7 +70,7 @@ Environment::Environment ()
{ {
} }
Environment::~Environment () Environment::~Environment()
{ {
if (_macros) { if (_macros) {
qDeleteAll(firstMacro(), lastMacro()); qDeleteAll(firstMacro(), lastMacro());
@@ -78,20 +81,22 @@ Environment::~Environment ()
free(_hash); free(_hash);
} }
unsigned Environment::macroCount () const unsigned Environment::macroCount() const
{ return _macro_count + 1; } {
return _macro_count + 1;
}
Macro *Environment::macroAt (unsigned index) const Macro *Environment::macroAt(unsigned index) const
{ return _macros[index]; } {
return _macros[index];
}
Macro *Environment::bind(const Macro &__macro) Macro *Environment::bind(const Macro &__macro)
{ {
Q_ASSERT(! __macro.name.isEmpty()); QTC_ASSERT(! __macro.name.isEmpty(), return 0);
Macro *m = new Macro (__macro); Macro *m = new Macro (__macro);
m->hashcode = hash_code(m->name); m->hashcode = hash_code(m->name);
m->fileName = current_file;
m->line = currentLine;
if (++_macro_count == _allocated_macros) { if (++_macro_count == _allocated_macros) {
if (! _allocated_macros) if (! _allocated_macros)
@@ -115,12 +120,14 @@ Macro *Environment::bind(const Macro &__macro)
return m; return m;
} }
void Environment::remove (const QByteArray &name) Macro *Environment::remove(const QByteArray &name)
{ {
Macro macro; Macro macro;
macro.name = name; macro.name = name;
macro.hidden = true; macro.hidden = true;
bind(macro); macro.fileName = currentFile;
macro.line = currentLine;
return bind(macro);
} }
bool Environment::isBuiltinMacro(const QByteArray &s) const bool Environment::isBuiltinMacro(const QByteArray &s) const

View File

@@ -53,14 +53,16 @@
#ifndef PP_ENVIRONMENT_H #ifndef PP_ENVIRONMENT_H
#define PP_ENVIRONMENT_H #define PP_ENVIRONMENT_H
#include "CPlusPlusForwardDeclarations.h"
#include <QVector> #include <QVector>
#include <QByteArray> #include <QByteArray>
namespace rpp { namespace CPlusPlus {
struct Macro; class Macro;
class Environment class CPLUSPLUS_EXPORT Environment
{ {
public: public:
Environment(); Environment();
@@ -70,7 +72,7 @@ public:
Macro *macroAt(unsigned index) const; Macro *macroAt(unsigned index) const;
Macro *bind(const Macro &macro); Macro *bind(const Macro &macro);
void remove(const QByteArray &name); Macro *remove(const QByteArray &name);
Macro *resolve(const QByteArray &name) const; Macro *resolve(const QByteArray &name) const;
bool isBuiltinMacro(const QByteArray &name) const; bool isBuiltinMacro(const QByteArray &name) const;
@@ -92,7 +94,7 @@ private:
void rehash(); void rehash();
public: public:
QByteArray current_file; QByteArray currentFile;
unsigned currentLine; unsigned currentLine;
bool hide_next; bool hide_next;
@@ -104,6 +106,6 @@ private:
int _hash_count; int _hash_count;
}; };
} // namespace rpp } // namespace CPlusPlus
#endif // PP_ENVIRONMENT_H #endif // PP_ENVIRONMENT_H

View File

View File

@@ -55,7 +55,7 @@
#include <QByteArray> #include <QByteArray>
namespace rpp { namespace CPlusPlus {
namespace _PP_internal { namespace _PP_internal {
inline bool comment_p (const char *__first, const char *__last) inline bool comment_p (const char *__first, const char *__last)
@@ -73,6 +73,6 @@ inline bool comment_p (const char *__first, const char *__last)
} }
} // _PP_internal } // _PP_internal
} // namespace rpp } // namespace CPlusPlus
#endif // PP_INTERNAL_H #endif // PP_INTERNAL_H

View File

@@ -35,7 +35,7 @@
#include "pp-macro-expander.h" #include "pp-macro-expander.h"
#include <QDateTime> #include <QDateTime>
using namespace rpp; using namespace CPlusPlus;
MacroExpander::MacroExpander (Environment &env, pp_frame *frame) MacroExpander::MacroExpander (Environment &env, pp_frame *frame)
: env(env), frame(frame), : env(env), frame(frame),
@@ -73,7 +73,7 @@ const char *MacroExpander::operator () (const char *__first, const char *__last,
__result->append(QByteArray::number(env.currentLine)); __result->append(QByteArray::number(env.currentLine));
__result->append(' '); __result->append(' ');
__result->append('"'); __result->append('"');
__result->append(env.current_file); __result->append(env.currentFile);
__result->append('"'); __result->append('"');
__result->append('\n'); __result->append('\n');
++lines; ++lines;
@@ -218,7 +218,7 @@ const char *MacroExpander::operator () (const char *__first, const char *__last,
else if (fast_name == "__FILE__") else if (fast_name == "__FILE__")
{ {
__result->append('"'); __result->append('"');
__result->append(env.current_file); __result->append(env.currentFile);
__result->append('"'); __result->append('"');
continue; continue;
} }

View File

@@ -53,7 +53,7 @@
#ifndef PP_MACRO_EXPANDER_H #ifndef PP_MACRO_EXPANDER_H
#define PP_MACRO_EXPANDER_H #define PP_MACRO_EXPANDER_H
namespace rpp { namespace CPlusPlus {
struct pp_frame struct pp_frame
{ {
@@ -97,7 +97,7 @@ namespace rpp {
int generated_lines; int generated_lines;
}; };
} // namespace rpp } // namespace CPlusPlus
#endif // PP_MACRO_EXPANDER_H #endif // PP_MACRO_EXPANDER_H

View File

@@ -53,43 +53,72 @@
#ifndef PP_MACRO_H #ifndef PP_MACRO_H
#define PP_MACRO_H #define PP_MACRO_H
#include <CPlusPlusForwardDeclarations.h>
#include <QByteArray> #include <QByteArray>
#include <QVector> #include <QVector>
#include <QString>
namespace rpp { namespace CPlusPlus {
struct Macro class CPLUSPLUS_EXPORT Macro
{
public:
QByteArray name;
QByteArray definition;
QVector<QByteArray> formals;
QByteArray fileName;
int line;
Macro *next;
unsigned hashcode;
union
{ {
QByteArray name; unsigned state;
QByteArray definition;
QVector<QByteArray> formals;
QByteArray fileName;
int line;
int lines;
Macro *next;
unsigned hashcode;
union struct
{ {
unsigned state; unsigned hidden: 1;
unsigned function_like: 1;
struct unsigned variadics: 1;
{
unsigned hidden: 1;
unsigned function_like: 1;
unsigned variadics: 1;
};
}; };
};
inline Macro(): inline Macro():
line(0), line(0),
lines(0),
next(0), next(0),
hashcode(0), hashcode(0),
state(0) state(0)
{ } { }
};
} // namespace rpp QString toString() const
{
QString text;
if (hidden)
text += QLatin1String("#undef ");
else
text += QLatin1String("#define ");
text += QString::fromUtf8(name.constData(), name.size());
if (function_like) {
text += QLatin1Char('(');
bool first = true;
foreach (const QByteArray formal, formals) {
if (! first)
text += QLatin1String(", ");
else
first = false;
text += QString::fromUtf8(formal.constData(), formal.size());
}
if (variadics)
text += QLatin1String("...");
text += QLatin1Char(')');
}
text += QLatin1Char(' ');
text += QString::fromUtf8(definition.constData(), definition.size());
return text;
}
};
} // namespace CPlusPlus
#endif // PP_MACRO_H #endif // PP_MACRO_H

View File

@@ -53,7 +53,7 @@
#ifndef PP_SCANNER_H #ifndef PP_SCANNER_H
#define PP_SCANNER_H #define PP_SCANNER_H
namespace rpp { namespace CPlusPlus {
struct pp_skip_blanks struct pp_skip_blanks
{ {
@@ -373,7 +373,7 @@ struct pp_skip_argument
} }
}; };
} // namespace rpp } // namespace CPlusPlus
#endif // PP_SCANNER_H #endif // PP_SCANNER_H

View File

@@ -422,12 +422,12 @@ void PluginManager::formatPluginVersions(QTextStream &str) const
void PluginManager::startTests() void PluginManager::startTests()
{ {
#ifdef WITH_TESTS #ifdef WITH_TESTS
foreach(PluginSpec *pluginSpec, d->testSpecs) { foreach (PluginSpec *pluginSpec, d->testSpecs) {
const QMetaObject *mo = pluginSpec->plugin()->metaObject(); const QMetaObject *mo = pluginSpec->plugin()->metaObject();
QStringList methods; QStringList methods;
methods.append("arg0"); methods.append("arg0");
// We only want slots starting with "test" // We only want slots starting with "test"
for(int i = mo->methodOffset(); i < mo->methodCount(); ++i) { for (int i = mo->methodOffset(); i < mo->methodCount(); ++i) {
if (QByteArray(mo->method(i).signature()).startsWith("test")) { if (QByteArray(mo->method(i).signature()).startsWith("test")) {
QString method = QString::fromLatin1(mo->method(i).signature()); QString method = QString::fromLatin1(mo->method(i).signature());
methods.append(method.left(method.size()-2)); methods.append(method.left(method.size()-2));

View File

@@ -33,6 +33,8 @@
#include "classnamevalidatinglineedit.h" #include "classnamevalidatinglineedit.h"
#include <utils/qtcassert.h>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QRegExp> #include <QtCore/QRegExp>
@@ -53,7 +55,7 @@ ClassNameValidatingLineEditPrivate:: ClassNameValidatingLineEditPrivate() :
m_namespaceDelimiter(QLatin1String("::")), m_namespaceDelimiter(QLatin1String("::")),
m_namespacesEnabled(false) m_namespacesEnabled(false)
{ {
Q_ASSERT(m_nameRegexp.isValid()); QTC_ASSERT(m_nameRegexp.isValid(), return);
} }
// --------------------- ClassNameValidatingLineEdit // --------------------- ClassNameValidatingLineEdit
@@ -113,7 +115,7 @@ QString ClassNameValidatingLineEdit::createClassName(const QString &name)
// Remove spaces and convert the adjacent characters to uppercase // Remove spaces and convert the adjacent characters to uppercase
QString className = name; QString className = name;
QRegExp spaceMatcher(QLatin1String(" +(\\w)"), Qt::CaseSensitive, QRegExp::RegExp2); QRegExp spaceMatcher(QLatin1String(" +(\\w)"), Qt::CaseSensitive, QRegExp::RegExp2);
Q_ASSERT(spaceMatcher.isValid()); QTC_ASSERT(spaceMatcher.isValid(), /**/);
int pos; int pos;
while ((pos = spaceMatcher.indexIn(className)) != -1) { while ((pos = spaceMatcher.indexIn(className)) != -1) {
className.replace(pos, spaceMatcher.matchedLength(), className.replace(pos, spaceMatcher.matchedLength(),

View File

@@ -32,27 +32,67 @@
***************************************************************************/ ***************************************************************************/
#include "filenamevalidatinglineedit.h" #include "filenamevalidatinglineedit.h"
#include "qtcassert.h"
#include <QtCore/QRegExp>
#include <QtCore/QDebug>
namespace Core { namespace Core {
namespace Utils { namespace Utils {
FileNameValidatingLineEdit::FileNameValidatingLineEdit(QWidget *parent) : // Naming a file like a device name will break on Windows, even if it is
BaseValidatingLineEdit(parent) // "com1.txt". Since we are cross-platform, we generally disallow such file
// names.
static const QRegExp &windowsDeviceNoSubDirPattern()
{ {
static const QRegExp rc(QLatin1String("CON|AUX|PRN|COM1|COM2|LPT1|LPT2|NUL"),
Qt::CaseInsensitive);
QTC_ASSERT(rc.isValid(), return rc);
return rc;
}
static const QRegExp &windowsDeviceSubDirPattern()
{
static const QRegExp rc(QLatin1String(".*[/\\\\]CON|.*[/\\\\]AUX|.*[/\\\\]PRN|.*[/\\\\]COM1|.*[/\\\\]COM2|.*[/\\\\]LPT1|.*[/\\\\]LPT2|.*[/\\\\]NUL"),
Qt::CaseInsensitive);
QTC_ASSERT(rc.isValid(), return rc);
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. */ /* Validate a file base name, check for forbidden characters/strings. */
static const char *notAllowedChars = "/?:&\\*\"|#%<> "; #ifdef Q_OS_WIN
# define SLASHES "/\\"
#else
# define SLASHES "/"
#endif
static const char *notAllowedCharsSubDir = "?:&*\"|#%<> ";
static const char *notAllowedCharsNoSubDir = "?:&*\"|#%<> "SLASHES;
static const char *notAllowedSubStrings[] = {".."}; static const char *notAllowedSubStrings[] = {".."};
// Naming a file like a device name will break on Windows, even if it is bool FileNameValidatingLineEdit::validateFileName(const QString &name,
// "com1.txt". Since we are cross-platform, we generally disallow such file bool allowDirectories,
// names. QString *errorMessage /* = 0*/)
static const char *notAllowedStrings[] = {"CON", "AUX", "PRN", "COM1", "COM2", "LPT1", "LPT2" };
bool FileNameValidatingLineEdit::validateFileName(const QString &name, QString *errorMessage /* = 0*/)
{ {
if (name.isEmpty()) { if (name.isEmpty()) {
if (errorMessage) if (errorMessage)
@@ -60,6 +100,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 +117,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

@@ -92,7 +92,7 @@ void FileWizardPage::setName(const QString &name)
void FileWizardPage::changeEvent(QEvent *e) void FileWizardPage::changeEvent(QEvent *e)
{ {
switch(e->type()) { switch (e->type()) {
case QEvent::LanguageChange: case QEvent::LanguageChange:
m_d->m_ui.retranslateUi(this); m_d->m_ui.retranslateUi(this);
break; break;
@@ -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

@@ -32,56 +32,74 @@
***************************************************************************/ ***************************************************************************/
#include "pathchooser.h" #include "pathchooser.h"
#include "basevalidatinglineedit.h" #include "basevalidatinglineedit.h"
#include "qtcassert.h"
#include <QtGui/QLineEdit>
#include <QtGui/QHBoxLayout>
#include <QtGui/QToolButton>
#include <QtGui/QFileDialog>
#include <QtGui/QDesktopServices>
#include <QtCore/QFileInfo>
#include <QtCore/QDir>
#include <QtCore/QSettings>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QFileInfo>
#include <QtCore/QSettings>
#include <QtGui/QDesktopServices>
#include <QtGui/QFileDialog>
#include <QtGui/QHBoxLayout>
#include <QtGui/QLineEdit>
#include <QtGui/QToolButton>
namespace Core { namespace Core {
namespace Utils { namespace Utils {
#ifdef Q_OS_OSX
/*static*/ const char * const PathChooser::browseButtonLabel = "Choose...";
#else
/*static*/ const char * const PathChooser::browseButtonLabel = "Browse...";
#endif
// ------------------ PathValidatingLineEdit // ------------------ PathValidatingLineEdit
class PathValidatingLineEdit : public BaseValidatingLineEdit { class PathValidatingLineEdit : public BaseValidatingLineEdit
{
public: public:
explicit PathValidatingLineEdit(QWidget *parent = 0); explicit PathValidatingLineEdit(PathChooser *chooser, QWidget *parent = 0);
protected: protected:
virtual bool validate(const QString &value, QString *errorMessage) const; virtual bool validate(const QString &value, QString *errorMessage) const;
private:
PathChooser *m_chooser;
}; };
PathValidatingLineEdit::PathValidatingLineEdit(QWidget *parent) : PathValidatingLineEdit::PathValidatingLineEdit(PathChooser *chooser, QWidget *parent) :
BaseValidatingLineEdit(parent) BaseValidatingLineEdit(parent),
m_chooser(chooser)
{ {
QTC_ASSERT(chooser, return);
} }
bool PathValidatingLineEdit::validate(const QString &value, QString *errorMessage) const bool PathValidatingLineEdit::validate(const QString &value, QString *errorMessage) const
{ {
return PathChooser::validatePath(value, errorMessage); return m_chooser->validatePath(value, errorMessage);
} }
// ------------------ PathChooserPrivate // ------------------ PathChooserPrivate
struct PathChooserPrivate { struct PathChooserPrivate
PathChooserPrivate(); {
PathChooserPrivate(PathChooser *chooser);
PathValidatingLineEdit *m_lineEdit; PathValidatingLineEdit *m_lineEdit;
PathChooser::Kind m_acceptingKind;
QString m_dialogTitleOverride;
}; };
PathChooserPrivate::PathChooserPrivate() : PathChooserPrivate::PathChooserPrivate(PathChooser *chooser) :
m_lineEdit(new PathValidatingLineEdit) m_lineEdit(new PathValidatingLineEdit(chooser)),
m_acceptingKind(PathChooser::Directory)
{ {
} }
PathChooser::PathChooser(QWidget *parent) : PathChooser::PathChooser(QWidget *parent) :
QWidget(parent), QWidget(parent),
m_d(new PathChooserPrivate) m_d(new PathChooserPrivate(this))
{ {
QHBoxLayout *hLayout = new QHBoxLayout; QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->setContentsMargins(0, 0, 0, 0); hLayout->setContentsMargins(0, 0, 0, 0);
@@ -90,11 +108,12 @@ PathChooser::PathChooser(QWidget *parent) :
connect(m_d->m_lineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(changed())); connect(m_d->m_lineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(changed()));
connect(m_d->m_lineEdit, SIGNAL(validChanged()), this, SIGNAL(validChanged())); connect(m_d->m_lineEdit, SIGNAL(validChanged()), this, SIGNAL(validChanged()));
m_d->m_lineEdit->setMinimumWidth(300); m_d->m_lineEdit->setMinimumWidth(260);
hLayout->addWidget(m_d->m_lineEdit); hLayout->addWidget(m_d->m_lineEdit);
hLayout->setSizeConstraint(QLayout::SetMinimumSize);
QToolButton *browseButton = new QToolButton; QToolButton *browseButton = new QToolButton;
browseButton->setText(tr("...")); browseButton->setText(tr(browseButtonLabel));
connect(browseButton, SIGNAL(clicked()), this, SLOT(slotBrowse())); connect(browseButton, SIGNAL(clicked()), this, SLOT(slotBrowse()));
hLayout->addWidget(browseButton); hLayout->addWidget(browseButton);
@@ -123,11 +142,31 @@ void PathChooser::slotBrowse()
QString predefined = path(); QString predefined = path();
if (!predefined.isEmpty() && !QFileInfo(predefined).isDir()) if (!predefined.isEmpty() && !QFileInfo(predefined).isDir())
predefined.clear(); predefined.clear();
// Prompt for a directory, delete trailing slashes unless it is "/", only
QString newPath = QFileDialog::getExistingDirectory(this, tr("Choose a path"), predefined); // Prompt for a file/dir
if (!newPath .isEmpty()) { QString dialogTitle;
if (newPath .size() > 1 && newPath .endsWith(QDir::separator())) QString newPath;
newPath .truncate(newPath .size() - 1); switch (m_d->m_acceptingKind) {
case PathChooser::Directory:
newPath = QFileDialog::getExistingDirectory(this,
makeDialogTitle(tr("Choose a directory")), predefined);
break;
case PathChooser::File: // fall through
case PathChooser::Command:
newPath = QFileDialog::getOpenFileName(this,
makeDialogTitle(tr("Choose a file")), predefined);
break;
default:
;
}
// TODO make cross-platform
// Delete trailing slashes unless it is "/", only
if (!newPath.isEmpty()) {
if (newPath.size() > 1 && newPath.endsWith(QDir::separator()))
newPath.truncate(newPath.size() - 1);
setPath(newPath); setPath(newPath);
} }
} }
@@ -139,7 +178,7 @@ bool PathChooser::isValid() const
QString PathChooser::errorMessage() const QString PathChooser::errorMessage() const
{ {
return m_d->m_lineEdit->errorMessage(); return m_d->m_lineEdit->errorMessage();
} }
bool PathChooser::validatePath(const QString &path, QString *errorMessage) bool PathChooser::validatePath(const QString &path, QString *errorMessage)
@@ -149,20 +188,54 @@ bool PathChooser::validatePath(const QString &path, QString *errorMessage)
*errorMessage = tr("The path must not be empty."); *errorMessage = tr("The path must not be empty.");
return false; return false;
} }
// Must be a directory?
const QFileInfo fi(path);
if (fi.isDir())
return true; // Happy!
if (!fi.exists()) { const QFileInfo fi(path);
if (errorMessage) const bool isDir = fi.isDir();
*errorMessage = tr("The path '%1' does not exist.").arg(path);
return false; // Check if existing
switch (m_d->m_acceptingKind) {
case PathChooser::Directory: // fall through
case PathChooser::File:
if (!fi.exists()) {
if (errorMessage)
*errorMessage = tr("The path '%1' does not exist.").arg(path);
return false;
}
break;
case PathChooser::Command: // fall through
default:
;
} }
// Must be something weird
if (errorMessage) // Check expected kind
*errorMessage = tr("The path '%1' is not a directory.").arg(path); switch (m_d->m_acceptingKind) {
return false; case PathChooser::Directory:
if (!isDir) {
if (errorMessage)
*errorMessage = tr("The path '%1' is not a directory.").arg(path);
return false;
}
break;
case PathChooser::File:
if (isDir) {
if (errorMessage)
*errorMessage = tr("The path '%1' is not a file.").arg(path);
return false;
}
break;
case PathChooser::Command:
// TODO do proper command validation
// i.e. search $PATH for a matching file
break;
default:
;
}
return true;
} }
QString PathChooser::label() QString PathChooser::label()
@@ -182,5 +255,23 @@ QString PathChooser::homePath()
#endif #endif
} }
void PathChooser::setExpectedKind(Kind expected)
{
m_d->m_acceptingKind = expected;
}
void PathChooser::setPromptDialogTitle(const QString &title)
{
m_d->m_dialogTitleOverride = title;
}
QString PathChooser::makeDialogTitle(const QString &title)
{
if (m_d->m_dialogTitleOverride.isNull())
return title;
else
return m_d->m_dialogTitleOverride;
}
} // namespace Utils } // namespace Utils
} // namespace Core } // namespace Core

View File

@@ -30,6 +30,7 @@
** version 1.2, included in the file GPL_EXCEPTION.txt in this package. ** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
** **
***************************************************************************/ ***************************************************************************/
#ifndef PATHCHOOSER_H #ifndef PATHCHOOSER_H
#define PATHCHOOSER_H #define PATHCHOOSER_H
@@ -53,9 +54,23 @@ class QWORKBENCH_UTILS_EXPORT PathChooser : public QWidget
Q_PROPERTY(QString path READ path WRITE setPath DESIGNABLE true) Q_PROPERTY(QString path READ path WRITE setPath DESIGNABLE true)
public: public:
static const char * const browseButtonLabel;
explicit PathChooser(QWidget *parent = 0); explicit PathChooser(QWidget *parent = 0);
virtual ~PathChooser(); virtual ~PathChooser();
enum Kind {
Directory,
File,
Command,
// ,Any
};
// Default is <Directory>
void setExpectedKind(Kind expected);
void setPromptDialogTitle(const QString &title);
bool isValid() const; bool isValid() const;
QString errorMessage() const; QString errorMessage() const;
@@ -64,11 +79,15 @@ public:
// Returns the suggested label title when used in a form layout // Returns the suggested label title when used in a form layout
static QString label(); static QString label();
static bool validatePath(const QString &path, QString *errorMessage = 0); bool validatePath(const QString &path, QString *errorMessage = 0);
// Return the home directory, which needs some fixing under Windows. // Return the home directory, which needs some fixing under Windows.
static QString homePath(); static QString homePath();
private:
// Returns overridden title or the one from <title>
QString makeDialogTitle(const QString &title);
signals: signals:
void validChanged(); void validChanged();
void changed(); void changed();

View File

@@ -117,7 +117,7 @@ void ProjectIntroPage::setDescription(const QString &description)
void ProjectIntroPage::changeEvent(QEvent *e) void ProjectIntroPage::changeEvent(QEvent *e)
{ {
switch(e->type()) { switch (e->type()) {
case QEvent::LanguageChange: case QEvent::LanguageChange:
m_d->m_ui.retranslateUi(this); m_d->m_ui.retranslateUi(this);
break; break;

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

@@ -31,16 +31,16 @@
** **
***************************************************************************/ ***************************************************************************/
#ifndef DEBUGGER_QWB_ASSERT_H #ifndef QTC_ASSERT_H
#define DEBUGGER_QWB_ASSERT_H #define QTC_ASSERT_H
#ifdef Q_OS_UNIX #include <QtCore/QDebug>
#define QWB_ASSERT(cond, action) \
// we do not use the 'do {...} while (0)' idiom here to be able to use
// 'break' and 'continue' as 'actions'.
#define QTC_ASSERT(cond, action) \
if(cond){}else{qDebug()<<"ASSERTION"<<#cond<<"FAILED"<<__FILE__<<__LINE__;action;} if(cond){}else{qDebug()<<"ASSERTION"<<#cond<<"FAILED"<<__FILE__<<__LINE__;action;}
#else
#define QWB_ASSERT(cond, action) \
if(cond){}else{qDebug()<<"ASSERTION"<<#cond<<"FAILED";action;}
#endif
#endif // DEBUGGER_QWB_ASSERT_H #endif // QTC_ASSERT_H

View File

@@ -46,7 +46,8 @@ namespace Utils {
// QActionPushButton: A push button tied to an action // QActionPushButton: A push button tied to an action
// (similar to a QToolButton) // (similar to a QToolButton)
class QActionPushButton : public QPushButton { class QActionPushButton : public QPushButton
{
Q_OBJECT Q_OBJECT
public: public:
explicit QActionPushButton(QAction *a); explicit QActionPushButton(QAction *a);
@@ -319,7 +320,7 @@ void SubmitEditorWidget::fileSelectionChanged()
void SubmitEditorWidget::changeEvent(QEvent *e) void SubmitEditorWidget::changeEvent(QEvent *e)
{ {
switch(e->type()) { switch (e->type()) {
case QEvent::LanguageChange: case QEvent::LanguageChange:
m_d->m_ui.retranslateUi(this); m_d->m_ui.retranslateUi(this);
break; break;

View File

@@ -222,7 +222,7 @@ void BinEditor::scrollContentsBy(int dx, int dy)
void BinEditor::changeEvent(QEvent *e) void BinEditor::changeEvent(QEvent *e)
{ {
QAbstractScrollArea::changeEvent(e); QAbstractScrollArea::changeEvent(e);
if(e->type() == QEvent::ActivationChange) { if (e->type() == QEvent::ActivationChange) {
if (!isActiveWindow()) if (!isActiveWindow())
m_autoScrollTimer.stop(); m_autoScrollTimer.stop();
} }
@@ -450,7 +450,7 @@ void BinEditor::paintEvent(QPaintEvent *e)
for (int c = 0; c < 16; ++c) { for (int c = 0; c < 16; ++c) {
int pos = line * 16 + c; int pos = line * 16 + c;
if (pos >= m_data.size()) { if (pos >= m_data.size()) {
while(c < 16) { while (c < 16) {
itemStringData[c*3] = itemStringData[c*3+1] = ' '; itemStringData[c*3] = itemStringData[c*3+1] = ' ';
++c; ++c;
} }

View File

@@ -32,6 +32,7 @@
***************************************************************************/ ***************************************************************************/
#include "bookmarkmanager.h" #include "bookmarkmanager.h"
#include "bookmark.h" #include "bookmark.h"
#include "bookmarksplugin.h" #include "bookmarksplugin.h"
#include "bookmarks_global.h" #include "bookmarks_global.h"
@@ -41,12 +42,14 @@
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
#include <utils/qtcassert.h>
#include <QtCore/QDebug>
#include <QtCore/QFileInfo>
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtCore/QFileInfo>
#include <QtCore/QDebug>
#include <QtGui/QPainter>
#include <QtGui/QContextMenuEvent> #include <QtGui/QContextMenuEvent>
#include <QtGui/QPainter>
Q_DECLARE_METATYPE(Bookmarks::Internal::Bookmark*) Q_DECLARE_METATYPE(Bookmarks::Internal::Bookmark*)
@@ -173,7 +176,7 @@ void BookmarkDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
// int idx; // int idx;
// forever { // forever {
// idx = directory.lastIndexOf("/", pos-1); // idx = directory.lastIndexOf("/", pos-1);
// if(idx == -1) { // if (idx == -1) {
// // Can't happen, this means the string did fit after all? // // Can't happen, this means the string did fit after all?
// break; // break;
// } // }
@@ -272,7 +275,7 @@ void BookmarkView::removeAll()
void BookmarkView::setModel(QAbstractItemModel *model) void BookmarkView::setModel(QAbstractItemModel *model)
{ {
BookmarkManager *manager = qobject_cast<BookmarkManager *>(model); BookmarkManager *manager = qobject_cast<BookmarkManager *>(model);
Q_ASSERT(manager); QTC_ASSERT(manager, return);
QListView::setModel(model); QListView::setModel(model);
setSelectionModel(manager->selectionModel()); setSelectionModel(manager->selectionModel());
setSelectionMode(QAbstractItemView::SingleSelection); setSelectionMode(QAbstractItemView::SingleSelection);
@@ -396,11 +399,16 @@ void BookmarkManager::toggleBookmark()
if (!editor) if (!editor)
return; return;
const QFileInfo fi(editor->file()->fileName()); toggleBookmark(editor->file()->fileName(), editor->currentLine());
const int editorLine = editor->currentLine(); }
void BookmarkManager::toggleBookmark(const QString &fileName, int lineNumber)
{
const QFileInfo fi(fileName);
const int editorLine = lineNumber;
// Remove any existing bookmark on this line // Remove any existing bookmark on this line
if (Bookmark *mark = findBookmark(fi.path(), fi.fileName(), editorLine)) { if (Bookmark *mark = findBookmark(fi.path(), fi.fileName(), lineNumber)) {
// TODO check if the bookmark is really on the same markable Interface // TODO check if the bookmark is really on the same markable Interface
removeBookmark(mark); removeBookmark(mark);
return; return;

View File

@@ -34,15 +34,15 @@
#ifndef BOOKMARKMANAGER_H #ifndef BOOKMARKMANAGER_H
#define BOOKMARKMANAGER_H #define BOOKMARKMANAGER_H
#include <QtCore/QAbstractItemModel>
#include <QtGui/QListView>
#include <QtCore/QList>
#include <QtGui/QPixmap>
#include <QtGui/QStyledItemDelegate>
#include <coreplugin/icontext.h> #include <coreplugin/icontext.h>
#include <coreplugin/inavigationwidgetfactory.h> #include <coreplugin/inavigationwidgetfactory.h>
#include <QtCore/QAbstractItemModel>
#include <QtCore/QList>
#include <QtGui/QListView>
#include <QtGui/QPixmap>
#include <QtGui/QStyledItemDelegate>
namespace ProjectExplorer { namespace ProjectExplorer {
class SessionManager; class SessionManager;
} }
@@ -89,10 +89,16 @@ public:
// this QItemSelectionModel is shared by all views // this QItemSelectionModel is shared by all views
QItemSelectionModel *selectionModel() const; QItemSelectionModel *selectionModel() const;
enum Roles {Filename = Qt::UserRole, LineNumber = Qt::UserRole + 1, Directory = Qt::UserRole + 2, LineText = Qt::UserRole + 3}; enum Roles {
Filename = Qt::UserRole,
LineNumber = Qt::UserRole + 1,
Directory = Qt::UserRole + 2,
LineText = Qt::UserRole + 3
};
public slots: public slots:
void toggleBookmark(); void toggleBookmark();
void toggleBookmark(const QString &fileName, int lineNumber);
void nextInDocument(); void nextInDocument();
void prevInDocument(); void prevInDocument();
void next(); void next();
@@ -108,6 +114,7 @@ private slots:
void updateActionStatus(); void updateActionStatus();
void gotoBookmark(Bookmark *bookmark); void gotoBookmark(Bookmark *bookmark);
void loadBookmarks(); void loadBookmarks();
private: private:
TextEditor::ITextEditor *currentTextEditor() const; TextEditor::ITextEditor *currentTextEditor() const;
ProjectExplorer::SessionManager* sessionManager() const; ProjectExplorer::SessionManager* sessionManager() const;
@@ -120,8 +127,8 @@ private:
static QString bookmarkToString(const Bookmark *b); static QString bookmarkToString(const Bookmark *b);
void saveBookmarks(); void saveBookmarks();
typedef QMultiMap<QString, Bookmark*> FileNameBookmarksMap; typedef QMultiMap<QString, Bookmark *> FileNameBookmarksMap;
typedef QMap<QString, FileNameBookmarksMap*> DirectoryFileBookmarksMap; typedef QMap<QString, FileNameBookmarksMap *> DirectoryFileBookmarksMap;
DirectoryFileBookmarksMap m_bookmarksMap; DirectoryFileBookmarksMap m_bookmarksMap;
Core::ICore *m_core; Core::ICore *m_core;
@@ -138,7 +145,7 @@ class BookmarkView : public QListView
public: public:
BookmarkView(QWidget *parent = 0); BookmarkView(QWidget *parent = 0);
~BookmarkView(); ~BookmarkView();
void setModel(QAbstractItemModel * model); void setModel(QAbstractItemModel *model);
public slots: public slots:
void gotoBookmark(const QModelIndex &index); void gotoBookmark(const QModelIndex &index);
protected slots: protected slots:
@@ -146,7 +153,7 @@ protected slots:
void removeAll(); void removeAll();
protected: protected:
void contextMenuEvent(QContextMenuEvent *event); void contextMenuEvent(QContextMenuEvent *event);
void removeBookmark(const QModelIndex& index); void removeBookmark(const QModelIndex &index);
private: private:
BookmarkContext *m_bookmarkContext; BookmarkContext *m_bookmarkContext;
QModelIndex m_contextMenuIndex; QModelIndex m_contextMenuIndex;

View File

@@ -36,17 +36,22 @@
#include "bookmarks_global.h" #include "bookmarks_global.h"
#include <texteditor/texteditorconstants.h> #include <texteditor/texteditorconstants.h>
#include <texteditor/itexteditor.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <coreplugin/actionmanager/actionmanagerinterface.h> #include <coreplugin/actionmanager/actionmanagerinterface.h>
#include <QtCore/qplugin.h> #include <QtCore/qplugin.h>
#include <QtCore/QDebug>
#include <QtGui/QMenu> #include <QtGui/QMenu>
#include <QDebug>
using namespace Bookmarks::Constants; using namespace Bookmarks::Constants;
using namespace Bookmarks::Internal; using namespace Bookmarks::Internal;
using namespace TextEditor;
BookmarksPlugin *BookmarksPlugin::m_instance = 0; BookmarksPlugin *BookmarksPlugin::m_instance = 0;
@@ -159,6 +164,19 @@ bool BookmarksPlugin::initialize(const QStringList & /*arguments*/, QString *)
updateActions(m_bookmarkManager->state()); updateActions(m_bookmarkManager->state());
addAutoReleasedObject(new BookmarkViewFactory(m_bookmarkManager)); addAutoReleasedObject(new BookmarkViewFactory(m_bookmarkManager));
m_bookmarkMarginAction = new QAction(this);
m_bookmarkMarginAction->setText("Toggle Bookmark");
//m_bookmarkAction->setIcon(QIcon(":/gdbdebugger/images/breakpoint.svg"));
connect(m_bookmarkMarginAction, SIGNAL(triggered()),
this, SLOT(bookmarkMarginActionTriggered()));
// EditorManager
QObject *editorManager = m_core->editorManager();
connect(editorManager, SIGNAL(editorAboutToClose(Core::IEditor*)),
this, SLOT(editorAboutToClose(Core::IEditor*)));
connect(editorManager, SIGNAL(editorOpened(Core::IEditor*)),
this, SLOT(editorOpened(Core::IEditor*)));
return true; return true;
} }
@@ -169,7 +187,6 @@ BookmarksPlugin::~BookmarksPlugin()
void BookmarksPlugin::updateActions(int state) void BookmarksPlugin::updateActions(int state)
{ {
const bool hasbm = state >= BookmarkManager::HasBookMarks; const bool hasbm = state >= BookmarkManager::HasBookMarks;
const bool hasdocbm = state == BookmarkManager::HasBookmarksInDocument; const bool hasdocbm = state == BookmarkManager::HasBookmarksInDocument;
@@ -182,4 +199,32 @@ void BookmarksPlugin::updateActions(int state)
m_moveDownAction->setEnabled(hasbm); m_moveDownAction->setEnabled(hasbm);
} }
void BookmarksPlugin::editorOpened(Core::IEditor *editor)
{
connect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
}
void BookmarksPlugin::editorAboutToClose(Core::IEditor *editor)
{
disconnect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
}
void BookmarksPlugin::requestContextMenu(TextEditor::ITextEditor *editor,
int lineNumber, QMenu *menu)
{
m_bookmarkMarginActionLineNumber = lineNumber;
m_bookmarkMarginActionFileName = editor->file()->fileName();
menu->addAction(m_bookmarkMarginAction);
}
void BookmarksPlugin::bookmarkMarginActionTriggered()
{
m_bookmarkManager->toggleBookmark(
m_bookmarkMarginActionFileName,
m_bookmarkMarginActionLineNumber
);
}
Q_EXPORT_PLUGIN(BookmarksPlugin) Q_EXPORT_PLUGIN(BookmarksPlugin)

View File

@@ -31,18 +31,26 @@
** **
***************************************************************************/ ***************************************************************************/
#ifndef BOOKMARKS_H #ifndef BOOKMARKSPLUGIN_H
#define BOOKMARKS_H #define BOOKMARKSPLUGIN_H
#include <extensionsystem/iplugin.h>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QMultiMap> #include <QtCore/QMultiMap>
#include <extensionsystem/iplugin.h> QT_BEGIN_NAMESPACE
class QAction;
QT_FORWARD_DECLARE_CLASS(QAction) class QMenu;
QT_END_NAMESPACE
namespace Core { namespace Core {
class ICore; class ICore;
class IEditor;
}
namespace TextEditor {
class ITextEditor;
} }
namespace Bookmarks { namespace Bookmarks {
@@ -67,6 +75,13 @@ public:
public slots: public slots:
void updateActions(int stateMask); void updateActions(int stateMask);
private slots:
void editorOpened(Core::IEditor *editor);
void editorAboutToClose(Core::IEditor *editor);
void requestContextMenu(TextEditor::ITextEditor *editor,
int lineNumber, QMenu *menu);
void bookmarkMarginActionTriggered();
private: private:
static BookmarksPlugin *m_instance; static BookmarksPlugin *m_instance;
BookmarkManager *m_bookmarkManager; BookmarkManager *m_bookmarkManager;
@@ -79,6 +94,10 @@ private:
QAction *m_docNextAction; QAction *m_docNextAction;
QAction *m_moveUpAction; QAction *m_moveUpAction;
QAction *m_moveDownAction; QAction *m_moveDownAction;
QAction *m_bookmarkMarginAction;
int m_bookmarkMarginActionLineNumber;
QString m_bookmarkMarginActionFileName;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -32,13 +32,20 @@
***************************************************************************/ ***************************************************************************/
#include "cmakeproject.h" #include "cmakeproject.h"
#include "cmakeprojectconstants.h" #include "cmakeprojectconstants.h"
#include "cmakeprojectnodes.h" #include "cmakeprojectnodes.h"
#include "cmakerunconfiguration.h"
#include "cmakestep.h"
#include "makestep.h"
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <cpptools/cppmodelmanagerinterface.h> #include <cpptools/cppmodelmanagerinterface.h>
#include <utils/qtcassert.h>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QProcess>
using namespace CMakeProjectManager; using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal; using namespace CMakeProjectManager::Internal;
@@ -46,27 +53,40 @@ using namespace CMakeProjectManager::Internal;
CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName) CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName)
: m_manager(manager), m_fileName(fileName), m_rootNode(new CMakeProjectNode(m_fileName)) : m_manager(manager), m_fileName(fileName), m_rootNode(new CMakeProjectNode(m_fileName))
{ {
//TODO
m_file = new CMakeFile(this, fileName); m_file = new CMakeFile(this, fileName);
QDir dir = QFileInfo(m_fileName).absoluteDir(); QDir dir = QFileInfo(m_fileName).absoluteDir();
QString cbpFile = findCbpFile(dir); QString cbpFile = findCbpFile(dir);
if (cbpFile.isEmpty()) if (cbpFile.isEmpty())
cbpFile = createCbpFile(dir); cbpFile = createCbpFile(dir);
//TODO move this parsing to a seperate method, which is also called if the CMakeList.txt is updated
CMakeCbpParser cbpparser; CMakeCbpParser cbpparser;
if (cbpparser.parseCbpFile(cbpFile)) { if (cbpparser.parseCbpFile(cbpFile)) {
// TODO do a intelligent updating of the tree
buildTree(m_rootNode, cbpparser.fileList()); buildTree(m_rootNode, cbpparser.fileList());
foreach(ProjectExplorer::FileNode *fn, cbpparser.fileList()) foreach (ProjectExplorer::FileNode *fn, cbpparser.fileList())
m_files.append(fn->path()); m_files.append(fn->path());
m_files.sort(); m_files.sort();
m_targets = cbpparser.targets();
qDebug()<<"Printing targets";
foreach(CMakeTarget ct, m_targets) {
qDebug()<<ct.title<<" with executable:"<<ct.executable;
qDebug()<<"WD:"<<ct.workingDirectory;
qDebug()<<ct.makeCommand<<ct.makeCleanCommand;
qDebug()<<"";
}
CppTools::CppModelManagerInterface *modelmanager = ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>(); CppTools::CppModelManagerInterface *modelmanager = ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
if (modelmanager) { if (modelmanager) {
CppTools::CppModelManagerInterface::ProjectInfo *pinfo = modelmanager->projectInfo(this); CppTools::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this);
pinfo->includePaths = cbpparser.includeFiles(); pinfo.includePaths = cbpparser.includeFiles();
// TODO we only want C++ files, not all other stuff that might be in the project // TODO we only want C++ files, not all other stuff that might be in the project
pinfo->sourceFiles = m_files; pinfo.sourceFiles = m_files;
// TODO defines // TODO defines
// TODO gcc preprocessor files
modelmanager->updateProjectInfo(pinfo);
} }
} else { } else {
// TODO report error // TODO report error
@@ -84,25 +104,27 @@ QString CMakeProject::findCbpFile(const QDir &directory)
// TODO the cbp file is named like the project() command in the CMakeList.txt file // TODO the cbp file is named like the project() command in the CMakeList.txt file
// so this method below could find the wrong cbp file, if the user changes the project() // so this method below could find the wrong cbp file, if the user changes the project()
// name // name
foreach(const QString &cbpFile , directory.entryList()) foreach (const QString &cbpFile , directory.entryList()) {
{ if (cbpFile.endsWith(".cbp"))
if (cbpFile.endsWith(".cbp")) {
return directory.path() + "/" + cbpFile; return directory.path() + "/" + cbpFile;
}
} }
return QString::null; return QString::null;
} }
QString CMakeProject::createCbpFile(const QDir &directory)
QString CMakeProject::createCbpFile(const QDir &)
{ {
// TODO create a cbp file. // We create a cbp file, only if we didn't find a cbp file in the base directory
// Issue: Where to create it? We want to do that in the build directory // Yet that can still override cbp files in subdirectories
// but at this stage we don't know the build directory yet // And we are creating tons of files in the source directories
// So create it in a temp directory? // All of that is not really nice.
// Issue: We want to reuse whatever CMakeCache.txt that is alread there, which // The mid term plan is to move away from the CodeBlocks Generator and use our own
// would indicate, creating it in the build directory // QtCreator generator, which actually can be very similar to the CodeBlock Generator
// Or we could use a temp directory and use -C builddirectory
// TODO we need to pass on the same paremeters as the cmakestep
QProcess cmake;
cmake.setWorkingDirectory(directory.absolutePath());
cmake.start("cmake", QStringList() << "-GCodeBlocks - Unix Makefiles");
return QString::null; return QString::null;
} }
@@ -110,7 +132,7 @@ void CMakeProject::buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::
{ {
//m_rootNode->addFileNodes(fileList, m_rootNode); //m_rootNode->addFileNodes(fileList, m_rootNode);
qSort(list.begin(), list.end(), ProjectExplorer::ProjectNode::sortNodesByPath); qSort(list.begin(), list.end(), ProjectExplorer::ProjectNode::sortNodesByPath);
foreach( ProjectExplorer::FileNode *fn, list) { foreach (ProjectExplorer::FileNode *fn, list) {
// Get relative path to rootNode // Get relative path to rootNode
QString parentDir = QFileInfo(fn->path()).absolutePath(); QString parentDir = QFileInfo(fn->path()).absolutePath();
ProjectExplorer::FolderNode *folder = findOrCreateFolder(rootNode, parentDir); ProjectExplorer::FolderNode *folder = findOrCreateFolder(rootNode, parentDir);
@@ -124,10 +146,10 @@ ProjectExplorer::FolderNode *CMakeProject::findOrCreateFolder(CMakeProjectNode *
QString relativePath = QDir(QFileInfo(rootNode->path()).path()).relativeFilePath(directory); QString relativePath = QDir(QFileInfo(rootNode->path()).path()).relativeFilePath(directory);
QStringList parts = relativePath.split("/"); QStringList parts = relativePath.split("/");
ProjectExplorer::FolderNode *parent = rootNode; ProjectExplorer::FolderNode *parent = rootNode;
foreach(const QString &part, parts) { foreach (const QString &part, parts) {
// Find folder in subFolders // Find folder in subFolders
bool found = false; bool found = false;
foreach(ProjectExplorer::FolderNode *folder, parent->subFolderNodes()) { foreach (ProjectExplorer::FolderNode *folder, parent->subFolderNodes()) {
if (QFileInfo(folder->path()).fileName() == part) { if (QFileInfo(folder->path()).fileName() == part) {
// yeah found something :) // yeah found something :)
parent = folder; parent = folder;
@@ -187,7 +209,7 @@ QString CMakeProject::buildDirectory(const QString &buildConfiguration) const
{ {
Q_UNUSED(buildConfiguration) Q_UNUSED(buildConfiguration)
//TODO //TODO
return ""; return QFileInfo(m_fileName).absolutePath();
} }
ProjectExplorer::BuildStepConfigWidget *CMakeProject::createConfigWidget() ProjectExplorer::BuildStepConfigWidget *CMakeProject::createConfigWidget()
@@ -224,13 +246,37 @@ QStringList CMakeProject::files(FilesMode fileMode) const
void CMakeProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer) void CMakeProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer)
{ {
// TODO // TODO
Q_UNUSED(writer) Project::saveSettingsImpl(writer);
} }
void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader) void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader)
{ {
// TODO // TODO
Q_UNUSED(reader) Project::restoreSettingsImpl(reader);
if (buildConfigurations().isEmpty()) {
// No build configuration, adding those
CMakeStep *cmakeStep = new CMakeStep(this);
MakeStep *makeStep = new MakeStep(this);
insertBuildStep(0, cmakeStep);
insertBuildStep(1, makeStep);
// Create build configurations of m_targets
qDebug()<<"Create build configurations of m_targets";
foreach(const CMakeTarget &ct, m_targets) {
addBuildConfiguration(ct.title);
makeStep->setValue(ct.title, "makeCommand", ct.makeCommand);
makeStep->setValue(ct.title, "makeCleanCommand", ct.makeCleanCommand);
QSharedPointer<ProjectExplorer::RunConfiguration> rc(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory));
// TODO set build configuration to build before it can be run
addRunConfiguration(rc);
setActiveRunConfiguration(rc); // TODO what exactly shall be the active run configuration?
}
setActiveBuildConfiguration("all");
}
// Restoring is fine
} }
@@ -313,7 +359,7 @@ bool CMakeCbpParser::parseCbpFile(const QString &fileName)
if (fi.exists() && fi.open(QFile::ReadOnly)) { if (fi.exists() && fi.open(QFile::ReadOnly)) {
setDevice(&fi); setDevice(&fi);
while(!atEnd()) { while (!atEnd()) {
readNext(); readNext();
if (name() == "CodeBlocks_project_file") { if (name() == "CodeBlocks_project_file") {
parseCodeBlocks_project_file(); parseCodeBlocks_project_file();
@@ -331,7 +377,7 @@ bool CMakeCbpParser::parseCbpFile(const QString &fileName)
void CMakeCbpParser::parseCodeBlocks_project_file() void CMakeCbpParser::parseCodeBlocks_project_file()
{ {
while(!atEnd()) { while (!atEnd()) {
readNext(); readNext();
if (isEndElement()) { if (isEndElement()) {
return; return;
@@ -345,7 +391,7 @@ void CMakeCbpParser::parseCodeBlocks_project_file()
void CMakeCbpParser::parseProject() void CMakeCbpParser::parseProject()
{ {
while(!atEnd()) { while (!atEnd()) {
readNext(); readNext();
if (isEndElement()) { if (isEndElement()) {
return; return;
@@ -361,7 +407,7 @@ void CMakeCbpParser::parseProject()
void CMakeCbpParser::parseBuild() void CMakeCbpParser::parseBuild()
{ {
while(!atEnd()) { while (!atEnd()) {
readNext(); readNext();
if (isEndElement()) { if (isEndElement()) {
return; return;
@@ -375,12 +421,86 @@ void CMakeCbpParser::parseBuild()
void CMakeCbpParser::parseTarget() void CMakeCbpParser::parseTarget()
{ {
while(!atEnd()) { m_targetType = false;
m_target.clear();
if (attributes().hasAttribute("title"))
m_target.title = attributes().value("title").toString();
while (!atEnd()) {
readNext(); readNext();
if (isEndElement()) { if (isEndElement()) {
if (m_targetType || m_target.title == "all") {
m_targets.append(m_target);
}
return; return;
} else if (name() == "Compiler") { } else if (name() == "Compiler") {
parseCompiler(); parseCompiler();
} else if (name() == "Option") {
parseTargetOption();
} else if (isStartElement()) {
parseUnknownElement();
}
}
}
void CMakeCbpParser::parseTargetOption()
{
if (attributes().hasAttribute("output"))
m_target.executable = attributes().value("output").toString();
else if (attributes().hasAttribute("type") && attributes().value("type") == "1")
m_targetType = true;
else if (attributes().hasAttribute("working_dir"))
m_target.workingDirectory = attributes().value("working_dir").toString();
while (!atEnd()) {
readNext();
if (isEndElement()) {
return;
} else if (name() == "MakeCommand") {
parseMakeCommand();
} else if (isStartElement()) {
parseUnknownElement();
}
}
}
void CMakeCbpParser::parseMakeCommand()
{
while (!atEnd()) {
readNext();
if (isEndElement()) {
return;
} else if (name() == "Build") {
parseTargetBuild();
} else if (name() == "Clean") {
parseTargetClean();
} else if (isStartElement()) {
parseUnknownElement();
}
}
}
void CMakeCbpParser::parseTargetBuild()
{
if (attributes().hasAttribute("command"))
m_target.makeCommand = attributes().value("command").toString();
while (!atEnd()) {
readNext();
if (isEndElement()) {
return;
} else if (isStartElement()) {
parseUnknownElement();
}
}
}
void CMakeCbpParser::parseTargetClean()
{
if (attributes().hasAttribute("command"))
m_target.makeCleanCommand = attributes().value("command").toString();
while (!atEnd()) {
readNext();
if (isEndElement()) {
return;
} else if (isStartElement()) { } else if (isStartElement()) {
parseUnknownElement(); parseUnknownElement();
} }
@@ -389,7 +509,7 @@ void CMakeCbpParser::parseTarget()
void CMakeCbpParser::parseCompiler() void CMakeCbpParser::parseCompiler()
{ {
while(!atEnd()) { while (!atEnd()) {
readNext(); readNext();
if (isEndElement()) { if (isEndElement()) {
return; return;
@@ -404,7 +524,7 @@ void CMakeCbpParser::parseCompiler()
void CMakeCbpParser::parseAdd() void CMakeCbpParser::parseAdd()
{ {
m_includeFiles.append(attributes().value("directory").toString()); m_includeFiles.append(attributes().value("directory").toString());
while(!atEnd()) { while (!atEnd()) {
readNext(); readNext();
if (isEndElement()) { if (isEndElement()) {
return; return;
@@ -420,7 +540,7 @@ void CMakeCbpParser::parseUnit()
QString fileName = attributes().value("filename").toString(); QString fileName = attributes().value("filename").toString();
if (!fileName.endsWith(".rule")) if (!fileName.endsWith(".rule"))
m_fileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::SourceType, false)); m_fileList.append( new ProjectExplorer::FileNode(fileName, ProjectExplorer::SourceType, false));
while(!atEnd()) { while (!atEnd()) {
readNext(); readNext();
if (isEndElement()) { if (isEndElement()) {
return; return;
@@ -432,7 +552,7 @@ void CMakeCbpParser::parseUnit()
void CMakeCbpParser::parseUnknownElement() void CMakeCbpParser::parseUnknownElement()
{ {
Q_ASSERT(isStartElement()); QTC_ASSERT(isStartElement(), /**/);
while (!atEnd()) { while (!atEnd()) {
readNext(); readNext();
@@ -454,3 +574,18 @@ QStringList CMakeCbpParser::includeFiles()
{ {
return m_includeFiles; return m_includeFiles;
} }
QList<CMakeTarget> CMakeCbpParser::targets()
{
return m_targets;
}
void CMakeTarget::clear()
{
executable = QString::null;
makeCommand = QString::null;
makeCleanCommand = QString::null;
workingDirectory = QString::null;
title = QString::null;
}

View File

@@ -49,6 +49,16 @@ namespace Internal{
class CMakeFile; class CMakeFile;
struct CMakeTarget
{
QString title;
QString executable;
QString workingDirectory;
QString makeCommand;
QString makeCleanCommand;
void clear();
};
class CMakeProject : public ProjectExplorer::Project class CMakeProject : public ProjectExplorer::Project
{ {
Q_OBJECT Q_OBJECT
@@ -105,6 +115,7 @@ private:
// TODO probably need a CMake specific node structure // TODO probably need a CMake specific node structure
CMakeProjectNode* m_rootNode; CMakeProjectNode* m_rootNode;
QStringList m_files; QStringList m_files;
QList<CMakeTarget> m_targets;
protected: protected:
virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer); virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer);
@@ -118,11 +129,16 @@ public:
bool parseCbpFile(const QString &fileName); bool parseCbpFile(const QString &fileName);
QList<ProjectExplorer::FileNode *> fileList(); QList<ProjectExplorer::FileNode *> fileList();
QStringList includeFiles(); QStringList includeFiles();
QList<CMakeTarget> targets();
private: private:
void parseCodeBlocks_project_file(); void parseCodeBlocks_project_file();
void parseProject(); void parseProject();
void parseBuild(); void parseBuild();
void parseTarget(); void parseTarget();
void parseTargetOption();
void parseMakeCommand();
void parseTargetBuild();
void parseTargetClean();
void parseCompiler(); void parseCompiler();
void parseAdd(); void parseAdd();
void parseUnit(); void parseUnit();
@@ -130,6 +146,10 @@ private:
QList<ProjectExplorer::FileNode *> m_fileList; QList<ProjectExplorer::FileNode *> m_fileList;
QStringList m_includeFiles; QStringList m_includeFiles;
CMakeTarget m_target;
bool m_targetType;
QList<CMakeTarget> m_targets;
}; };
class CMakeFile : public Core::IFile class CMakeFile : public Core::IFile

View File

@@ -41,6 +41,7 @@ const char * const PROJECTCONTEXT = "CMakeProject.ProjectContext";
const char * const CMAKEMIMETYPE = "text/x-cmake"; // TOOD check that this is correct const char * const CMAKEMIMETYPE = "text/x-cmake"; // TOOD check that this is correct
const char * const CMAKESTEP = "CMakeProjectManager.CMakeStep"; const char * const CMAKESTEP = "CMakeProjectManager.CMakeStep";
const char * const MAKESTEP = "CMakeProjectManager.MakeStep"; const char * const MAKESTEP = "CMakeProjectManager.MakeStep";
const char * const CMAKERUNCONFIGURATION = "CMakeProjectManager.CMakeRunConfiguration";
} // namespace Constants } // namespace Constants

View File

@@ -8,11 +8,13 @@ HEADERS = cmakeproject.h \
cmakeprojectconstants.h \ cmakeprojectconstants.h \
cmakeprojectnodes.h \ cmakeprojectnodes.h \
cmakestep.h \ cmakestep.h \
makestep.h makestep.h \
cmakerunconfiguration.h
SOURCES = cmakeproject.cpp \ SOURCES = cmakeproject.cpp \
cmakeprojectplugin.cpp \ cmakeprojectplugin.cpp \
cmakeprojectmanager.cpp \ cmakeprojectmanager.cpp \
cmakeprojectnodes.cpp \ cmakeprojectnodes.cpp \
cmakestep.cpp \ cmakestep.cpp \
makestep.cpp makestep.cpp \
cmakerunconfiguration.cpp
RESOURCES += cmakeproject.qrc RESOURCES += cmakeproject.qrc

View File

@@ -33,6 +33,7 @@
#include "cmakeprojectplugin.h" #include "cmakeprojectplugin.h"
#include "cmakeprojectmanager.h" #include "cmakeprojectmanager.h"
#include "cmakerunconfiguration.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/mimedatabase.h> #include <coreplugin/mimedatabase.h>
@@ -57,6 +58,7 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString *
if (!core->mimeDatabase()->addMimeTypes(QLatin1String(":cmakeproject/CMakeProject.mimetypes.xml"), errorMessage)) if (!core->mimeDatabase()->addMimeTypes(QLatin1String(":cmakeproject/CMakeProject.mimetypes.xml"), errorMessage))
return false; return false;
addAutoReleasedObject(new CMakeManager()); addAutoReleasedObject(new CMakeManager());
addAutoReleasedObject(new CMakeRunConfigurationFactory());
return true; return true;
} }

View File

@@ -0,0 +1,157 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#include "cmakerunconfiguration.h"
#include "cmakeproject.h"
#include "cmakeprojectconstants.h"
#include <projectexplorer/environment.h>
#include <utils/qtcassert.h>
using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal;
CMakeRunConfiguration::CMakeRunConfiguration(CMakeProject *pro, const QString &target, const QString &workingDirectory)
: ProjectExplorer::ApplicationRunConfiguration(pro), m_target(target), m_workingDirectory(workingDirectory)
{
setName(target);
}
CMakeRunConfiguration::~CMakeRunConfiguration()
{
}
QString CMakeRunConfiguration::type() const
{
return Constants::CMAKERUNCONFIGURATION;
}
QString CMakeRunConfiguration::executable() const
{
return m_target;
}
ProjectExplorer::ApplicationRunConfiguration::RunMode CMakeRunConfiguration::runMode() const
{
return ProjectExplorer::ApplicationRunConfiguration::Gui;
}
QString CMakeRunConfiguration::workingDirectory() const
{
return m_workingDirectory;
}
QStringList CMakeRunConfiguration::commandLineArguments() const
{
// TODO
return QStringList();
}
ProjectExplorer::Environment CMakeRunConfiguration::environment() const
{
// TODO
return ProjectExplorer::Environment::systemEnvironment();
}
void CMakeRunConfiguration::save(ProjectExplorer::PersistentSettingsWriter &writer) const
{
ProjectExplorer::ApplicationRunConfiguration::save(writer);
}
void CMakeRunConfiguration::restore(const ProjectExplorer::PersistentSettingsReader &reader)
{
ProjectExplorer::ApplicationRunConfiguration::restore(reader);
}
QWidget *CMakeRunConfiguration::configurationWidget()
{
//TODO
return new QWidget();
}
// Factory
CMakeRunConfigurationFactory::CMakeRunConfigurationFactory()
{
}
CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory()
{
}
// used to recreate the runConfigurations when restoring settings
bool CMakeRunConfigurationFactory::canCreate(const QString &type) const
{
if (type.startsWith(Constants::CMAKERUNCONFIGURATION))
return true;
return false;
}
// used to show the list of possible additons to a project, returns a list of types
QStringList CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Project *project) const
{
CMakeProject *pro = qobject_cast<CMakeProject *>(project);
if (!pro)
return QStringList();
// TODO gather all targets and return them here
return QStringList();
}
// used to translate the types to names to display to the user
QString CMakeRunConfigurationFactory::nameForType(const QString &type) const
{
QTC_ASSERT(type.startsWith(Constants::CMAKERUNCONFIGURATION), /**/);
if (type == Constants::CMAKERUNCONFIGURATION)
return "CMake"; // Doesn't happen
else
return type.mid(QString(Constants::CMAKERUNCONFIGURATION).length());
}
QSharedPointer<ProjectExplorer::RunConfiguration> CMakeRunConfigurationFactory::create(ProjectExplorer::Project *project, const QString &type)
{
CMakeProject *pro = qobject_cast<CMakeProject *>(project);
QTC_ASSERT(pro, /**/);
if (type == Constants::CMAKERUNCONFIGURATION) {
// Restoring, filename will be added by restoreSettings
QSharedPointer<ProjectExplorer::RunConfiguration> rc(new CMakeRunConfiguration(pro, QString::null, QString::null));
return rc;
} else {
// Adding new
QString file = type.mid(QString(Constants::CMAKERUNCONFIGURATION).length());
QSharedPointer<ProjectExplorer::RunConfiguration> rc(new CMakeRunConfiguration(pro, file, QString::null));
return rc;
}
}

View File

@@ -0,0 +1,93 @@
/***************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
** Licensees may use this file in accordance with the Qt Beta Version
** License Agreement, Agreement version 2.2 provided with the Software or,
** alternatively, in accordance with the terms contained in a written
** agreement between you and Nokia.
**
** GNU General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the packaging
** of this file. Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
**
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
** http://www.gnu.org/copyleft/gpl.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt GPL Exception
** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
**
***************************************************************************/
#ifndef CMAKERUNCONFIGURATION_H
#define CMAKERUNCONFIGURATION_H
#include <projectexplorer/applicationrunconfiguration.h>
#include <projectexplorer/environment.h>
#include <projectexplorer/persistentsettings.h>
namespace CMakeProjectManager {
namespace Internal {
class CMakeProject;
class CMakeRunConfiguration : public ProjectExplorer::ApplicationRunConfiguration
{
public:
CMakeRunConfiguration(CMakeProject *pro, const QString &target, const QString &workingDirectory);
virtual ~CMakeRunConfiguration();
virtual QString type() const;
virtual QString executable() const;
virtual RunMode runMode() const;
virtual QString workingDirectory() const;
virtual QStringList commandLineArguments() const;
virtual ProjectExplorer::Environment environment() const;
virtual QWidget *configurationWidget();
virtual void save(ProjectExplorer::PersistentSettingsWriter &writer) const;
virtual void restore(const ProjectExplorer::PersistentSettingsReader &reader);
private:
QString m_target;
QString m_workingDirectory;
};
/* The run configuration factory is used for restoring run configurations from
* settings. And used to create new runconfigurations in the "Run Settings" Dialog.
* For the first case bool canCreate(const QString &type) and
* QSharedPointer<RunConfiguration> create(Project *project, QString type) are used.
* For the second type the functions QStringList canCreate(Project *pro) and
* QString nameForType(const QString&) are used to generate a list of creatable
* RunConfigurations, and create(..) is used to create it.
*/
class CMakeRunConfigurationFactory : public QObject
{
Q_OBJECT;
public:
CMakeRunConfigurationFactory();
virtual ~CMakeRunConfigurationFactory();
// used to recreate the runConfigurations when restoring settings
virtual bool canCreate(const QString &type) const;
// used to show the list of possible additons to a project, returns a list of types
virtual QStringList canCreate(ProjectExplorer::Project *pro) const;
// used to translate the types to names to display to the user
virtual QString nameForType(const QString &type) const;
virtual QSharedPointer<ProjectExplorer::RunConfiguration> create(ProjectExplorer::Project *project, const QString &type);
};
}
}
#endif // CMAKERUNCONFIGURATION_H

View File

@@ -32,8 +32,11 @@
***************************************************************************/ ***************************************************************************/
#include "cmakestep.h" #include "cmakestep.h"
#include "cmakeprojectconstants.h"
#include "cmakeproject.h" #include "cmakeproject.h"
#include "cmakeprojectconstants.h"
#include <utils/qtcassert.h>
using namespace CMakeProjectManager; using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal; using namespace CMakeProjectManager::Internal;
@@ -41,12 +44,10 @@ using namespace CMakeProjectManager::Internal;
CMakeStep::CMakeStep(CMakeProject *pro) CMakeStep::CMakeStep(CMakeProject *pro)
: AbstractProcessStep(pro), m_pro(pro) : AbstractProcessStep(pro), m_pro(pro)
{ {
} }
CMakeStep::~CMakeStep() CMakeStep::~CMakeStep()
{ {
} }
bool CMakeStep::init(const QString &buildConfiguration) bool CMakeStep::init(const QString &buildConfiguration)
@@ -54,13 +55,18 @@ bool CMakeStep::init(const QString &buildConfiguration)
setEnabled(buildConfiguration, true); setEnabled(buildConfiguration, true);
setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration)); setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration));
setCommand(buildConfiguration, "cmake"); // TODO give full path here? setCommand(buildConfiguration, "cmake"); // TODO give full path here?
setArguments(buildConfiguration, QStringList()); // TODO setArguments(buildConfiguration, QStringList() << "-GUnix Makefiles"); // TODO
setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration)); setEnvironment(buildConfiguration, m_pro->environment(buildConfiguration));
return AbstractProcessStep::init(buildConfiguration); return AbstractProcessStep::init(buildConfiguration);
} }
void CMakeStep::run(QFutureInterface<bool> &fi) void CMakeStep::run(QFutureInterface<bool> &fi)
{ {
// TODO we want to only run cmake if the command line arguments or
// the CmakeLists.txt has actually changed
// And we want all of them to share the SAME command line arguments
// Shadow building ruins this, hmm, hmm
//
AbstractProcessStep::run(fi); AbstractProcessStep::run(fi);
} }
@@ -109,9 +115,9 @@ bool CMakeBuildStepFactory::canCreate(const QString &name) const
ProjectExplorer::BuildStep *CMakeBuildStepFactory::create(ProjectExplorer::Project *project, const QString &name) const ProjectExplorer::BuildStep *CMakeBuildStepFactory::create(ProjectExplorer::Project *project, const QString &name) const
{ {
Q_ASSERT(name == Constants::CMAKESTEP); QTC_ASSERT(name == Constants::CMAKESTEP, /**/);
CMakeProject *pro = qobject_cast<CMakeProject *>(project); CMakeProject *pro = qobject_cast<CMakeProject *>(project);
Q_ASSERT(pro); QTC_ASSERT(pro, /**/);
return new CMakeStep(pro); return new CMakeStep(pro);
} }

View File

@@ -35,18 +35,18 @@
#include "cmakeprojectconstants.h" #include "cmakeprojectconstants.h"
#include "cmakeproject.h" #include "cmakeproject.h"
#include <utils/qtcassert.h>
using namespace CMakeProjectManager; using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal; using namespace CMakeProjectManager::Internal;
MakeStep::MakeStep(CMakeProject *pro) MakeStep::MakeStep(CMakeProject *pro)
: AbstractProcessStep(pro), m_pro(pro) : AbstractProcessStep(pro), m_pro(pro)
{ {
} }
MakeStep::~MakeStep() MakeStep::~MakeStep()
{ {
} }
bool MakeStep::init(const QString &buildConfiguration) bool MakeStep::init(const QString &buildConfiguration)
@@ -109,9 +109,9 @@ bool MakeBuildStepFactory::canCreate(const QString &name) const
ProjectExplorer::BuildStep *MakeBuildStepFactory::create(ProjectExplorer::Project *project, const QString &name) const ProjectExplorer::BuildStep *MakeBuildStepFactory::create(ProjectExplorer::Project *project, const QString &name) const
{ {
Q_ASSERT(name == Constants::MAKESTEP); QTC_ASSERT(name == Constants::MAKESTEP, return 0);
CMakeProject *pro = qobject_cast<CMakeProject *>(project); CMakeProject *pro = qobject_cast<CMakeProject *>(project);
Q_ASSERT(pro); QTC_ASSERT(pro, return 0);
return new MakeStep(pro); return new MakeStep(pro);
} }

View File

@@ -456,7 +456,7 @@ QStringList BaseFileWizard::runWizard(const QString &path, QWidget *parent)
} }
} }
if (firstExtensionPageHit) if (firstExtensionPageHit)
foreach(IFileWizardExtension *ex, extensions) foreach (IFileWizardExtension *ex, extensions)
ex->firstExtensionPageShown(files); ex->firstExtensionPageShown(files);
if (accepted) if (accepted)
break; break;
@@ -486,7 +486,7 @@ QStringList BaseFileWizard::runWizard(const QString &path, QWidget *parent)
} }
} }
// Run the extensions // Run the extensions
foreach(IFileWizardExtension *ex, extensions) foreach (IFileWizardExtension *ex, extensions)
if (!ex->process(files, &errorMessage)) { if (!ex->process(files, &errorMessage)) {
QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage); QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage);
return QStringList(); return QStringList();

View File

@@ -47,6 +47,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
setupUi(this); setupUi(this);
buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
splitter->setCollapsible(1, false);
pageTree->header()->setVisible(false); pageTree->header()->setVisible(false);
connect(pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), connect(pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
@@ -58,8 +59,8 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
CoreImpl::instance()->pluginManager()->getObjects<IOptionsPage>(); CoreImpl::instance()->pluginManager()->getObjects<IOptionsPage>();
int index = 0; int index = 0;
foreach(IOptionsPage *page, pages) { foreach (IOptionsPage *page, pages) {
QTreeWidgetItem *item = new QTreeWidgetItem(); QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(0, page->name()); item->setText(0, page->name());
item->setData(0, Qt::UserRole, index); item->setData(0, Qt::UserRole, index);
@@ -77,7 +78,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, const QString &initialCategory,
int catCount = 1; int catCount = 1;
while (catCount < categoriesId.count()) { while (catCount < categoriesId.count()) {
if(!categories.contains(currentCategory + QLatin1Char('|') + categoriesId.at(catCount))) { if (!categories.contains(currentCategory + QLatin1Char('|') + categoriesId.at(catCount))) {
treeitem = new QTreeWidgetItem(categories.value(currentCategory)); treeitem = new QTreeWidgetItem(categories.value(currentCategory));
currentCategory += QLatin1Char('|') + categoriesId.at(catCount); currentCategory += QLatin1Char('|') + categoriesId.at(catCount);
treeitem->setText(0, trCategories.at(catCount)); treeitem->setText(0, trCategories.at(catCount));
@@ -123,14 +124,14 @@ void SettingsDialog::pageSelected(QTreeWidgetItem *)
void SettingsDialog::accept() void SettingsDialog::accept()
{ {
foreach(IOptionsPage *page, m_pages) foreach (IOptionsPage *page, m_pages)
page->finished(true); page->finished(true);
done(QDialog::Accepted); done(QDialog::Accepted);
} }
void SettingsDialog::reject() void SettingsDialog::reject()
{ {
foreach(IOptionsPage *page, m_pages) foreach (IOptionsPage *page, m_pages)
page->finished(false); page->finished(false);
done(QDialog::Rejected); done(QDialog::Rejected);
} }

View File

@@ -123,7 +123,7 @@ QWidget *ShortcutSettings::createPage(QWidget *parent)
void ShortcutSettings::finished(bool accepted) void ShortcutSettings::finished(bool accepted)
{ {
if (accepted) { if (accepted) {
foreach(ShortcutItem *item, m_scitems) { foreach (ShortcutItem *item, m_scitems) {
item->m_cmd->setKeySequence(item->m_key); item->m_cmd->setKeySequence(item->m_key);
} }
} }
@@ -196,7 +196,7 @@ bool ShortcutSettings::filter(const QString &f, const QTreeWidgetItem *item)
if (f.isEmpty()) if (f.isEmpty())
return false; return false;
for (int i = 0; i < item->columnCount(); ++i) { for (int i = 0; i < item->columnCount(); ++i) {
if(item->text(i).contains(f, Qt::CaseInsensitive)) if (item->text(i).contains(f, Qt::CaseInsensitive))
return false; return false;
} }
return true; return true;
@@ -242,7 +242,7 @@ void ShortcutSettings::importAction()
CommandsFile cf(fileName); CommandsFile cf(fileName);
QMap<QString, QKeySequence> mapping = cf.importCommands(); QMap<QString, QKeySequence> mapping = cf.importCommands();
foreach(ShortcutItem *item, m_scitems) { foreach (ShortcutItem *item, m_scitems) {
QString sid = uidm->stringForUniqueIdentifier(item->m_cmd->id()); QString sid = uidm->stringForUniqueIdentifier(item->m_cmd->id());
if (mapping.contains(sid)) { if (mapping.contains(sid)) {
item->m_key = mapping.value(sid); item->m_key = mapping.value(sid);
@@ -256,7 +256,7 @@ void ShortcutSettings::importAction()
void ShortcutSettings::defaultAction() void ShortcutSettings::defaultAction()
{ {
foreach(ShortcutItem *item, m_scitems) { foreach (ShortcutItem *item, m_scitems) {
item->m_key = item->m_cmd->defaultKeySequence(); item->m_key = item->m_cmd->defaultKeySequence();
item->m_item->setText(2, item->m_key); item->m_item->setText(2, item->m_key);
if (item->m_item == m_page->commandList->currentItem()) if (item->m_item == m_page->commandList->currentItem())

View File

@@ -32,15 +32,18 @@
***************************************************************************/ ***************************************************************************/
#include "editorgroup.h" #include "editorgroup.h"
#include "editormanager.h" #include "editormanager.h"
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <utils/qtcassert.h>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QDebug>
#include <QtGui/QPainter> #include <QtGui/QPainter>
#include <QtGui/QStyle> #include <QtGui/QStyle>
#include <QtGui/QStyleOption> #include <QtGui/QStyleOption>
#include <QtCore/QtDebug>
#ifdef Q_WS_MAC #ifdef Q_WS_MAC
#include <QtGui/QMacStyle> #include <QtGui/QMacStyle>
#endif #endif
@@ -107,20 +110,20 @@ QVariant EditorModel::data(const QModelIndex &index, int role) const
if (!index.isValid()) if (!index.isValid())
return QVariant(); return QVariant();
IEditor *editor = m_editors.at(index.row()); IEditor *editor = m_editors.at(index.row());
Q_ASSERT(editor); QTC_ASSERT(editor, return QVariant());
switch (role) { switch (role) {
case Qt::DisplayRole: case Qt::DisplayRole:
return editor->file()->isModified() return editor->file()->isModified()
?editor->displayName()+QLatin1String("*") ? editor->displayName() + QLatin1String("*")
:editor->displayName(); : editor->displayName();
case Qt::DecorationRole: case Qt::DecorationRole:
return editor->file()->isReadOnly() return editor->file()->isReadOnly()
?QIcon(QLatin1String(":/qworkbench/images/locked.png")) ? QIcon(QLatin1String(":/qworkbench/images/locked.png"))
:QIcon(); : QIcon();
case Qt::ToolTipRole: case Qt::ToolTipRole:
return editor->file()->fileName().isEmpty() return editor->file()->fileName().isEmpty()
?editor->displayName() ? editor->displayName()
:QDir::toNativeSeparators(editor->file()->fileName()); : QDir::toNativeSeparators(editor->file()->fileName());
case Qt::UserRole: case Qt::UserRole:
return qVariantFromValue(editor); return qVariantFromValue(editor);
default: default:
@@ -145,6 +148,7 @@ EditorGroupContext::EditorGroupContext(EditorGroup *editorGroup)
m_editorGroup(editorGroup) m_editorGroup(editorGroup)
{ {
} }
QList<int> EditorGroupContext::context() const QList<int> EditorGroupContext::context() const
{ {
return m_context; return m_context;

View File

@@ -53,21 +53,23 @@
#include <coreplugin/baseview.h> #include <coreplugin/baseview.h>
#include <coreplugin/imode.h> #include <coreplugin/imode.h>
#include <QtCore/QFileInfo> #include <utils/qtcassert.h>
#include <QtCore/QSettings>
#include <QtCore/QMap>
#include <QtCore/QSet>
#include <QtCore/QProcess>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QFileInfo>
#include <QtCore/QMap>
#include <QtCore/QProcess>
#include <QtCore/QSet>
#include <QtCore/QSettings>
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtGui/QLayout>
#include <QtGui/QApplication> #include <QtGui/QApplication>
#include <QtGui/QSplitter>
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtGui/QLayout>
#include <QtGui/QMenu> #include <QtGui/QMenu>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QtGui/QPushButton> #include <QtGui/QPushButton>
#include <QtGui/QSplitter>
using namespace Core; using namespace Core;
using namespace Core::Internal; using namespace Core::Internal;
@@ -961,11 +963,10 @@ bool EditorManager::hasEditor(const QString &fileName) const
void EditorManager::restoreEditorState(IEditor *editor) void EditorManager::restoreEditorState(IEditor *editor)
{ {
Q_ASSERT(editor); QTC_ASSERT(editor, return);
QString fileName = editor->file()->fileName(); QString fileName = editor->file()->fileName();
if (m_d->m_editorStates.contains(fileName)) { if (m_d->m_editorStates.contains(fileName))
editor->restoreState(m_d->m_editorStates.value(fileName).toByteArray()); editor->restoreState(m_d->m_editorStates.value(fileName).toByteArray());
}
} }
bool EditorManager::saveEditor(IEditor *editor) bool EditorManager::saveEditor(IEditor *editor)
@@ -1089,7 +1090,7 @@ bool EditorManager::saveFileAs(IEditor *editor)
const bool success = editor->file()->save(absoluteFilePath); const bool success = editor->file()->save(absoluteFilePath);
m_d->m_core->fileManager()->unblockFileChange(editor->file()); m_d->m_core->fileManager()->unblockFileChange(editor->file());
if(success) if (success)
m_d->m_core->fileManager()->addToRecentFiles(editor->file()->fileName()); m_d->m_core->fileManager()->addToRecentFiles(editor->file()->fileName());
updateActions(); updateActions();

View File

@@ -32,16 +32,19 @@
***************************************************************************/ ***************************************************************************/
#include "editorsplitter.h" #include "editorsplitter.h"
#include "editormanager.h" #include "editormanager.h"
#include "minisplitter.h"
#include "openeditorswindow.h" #include "openeditorswindow.h"
#include "stackededitorgroup.h" #include "stackededitorgroup.h"
#include "minisplitter.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <coreplugin/actionmanager/actionmanagerinterface.h> #include <coreplugin/actionmanager/actionmanagerinterface.h>
#include <utils/qtcassert.h>
#include <QtGui/QHBoxLayout> #include <QtGui/QHBoxLayout>
#include <QtGui/QMenu> #include <QtGui/QMenu>
#include <QtGui/QApplication> #include <QtGui/QApplication>
@@ -160,7 +163,7 @@ void EditorSplitter::registerActions()
void EditorSplitter::updateActions() void EditorSplitter::updateActions()
{ {
const bool hasMultipleGroups = (qobject_cast<QSplitter*>(m_root) != 0); const bool hasMultipleGroups = (qobject_cast<QSplitter*>(m_root) != 0);
Q_ASSERT(currentGroup()); QTC_ASSERT(currentGroup(), return);
const bool hasEditors = (currentGroup()->editorCount() != 0); const bool hasEditors = (currentGroup()->editorCount() != 0);
m_unsplitAction->setEnabled(hasMultipleGroups); m_unsplitAction->setEnabled(hasMultipleGroups);
#if 0 #if 0
@@ -245,7 +248,7 @@ void EditorSplitter::collectGroups(QWidget *widget, QList<EditorGroup*> &groups)
return; return;
} }
QSplitter *splitter = qobject_cast<QSplitter*>(widget); QSplitter *splitter = qobject_cast<QSplitter*>(widget);
Q_ASSERT(splitter); QTC_ASSERT(splitter, return);
collectGroups(splitter->widget(LEFT), groups); collectGroups(splitter->widget(LEFT), groups);
collectGroups(splitter->widget(RIGHT), groups); collectGroups(splitter->widget(RIGHT), groups);
} }
@@ -330,7 +333,7 @@ void EditorSplitter::unsplit()
if (!curGroup) if (!curGroup)
return; return;
QWidget *curGroupWidget = curGroup->widget(); QWidget *curGroupWidget = curGroup->widget();
Q_ASSERT(curGroupWidget); QTC_ASSERT(curGroupWidget, return);
IEditor *selectedEditor = curGroup->currentEditor(); IEditor *selectedEditor = curGroup->currentEditor();
QSplitter *parentSplitter = qobject_cast<QSplitter*>(curGroupWidget->parentWidget()); QSplitter *parentSplitter = qobject_cast<QSplitter*>(curGroupWidget->parentWidget());
@@ -454,25 +457,25 @@ EditorGroup *EditorSplitter::groupFarthestOnSide(QWidget *node, Side side) const
void EditorSplitter::selectNextGroup() void EditorSplitter::selectNextGroup()
{ {
EditorGroup *curGroup = currentGroup(); EditorGroup *curGroup = currentGroup();
Q_ASSERT(curGroup); QTC_ASSERT(curGroup, return);
setCurrentGroup(nextGroup(curGroup, RIGHT)); setCurrentGroup(nextGroup(curGroup, RIGHT));
} }
void EditorSplitter::selectPreviousGroup() void EditorSplitter::selectPreviousGroup()
{ {
EditorGroup *curGroup = currentGroup(); EditorGroup *curGroup = currentGroup();
Q_ASSERT(curGroup); QTC_ASSERT(curGroup, return);
setCurrentGroup(nextGroup(curGroup, LEFT)); setCurrentGroup(nextGroup(curGroup, LEFT));
} }
EditorGroup *EditorSplitter::nextGroup(EditorGroup *curGroup, Side side) const EditorGroup *EditorSplitter::nextGroup(EditorGroup *curGroup, Side side) const
{ {
Q_ASSERT(curGroup); QTC_ASSERT(curGroup, return 0);
QWidget *curWidget = curGroup->widget(); QWidget *curWidget = curGroup->widget();
QWidget *parent = curWidget->parentWidget(); QWidget *parent = curWidget->parentWidget();
while (curWidget != m_root) { while (curWidget != m_root) {
QSplitter *splitter = qobject_cast<QSplitter *>(parent); QSplitter *splitter = qobject_cast<QSplitter *>(parent);
Q_ASSERT(splitter); QTC_ASSERT(splitter, return 0);
if (splitter->widget(side) != curWidget) { if (splitter->widget(side) != curWidget) {
curWidget = splitter->widget(side); curWidget = splitter->widget(side);
break; break;
@@ -486,7 +489,7 @@ EditorGroup *EditorSplitter::nextGroup(EditorGroup *curGroup, Side side) const
void EditorSplitter::moveDocToAdjacentGroup(Side side) void EditorSplitter::moveDocToAdjacentGroup(Side side)
{ {
EditorGroup *curGroup = currentGroup(); EditorGroup *curGroup = currentGroup();
Q_ASSERT(curGroup); QTC_ASSERT(curGroup, return);
IEditor *editor = curGroup->currentEditor(); IEditor *editor = curGroup->currentEditor();
if (!editor) if (!editor)
return; return;
@@ -510,7 +513,7 @@ QWidget *EditorSplitter::recreateGroupTree(QWidget *node)
QSplitter *splitter = qobject_cast<QSplitter *>(node); QSplitter *splitter = qobject_cast<QSplitter *>(node);
if (!splitter) { if (!splitter) {
EditorGroup *group = qobject_cast<EditorGroup *>(node); EditorGroup *group = qobject_cast<EditorGroup *>(node);
Q_ASSERT(group); QTC_ASSERT(group, return 0);
IEditor *currentEditor = group->currentEditor(); IEditor *currentEditor = group->currentEditor();
EditorGroup *newGroup = createGroup(); EditorGroup *newGroup = createGroup();
bool block = newGroup->widget()->blockSignals(true); bool block = newGroup->widget()->blockSignals(true);
@@ -588,7 +591,7 @@ void EditorSplitter::saveState(QWidget *current, QDataStream &stream) const
saveState(splitter->widget(1), stream); saveState(splitter->widget(1), stream);
} else { } else {
EditorGroup *group = qobject_cast<EditorGroup *>(current); EditorGroup *group = qobject_cast<EditorGroup *>(current);
Q_ASSERT(group); QTC_ASSERT(group, /**/);
if (group != currentGroup()) if (group != currentGroup())
type = 1; type = 1;
else else
@@ -639,7 +642,7 @@ void EditorSplitter::fillPathGroupMap(QWidget *current, QString currentPath,
map.insert(currentPath, group); map.insert(currentPath, group);
} else { } else {
QSplitter *splitter = qobject_cast<QSplitter *>(current); QSplitter *splitter = qobject_cast<QSplitter *>(current);
Q_ASSERT(splitter); QTC_ASSERT(splitter, return);
fillPathGroupMap(splitter->widget(0), currentPath+"0", map); fillPathGroupMap(splitter->widget(0), currentPath+"0", map);
fillPathGroupMap(splitter->widget(1), currentPath+"1", map); fillPathGroupMap(splitter->widget(1), currentPath+"1", map);
} }

View File

@@ -100,4 +100,4 @@ signals:
} // namespace Core } // namespace Core
#endif //IEDITOR_H #endif // IEDITOR_H

View File

@@ -39,6 +39,7 @@
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/filemanager.h> #include <coreplugin/filemanager.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <utils/qtcassert.h>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <QtGui/QMenu> #include <QtGui/QMenu>
@@ -70,7 +71,7 @@ OpenEditorsWidget::OpenEditorsWidget()
m_ui.editorList->installEventFilter(this); m_ui.editorList->installEventFilter(this);
m_ui.editorList->setFrameStyle(QFrame::NoFrame); m_ui.editorList->setFrameStyle(QFrame::NoFrame);
EditorManager *em = EditorManager::instance(); EditorManager *em = EditorManager::instance();
foreach(IEditor *editor, em->openedEditors()) { foreach (IEditor *editor, em->openedEditors()) {
registerEditor(editor); registerEditor(editor);
} }
connect(em, SIGNAL(editorOpened(Core::IEditor*)), connect(em, SIGNAL(editorOpened(Core::IEditor*)),
@@ -197,7 +198,7 @@ void OpenEditorsWidget::selectEditor(QTreeWidgetItem *item)
void OpenEditorsWidget::updateEditor() void OpenEditorsWidget::updateEditor()
{ {
IEditor *editor = qobject_cast<IEditor *>(sender()); IEditor *editor = qobject_cast<IEditor *>(sender());
Q_ASSERT(editor); QTC_ASSERT(editor, return);
int num = m_ui.editorList->topLevelItemCount(); int num = m_ui.editorList->topLevelItemCount();
for (int i = 0; i < num; ++i) { for (int i = 0; i < num; ++i) {
QTreeWidgetItem *item = m_ui.editorList->topLevelItem(i); QTreeWidgetItem *item = m_ui.editorList->topLevelItem(i);

View File

@@ -35,21 +35,24 @@
#include "editormanager.h" #include "editormanager.h"
#include "coreimpl.h" #include "coreimpl.h"
#include <QtCore/QFileInfo> #include <utils/qtcassert.h>
#include <QtCore/QDebug>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtCore/QFileInfo>
#include <QtCore/QMimeData> #include <QtCore/QMimeData>
#include <QtGui/QApplication>
#include <QtGui/QComboBox> #include <QtGui/QComboBox>
#include <QtGui/QHBoxLayout> #include <QtGui/QHBoxLayout>
#include <QtGui/QLabel>
#include <QtGui/QMouseEvent>
#include <QtGui/QPainter> #include <QtGui/QPainter>
#include <QtGui/QStackedWidget>
#include <QtGui/QStyle> #include <QtGui/QStyle>
#include <QtGui/QStyleOption> #include <QtGui/QStyleOption>
#include <QtGui/QMouseEvent>
#include <QtGui/QApplication>
#include <QtGui/QToolBar> #include <QtGui/QToolBar>
#include <QtGui/QToolButton> #include <QtGui/QToolButton>
#include <QtGui/QLabel>
#include <QtGui/QStackedWidget>
#include <QtDebug>
#ifdef Q_WS_MAC #ifdef Q_WS_MAC
#include <qmacstyle_mac.h> #include <qmacstyle_mac.h>
#endif #endif
@@ -240,7 +243,7 @@ void StackedEditorGroup::sendCloseRequest()
void StackedEditorGroup::removeEditor(IEditor *editor) void StackedEditorGroup::removeEditor(IEditor *editor)
{ {
Q_ASSERT(editor); QTC_ASSERT(editor, return);
EditorGroup::removeEditor(editor); EditorGroup::removeEditor(editor);
const int index = m_container->indexOf(editor->widget()); const int index = m_container->indexOf(editor->widget());
if (index != -1) { if (index != -1) {
@@ -280,7 +283,7 @@ void StackedEditorGroup::setCurrentEditor(IEditor *editor)
return; return;
m_toplevel->setVisible(true); m_toplevel->setVisible(true);
const int idx = m_container->indexOf(editor->widget()); const int idx = m_container->indexOf(editor->widget());
Q_ASSERT(idx >= 0); QTC_ASSERT(idx >= 0, return);
if (m_container->currentIndex() != idx) { if (m_container->currentIndex() != idx) {
m_container->setCurrentIndex(idx); m_container->setCurrentIndex(idx);
@@ -298,10 +301,11 @@ void StackedEditorGroup::setCurrentEditor(IEditor *editor)
} }
} }
void StackedEditorGroup::updateEditorStatus(IEditor *editor) { void StackedEditorGroup::updateEditorStatus(IEditor *editor)
{
if (!editor) if (!editor)
editor = qobject_cast<IEditor *>(sender()); editor = qobject_cast<IEditor *>(sender());
Q_ASSERT(editor); QTC_ASSERT(editor, return);
static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png")); static const QIcon lockedIcon(QLatin1String(":/qworkbench/images/locked.png"));
static const QIcon unlockedIcon(QLatin1String(":/qworkbench/images/unlocked.png")); static const QIcon unlockedIcon(QLatin1String(":/qworkbench/images/unlocked.png"));
@@ -371,6 +375,6 @@ int StackedEditorGroup::indexOf(IEditor *editor)
if (editor == model->data(model->index(i, 0), Qt::UserRole).value<IEditor*>()) if (editor == model->data(model->index(i, 0), Qt::UserRole).value<IEditor*>())
return i; return i;
} }
Q_ASSERT(false); QTC_ASSERT(false, /**/);
return 0; return 0;
} }

View File

@@ -96,7 +96,7 @@ void FileIconProvider::registerIconForSuffix(const QIcon &icon, const QString &s
{ {
// delete old icon, if it exists // delete old icon, if it exists
QList<QPair<QString,QIcon> >::iterator iter = m_cache.begin(); QList<QPair<QString,QIcon> >::iterator iter = m_cache.begin();
for(; iter != m_cache.end(); ++iter) { for (; iter != m_cache.end(); ++iter) {
if ((*iter).first == suffix) { if ((*iter).first == suffix) {
iter = m_cache.erase(iter); iter = m_cache.erase(iter);
break; break;
@@ -118,7 +118,7 @@ QIcon FileIconProvider::iconForSuffix(const QString &suffix) const
return icon; return icon;
QList<QPair<QString,QIcon> >::const_iterator iter = m_cache.constBegin(); QList<QPair<QString,QIcon> >::const_iterator iter = m_cache.constBegin();
for(; iter != m_cache.constEnd(); ++iter) { for (; iter != m_cache.constEnd(); ++iter) {
if ((*iter).first == suffix) { if ((*iter).first == suffix) {
icon = (*iter).second; icon = (*iter).second;
break; break;

View File

@@ -32,6 +32,7 @@
***************************************************************************/ ***************************************************************************/
#include "filemanager.h" #include "filemanager.h"
#include "ifile.h" #include "ifile.h"
#include "mainwindow.h" #include "mainwindow.h"
#include "saveitemsdialog.h" #include "saveitemsdialog.h"
@@ -40,6 +41,8 @@
#include "mimedatabase.h" #include "mimedatabase.h"
#include "iversioncontrol.h" #include "iversioncontrol.h"
#include <utils/qtcassert.h>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtCore/QFileInfo> #include <QtCore/QFileInfo>
@@ -177,22 +180,20 @@ bool FileManager::removeFile(IFile *file)
void FileManager::addWatch(const QString &filename) void FileManager::addWatch(const QString &filename)
{ {
if (!filename.isEmpty() && managedFiles(filename).isEmpty()) { if (!filename.isEmpty() && managedFiles(filename).isEmpty())
m_fileWatcher->addPath(filename); m_fileWatcher->addPath(filename);
}
} }
void FileManager::removeWatch(const QString &filename) void FileManager::removeWatch(const QString &filename)
{ {
if (!filename.isEmpty() && managedFiles(filename).isEmpty()) { if (!filename.isEmpty() && managedFiles(filename).isEmpty())
m_fileWatcher->removePath(filename); m_fileWatcher->removePath(filename);
}
} }
void FileManager::checkForNewFileName() void FileManager::checkForNewFileName()
{ {
IFile *file = qobject_cast<IFile *>(sender()); IFile *file = qobject_cast<IFile *>(sender());
Q_ASSERT(file); QTC_ASSERT(file, return);
const QString newfilename = fixFileName(file->fileName()); const QString newfilename = fixFileName(file->fileName());
const QString oldfilename = m_managedFiles.value(file).fileName; const QString oldfilename = m_managedFiles.value(file).fileName;
if (!newfilename.isEmpty() && newfilename != oldfilename) { if (!newfilename.isEmpty() && newfilename != oldfilename) {

View File

@@ -896,7 +896,7 @@ void MainWindow::removeContextObject(IContext *context)
return; return;
m_contextWidgets.remove(widget); m_contextWidgets.remove(widget);
if(m_activeContext == context) if (m_activeContext == context)
updateContextObject(0); updateContextObject(0);
} }
@@ -957,10 +957,11 @@ void MainWindow::resetContext()
updateContextObject(0); updateContextObject(0);
} }
QMenu *MainWindow::createPopupMenu() { QMenu *MainWindow::createPopupMenu()
{
QMenu *menu = new QMenu(this); QMenu *menu = new QMenu(this);
QList<ActionContainer *> containers = m_actionManager->containers(); QList<ActionContainer *> containers = m_actionManager->containers();
foreach(ActionContainer *c, containers) { foreach (ActionContainer *c, containers) {
if (c->toolBar()) if (c->toolBar())
menu->addAction(c->toolBar()->toggleViewAction()); menu->addAction(c->toolBar()->toggleViewAction());
} }

View File

@@ -33,30 +33,34 @@
#include "manhattanstyle.h" #include "manhattanstyle.h"
#include <QStyleOption>
#include <QPainter>
#include <QScrollArea>
#include <QMainWindow>
#include <QDockWidget>
#include <QPixmapCache>
#include <QDialogButtonBox>
#include <QPixmap>
#include <QToolBar>
#include <QDialog>
#include <QLineEdit>
#include <QComboBox>
#include <QLibrary>
#include <QStatusBar>
#include <QApplication>
#include <QStyleFactory>
#include <QToolButton>
#include <QLabel>
#include <QPushButton>
#include <QSplitter>
#include <QMenuBar>
#include "stylehelper.h" #include "stylehelper.h"
#include "styleanimator.h" #include "styleanimator.h"
#include <qdebug.h>
#include <QtCore/QDebug>
#include <QtCore/QLibrary>
#include <QtGui/QApplication>
#include <QtGui/QComboBox>
#include <QtGui/QDialog>
#include <QtGui/QDialogButtonBox>
#include <QtGui/QDockWidget>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QPainter>
#include <QtGui/QPixmap>
#include <QtGui/QPixmapCache>
#include <QtGui/QPushButton>
#include <QtGui/QScrollArea>
#include <QtGui/QSplitter>
#include <QtGui/QStatusBar>
#include <QtGui/QStyleFactory>
#include <QtGui/QStyleOption>
#include <QtGui/QToolBar>
#include <QtGui/QToolButton>
#include <utils/qtcassert.h>
// We define a currently unused state for indicating animations // We define a currently unused state for indicating animations
#define State_Animating 0x00000040 #define State_Animating 0x00000040
@@ -97,7 +101,7 @@ public:
ManhattanStylePrivate(const QString &baseStyleName) ManhattanStylePrivate(const QString &baseStyleName)
{ {
style = QStyleFactory::create(baseStyleName); style = QStyleFactory::create(baseStyleName);
Q_ASSERT(style); QTC_ASSERT(style, /**/);
buttonImage_pressed = QImage(":/qworkbench/images/pushbutton_pressed.png"); buttonImage_pressed = QImage(":/qworkbench/images/pushbutton_pressed.png");
buttonImage = QImage(":/qworkbench/images/pushbutton.png"); buttonImage = QImage(":/qworkbench/images/pushbutton.png");
@@ -105,12 +109,15 @@ public:
lineeditImage_disabled = QImage(":/qworkbench/images/inputfield_disabled.png"); lineeditImage_disabled = QImage(":/qworkbench/images/inputfield_disabled.png");
} }
~ManhattanStylePrivate() { ~ManhattanStylePrivate()
{
delete style; delete style;
style = 0; style = 0;
} }
void init(); void init();
public:
QStyle *style; QStyle *style;
QImage buttonImage; QImage buttonImage;
QImage buttonImage_pressed; QImage buttonImage_pressed;
@@ -140,7 +147,7 @@ void drawCornerImage(const QImage &img, QPainter *painter, QRect rect,
if (top > 0) { //top if (top > 0) { //top
painter->drawImage(QRect(rect.left() + left, rect.top(), rect.width() -right - left, top), img, painter->drawImage(QRect(rect.left() + left, rect.top(), rect.width() -right - left, top), img,
QRect(left, 0, size.width() -right - left, top)); QRect(left, 0, size.width() -right - left, top));
if(left > 0) //top-left if (left > 0) //top-left
painter->drawImage(QRect(rect.left(), rect.top(), left, top), img, painter->drawImage(QRect(rect.left(), rect.top(), left, top), img,
QRect(0, 0, left, top)); QRect(0, 0, left, top));
if (right > 0) //top-right if (right > 0) //top-right

View File

@@ -33,19 +33,22 @@
#include "mimedatabase.h" #include "mimedatabase.h"
#include <QtCore/QStringList> #include <utils/qtcassert.h>
#include <QtCore/QByteArray>
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QFile> #include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QLocale>
#include <QtCore/QMap> #include <QtCore/QMap>
#include <QtCore/QMultiHash> #include <QtCore/QMultiHash>
#include <QtCore/QDebug>
#include <QtCore/QRegExp> #include <QtCore/QRegExp>
#include <QtCore/QCoreApplication>
#include <QtCore/QFileInfo>
#include <QtCore/QByteArray>
#include <QtCore/QSharedData> #include <QtCore/QSharedData>
#include <QtCore/QSharedPointer> #include <QtCore/QSharedPointer>
#include <QtCore/QStringList>
#include <QtCore/QTextStream> #include <QtCore/QTextStream>
#include <QtCore/QLocale>
#include <QtXml/QXmlStreamReader> #include <QtXml/QXmlStreamReader>
enum { debugMimeDB = 0 }; enum { debugMimeDB = 0 };
@@ -299,7 +302,7 @@ void MimeTypeData::debug(QTextStream &str, int indent) const
str << indentS << "SubClassesOf: " << subClassesOf.join(comma) << '\n'; str << indentS << "SubClassesOf: " << subClassesOf.join(comma) << '\n';
if (!globPatterns.empty()) { if (!globPatterns.empty()) {
str << indentS << "Glob: "; str << indentS << "Glob: ";
foreach(const QRegExp &r, globPatterns) foreach (const QRegExp &r, globPatterns)
str << r.pattern() << ' '; str << r.pattern() << ' ';
str << '\n'; str << '\n';
if (!suffixes.empty()) { if (!suffixes.empty()) {
@@ -574,7 +577,7 @@ BaseMimeTypeParser:: BaseMimeTypeParser() :
// "*.log[1-9]" // "*.log[1-9]"
m_suffixPattern(QLatin1String("^\\*\\.[\\w]+$")) m_suffixPattern(QLatin1String("^\\*\\.[\\w]+$"))
{ {
Q_ASSERT(m_suffixPattern.isValid()); QTC_ASSERT(m_suffixPattern.isValid(), /**/);
} }
void BaseMimeTypeParser::addGlobPattern(const QString &pattern, MimeTypeData *d) const void BaseMimeTypeParser::addGlobPattern(const QString &pattern, MimeTypeData *d) const

View File

@@ -32,11 +32,13 @@
***************************************************************************/ ***************************************************************************/
#include "modemanager.h" #include "modemanager.h"
#include "fancytabwidget.h" #include "fancytabwidget.h"
#include "fancyactionbar.h" #include "fancyactionbar.h"
#include "mainwindow.h" #include "mainwindow.h"
#include <aggregation/aggregate.h> #include <aggregation/aggregate.h>
#include <coreplugin/actionmanager/actionmanagerinterface.h> #include <coreplugin/actionmanager/actionmanagerinterface.h>
#include <coreplugin/actionmanager/icommand.h> #include <coreplugin/actionmanager/icommand.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
@@ -44,9 +46,12 @@
#include <coreplugin/imode.h> #include <coreplugin/imode.h>
#include <coreplugin/uniqueidmanager.h> #include <coreplugin/uniqueidmanager.h>
#include <utils/qtcassert.h>
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QSignalMapper> #include <QtCore/QSignalMapper>
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtGui/QTabWidget> #include <QtGui/QTabWidget>
#include <QtGui/QVBoxLayout> #include <QtGui/QVBoxLayout>
@@ -225,7 +230,7 @@ void ModeManager::currentTabChanged(int index)
void ModeManager::setFocusToCurrentMode() void ModeManager::setFocusToCurrentMode()
{ {
IMode *mode = currentMode(); IMode *mode = currentMode();
Q_ASSERT(mode); QTC_ASSERT(mode, return);
QWidget *widget = mode->widget(); QWidget *widget = mode->widget();
if (widget) { if (widget) {
QWidget *focusWidget = widget->focusWidget(); QWidget *focusWidget = widget->focusWidget();

View File

@@ -87,8 +87,8 @@ void NavigationWidgetPlaceHolder::applyStoredSize(int width)
QList<int> sizes = splitter->sizes(); QList<int> sizes = splitter->sizes();
int index = splitter->indexOf(this); int index = splitter->indexOf(this);
int diff = width - sizes.at(index); int diff = width - sizes.at(index);
int adjust = sizes.count() > 1? ( diff / (sizes.count() - 1)) : 0; int adjust = sizes.count() > 1 ? (diff / (sizes.count() - 1)) : 0;
for(int i=0; i<sizes.count(); ++i) { for (int i = 0; i < sizes.count(); ++i) {
if (i != index) if (i != index)
sizes[i] += adjust; sizes[i] += adjust;
} }

View File

@@ -277,7 +277,7 @@ void OutputPane::init(ICore *core, ExtensionSystem::PluginManager *pm)
connect(cmd->action(), SIGNAL(triggered()), this, SLOT(shortcutTriggered())); connect(cmd->action(), SIGNAL(triggered()), this, SLOT(shortcutTriggered()));
connect(cmd->action(), SIGNAL(changed()), this, SLOT(updateToolTip())); connect(cmd->action(), SIGNAL(changed()), this, SLOT(updateToolTip()));
} while(it != begin); } while (it != begin);
changePage(); changePage();
} }
@@ -293,7 +293,7 @@ void OutputPane::shortcutTriggered()
// but the outputpane doesn't have focus // but the outputpane doesn't have focus
// then just give it focus // then just give it focus
// else do the same as clicking on the button does // else do the same as clicking on the button does
if(OutputPanePlaceHolder::m_current if (OutputPanePlaceHolder::m_current
&& OutputPanePlaceHolder::m_current->isVisible() && OutputPanePlaceHolder::m_current->isVisible()
&& m_widgetComboBox->itemData(m_widgetComboBox->currentIndex()).toInt() == idx) { && m_widgetComboBox->itemData(m_widgetComboBox->currentIndex()).toInt() == idx) {
if (!outputPane->hasFocus() && outputPane->canFocus()) if (!outputPane->hasFocus() && outputPane->canFocus())

View File

@@ -40,11 +40,13 @@
#include "uniqueidmanager.h" #include "uniqueidmanager.h"
#include "viewmanagerinterface.h" #include "viewmanagerinterface.h"
#include <utils/qtcassert.h>
using namespace Core; using namespace Core;
using namespace Core::Internal; using namespace Core::Internal;
ProgressManager::ProgressManager(QObject *parent) : ProgressManager::ProgressManager(QObject *parent)
ProgressManagerInterface(parent) : ProgressManagerInterface(parent)
{ {
m_progressView = new ProgressView; m_progressView = new ProgressView;
ICore *core = CoreImpl::instance(); ICore *core = CoreImpl::instance();
@@ -103,7 +105,7 @@ QWidget *ProgressManager::progressView()
void ProgressManager::taskFinished() void ProgressManager::taskFinished()
{ {
QObject *taskObject = sender(); QObject *taskObject = sender();
Q_ASSERT(taskObject); QTC_ASSERT(taskObject, return);
QFutureWatcher<void> *task = static_cast<QFutureWatcher<void> *>(taskObject); QFutureWatcher<void> *task = static_cast<QFutureWatcher<void> *>(taskObject);
m_runningTasks.remove(task); m_runningTasks.remove(task);
delete task; delete task;

View File

@@ -101,9 +101,9 @@ void ProgressBar::paintEvent(QPaintEvent *)
double percent = 0.50; double percent = 0.50;
if (range != 0) if (range != 0)
percent = (value() - minimum()) / range; percent = (value() - minimum()) / range;
if(percent > 1) if (percent > 1)
percent = 1; percent = 1;
else if(percent < 0) else if (percent < 0)
percent = 0; percent = 0;
QPainter p(this); QPainter p(this);

View File

@@ -34,6 +34,8 @@
#include "progressview.h" #include "progressview.h"
#include "futureprogress.h" #include "futureprogress.h"
#include <utils/qtcassert.h>
#include <QtGui/QHBoxLayout> #include <QtGui/QHBoxLayout>
using namespace Core; using namespace Core;
@@ -136,7 +138,7 @@ void ProgressView::removeTask(FutureProgress *task)
void ProgressView::slotFinished() void ProgressView::slotFinished()
{ {
FutureProgress *progress = qobject_cast<FutureProgress *>(sender()); FutureProgress *progress = qobject_cast<FutureProgress *>(sender());
Q_ASSERT(progress); QTC_ASSERT(progress, return);
if (m_keep.contains(progress) && !m_keep.value(progress) && !progress->hasError()) if (m_keep.contains(progress) && !m_keep.value(progress) && !progress->hasError())
removeTask(progress); removeTask(progress);
removeOldTasks(m_type.value(progress), true); removeOldTasks(m_type.value(progress), true);

View File

@@ -76,8 +76,8 @@ void RightPanePlaceHolder::applyStoredSize(int width)
QList<int> sizes = splitter->sizes(); QList<int> sizes = splitter->sizes();
int index = splitter->indexOf(this); int index = splitter->indexOf(this);
int diff = width - sizes.at(index); int diff = width - sizes.at(index);
int adjust = sizes.count() > 1? ( diff / (sizes.count() - 1)) : 0; int adjust = sizes.count() > 1 ? (diff / (sizes.count() - 1)) : 0;
for(int i=0; i<sizes.count(); ++i) { for (int i = 0; i < sizes.count(); ++i) {
if (i != index) if (i != index)
sizes[i] -= adjust; sizes[i] -= adjust;
} }
@@ -125,7 +125,7 @@ void RightPanePlaceHolder::currentModeChanged(Core::IMode *mode)
RightPaneWidget *RightPaneWidget::m_instance = 0; RightPaneWidget *RightPaneWidget::m_instance = 0;
RightPaneWidget::RightPaneWidget() RightPaneWidget::RightPaneWidget()
:m_shown(true), m_width(0) : m_shown(true), m_width(0)
{ {
m_instance = this; m_instance = this;

View File

@@ -38,12 +38,15 @@
#include <coreplugin/messagemanager.h> #include <coreplugin/messagemanager.h>
#include <coreplugin/editormanager/editorgroup.h> #include <coreplugin/editormanager/editorgroup.h>
#include <utils/qtcassert.h>
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtGui/QMainWindow> #include <QtGui/QMainWindow>
#include <QtGui/QStatusBar> #include <QtGui/QStatusBar>
#include <QtGui/QToolBar> #include <QtGui/QToolBar>
#include <QtScript/QScriptEngine> #include <QtScript/QScriptEngine>
namespace { namespace {
@@ -107,7 +110,7 @@ QString CorePrototype::toString() const
CorePrototype::ICore *CorePrototype::callee() const CorePrototype::ICore *CorePrototype::callee() const
{ {
ICore *rc = qscriptvalue_cast<ICore *>(thisObject()); ICore *rc = qscriptvalue_cast<ICore *>(thisObject());
Q_ASSERT(rc); QTC_ASSERT(rc, return 0);
return rc; return rc;
} }
@@ -121,14 +124,14 @@ MessageManagerPrototype::MessageManagerPrototype(QObject *parent) :
void MessageManagerPrototype::displayStatusBarMessage(const QString &text, int ms) void MessageManagerPrototype::displayStatusBarMessage(const QString &text, int ms)
{ {
MessageManager *mm = qscriptvalue_cast<MessageManager *>(thisObject()); MessageManager *mm = qscriptvalue_cast<MessageManager *>(thisObject());
Q_ASSERT(mm); QTC_ASSERT(mm, return);
mm->displayStatusBarMessage(text, ms); mm->displayStatusBarMessage(text, ms);
} }
void MessageManagerPrototype::printToOutputPane(const QString &text, bool bringToForeground) void MessageManagerPrototype::printToOutputPane(const QString &text, bool bringToForeground)
{ {
MessageManager *mm = qscriptvalue_cast<MessageManager *>(thisObject()); MessageManager *mm = qscriptvalue_cast<MessageManager *>(thisObject());
Q_ASSERT(mm); QTC_ASSERT(mm, return);
mm->printToOutputPane(text, bringToForeground); mm->printToOutputPane(text, bringToForeground);
} }
@@ -147,28 +150,66 @@ FileManagerPrototype::FileManagerPrototype(QObject *parent) :
FileManager *FileManagerPrototype::callee() const FileManager *FileManagerPrototype::callee() const
{ {
FileManager *rc = qscriptvalue_cast<FileManager *>(thisObject()); FileManager *rc = qscriptvalue_cast<FileManager *>(thisObject());
Q_ASSERT(rc); QTC_ASSERT(rc, return 0);
return rc; return rc;
} }
bool FileManagerPrototype::addFiles(const QList<Core::IFile *> &files) { return callee()->addFiles(files); } bool FileManagerPrototype::addFiles(const QList<Core::IFile *> &files)
bool FileManagerPrototype::addFile(Core::IFile *file) { return callee()->addFile(file); } {
bool FileManagerPrototype::removeFile(Core::IFile *file) { return callee()->removeFile(file); } return callee()->addFiles(files);
}
bool FileManagerPrototype::addFile(Core::IFile *file)
{
return callee()->addFile(file);
}
bool FileManagerPrototype::removeFile(Core::IFile *file)
{
return callee()->removeFile(file);
}
QList<Core::IFile*> QList<Core::IFile*>
FileManagerPrototype::saveModifiedFilesSilently(const QList<Core::IFile*> &files) { return callee()->saveModifiedFilesSilently(files); } FileManagerPrototype::saveModifiedFilesSilently(const QList<Core::IFile*> &files)
{
return callee()->saveModifiedFilesSilently(files);
}
QString FileManagerPrototype::getSaveAsFileName(Core::IFile *file) { return callee()->getSaveAsFileName(file); } QString FileManagerPrototype::getSaveAsFileName(Core::IFile *file)
{
return callee()->getSaveAsFileName(file);
}
bool FileManagerPrototype::isFileManaged(const QString &fileName) const
{
return callee()->isFileManaged(fileName);
}
bool FileManagerPrototype::isFileManaged(const QString &fileName) const { return callee()->isFileManaged(fileName); }
QList<Core::IFile *> QList<Core::IFile *>
FileManagerPrototype::managedFiles(const QString &fileName) const { return callee()->managedFiles(fileName); } FileManagerPrototype::managedFiles(const QString &fileName) const
{
return callee()->managedFiles(fileName);
}
void FileManagerPrototype::blockFileChange(Core::IFile *file) { callee()->blockFileChange(file); } void FileManagerPrototype::blockFileChange(Core::IFile *file)
void FileManagerPrototype::unblockFileChange(Core::IFile *file) { return callee()->unblockFileChange(file); } {
callee()->blockFileChange(file);
}
void FileManagerPrototype::addToRecentFiles(const QString &fileName) { return callee()->addToRecentFiles(fileName); } void FileManagerPrototype::unblockFileChange(Core::IFile *file)
QStringList FileManagerPrototype::recentFiles() const { return callee()->recentFiles(); } {
return callee()->unblockFileChange(file);
}
void FileManagerPrototype::addToRecentFiles(const QString &fileName)
{
return callee()->addToRecentFiles(fileName);
}
QStringList FileManagerPrototype::recentFiles() const
{
return callee()->recentFiles();
}
QString FileManagerPrototype::toString() const QString FileManagerPrototype::toString() const
{ {
@@ -185,7 +226,7 @@ FilePrototype::FilePrototype(QObject *parent) :
IFile *FilePrototype::callee() const IFile *FilePrototype::callee() const
{ {
IFile *rc = qscriptvalue_cast<IFile *>(thisObject()); IFile *rc = qscriptvalue_cast<IFile *>(thisObject());
Q_ASSERT(rc); QTC_ASSERT(rc, return 0);
return rc; return rc;
} }
@@ -270,39 +311,66 @@ QString EditorManagerPrototype::toString() const
EditorManagerPrototype::EditorManager *EditorManagerPrototype::callee() const EditorManagerPrototype::EditorManager *EditorManagerPrototype::callee() const
{ {
EditorManager *rc = qscriptvalue_cast<EditorManager *>(thisObject()); EditorManager *rc = qscriptvalue_cast<EditorManager *>(thisObject());
Q_ASSERT(rc); QTC_ASSERT(rc, return 0);
return rc; return rc;
} }
// ------------- EditorPrototype // ------------- EditorPrototype
EditorPrototype::EditorPrototype(QObject *parent) : EditorPrototype::EditorPrototype(QObject *parent)
QObject(parent) : QObject(parent)
{ {
} }
QString EditorPrototype::displayName() const { return callee()->displayName(); } QString EditorPrototype::displayName() const
void EditorPrototype::setDisplayName(const QString &title) { callee()->setDisplayName(title); } {
return callee()->displayName();
}
QString EditorPrototype::kind() const { return QLatin1String(callee()->kind()); } void EditorPrototype::setDisplayName(const QString &title)
bool EditorPrototype::duplicateSupported() const { return callee()->duplicateSupported(); } {
callee()->setDisplayName(title);
}
bool EditorPrototype::createNew(const QString &contents) { return callee()->createNew(contents); } QString EditorPrototype::kind() const
bool EditorPrototype::open(const QString &fileName) { return callee()->open(fileName); } {
return QLatin1String(callee()->kind());
}
bool EditorPrototype::duplicateSupported() const
{
return callee()->duplicateSupported();
}
bool EditorPrototype::createNew(const QString &contents)
{
return callee()->createNew(contents);
}
bool EditorPrototype::open(const QString &fileName)
{
return callee()->open(fileName);
}
Core::IEditor *EditorPrototype::duplicate(QWidget *parent) Core::IEditor *EditorPrototype::duplicate(QWidget *parent)
{ {
return callee()->duplicate(parent); return callee()->duplicate(parent);
} }
Core::IFile *EditorPrototype::file() const { return callee()->file(); } Core::IFile *EditorPrototype::file() const
QToolBar* EditorPrototype::toolBar() const { return callee()->toolBar();} {
return callee()->file();
}
QToolBar* EditorPrototype::toolBar() const
{
return callee()->toolBar();
}
Core::IEditor *EditorPrototype::callee() const Core::IEditor *EditorPrototype::callee() const
{ {
IEditor *rc = qscriptvalue_cast<IEditor *>(thisObject()); IEditor *rc = qscriptvalue_cast<IEditor *>(thisObject());
Q_ASSERT(rc); QTC_ASSERT(rc, return 0);
return rc; return rc;
} }
@@ -375,7 +443,7 @@ QString EditorGroupPrototype::toString() const
Core::EditorGroup *EditorGroupPrototype::callee() const Core::EditorGroup *EditorGroupPrototype::callee() const
{ {
EditorGroup *rc = qscriptvalue_cast<EditorGroup *>(thisObject()); EditorGroup *rc = qscriptvalue_cast<EditorGroup *>(thisObject());
Q_ASSERT(rc); QTC_ASSERT(rc, return 0);
return rc; return rc;
} }

Some files were not shown because too many files have changed in this diff Show More