diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp index f4c7455e017365d2dd3989b94e794443555876ed..80b15b4c94b471979be597db48bc6b7fb01e7982 100644 --- a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp @@ -40,123 +40,45 @@ #include <QtGui/QCheckBox> #include <QtGui/QPushButton> +Q_DECLARE_METATYPE(Core::IFile*); + using namespace Core; using namespace Core::Internal; -FileItem::FileItem(QTreeWidget *tree, bool supportOpen, bool open, const QString &text) - : QTreeWidgetItem(tree) -{ - m_saveCheckBox = createCheckBox(tree, 0); - m_saveCheckBox->setChecked(true); - - QFileInfo fi(text); - QString name = fi.fileName(); - if (open) - name.append(tr(" [ReadOnly]")); - - if (supportOpen) { - m_sccCheckBox = createCheckBox(tree, 1); - m_sccCheckBox->setEnabled(open); - m_sccCheckBox->setChecked(open); - connect(m_saveCheckBox, SIGNAL(stateChanged(int)), - this, SLOT(updateSCCCheckBox())); - setText(2, name); - setToolTip(2, text); - } else { - m_sccCheckBox = 0; - setText(2, name); - setToolTip(2, text); - } -} - -QCheckBox *FileItem::createCheckBox(QTreeWidget *tree, int column) -{ - QWidget *w = new QWidget(); - QHBoxLayout *l = new QHBoxLayout(w); - l->setMargin(0); - l->setSpacing(0); - QCheckBox *box = new QCheckBox(w); - l->addWidget(box); - l->setAlignment(box, Qt::AlignCenter); - w->setLayout(l); - tree->setItemWidget(this, column, w); - return box; -} - -void FileItem::updateSCCCheckBox() -{ - if (!m_saveCheckBox->isChecked()) { - m_sccCheckBox->setEnabled(false); - m_sccCheckBox->setChecked(false); - } else { - m_sccCheckBox->setEnabled(true); - } -} - -bool FileItem::shouldBeSaved() const -{ - return m_saveCheckBox->isChecked(); -} - -void FileItem::setShouldBeSaved(bool s) -{ - m_saveCheckBox->setChecked(s); -} - -bool FileItem::shouldBeOpened() const -{ - if (m_sccCheckBox) - return m_sccCheckBox->isChecked(); - return false; -} - - - -SaveItemsDialog::SaveItemsDialog(MainWindow *mainWindow, - QMap<IFile*, QString> items) - : QDialog(mainWindow) +SaveItemsDialog::SaveItemsDialog(QWidget *parent, + QList<IFile *> items) + : QDialog(parent) { m_ui.setupUi(this); - QPushButton *uncheckButton = m_ui.buttonBox->addButton(tr("Uncheck All"), - QDialogButtonBox::ActionRole); - QPushButton *discardButton = m_ui.buttonBox->addButton(tr("Discard All"), - QDialogButtonBox::DestructiveRole); - m_ui.buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); - m_ui.buttonBox->button(QDialogButtonBox::Ok)->setFocus(Qt::TabFocusReason); - - m_ui.treeWidget->header()->setMovable(false); - m_ui.treeWidget->setRootIsDecorated(false); - m_ui.treeWidget->setColumnCount(2); - - QStringList headers; - headers << tr("Save") << tr("File Name"); - - const bool hasVersionControl = true; - if (hasVersionControl) { - m_ui.treeWidget->setColumnCount(3); - headers.insert(1, tr("Open with SCC")); - } - m_ui.treeWidget->setHeaderLabels(headers); - - FileItem *itm; - QMap<IFile*, QString>::const_iterator it = items.constBegin(); - while (it != items.constEnd()) { - QString directory = QFileInfo(it.key()->fileName()).absolutePath(); - bool fileHasVersionControl = mainWindow->vcsManager()->findVersionControlForDirectory(directory) != 0; - itm = new FileItem(m_ui.treeWidget, fileHasVersionControl, - it.key()->isReadOnly(), it.value()); - m_itemMap.insert(itm, it.key()); - ++it; + QPushButton *discardButton = m_ui.buttonBox->addButton(tr("Don't Save"), QDialogButtonBox::DestructiveRole); + m_ui.buttonBox->button(QDialogButtonBox::Save)->setDefault(true); + m_ui.buttonBox->button(QDialogButtonBox::Save)->setFocus(Qt::TabFocusReason); + m_ui.buttonBox->button(QDialogButtonBox::Save)->setMinimumWidth(130); // bad magic number to avoid resizing of button + + foreach (IFile *file, items) { + QString visibleName; + QString directory; + QString fileName = file->fileName(); + if (fileName.isEmpty()) { + visibleName = file->suggestedFileName(); + } else { + QFileInfo info = QFileInfo(fileName); + directory = info.absolutePath(); + visibleName = info.fileName(); + } + QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.treeWidget, QStringList() + << visibleName << directory); + item->setData(0, Qt::UserRole, qVariantFromValue(file)); } m_ui.treeWidget->resizeColumnToContents(0); - if (hasVersionControl) - m_ui.treeWidget->resizeColumnToContents(1); + m_ui.treeWidget->selectAll(); + updateSaveButton(); - connect(m_ui.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), + connect(m_ui.buttonBox->button(QDialogButtonBox::Save), SIGNAL(clicked()), this, SLOT(collectItemsToSave())); - connect(uncheckButton, SIGNAL(clicked()), this, SLOT(uncheckAll())); connect(discardButton, SIGNAL(clicked()), this, SLOT(discardAll())); + connect(m_ui.treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(updateSaveButton())); } void SaveItemsDialog::setMessage(const QString &msg) @@ -164,24 +86,34 @@ void SaveItemsDialog::setMessage(const QString &msg) m_ui.msgLabel->setText(msg); } +void SaveItemsDialog::updateSaveButton() +{ + int count = m_ui.treeWidget->selectedItems().count(); + QPushButton *button = m_ui.buttonBox->button(QDialogButtonBox::Save); + if (count == m_ui.treeWidget->topLevelItemCount()) { + button->setEnabled(true); + button->setText(tr("Save All")); + } else if (count == 0) { + button->setEnabled(false); + button->setText(tr("Save")); + } else { + button->setEnabled(true); + button->setText(tr("Save Selected")); + } +} + void SaveItemsDialog::collectItemsToSave() { m_itemsToSave.clear(); - m_itemsToOpen.clear(); - QMap<FileItem*, IFile*>::const_iterator it = m_itemMap.constBegin(); - while (it != m_itemMap.constEnd()) { - if (it.key()->shouldBeSaved()) - m_itemsToSave << it.value(); - if (it.key()->shouldBeOpened()) - m_itemsToOpen.insert(it.value()); - ++it; + foreach (QTreeWidgetItem *item, m_ui.treeWidget->selectedItems()) { + m_itemsToSave.append(item->data(0, Qt::UserRole).value<IFile*>()); } accept(); } void SaveItemsDialog::discardAll() { - uncheckAll(); + m_ui.treeWidget->clearSelection(); collectItemsToSave(); } @@ -189,16 +121,3 @@ QList<IFile*> SaveItemsDialog::itemsToSave() const { return m_itemsToSave; } - -QSet<IFile*> SaveItemsDialog::itemsToOpen() const -{ - return m_itemsToOpen; -} - -void SaveItemsDialog::uncheckAll() -{ - for (int i=0; i<m_ui.treeWidget->topLevelItemCount(); ++i) { - FileItem *item = static_cast<FileItem*>(m_ui.treeWidget->topLevelItem(i)); - item->setShouldBeSaved(false); - } -} diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.h b/src/plugins/coreplugin/dialogs/saveitemsdialog.h index d6ceb414a8b068504daac06a60245ae54982b7c0..ff22baa1f66fa04eb1c4d1432ed3aab199a61b66 100644 --- a/src/plugins/coreplugin/dialogs/saveitemsdialog.h +++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.h @@ -48,49 +48,26 @@ namespace Internal { class MainWindow; -class FileItem : public QObject, public QTreeWidgetItem -{ - Q_OBJECT - -public: - FileItem(QTreeWidget *tree, bool supportOpen, - bool open, const QString &text); - bool shouldBeSaved() const; - void setShouldBeSaved(bool s); - bool shouldBeOpened() const; - -private slots: - void updateSCCCheckBox(); - -private: - QCheckBox *createCheckBox(QTreeWidget *tree, int column); - QCheckBox *m_saveCheckBox; - QCheckBox *m_sccCheckBox; -}; - class SaveItemsDialog : public QDialog { Q_OBJECT public: - SaveItemsDialog(MainWindow *mainWindow, - QMap<Core::IFile*, QString> items); + SaveItemsDialog(QWidget *parent, + QList<Core::IFile *> items); void setMessage(const QString &msg); - QList<Core::IFile*> itemsToSave() const; - QSet<Core::IFile*> itemsToOpen() const; + QList<Core::IFile *> itemsToSave() const; private slots: void collectItemsToSave(); - void uncheckAll(); void discardAll(); + void updateSaveButton(); private: Ui::SaveItemsDialog m_ui; - QMap<FileItem*, Core::IFile*> m_itemMap; QList<Core::IFile*> m_itemsToSave; - QSet<Core::IFile*> m_itemsToOpen; }; } // namespace Internal diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.ui b/src/plugins/coreplugin/dialogs/saveitemsdialog.ui index 85931a1daba3bd4154675b9eab98fba472c21f44..966be8f4f303261e840bec53bf4dbf44c8e49c7c 100644 --- a/src/plugins/coreplugin/dialogs/saveitemsdialog.ui +++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.ui @@ -1,41 +1,68 @@ -<ui version="4.0" > +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> <class>SaveItemsDialog</class> - <widget class="QDialog" name="SaveItemsDialog" > - <property name="geometry" > + <widget class="QDialog" name="SaveItemsDialog"> + <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>400</width> + <width>457</width> <height>200</height> </rect> </property> - <property name="windowTitle" > + <property name="windowTitle"> <string>Save Changes</string> </property> - <layout class="QVBoxLayout" > - <property name="margin" > - <number>9</number> - </property> - <property name="spacing" > - <number>6</number> - </property> + <layout class="QVBoxLayout"> <item> - <widget class="QLabel" name="msgLabel" > - <property name="text" > - <string>Save the changes of the following items:</string> + <widget class="QLabel" name="msgLabel"> + <property name="text"> + <string>The following files have unsaved changes:</string> </property> </widget> </item> <item> - <widget class="QTreeWidget" name="treeWidget" /> + <widget class="QTreeWidget" name="treeWidget"> + <property name="selectionMode"> + <enum>QAbstractItemView::ExtendedSelection</enum> + </property> + <property name="textElideMode"> + <enum>Qt::ElideLeft</enum> + </property> + <property name="indentation"> + <number>0</number> + </property> + <property name="rootIsDecorated"> + <bool>false</bool> + </property> + <property name="uniformRowHeights"> + <bool>true</bool> + </property> + <property name="headerHidden"> + <bool>true</bool> + </property> + <property name="columnCount"> + <number>2</number> + </property> + <column> + <property name="text"> + <string notr="true">1</string> + </property> + </column> + <column> + <property name="text"> + <string notr="true">2</string> + </property> + </column> + </widget> </item> <item> - <widget class="QDialogButtonBox" name="buttonBox" > - <property name="orientation" > + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> <enum>Qt::Horizontal</enum> </property> - <property name="standardButtons" > - <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set> </property> </widget> </item> @@ -52,11 +79,11 @@ <receiver>SaveItemsDialog</receiver> <slot>reject()</slot> <hints> - <hint type="sourcelabel" > + <hint type="sourcelabel"> <x>199</x> <y>174</y> </hint> - <hint type="destinationlabel" > + <hint type="destinationlabel"> <x>199</x> <y>99</y> </hint> diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 8badefeb9a8237e99b978fb504b2a9322a5a03d3..722f925b263f9607c062ed42d15a30f17e88267a 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -36,7 +36,6 @@ #include "icore.h" #include "iversioncontrol.h" #include "mimedatabase.h" -#include "saveitemsdialog.h" #include "tabpositionindicator.h" #include "vcsmanager.h" diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index a201e5c9baecdef21a7ae90b31ca6a5bc193c066..1399269c6a67fc0b4aba1e8cfea903f3ce152286 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -132,8 +132,7 @@ void EditorModel::addEntry(const Entry &entry) if (previousIndex >= 0) { if (entry.editor && m_editors.at(previousIndex).editor == 0) { m_editors[previousIndex] = entry; - QModelIndex mindex = index(previousIndex, 0); - emit dataChanged(mindex, mindex); + connect(entry.editor, SIGNAL(changed()), this, SLOT(itemChanged())); } return; } diff --git a/src/plugins/coreplugin/filemanager.cpp b/src/plugins/coreplugin/filemanager.cpp index 5fd9fe3fdd52de79c0dc30d488236813fab904f1..b996ed50407337bd9bc830a4dbbf64f410875203 100644 --- a/src/plugins/coreplugin/filemanager.cpp +++ b/src/plugins/coreplugin/filemanager.cpp @@ -314,7 +314,8 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files, (*cancelled) = false; QList<IFile *> notSaved; - QMap<IFile*, QString> modifiedFiles; + QMap<IFile *, QString> modifiedFilesMap; + QList<IFile *> modifiedFiles; foreach (IFile *file, files) { if (file->isModified()) { @@ -324,17 +325,16 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files, // There can be several FileInterfaces pointing to the same file // Select one that is not readonly. - if (!(modifiedFiles.values().contains(name) + if (!(modifiedFilesMap.values().contains(name) && file->isReadOnly())) - modifiedFiles.insert(file, name); + modifiedFilesMap.insert(file, name); } } - + modifiedFiles = modifiedFilesMap.keys(); if (!modifiedFiles.isEmpty()) { QList<IFile *> filesToSave; - QSet<IFile *> filesToOpen; if (silently) { - filesToSave = modifiedFiles.keys(); + filesToSave = modifiedFiles; } else { SaveItemsDialog dia(m_mainWindow, modifiedFiles); if (!message.isEmpty()) @@ -342,16 +342,15 @@ QList<IFile *> FileManager::saveModifiedFiles(const QList<IFile *> &files, if (dia.exec() != QDialog::Accepted) { if (cancelled) (*cancelled) = true; - notSaved = modifiedFiles.keys(); + notSaved = modifiedFiles; return notSaved; } filesToSave = dia.itemsToSave(); - filesToOpen = dia.itemsToOpen(); } bool yestoall = false; foreach (IFile *file, filesToSave) { - if (file->isReadOnly() && filesToOpen.contains(file)) { + if (file->isReadOnly()) { QString directory = QFileInfo(file->fileName()).absolutePath(); IVersionControl *versionControl = m_mainWindow->vcsManager()->findVersionControlForDirectory(directory); if (versionControl) diff --git a/src/plugins/coreplugin/welcomemode.cpp b/src/plugins/coreplugin/welcomemode.cpp index 588bfcb827badaffa4c8092dc97466857ace18bf..a31e1965b1089322cf65de3cfc9d37f216fac220 100644 --- a/src/plugins/coreplugin/welcomemode.cpp +++ b/src/plugins/coreplugin/welcomemode.cpp @@ -92,7 +92,9 @@ WelcomeModePrivate::WelcomeModePrivate() : m_projectHtmlTemplate(readFile(QLatin1String(":/core/html/recent_projects.html"))), m_baseUrl(QUrl(QLatin1String("qrc:/core/html/welcome.html"))) { +#if !defined(QT_NO_WEBKIT) m_webview->setContextMenuPolicy(Qt::NoContextMenu); +#endif } #if defined(QT_NO_WEBKIT) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 5b363e291dbe598b7c47b07a81c2225449672dc7..9990547838a4a1b283096830b03f36e685e79d92 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -370,7 +370,7 @@ void CPPEditor::jumpToMethod(int) if (! symbol) return; - openEditorAt(symbol); + openCppEditorAt(linkToSymbol(symbol)); } void CPPEditor::updateMethodBoxIndex() @@ -579,50 +579,65 @@ void CPPEditor::switchDeclarationDefinition() declaration = symbols.first(); if (declaration) - openEditorAt(declaration); + openCppEditorAt(linkToSymbol(declaration)); } else if (lastSymbol->type()->isFunctionType()) { if (Symbol *def = findDefinition(lastSymbol)) - openEditorAt(def); + openCppEditorAt(linkToSymbol(def)); } } -void CPPEditor::jumpToDefinition() +CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor) { + Link link; + if (!m_modelManager) - return; + return link; const Snapshot snapshot = m_modelManager->snapshot(); - - // Find the last symbol up to the cursor position int line = 0, column = 0; - convertPosition(position(), &line, &column); + convertPosition(cursor.position(), &line, &column); Document::Ptr doc = snapshot.value(file()->fileName()); if (!doc) - return; + return link; - QTextCursor tc = textCursor(); - unsigned lineno = tc.blockNumber() + 1; + // Handle include directives + const unsigned lineno = cursor.blockNumber() + 1; foreach (const Document::Include &incl, doc->includes()) { if (incl.line() == lineno) { - if (openCppEditorAt(incl.fileName(), 0, 0)) - return; // done - break; + link.fileName = incl.fileName(); + link.pos = cursor.block().position(); + link.length = cursor.block().length(); + return link; } } + // Find the last symbol up to the cursor position Symbol *lastSymbol = doc->findSymbolAt(line, column); if (!lastSymbol) - return; + return link; + + // Check whether we're at a name + const int endOfName = endOfNameAtPosition(cursor.position()); + if (!characterAt(endOfName - 1).isLetterOrNumber()) + return link; + + // Remember the position and length of the name + QTextCursor tc = cursor; + tc.setPosition(endOfName); + tc.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor); + const int nameStart = tc.position(); + const int nameLength = tc.anchor() - tc.position(); + + // Drop out if we're at a number + if (characterAt(nameStart).isNumber()) + return link; - // Get the expression under the cursor - const int endOfName = endOfNameUnderCursor(); + // Evaluate the type of the expression under the cursor tc.setPosition(endOfName); ExpressionUnderCursor expressionUnderCursor; const QString expression = expressionUnderCursor(tc); - - // Evaluate the type of the expression TypeOfExpression typeOfExpression; - typeOfExpression.setSnapshot(m_modelManager->snapshot()); + typeOfExpression.setSnapshot(snapshot); QList<TypeOfExpression::Result> resolvedSymbols = typeOfExpression(expression, doc, lastSymbol); @@ -633,10 +648,10 @@ void CPPEditor::jumpToDefinition() if (!lastSymbol->isFunction()) def = findDefinition(symbol); - if (def) - openEditorAt(def); - else - openEditorAt(symbol); + link = linkToSymbol(def ? def : symbol); + link.pos = nameStart; + link.length = nameLength; + return link; // This would jump to the type of a name #if 0 @@ -649,15 +664,25 @@ void CPPEditor::jumpToDefinition() #endif } } else { + // Handle macro uses foreach (const Document::MacroUse use, doc->macroUses()) { if (use.contains(endOfName - 1)) { const Macro ¯o = use.macro(); - const QString fileName = QString::fromUtf8(macro.fileName()); - if (openCppEditorAt(fileName, macro.line(), 0)) - return; // done + link.fileName = QString::fromUtf8(macro.fileName()); + link.line = macro.line(); + link.pos = use.begin(); + link.length = use.end() - use.begin(); + return link; } } } + + return link; +} + +void CPPEditor::jumpToDefinition() +{ + openCppEditorAt(findLinkAt(textCursor())); } Symbol *CPPEditor::findDefinition(Symbol *symbol) @@ -777,6 +802,78 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e) delete menu; } +void CPPEditor::mouseMoveEvent(QMouseEvent *e) +{ + bool hasDestination = false; + Qt::CursorShape cursorShape; + + if (e->modifiers() & Qt::ControlModifier) { + // Link emulation behaviour for 'go to definition' + const QTextCursor cursor = cursorForPosition(e->pos()); + + // Check that the mouse was actually on the text somewhere + bool onText = cursorRect(cursor).right() >= e->x(); + if (!onText) { + QTextCursor nextPos = cursor; + nextPos.movePosition(QTextCursor::Right); + onText = cursorRect(nextPos).right() >= e->x(); + } + + const Link link = findLinkAt(cursor); + + if (onText && !link.fileName.isEmpty()) { + QTextEdit::ExtraSelection sel; + sel.cursor = cursor; + if (link.pos >= 0) { + sel.cursor.setPosition(link.pos); + sel.cursor.setPosition(link.pos + link.length, QTextCursor::KeepAnchor); + } else { + sel.cursor.select(QTextCursor::WordUnderCursor); + } + sel.format.setFontUnderline(true); + sel.format.setForeground(Qt::blue); + setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>() << sel); + hasDestination = true; + cursorShape = Qt::PointingHandCursor; + } + } + + if (!hasDestination) { + setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>()); + cursorShape = Qt::IBeamCursor; + } + + TextEditor::BaseTextEditor::mouseMoveEvent(e); + + viewport()->setCursor(cursorShape); +} + +void CPPEditor::mouseReleaseEvent(QMouseEvent *e) +{ + if (e->modifiers() & Qt::ControlModifier && !(e->modifiers() & Qt::ShiftModifier) + && e->button() == Qt::LeftButton) { + + const QTextCursor cursor = cursorForPosition(e->pos()); + if (openCppEditorAt(findLinkAt(cursor))) { + setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>()); + viewport()->setCursor(Qt::IBeamCursor); + e->accept(); + return; + } + } + + TextEditor::BaseTextEditor::mouseReleaseEvent(e); +} + +void CPPEditor::keyReleaseEvent(QKeyEvent *e) +{ + // Clear link emulation when Ctrl is released + if (e->key() == Qt::Key_Control) { + setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>()); + viewport()->setCursor(Qt::IBeamCursor); + } +} + QList<int> CPPEditorEditable::context() const { return m_context; @@ -946,9 +1043,11 @@ void CPPEditor::unCommentSelection() cursor.endEditBlock(); } -int CPPEditor::endOfNameUnderCursor() +int CPPEditor::endOfNameAtPosition(int pos) { - int pos = position(); + if (pos == -1) + pos = position(); + QChar chr = characterAt(pos); // Skip to the start of a name @@ -958,32 +1057,37 @@ int CPPEditor::endOfNameUnderCursor() return pos; } -TextEditor::ITextEditor *CPPEditor::openCppEditorAt(const QString &fileName, - int line, int column) -{ - return TextEditor::BaseTextEditor::openEditorAt(fileName, line, column, - Constants::C_CPPEDITOR); -} - -bool CPPEditor::openEditorAt(Symbol *s) +CPPEditor::Link CPPEditor::linkToSymbol(CPlusPlus::Symbol *symbol) { - const QString fileName = QString::fromUtf8(s->fileName(), s->fileNameLength()); - unsigned line = s->line(); - unsigned column = s->column(); + const QString fileName = QString::fromUtf8(symbol->fileName(), + symbol->fileNameLength()); + unsigned line = symbol->line(); + unsigned column = symbol->column(); if (column) --column; - if (s->isGenerated()) + if (symbol->isGenerated()) column = 0; - if (baseTextDocument()->fileName() == fileName) { + return Link(fileName, line, column); +} + +bool CPPEditor::openCppEditorAt(const Link &link) +{ + if (link.fileName.isEmpty()) + return false; + + if (baseTextDocument()->fileName() == link.fileName) { Core::EditorManager *editorManager = Core::EditorManager::instance(); editorManager->addCurrentPositionToNavigationHistory(); - gotoLine(line, column); + gotoLine(link.line, link.column); setFocus(); return true; } - return openCppEditorAt(fileName, line, column); + return TextEditor::BaseTextEditor::openEditorAt(link.fileName, + link.line, + link.column, + Constants::C_CPPEDITOR); } diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index 7a91faebf3c02a1de19eadd16ae27cf8807b527b..35a46cb0c7249fbc8918e724fcb34f5979304d7c 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -96,7 +96,11 @@ public slots: void deleteEndOfToken(); protected: - void contextMenuEvent(QContextMenuEvent *e); + void contextMenuEvent(QContextMenuEvent *); + void mouseMoveEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); + void keyReleaseEvent(QKeyEvent *); + TextEditor::BaseTextEditorEditable *createEditableInterface(); // Rertuns true if key triggers anindent. @@ -122,9 +126,31 @@ private: void createToolBar(CPPEditorEditable *editable); - int endOfNameUnderCursor(); - - bool openEditorAt(CPlusPlus::Symbol *symbol); + int endOfNameAtPosition(int pos); + + struct Link + { + Link(const QString &fileName = QString(), + int line = 0, + int column = 0) + : pos(-1) + , length(-1) + , fileName(fileName) + , line(line) + , column(column) + {} + + int pos; // Link position + int length; // Link length + + QString fileName; // Target file + int line; // Target line + int column; // Target column + }; + + Link findLinkAt(const QTextCursor &); + static Link linkToSymbol(CPlusPlus::Symbol *symbol); + bool openCppEditorAt(const Link &); CppTools::CppModelManagerInterface *m_modelManager; diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index d1aa6ff33cb8603b88582a17db0df18e48a10f36..f7edac224f73d604c659ee75c8a5d3a7942cadf4 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -54,6 +54,7 @@ namespace Internal { DebuggerAction::DebuggerAction(QObject *parent) : QAction(parent) { + m_widget = 0; connect(this, SIGNAL(triggered(bool)), this, SLOT(actionTriggered(bool))); } @@ -126,8 +127,7 @@ QString DebuggerAction::toString() const { return "value: " + m_value.toString() + " defaultvalue: " + m_defaultValue.toString() - + " settingskey: " + m_settingsGroup + '/' + m_settingsKey - + " deferedValue: " + m_deferedValue.toString(); + + " settingskey: " + m_settingsGroup + '/' + m_settingsKey; } QAction *DebuggerAction::updatedAction(const QString &text0) @@ -173,9 +173,9 @@ void DebuggerAction::writeSettings(QSettings *settings) void DebuggerAction::connectWidget(QWidget *widget, ApplyMode applyMode) { using namespace Core::Utils; - //qDebug() << "CONNECT WIDGET " << widget << " TO " << m_settingsKey; - m_applyModes[widget] = applyMode; - m_deferedValue = m_value; + m_widget = widget; + m_applyMode = applyMode; + if (QAbstractButton *button = qobject_cast<QAbstractButton *>(widget)) { if (button->isCheckable()) { button->setChecked(m_value.toBool()); @@ -203,9 +203,16 @@ void DebuggerAction::connectWidget(QWidget *widget, ApplyMode applyMode) void DebuggerAction::apply(QSettings *s) { - setValue(m_deferedValue); + using namespace Core::Utils; + if (QAbstractButton *button = qobject_cast<QAbstractButton *>(m_widget)) + setValue(button->isChecked()); + else if (QLineEdit *lineEdit = qobject_cast<QLineEdit *>(m_widget)) + setValue(lineEdit->text()); + else if (PathChooser *pathChooser = qobject_cast<PathChooser *>(m_widget)) + setValue(pathChooser->path()); + m_widget = 0; if (s) - writeSettings(s); + writeSettings(s); } void DebuggerAction::uncheckableButtonClicked() @@ -221,9 +228,7 @@ void DebuggerAction::checkableButtonClicked(bool) QAbstractButton *button = qobject_cast<QAbstractButton *>(sender()); QTC_ASSERT(button, return); //qDebug() << "CHECKABLE BUTTON: " << sender(); - if (m_applyModes[sender()] == DeferedApply) - m_deferedValue = button->isChecked(); - else + if (m_applyMode == ImmediateApply) setValue(button->isChecked()); } @@ -232,9 +237,7 @@ void DebuggerAction::lineEditEditingFinished() QLineEdit *lineEdit = qobject_cast<QLineEdit *>(sender()); QTC_ASSERT(lineEdit, return); //qDebug() << "LINEEDIT: " << sender() << lineEdit->text(); - if (m_applyModes[sender()] == DeferedApply) - m_deferedValue = lineEdit->text(); - else + if (m_applyMode == ImmediateApply) setValue(lineEdit->text()); } @@ -244,9 +247,7 @@ void DebuggerAction::pathChooserEditingFinished() PathChooser *pathChooser = qobject_cast<PathChooser *>(sender()); QTC_ASSERT(pathChooser, return); //qDebug() << "PATHCHOOSER: " << sender() << pathChooser->path(); - if (m_applyModes[sender()] == DeferedApply) - m_deferedValue = pathChooser->path(); - else + if (m_applyMode == ImmediateApply) setValue(pathChooser->path()); } @@ -262,13 +263,13 @@ void DebuggerAction::trigger(const QVariant &data) QAction::trigger(); } + ////////////////////////////////////////////////////////////////////////// // // DebuggerSettings // ////////////////////////////////////////////////////////////////////////// - DebuggerSettings::DebuggerSettings(QObject *parent) : QObject(parent) {} diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index b635840df06921815ceb02aa708f4ba5e397f447..47ccfa9638620e4f8557a1825ea8ab10e27b587b 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -96,12 +96,12 @@ private: QVariant m_value; QVariant m_defaultValue; - QVariant m_deferedValue; // basically a temporary copy of m_value QString m_settingsKey; QString m_settingsGroup; QString m_textPattern; QString m_textData; - QHash<QObject *, ApplyMode> m_applyModes; + QWidget *m_widget; + ApplyMode m_applyMode; }; class DebuggerSettings : public QObject diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index c2c18dec377a78eee63a68d55dab30f4889cd0e0..535276b326cfde9604675929fc1b7a9989807092 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -4232,7 +4232,7 @@ void GdbEngine::assignValueInDebugger(const QString &expression, const QString & QString GdbEngine::dumperLibraryName() const { - if (theDebuggerAction(UsePrebuiltDumpers)) + if (theDebuggerAction(UsePrebuiltDumpers)->value().toBool()) return theDebuggerAction(PrebuiltDumpersLocation)->value().toString(); #if defined(Q_OS_WIN) return q->m_buildDir + "/qtc-gdbmacros/debug/gdbmacros.dll"; @@ -4252,48 +4252,45 @@ void GdbEngine::tryLoadCustomDumpers() m_dataDumperState = DataDumperUnavailable; QString lib = dumperLibraryName(); - if (QFileInfo(lib).exists()) { -#if defined(Q_OS_WIN) - m_dataDumperState = DataDumperLoadTried; - sendCommand("sharedlibrary .*"); // for LoadLibraryA - //sendCommand("handle SIGSEGV pass stop print"); - //sendCommand("set unwindonsignal off"); - sendCommand("call LoadLibraryA(\"" + lib + "\")", - WatchDumpCustomSetup); - sendCommand("sharedlibrary " + dotEscape(lib)); -#elif defined(Q_OS_MAC) - m_dataDumperState = DataDumperLoadTried; - //sendCommand("sharedlibrary libc"); // for malloc - //sendCommand("sharedlibrary libdl"); // for dlopen - QString flag = QString::number(RTLD_NOW); - sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", - WatchDumpCustomSetup); - //sendCommand("sharedlibrary " + dotEscape(lib)); - m_dataDumperState = DataDumperLoadTried; -#else - //sendCommand("p dlopen"); - QString flag = QString::number(RTLD_NOW); - sendCommand("sharedlibrary libc"); // for malloc - sendCommand("sharedlibrary libdl"); // for dlopen - sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", - WatchDumpCustomSetup); - // some older systems like CentOS 4.6 prefer this: - sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")", - WatchDumpCustomSetup); - sendCommand("sharedlibrary " + dotEscape(lib)); -#endif - } - - if (m_dataDumperState == DataDumperLoadTried) { - // retreive list of dumpable classes - sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)"); - sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper); - } else { + if (!QFileInfo(lib).exists()) { debugMessage(QString("DEBUG HELPER LIBRARY IS NOT USABLE: " " %1 EXISTS: %2, EXECUTABLE: %3").arg(lib) .arg(QFileInfo(lib).exists()) .arg(QFileInfo(lib).isExecutable())); + return; } + + m_dataDumperState = DataDumperLoadTried; +#if defined(Q_OS_WIN) + sendCommand("sharedlibrary .*"); // for LoadLibraryA + //sendCommand("handle SIGSEGV pass stop print"); + //sendCommand("set unwindonsignal off"); + sendCommand("call LoadLibraryA(\"" + lib + "\")", + WatchDumpCustomSetup); + sendCommand("sharedlibrary " + dotEscape(lib)); +#elif defined(Q_OS_MAC) + //sendCommand("sharedlibrary libc"); // for malloc + //sendCommand("sharedlibrary libdl"); // for dlopen + QString flag = QString::number(RTLD_NOW); + sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", + WatchDumpCustomSetup); + //sendCommand("sharedlibrary " + dotEscape(lib)); + m_dataDumperState = DataDumperLoadTried; +#else + //sendCommand("p dlopen"); + QString flag = QString::number(RTLD_NOW); + sendCommand("sharedlibrary libc"); // for malloc + sendCommand("sharedlibrary libdl"); // for dlopen + sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", + WatchDumpCustomSetup); + // some older systems like CentOS 4.6 prefer this: + sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")", + WatchDumpCustomSetup); + sendCommand("sharedlibrary " + dotEscape(lib)); +#endif + // retreive list of dumpable classes + sendCommand("call qDumpObjectData440(1,%1+1,0,0,0,0,0,0)"); + sendCommand("p (char*)qDumpOutBuffer", GdbQueryDataDumper); } void GdbEngine::recheckCustomDumperAvailability() diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index ab96217b1e8f51ee9f5f4bc8b6cae0b4f6dc8576..cfe0eb5338ceb24ee530b0d54f175a4ca8a2f918 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -682,7 +682,7 @@ void WatchHandler::rebuildModel() emit layoutAboutToBeChanged(); - if (oldTopINames != topINames) { + if (0 && oldTopINames != topINames) { m_displaySet = initialSet(); m_expandedINames.clear(); emit reset(); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index b4481b7773d2ab4ed050c42b2ee5b5660ef859df..a975c2bcecdded14a9f7bd319f867472df1be2b1 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1273,8 +1273,7 @@ bool ProjectExplorerPlugin::saveModifiedFiles(const QList<Project *> & projects) if (!filesToSave.isEmpty()) { bool cancelled; - Core::ICore::instance()->fileManager()->saveModifiedFiles(filesToSave, &cancelled, - tr("The following dependencies are modified, do you want to save them?")); + Core::ICore::instance()->fileManager()->saveModifiedFiles(filesToSave, &cancelled); if (cancelled) { return false; } diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index d185efa9b0a5eb495ba4161d92922263b5b63a94..3675999266e9d1b2e03891bdee26153f855d8dd0 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -335,7 +335,6 @@ void VCSBaseEditor::mouseMoveEvent(QMouseEvent *e) sel.cursor = cursor; sel.cursor.select(QTextCursor::WordUnderCursor); sel.format.setFontUnderline(true); - change = changeUnderCursor(cursor); sel.format.setProperty(QTextFormat::UserProperty, change); setExtraSelections(OtherSelection, QList<QTextEdit::ExtraSelection>() << sel); overrideCursor = true; diff --git a/src/qworkbench.pri b/src/qworkbench.pri index 762713bbb156aca3a18cb68ba41f318454ba9fe8..2c824c5591747795d490b9dd11a389db9c85a3e8 100644 --- a/src/qworkbench.pri +++ b/src/qworkbench.pri @@ -6,7 +6,7 @@ isEmpty(TEST):CONFIG(debug, debug|release) { } } -linux-g++-64 { +linux-*-64 { IDE_LIBRARY_BASENAME = lib64 } else { IDE_LIBRARY_BASENAME = lib