diff --git a/doc/qtcreator.qdoc b/doc/qtcreator.qdoc index 29b0e3ac5f64534eb112ccb3c6439a8592f55c32..c6c7286b8321463e2addbcac5c951e7f1bb1cc5c 100644 --- a/doc/qtcreator.qdoc +++ b/doc/qtcreator.qdoc @@ -222,8 +222,8 @@ \table \row \i Block navigation - \i To navigate between blocks, e.g., from one \c{\{} to another - \c{\c}}, use \key{Ctrl+[} and \key{Ctrl+]}. + \i To navigate between blocks, e.g., from one \bold{\{} to another + \bold{\}} , use \key{Ctrl+[} and \key{Ctrl+]}. \row \i Block selection \i To select a current block, use \key{Ctrl+U}. Pressing diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp index 735afc37989b1d565369b5ea7f42d3c2374fad3e..86b5d889dbdb523daf06f333286c9ed79901e206 100644 --- a/src/plugins/bookmarks/bookmarkmanager.cpp +++ b/src/plugins/bookmarks/bookmarkmanager.cpp @@ -563,7 +563,7 @@ TextEditor::ITextEditor *BookmarkManager::currentTextEditor() const } /* Returns the current session. */ -SessionManager* BookmarkManager::sessionManager() const +SessionManager *BookmarkManager::sessionManager() const { ExtensionSystem::PluginManager *pm = m_core->pluginManager(); ProjectExplorerPlugin *pe = pm->getObject<ProjectExplorerPlugin>(); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 0f5029c8eaf1bc68675ef4b44a66fe454b5e7e10..effe432e36ade9e953ae7eceace894c7221feba0 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -215,11 +215,6 @@ ProjectExplorer::IProjectManager *CMakeProject::projectManager() const return m_manager; } -QList<Core::IFile *> CMakeProject::dependencies() -{ - return QList<Core::IFile *>(); -} - QList<ProjectExplorer::Project *> CMakeProject::dependsOn() { return QList<Project *>(); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index cdabdf1d0845d1bb77b732352fbed79df44a48d1..a71ca7c8b008d477be1fad35bf59eeeb38e61d61 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -73,7 +73,6 @@ public: virtual Core::IFile *file() const; virtual ProjectExplorer::IProjectManager *projectManager() const; - virtual QList<Core::IFile *> dependencies(); //NBS TODO remove virtual QList<ProjectExplorer::Project *> dependsOn(); //NBS TODO implement dependsOn virtual bool isApplication() const; diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 7344e1d983cae235b06524bc9d73c8ca2c6b56e6..cc01473472591bb39897f814b16c1ebbe5fcfd88 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -128,6 +128,12 @@ enum VisualMode VisualBlockMode, }; +enum MoveType +{ + MoveExclusive, + MoveInclusive, +}; + struct EditOperation { EditOperation() : m_position(-1), m_itemCount(0) {} @@ -137,17 +143,23 @@ struct EditOperation QString m_to; }; -QDebug &operator<<(QDebug &ts, const EditOperation &op) +static QDebug &operator<<(QDebug &ts, const EditOperation &op) { if (op.m_itemCount > 0) { - ts << "EDIT BLOCK WITH" << op.m_itemCount << "ITEMS"; + ts << "\n EDIT BLOCK WITH " << op.m_itemCount << " ITEMS"; } else { - ts << "EDIT AT " << op.m_position - << " FROM " << op.m_from << " TO " << op.m_to; + ts << "\n EDIT AT " << op.m_position + << "\n FROM " << op.m_from << "\n TO " << op.m_to; } return ts; } +int lineCount(const QString &text) +{ + //return text.count(QChar(ParagraphSeparator)); + return text.count(QChar('\n')); +} + class FakeVimHandler::Private { public: @@ -206,26 +218,29 @@ private: // to reduce line noise typedef QTextCursor::MoveOperation MoveOperation; typedef QTextCursor::MoveMode MoveMode; - void moveToEndOfDocument(MoveMode m, int n = 1) - { m_tc.movePosition(QTextCursor::End, m, n); } - void moveToStartOfLine(MoveMode m, int n = 1) - { m_tc.movePosition(QTextCursor::StartOfLine, m, n); } - void moveToEndOfLine(MoveMode m, int n = 1) - { m_tc.movePosition(QTextCursor::EndOfLine, m, n); } - void moveUp(MoveMode m, int n = 1) - { m_tc.movePosition(QTextCursor::Up, m, n); } - void moveDown(MoveMode m, int n = 1) - { m_tc.movePosition(QTextCursor::Down, m, n); } - void moveRight(MoveMode m, int n = 1) - { m_tc.movePosition(QTextCursor::Right, m, n); } - void moveLeft(MoveMode m, int n = 1) - { m_tc.movePosition(QTextCursor::Left, m, n); } + void moveToEndOfDocument() + { m_tc.movePosition(QTextCursor::End, MoveAnchor); } + void moveToStartOfLine() + { m_tc.movePosition(QTextCursor::StartOfLine, MoveAnchor); } + void moveToEndOfLine() + { m_tc.movePosition(QTextCursor::EndOfLine, MoveAnchor); } + void moveUp(int n = 1) + { m_tc.movePosition(QTextCursor::Up, MoveAnchor, n); } + void moveDown(int n = 1) + { m_tc.movePosition(QTextCursor::Down, MoveAnchor, n); } + void moveRight(int n = 1) + { m_tc.movePosition(QTextCursor::Right, MoveAnchor, n); } + void moveLeft(int n = 1) + { m_tc.movePosition(QTextCursor::Left, MoveAnchor, n); } + void setAnchor() { m_anchor = m_tc.position(); } + + QString selectedText() const; void handleFfTt(int key); // helper function for handleCommand. return 1 based line index. int readLineCode(QString &cmd); - QTextCursor selectRange(int beginLine, int endLine); + void selectRange(int beginLine, int endLine); void setWidget(QWidget *ob); void enterInsertMode(); @@ -250,10 +265,12 @@ public: int m_subsubdata; QString m_input; QTextCursor m_tc; + int m_anchor; QHash<int, QString> m_registers; int m_register; QString m_mvcount; QString m_opcount; + MoveType m_moveType; bool m_fakeEnd; @@ -277,9 +294,11 @@ public: void recordRemoveNextChar(); void recordInsertText(const QString &data); - void recordRemoveSelectedText(); + QString recordRemoveSelectedText(); void recordBeginGroup(); void recordEndGroup(); + int anchor() const { return m_anchor; } + int position() const { return m_tc.position(); } void undo(); void redo(); @@ -331,6 +350,7 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent) m_plaintextedit = 0; m_visualMode = NoVisualMode; m_desiredColumn = 0; + m_moveType = MoveInclusive; m_config[ConfigStartOfLine] = ConfigOn; m_config[ConfigTabStop] = "8"; @@ -403,9 +423,9 @@ bool FakeVimHandler::Private::handleKey(int key, int unmodified, const QString & void FakeVimHandler::Private::finishMovement(const QString &dotCommand) { if (m_submode == FilterSubMode) { - int beginLine = lineForPosition(m_tc.anchor()); - int endLine = lineForPosition(m_tc.position()); - m_tc.setPosition(qMin(m_tc.anchor(), m_tc.position())); + int beginLine = lineForPosition(anchor()); + int endLine = lineForPosition(position()); + m_tc.setPosition(qMin(anchor(), position())); m_mode = ExMode; m_commandBuffer = QString(".,+%1!").arg(qAbs(endLine - beginLine)); m_commandHistory.append(QString()); @@ -420,16 +440,16 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand) if (m_submode == ChangeSubMode) { if (!dotCommand.isEmpty()) m_dotCommand = "c" + dotCommand; - m_registers[m_register] = m_tc.selectedText(); - recordRemoveSelectedText(); + QString text = recordRemoveSelectedText(); + qDebug() << "CHANGING TO INSERT MODE" << text; + m_registers[m_register] = text; m_mode = InsertMode; m_submode = NoSubMode; } else if (m_submode == DeleteSubMode) { if (!dotCommand.isEmpty()) m_dotCommand = "d" + dotCommand; - recordRemove(qMin(m_tc.position(), m_tc.anchor()), m_tc.selectedText()); - m_registers[m_register] = m_tc.selectedText(); - recordRemoveSelectedText(); + m_registers[m_register] = recordRemoveSelectedText(); + recordEndGroup(); m_submode = NoSubMode; if (atEol()) moveLeft(MoveAnchor); @@ -450,6 +470,8 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand) m_tc.setPosition(startBlock.position()); moveToFirstNonBlankOnLine(); m_submode = NoSubMode; + } else if (m_moveType == MoveExclusive) { + moveLeft(); // correct } m_mvcount.clear(); m_opcount.clear(); @@ -594,26 +616,31 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, m_register = key; m_submode = NoSubMode; } else if (m_submode == ChangeSubMode && key == 'c') { - moveToStartOfLine(MoveAnchor); - moveDown(KeepAnchor, count()); - m_registers[m_register] = m_tc.selectedText(); + moveToStartOfLine(); + setAnchor(); + moveDown(count()); + moveLeft(); + m_registers[m_register] = recordRemoveSelectedText(); + m_submode = NoSubMode; + m_mode = InsertMode; finishMovement("c"); } else if (m_submode == DeleteSubMode && key == 'd') { - moveToStartOfLine(MoveAnchor); - moveDown(KeepAnchor, count()); - m_registers[m_register] = m_tc.selectedText(); + moveToStartOfLine(); + setAnchor(); + moveDown(count()); + m_registers[m_register] = recordRemoveSelectedText(); finishMovement("d"); } else if (m_submode == YankSubMode && key == 'y') { - moveToStartOfLine(MoveAnchor); - moveDown(KeepAnchor, count()); - m_registers[m_register] = m_tc.selectedText(); + moveToStartOfLine(); + moveDown(count()); + m_registers[m_register] = selectedText(); finishMovement(); } else if (m_submode == ReplaceSubMode) { if (atEol()) moveLeft(KeepAnchor); else m_tc.deleteChar(); - m_tc.insertText(text); + recordInsertText(text); } else if (m_submode == IndentSubMode && key == '=') { indentRegion(m_tc.block(), m_tc.block().next()); finishMovement(); @@ -679,8 +706,9 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, } else if (key == '\'') { m_subsubmode = TickSubSubMode; } else if (key == '|') { - moveToStartOfLine(KeepAnchor); - moveRight(KeepAnchor, qMin(count(), rightDist()) - 1); + setAnchor(); + moveToStartOfLine(); + moveRight(qMin(count(), rightDist()) - 1); finishMovement(); } else if (key == '!' && m_visualMode == NoVisualMode) { m_submode = FilterSubMode; @@ -693,16 +721,16 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, } else if (key == '"') { m_submode = RegisterSubMode; } else if (unmodified == Key_Return) { - moveToStartOfLine(MoveAnchor); - moveDown(MoveAnchor); + moveToStartOfLine(); + moveDown(); moveToFirstNonBlankOnLine(); finishMovement(); } else if (key == Key_Home) { - m_tc.movePosition(StartOfLine, KeepAnchor); + moveToStartOfLine(); finishMovement(); } else if (key == '$' || key == Key_End) { int submode = m_submode; - moveToEndOfLine(KeepAnchor); + moveToEndOfLine(); finishMovement(); if (submode == NoSubMode) m_desiredColumn = -1; @@ -722,12 +750,14 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, finishMovement(); } else if (key == 'a') { m_mode = InsertMode; + recordBeginGroup(); m_lastInsertion.clear(); - m_tc.movePosition(Right, MoveAnchor, 1); + moveRight(); updateMiniBuffer(); } else if (key == 'A') { m_mode = InsertMode; - moveToEndOfLine(MoveAnchor); + moveToEndOfLine(); + recordBeginGroup(); m_lastInsertion.clear(); } else if (key == 'b') { moveToWordBoundary(false, false); @@ -736,30 +766,41 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, moveToWordBoundary(true, false); finishMovement(); } else if (key == 'c') { + setAnchor(); + recordBeginGroup(); m_submode = ChangeSubMode; } else if (key == 'C') { - m_submode = ChangeSubMode; - moveToEndOfLine(KeepAnchor); + setAnchor(); + recordBeginGroup(); + moveToEndOfLine(); + m_registers[m_register] = recordRemoveSelectedText(); + m_mode = InsertMode; finishMovement(); } else if (key == 'd' && m_visualMode == NoVisualMode) { if (atEol()) - moveLeft(MoveAnchor); + moveLeft(); + setAnchor(); + recordBeginGroup(); m_opcount = m_mvcount; m_mvcount.clear(); m_submode = DeleteSubMode; } else if (key == 'd') { + setAnchor(); leaveVisualMode(); int beginLine = lineForPosition(m_marks['<']); int endLine = lineForPosition(m_marks['>']); - m_tc = selectRange(beginLine, endLine); + selectRange(beginLine, endLine); recordRemoveSelectedText(); } else if (key == 'D') { + setAnchor(); + recordBeginGroup(); m_submode = DeleteSubMode; - moveDown(KeepAnchor, qMax(count() - 1, 0)); - moveRight(KeepAnchor, rightDist()); + moveDown(qMax(count() - 1, 0)); + moveRight(rightDist()); finishMovement(); } else if (key == 'e') { moveToWordBoundary(false, true); + m_moveType = MoveExclusive; finishMovement(); } else if (key == 'E') { moveToWordBoundary(true, true); @@ -775,15 +816,16 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, if (m_config[ConfigStartOfLine] == ConfigOn) moveToFirstNonBlankOnLine(); finishMovement(); - } else if (key == 'h' || key == Key_Left) { + } else if (key == 'h' || key == Key_Left + || key == Key_Backspace || key == control('h')) { int n = qMin(count(), leftDist()); if (m_fakeEnd && m_tc.block().length() > 1) ++n; - moveLeft(KeepAnchor, n); + moveLeft(n); finishMovement(); } else if (key == 'H') { m_tc = EDITOR(cursorForPosition(QPoint(0, 0))); - moveDown(KeepAnchor, qMax(count() - 1, 0)); + moveDown(qMax(count() - 1, 0)); moveToFirstNonBlankOnLine(); finishMovement(); } else if (key == 'i') { @@ -792,20 +834,21 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, if (atEol()) moveLeft(MoveAnchor); } else if (key == 'I') { + setAnchor(); enterInsertMode(); if (m_gflag) - moveToStartOfLine(KeepAnchor); + moveToStartOfLine(); else moveToFirstNonBlankOnLine(); } else if (key == 'j' || key == Key_Down) { int savedColumn = m_desiredColumn; if (m_submode == NoSubMode || m_submode == ZSubMode || m_submode == RegisterSubMode) { - moveDown(KeepAnchor, count()); + moveDown(count()); moveToDesiredColumn(); } else { - moveToStartOfLine(MoveAnchor); - moveDown(KeepAnchor, count() + 1); + moveToStartOfLine(); + moveDown(count() + 1); } finishMovement(); m_desiredColumn = savedColumn; @@ -813,33 +856,34 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, recordBeginGroup(); if (m_submode == NoSubMode) { for (int i = qMax(count(), 2) - 1; --i >= 0; ) { - moveToEndOfLine(MoveAnchor); + moveToEndOfLine(); recordRemoveNextChar(); if (!m_gflag) recordInsertText(" "); } if (!m_gflag) - moveLeft(MoveAnchor, 1); + moveLeft(); } recordEndGroup(); } else if (key == 'k' || key == Key_Up) { int savedColumn = m_desiredColumn; - if (m_submode == NoSubMode || m_submode == ZSubMode || m_submode == RegisterSubMode) { - moveUp(KeepAnchor, count()); + if (m_submode == NoSubMode || m_submode == ZSubMode + || m_submode == RegisterSubMode) { + moveUp(count()); moveToDesiredColumn(); } else { - moveToStartOfLine(MoveAnchor); - moveDown(MoveAnchor); - moveUp(KeepAnchor, count() + 1); + moveToStartOfLine(); + moveDown(); + moveUp(count() + 1); } finishMovement(); m_desiredColumn = savedColumn; } else if (key == 'l' || key == Key_Right) { - moveRight(KeepAnchor, qMin(count(), rightDist())); + moveRight(qMin(count(), rightDist())); finishMovement(); } else if (key == 'L') { m_tc = EDITOR(cursorForPosition(QPoint(0, EDITOR(height())))); - moveUp(KeepAnchor, qMax(count(), 1)); + moveUp(qMax(count(), 1)); moveToFirstNonBlankOnLine(); finishMovement(); } else if (key == 'm') { @@ -855,45 +899,52 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, } else if (key == 'o' || key == 'O') { enterInsertMode(); moveToFirstNonBlankOnLine(); + recordBeginGroup(); int numSpaces = leftDist(); - moveUp(MoveAnchor, 1); + moveUp(); if (key == 'o') - m_tc.movePosition(Down, MoveAnchor, 1); - moveToEndOfLine(MoveAnchor); - m_tc.insertText("\n"); - moveToStartOfLine(MoveAnchor); + moveDown(); + moveToEndOfLine(); + recordInsertText("\n"); + moveToStartOfLine(); if (m_config[ConfigAutoIndent] == ConfigOn) - m_tc.insertText(QString(indentDist(), ' ')); + recordInsertText(QString(indentDist(), ' ')); else - m_tc.insertText(QString(numSpaces, ' ')); + recordInsertText(QString(numSpaces, ' ')); + recordEndGroup(); } else if (key == 'p' || key == 'P') { + recordBeginGroup(); QString text = m_registers[m_register]; int n = text.count(QChar(ParagraphSeparator)); if (n > 0) { - m_tc.movePosition(StartOfLine); + moveToStartOfLine(); if (key == 'p') - m_tc.movePosition(Down); - m_tc.insertText(text); - m_tc.movePosition(Up, MoveAnchor, n); + moveDown(MoveAnchor); + recordInsertText(text); + moveUp(n); } else { if (key == 'p') - m_tc.movePosition(Right); - m_tc.insertText(text); - m_tc.movePosition(Left); + moveRight(); + recordInsertText(text); + moveLeft(); } + recordEndGroup(); m_dotCommand = "p"; } else if (key == 'r') { + recordBeginGroup(); m_submode = ReplaceSubMode; m_dotCommand = "r"; } else if (key == 'R') { + recordBeginGroup(); m_mode = InsertMode; m_submode = ReplaceSubMode; m_dotCommand = "R"; } else if (key == control('r')) { redo(); } else if (key == 's') { + recordBeginGroup(); m_submode = ChangeSubMode; - m_tc.movePosition(Right, KeepAnchor, qMin(count(), rightDist())); + moveRight(qMin(count(), rightDist())); } else if (key == 't' || key == 'T') { m_subsubmode = FtSubSubMode; m_subsubdata = key; @@ -910,7 +961,13 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, } else if (key == control('v')) { enterVisualMode(VisualBlockMode); } else if (key == 'w') { - moveToNextWord(false); + // Special case: "cw" and "cW" work the same as "ce" and "cE" if the + // cursor is on a non-blank. + if (m_submode == ChangeSubMode) + moveToWordBoundary(false, true); + else + moveToNextWord(false); + m_moveType = MoveExclusive; finishMovement("w"); } else if (key == 'W') { moveToNextWord(true); @@ -918,38 +975,42 @@ bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, } else if (key == 'x') { // = "dl" if (atEol()) moveLeft(MoveAnchor); + recordBeginGroup(); m_submode = DeleteSubMode; - moveRight(KeepAnchor, qMin(count(), rightDist())); + moveRight(qMin(count(), rightDist())); finishMovement("l"); } else if (key == 'X') { if (leftDist() > 0) { - moveLeft(KeepAnchor, qMin(count(), leftDist())); - m_tc.deleteChar(); + setAnchor(); + moveLeft(qMin(count(), leftDist())); + recordRemoveSelectedText(); } finishMovement(); } else if (key == 'y') { if (atEol()) - moveLeft(MoveAnchor); + moveLeft(); + recordBeginGroup(); m_submode = YankSubMode; } else if (key == 'z') { + recordBeginGroup(); m_submode = ZSubMode; } else if (key == '~' && !atEol()) { - moveRight(KeepAnchor, qMin(count(), rightDist())); - QString str = m_tc.selectedText(); + recordBeginGroup(); + setAnchor(); + moveRight(qMin(count(), rightDist())); + QString str = recordRemoveSelectedText(); for (int i = str.size(); --i >= 0; ) { QChar c = str.at(i); str[i] = c.isUpper() ? c.toLower() : c.toUpper(); } - m_tc.deleteChar(); - m_tc.insertText(str); + recordInsertText(str); + recordEndGroup(); } else if (key == Key_PageDown || key == control('f')) { - moveDown(KeepAnchor, count() * (linesOnScreen() - 2)); + moveDown(count() * (linesOnScreen() - 2)); finishMovement(); } else if (key == Key_PageUp || key == control('b')) { - moveUp(KeepAnchor, count() * (linesOnScreen() - 2)); + moveUp(count() * (linesOnScreen() - 2)); finishMovement(); - } else if (key == Key_Backspace || key == control('h')) { - m_tc.deletePreviousChar(); } else if (key == Key_Delete) { m_tc.deleteChar(); } else if (key == Key_Escape) { @@ -975,21 +1036,23 @@ bool FakeVimHandler::Private::handleInsertMode(int key, int, const QString &text data += m_lastInsertion; } recordInsert(m_tc.position() - m_lastInsertion.size(), data); - moveLeft(MoveAnchor, qMin(1, leftDist())); + recordEndGroup(); + //qDebug() << "UNDO: " << m_undoStack; + moveLeft(qMin(1, leftDist())); enterCommandMode(); } else if (key == Key_Left) { - moveLeft(MoveAnchor, count()); + moveLeft(count()); m_lastInsertion.clear(); } else if (key == Key_Down) { m_submode = NoSubMode; - moveDown(MoveAnchor, count()); + moveDown(count()); m_lastInsertion.clear(); } else if (key == Key_Up) { m_submode = NoSubMode; - moveUp(MoveAnchor, count()); + moveUp(count()); m_lastInsertion.clear(); } else if (key == Key_Right) { - moveRight(MoveAnchor, count()); + moveRight(count()); m_lastInsertion.clear(); } else if (key == Key_Return) { m_submode = NoSubMode; @@ -1003,10 +1066,10 @@ bool FakeVimHandler::Private::handleInsertMode(int key, int, const QString &text m_tc.deleteChar(); m_lastInsertion.clear(); } else if (key == Key_PageDown || key == control('f')) { - moveDown(KeepAnchor, count() * (linesOnScreen() - 2)); + moveDown(count() * (linesOnScreen() - 2)); m_lastInsertion.clear(); } else if (key == Key_PageUp || key == control('b')) { - moveUp(KeepAnchor, count() * (linesOnScreen() - 2)); + moveUp(count() * (linesOnScreen() - 2)); m_lastInsertion.clear(); } else if (key == Key_Tab && m_config[ConfigExpandTab] == ConfigOn) { QString str = QString(m_config[ConfigTabStop].toInt(), ' '); @@ -1173,17 +1236,15 @@ int FakeVimHandler::Private::readLineCode(QString &cmd) return -1; } -QTextCursor FakeVimHandler::Private::selectRange(int beginLine, int endLine) +void FakeVimHandler::Private::selectRange(int beginLine, int endLine) { - QTextCursor tc = m_tc; - tc.setPosition(positionForLine(beginLine), MoveAnchor); + m_tc.setPosition(positionForLine(beginLine), MoveAnchor); if (endLine == linesInDocument()) { - tc.setPosition(positionForLine(endLine), KeepAnchor); - tc.movePosition(EndOfLine, KeepAnchor); + m_tc.setPosition(positionForLine(endLine), KeepAnchor); + m_tc.movePosition(EndOfLine, KeepAnchor); } else { - tc.setPosition(positionForLine(endLine + 1), KeepAnchor); + m_tc.setPosition(positionForLine(endLine + 1), KeepAnchor); } - return tc; } void FakeVimHandler::Private::handleExCommand(const QString &cmd0) @@ -1223,11 +1284,11 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) beginLine = cursorLineInDocument(); if (endLine == -1) endLine = cursorLineInDocument(); - QTextCursor tc = selectRange(beginLine, endLine); + selectRange(beginLine, endLine); QString reg = reDelete.cap(2); + QString text = recordRemoveSelectedText(); if (!reg.isEmpty()) - m_registers[reg.at(0).unicode()] = tc.selection().toPlainText(); - tc.removeSelectedText(); + m_registers[reg.at(0).unicode()] = text; } else if (reWrite.indexIn(cmd) != -1) { // :w enterCommandMode(); bool noArgs = (beginLine == -1); @@ -1245,9 +1306,8 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) if (exists && !forced && !noArgs) { showRedMessage(tr("File '%1' exists (add ! to override)").arg(fileName)); } else if (file.open(QIODevice::ReadWrite)) { - QTextCursor tc = selectRange(beginLine, endLine); - QString contents = tc.selection().toPlainText(); - emit q->writeFile(fileName, contents); + selectRange(beginLine, endLine); + emit q->writeFile(fileName, selectedText()); // check by reading back file.open(QIODevice::ReadOnly); QByteArray ba = file.readAll(); @@ -1272,10 +1332,10 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) beginLine = cursorLineInDocument(); if (endLine == -1) endLine = cursorLineInDocument(); - QTextCursor tc = selectRange(beginLine, endLine); - QString text = tc.selection().toPlainText(); - tc.removeSelectedText(); + selectRange(beginLine, endLine); QString command = cmd.mid(1).trimmed(); + recordBeginGroup(); + QString text = recordRemoveSelectedText(); QProcess proc; proc.start(cmd.mid(1)); proc.waitForStarted(); @@ -1283,7 +1343,8 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) proc.closeWriteChannel(); proc.waitForFinished(); QString result = QString::fromUtf8(proc.readAllStandardOutput()); - m_tc.insertText(result); + recordInsertText(result); + recordEndGroup(); leaveVisualMode(); m_tc.setPosition(positionForLine(beginLine)); @@ -1357,8 +1418,6 @@ void FakeVimHandler::Private::search(const QString &needle0, bool forward) EDITOR(setTextCursor(m_tc)); if (EDITOR(find(needle, flags))) { m_tc = EDITOR(textCursor()); - // the qMax seems to be needed for QPlainTextEdit only - //m_tc.movePosition(Left, MoveAnchor, qMax(1, needle.size() - 1)); m_tc.setPosition(m_tc.anchor()); return; } @@ -1367,8 +1426,6 @@ void FakeVimHandler::Private::search(const QString &needle0, bool forward) EDITOR(setTextCursor(m_tc)); if (EDITOR(find(needle, flags))) { m_tc = EDITOR(textCursor()); - // the qMax seems to be needed for QPlainTextEdit only - //m_tc.movePosition(Left, MoveAnchor, qMax(1, needle.size() - 1)); m_tc.setPosition(m_tc.anchor()); if (forward) showRedMessage("search hit BOTTOM, continuing at TOP"); @@ -1474,17 +1531,15 @@ void FakeVimHandler::Private::moveToWordBoundary(bool simple, bool forward) int repeat = count(); QTextDocument *doc = m_tc.document(); int n = forward ? lastPositionInDocument() - 1 : 0; - int lastClass = 0; + int lastClass = -1; while (true) { - m_tc.movePosition(forward ? Right : Left, KeepAnchor, 1); + forward ? moveRight() : moveLeft(); QChar c = doc->characterAt(m_tc.position()); int thisClass = charClass(c, simple); if (thisClass != lastClass && lastClass != 0) --repeat; - if (repeat == -1) { - m_tc.movePosition(forward ? Left : Right, KeepAnchor, 1); + if (repeat == -1) break; - } lastClass = thisClass; if (m_tc.position() == n) break; @@ -1547,7 +1602,7 @@ void FakeVimHandler::Private::moveToNextWord(bool simple) if (repeat == 0) break; lastClass = thisClass; - m_tc.movePosition(Right, KeepAnchor, 1); + moveRight(); if (m_tc.position() == n) break; } @@ -1643,6 +1698,13 @@ QString FakeVimHandler::Private::lastSearchString() const return m_searchHistory.empty() ? QString() : m_searchHistory.back(); } +QString FakeVimHandler::Private::selectedText() const +{ + QTextCursor tc = m_tc; + tc.setPosition(m_anchor, KeepAnchor); + return tc.selection().toPlainText(); +} + int FakeVimHandler::Private::positionForLine(int line) const { return m_tc.block().document()->findBlockByNumber(line - 1).position(); @@ -1738,6 +1800,7 @@ void FakeVimHandler::Private::redo() void FakeVimHandler::Private::recordBeginGroup() { + //qDebug() << "PUSH"; m_undoGroupStack.push(m_undoStack.size()); } @@ -1745,22 +1808,27 @@ void FakeVimHandler::Private::recordEndGroup() { EditOperation op; op.m_itemCount = m_undoStack.size() - m_undoGroupStack.pop(); + //qDebug() << "POP " << op.m_itemCount; recordOperation(op); } -void FakeVimHandler::Private::recordRemoveSelectedText() +QString FakeVimHandler::Private::recordRemoveSelectedText() { EditOperation op; - op.m_position = qMin(m_tc.position(), m_tc.anchor()); + //qDebug() << "1 POS: " << position() << " ANCHOR: " << anchor() << m_tc.anchor(); + m_tc.setPosition(anchor(), KeepAnchor); + op.m_position = qMin(position(), anchor()); + //qDebug() << "2 POS: " << position() << " ANCHOR: " << anchor() << m_tc.anchor(); op.m_from = m_tc.selection().toPlainText(); recordOperation(op); - m_tc.removeSelectedText(); + m_tc.deleteChar(); + return op.m_from; } void FakeVimHandler::Private::recordRemoveNextChar() { - m_tc.setPosition(m_tc.position(), MoveAnchor); - m_tc.movePosition(Right, KeepAnchor); + m_anchor = position(); + moveRight(); recordRemoveSelectedText(); } @@ -1775,6 +1843,7 @@ void FakeVimHandler::Private::recordInsertText(const QString &data) void FakeVimHandler::Private::recordOperation(const EditOperation &op) { + //qDebug() << "OP: " << op; m_undoStack.push(op); m_redoStack.clear(); } diff --git a/src/plugins/projectexplorer/buildparserinterface.h b/src/plugins/projectexplorer/buildparserinterface.h index 6dba4dfec00199f5cec6be02780764073be88cad..2857926e18dfc4d3abe39d14cb6b41fd20874bef 100644 --- a/src/plugins/projectexplorer/buildparserinterface.h +++ b/src/plugins/projectexplorer/buildparserinterface.h @@ -66,7 +66,7 @@ class PROJECTEXPLORER_EXPORT IBuildParserFactory Q_OBJECT public: - IBuildParserFactory() {}; + IBuildParserFactory() {} virtual ~IBuildParserFactory(); virtual bool canCreate(const QString & name) const = 0; virtual BuildParserInterface * create(const QString & name) const = 0; diff --git a/src/plugins/projectexplorer/dependenciesdialog.cpp b/src/plugins/projectexplorer/dependenciesdialog.cpp deleted file mode 100644 index 9c78de543ad66f862ccf3865edf58b00a2a4fd26..0000000000000000000000000000000000000000 --- a/src/plugins/projectexplorer/dependenciesdialog.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/*************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2008-2009 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.3, included in the file GPL_EXCEPTION.txt in this package. -** -***************************************************************************/ - -#include "dependenciesdialog.h" -#include "project.h" -#include "session.h" - -#include <QtCore/QVector> -#include <QtCore/QDebug> -#include <QtCore/QAbstractTableModel> -#include <QtGui/QPushButton> -#include <QtGui/QHeaderView> - -namespace ProjectExplorer { -namespace Internal { - -// ------ DependencyModel - -class DependencyModel : public QAbstractTableModel { -public: - typedef ProjectExplorer::Project Project; - typedef DependenciesDialog::ProjectList ProjectList; - - DependencyModel(SessionManager *sln, const ProjectList &projectList, QObject * parent = 0); - - virtual int rowCount(const QModelIndex&) const { return m_projects.size(); } - virtual int columnCount(const QModelIndex&) const { return m_projects.size(); } - - virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const; - bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); - - virtual Qt::ItemFlags flags ( const QModelIndex & index ) const; - - QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; - - // Apply changed items - unsigned apply(SessionManager *sln) const; - - void resetDependencies(); - -private: - - struct Entry { - Entry(SessionManager *sln, Project *rootProject, Project *dependentProject); - Entry() : m_dependentProject(0), m_dependent(false), m_defaultValue(false), m_canAddDependency(false) {} - Project* m_dependentProject; - bool m_dependent; - bool m_defaultValue; - bool m_canAddDependency; - }; - - // column - typedef QVector<Entry> ProjectDependencies; - typedef QList<ProjectDependencies> Projects; - Projects m_projects; - ProjectList m_projectList; -}; - -DependencyModel::Entry::Entry(SessionManager *sln, - Project *rootProject, - Project *dependentProject) : - m_dependentProject(dependentProject), - m_dependent(sln->hasDependency(rootProject, dependentProject)), - m_defaultValue(m_dependent), - m_canAddDependency(sln->canAddDependency(rootProject, dependentProject)) -{ -} - -DependencyModel::DependencyModel(SessionManager *sln, - const ProjectList &projectList, - QObject * parent) : - QAbstractTableModel(parent), - m_projectList(projectList) -{ - const int count = projectList.size(); - for (int p = 0; p < count; p++) { - Project *rootProject = projectList.at(p); - ProjectDependencies dependencies; - dependencies.reserve(count); - for (int d = 0; d < count ; d++) - dependencies.push_back(p == d ? Entry() : Entry(sln, rootProject, projectList.at(d))); - - m_projects += dependencies; - } -} - -QVariant DependencyModel::data ( const QModelIndex & index, int role ) const -{ - static const QVariant empty = QVariant(QString()); - // TO DO: find a checked icon - static const QVariant checked = QVariant(QString(QLatin1Char('x'))); - - const int p = index.column(); - const int d = index.row(); - switch (role) { - case Qt::EditRole: - return QVariant(m_projects[p][d].m_dependent); - case Qt::DisplayRole: - return m_projects[p][d].m_dependent ? checked : empty; - default: - break; - } - return QVariant(); -} - -bool DependencyModel::setData ( const QModelIndex & index, const QVariant & value, int role) -{ - switch (role) { - case Qt::EditRole: { - const int p = index.column(); - const int d = index.row(); - if (d == p) - return false; - Entry &e(m_projects[p][d]); - e.m_dependent = value.toBool(); - emit dataChanged(index, index); - } - return true; - default: - break; - } - return false; -} - -Qt::ItemFlags DependencyModel::flags ( const QModelIndex & index ) const -{ - const int p = index.column(); - const int d = index.row(); - - if (d == p) - return 0; - - const Entry &e(m_projects[p][d]); - Qt::ItemFlags rc = Qt::ItemIsEnabled|Qt::ItemIsUserCheckable | Qt::ItemIsSelectable; - if (e.m_canAddDependency) - rc |= Qt::ItemIsEditable; - return rc; -} - -QVariant DependencyModel::headerData ( int section, Qt::Orientation , int role ) const -{ - switch (role) { - case Qt::DisplayRole: - return QVariant(m_projectList.at(section)->name()); - default: - break; - } - return QVariant(); -} - -void DependencyModel::resetDependencies() -{ - if (const int count = m_projectList.size()) { - for (int p = 0; p < count; p++) - for (int d = 0; d < count; d++) - m_projects[p][d].m_dependent = false; - reset(); - } -} - -unsigned DependencyModel::apply(SessionManager *sln) const -{ - unsigned rc = 0; - const int count = m_projectList.size(); - for (int p = 0; p < count; p++) { - Project *rootProject = m_projectList.at(p); - for (int d = 0; d < count; d++) { - if (d != p) { - const Entry &e(m_projects[p][d]); - if (e.m_dependent != e. m_defaultValue) { - rc++; - if (e.m_dependent) { - sln->addDependency(rootProject, e.m_dependentProject); - } else { - sln->removeDependency(rootProject, e.m_dependentProject); - } - } - } - } - } - return rc; -} - -// ------ DependenciesDialog -DependenciesDialog::DependenciesDialog(QWidget *parent, SessionManager *sln) : - QDialog(parent), - m_sln(sln), - m_projectList(m_sln->projects()), - m_model(new DependencyModel(sln, m_projectList)) -{ - m_ui.setupUi(this); - m_ui.buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); - QPushButton *resetButton = m_ui.buttonBox->addButton (QDialogButtonBox::Reset); - connect(resetButton, SIGNAL(clicked()), this, SLOT(reset())); - - m_ui.dependencyTable->setModel(m_model); -} - -void DependenciesDialog::accept() -{ - m_model->apply(m_sln); - QDialog::accept(); -} - -void DependenciesDialog::reset() -{ - m_model->resetDependencies(); -} - -DependenciesDialog::~DependenciesDialog() -{ -} - -} -} diff --git a/src/plugins/projectexplorer/dependenciesdialog.ui b/src/plugins/projectexplorer/dependenciesdialog.ui deleted file mode 100644 index 31a70dae9832c5d27b5eac73cbfe44665201aac8..0000000000000000000000000000000000000000 --- a/src/plugins/projectexplorer/dependenciesdialog.ui +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>ProjectExplorer::Internal::DependenciesDialog</class> - <widget class="QDialog" name="ProjectExplorer::Internal::DependenciesDialog"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>492</width> - <height>435</height> - </rect> - </property> - <property name="windowTitle"> - <string>Project Dependencies</string> - </property> - <layout class="QVBoxLayout"> - <property name="spacing"> - <number>6</number> - </property> - <property name="margin"> - <number>9</number> - </property> - <item> - <widget class="QTableView" name="dependencyTable"> - <property name="selectionMode"> - <enum>QAbstractItemView::SingleSelection</enum> - </property> - </widget> - </item> - <item> - <widget class="Line" name="line"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>ProjectExplorer::Internal::DependenciesDialog</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>142</x> - <y>285</y> - </hint> - <hint type="destinationlabel"> - <x>142</x> - <y>155</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>ProjectExplorer::Internal::DependenciesDialog</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>142</x> - <y>285</y> - </hint> - <hint type="destinationlabel"> - <x>142</x> - <y>155</y> - </hint> - </hints> - </connection> - </connections> -</ui> diff --git a/src/plugins/projectexplorer/dependenciespanel.cpp b/src/plugins/projectexplorer/dependenciespanel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bc83f7408a46c6253efacbb6399a96aee01fa3e7 --- /dev/null +++ b/src/plugins/projectexplorer/dependenciespanel.cpp @@ -0,0 +1,217 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2008-2009 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.3, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ + +#include "dependenciespanel.h" +#include "project.h" +#include "session.h" + +#include <coreplugin/fileiconprovider.h> + +#include <QtCore/QVector> +#include <QtCore/QDebug> +#include <QtCore/QAbstractListModel> +#include <QtGui/QHeaderView> +#include <QtGui/QMessageBox> +#include <QtGui/QPushButton> + +namespace ProjectExplorer { +namespace Internal { + +/// +/// DependenciesModel +/// + +class DependenciesModel : public QAbstractListModel +{ +public: + DependenciesModel(SessionManager *session, Project *project, QObject *parent = 0); + + int rowCount(const QModelIndex &index) const; + int columnCount(const QModelIndex &index) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + Qt::ItemFlags flags(const QModelIndex &index) const; + +private: + SessionManager *m_session; + Project *m_project; + QList<Project *> m_projects; +}; + +DependenciesModel::DependenciesModel(SessionManager *session, + Project *project, + QObject *parent) + : QAbstractListModel(parent) + , m_session(session) + , m_project(project) + , m_projects(session->projects()) +{ + // We can't select ourselves as a dependency + m_projects.removeAll(m_project); +} + +int DependenciesModel::rowCount(const QModelIndex &index) const +{ + return index.isValid() ? 0 : m_projects.size(); +} + +int DependenciesModel::columnCount(const QModelIndex &index) const +{ + return index.isValid() ? 0 : 1; +} + +QVariant DependenciesModel::data(const QModelIndex &index, int role) const +{ + const Project *p = m_projects.at(index.row()); + + switch (role) { + case Qt::DisplayRole: + return p->name(); + case Qt::CheckStateRole: + return m_session->hasDependency(m_project, p) ? Qt::Checked : Qt::Unchecked; + case Qt::DecorationRole: + return Core::FileIconProvider::instance()->icon(QFileInfo(p->file()->fileName())); + default: + return QVariant(); + } +} + +bool DependenciesModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + qDebug() << index << value << role << value.toBool(); + + if (role == Qt::CheckStateRole) { + const Project *p = m_projects.at(index.row()); + const Qt::CheckState c = static_cast<Qt::CheckState>(value.toInt()); + + if (c == Qt::Checked) { + if (m_session->addDependency(m_project, p)) { + emit dataChanged(index, index); + return true; + } else { + QMessageBox::warning(0, tr("Unable to add dependency"), + tr("This would create a circular dependency.")); + } + } else if (c == Qt::Unchecked) { + if (m_session->hasDependency(m_project, p)) { + m_session->removeDependency(m_project, p); + emit dataChanged(index, index); + return true; + } + } + } + return false; +} + +Qt::ItemFlags DependenciesModel::flags(const QModelIndex &index) const +{ + Qt::ItemFlags rc = QAbstractListModel::flags(index); + if (index.column() == 0) + rc |= Qt::ItemIsUserCheckable | Qt::ItemIsEditable; + return rc; +} + +/// +/// DependenciesWidget +/// + +class DependenciesWidget : public QWidget +{ +public: + DependenciesWidget(SessionManager *session, Project *project, + QWidget *parent = 0); + +private: + Ui::DependenciesWidget m_ui; + SessionManager *m_session; + DependenciesModel *m_model; +}; + +DependenciesWidget::DependenciesWidget(SessionManager *session, + Project *project, + QWidget *parent) + : QWidget(parent) + , m_session(session) + , m_model(new DependenciesModel(session, project, this)) +{ + m_ui.setupUi(this); + m_ui.dependenciesView->setModel(m_model); + m_ui.dependenciesView->setHeaderHidden(true); +} + +/// +/// DependenciesPanel +/// + +DependenciesPanel::DependenciesPanel(SessionManager *session, Project *project) + : PropertiesPanel() + , m_widget(new DependenciesWidget(session, project)) +{ +} + +DependenciesPanel::~DependenciesPanel() +{ + delete m_widget; +} + +QString DependenciesPanel::name() const +{ + return tr("Dependencies"); +} + +QWidget *DependenciesPanel::widget() +{ + return m_widget; +} + +/// +/// DependenciesPanelFactory +/// + +DependenciesPanelFactory::DependenciesPanelFactory(SessionManager *session) + : m_session(session) +{ +} + +bool DependenciesPanelFactory::supports(Project * /* project */) +{ + return true; +} + +PropertiesPanel *DependenciesPanelFactory::createPanel(Project *project) +{ + return new DependenciesPanel(m_session, project); +} + +} // namespace Internal +} // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/dependenciesdialog.h b/src/plugins/projectexplorer/dependenciespanel.h similarity index 73% rename from src/plugins/projectexplorer/dependenciesdialog.h rename to src/plugins/projectexplorer/dependenciespanel.h index 1dd8621a1ed6ddf77c0885128f9bdff4ddd94e6d..73c7755620c8f89ae708ab1a0f24ece196d902e7 100644 --- a/src/plugins/projectexplorer/dependenciesdialog.h +++ b/src/plugins/projectexplorer/dependenciespanel.h @@ -34,9 +34,10 @@ #ifndef DEPENDENCIESDIALOG_H #define DEPENDENCIESDIALOG_H -#include "ui_dependenciesdialog.h" +#include "iprojectproperties.h" +#include "ui_dependenciespanel.h" -#include <QtGui/QDialog> +#include <QtGui/QWidget> namespace ProjectExplorer { @@ -45,27 +46,32 @@ class SessionManager; namespace Internal { -class DependencyModel; +class DependenciesWidget; -// NBS kill DependenciesDialog? -class DependenciesDialog : public QDialog +class DependenciesPanelFactory : public IPanelFactory { - Q_OBJECT public: - typedef QList<ProjectExplorer::Project *> ProjectList; + DependenciesPanelFactory(SessionManager *session); + + bool supports(Project *project); + PropertiesPanel *createPanel(Project *project); + +private: + SessionManager *m_session; +}; - DependenciesDialog(QWidget *parent, SessionManager *sln); - virtual ~DependenciesDialog(); -public slots: - virtual void accept(); - void reset(); +class DependenciesPanel : public PropertiesPanel +{ + Q_OBJECT +public: + DependenciesPanel(SessionManager *session, Project *project); + ~DependenciesPanel(); + QString name() const; + QWidget *widget(); private: - Ui::DependenciesDialog m_ui; - SessionManager *m_sln; - ProjectList m_projectList; - DependencyModel *m_model; + DependenciesWidget *m_widget; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/dependenciespanel.ui b/src/plugins/projectexplorer/dependenciespanel.ui new file mode 100644 index 0000000000000000000000000000000000000000..83fc95b1a3bde674cd6fca9c4cb168370dc5a969 --- /dev/null +++ b/src/plugins/projectexplorer/dependenciespanel.ui @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ProjectExplorer::Internal::DependenciesWidget</class> + <widget class="QWidget" name="ProjectExplorer::Internal::DependenciesWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>502</width> + <height>375</height> + </rect> + </property> + <property name="windowTitle"> + <string>Project Dependencies</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="0"> + <widget class="QTreeView" name="dependenciesView"/> + </item> + <item row="1" column="1"> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Project Dependencies:</string> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/projectexplorer/editorsettingspropertiespage.h b/src/plugins/projectexplorer/editorsettingspropertiespage.h index 3be9f229c4f6a0697beec86a6b7c349379463721..45da481767592c1997084a0e69d0c18f30647bec 100644 --- a/src/plugins/projectexplorer/editorsettingspropertiespage.h +++ b/src/plugins/projectexplorer/editorsettingspropertiespage.h @@ -73,7 +73,6 @@ private slots: void currentEncodingChanged(int index); private: - Ui::EditorSettingsPropertiesPage m_ui; Project *m_project; QList<QTextCodec *> m_codecs; diff --git a/src/plugins/projectexplorer/iprojectproperties.h b/src/plugins/projectexplorer/iprojectproperties.h index aab3b5043315a47a3cceb202296e6f34bb14794b..aa823f49010bddeff7b8ebba90b5c36d3f96ff36 100644 --- a/src/plugins/projectexplorer/iprojectproperties.h +++ b/src/plugins/projectexplorer/iprojectproperties.h @@ -39,8 +39,6 @@ #include <coreplugin/icontext.h> -#include <QtGui/QWidget> - namespace ProjectExplorer { class PropertiesPanel; @@ -57,7 +55,7 @@ class PROJECTEXPLORER_EXPORT PropertiesPanel : public Core::IContext { Q_OBJECT public: - virtual void finish() {}; + virtual void finish() {} virtual QString name() const = 0; // IContext diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 3f377b52a11c9502a07efd56bfcb89d9850e68c3..961ad1a77084ef921f647688a70f0e73880e97e1 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -46,7 +46,6 @@ #include <QtCore/QTextCodec> using namespace ProjectExplorer; -using ExtensionSystem::PluginManager; Project::Project() : m_activeRunConfiguration(0), @@ -54,6 +53,14 @@ Project::Project() { } +Project::~Project() +{ + qDeleteAll(m_buildSteps); + qDeleteAll(m_cleanSteps); + qDeleteAll(m_buildConfigurationValues); + delete m_editorConfiguration; +} + void Project::insertBuildStep(int position, BuildStep *step) { m_buildSteps.insert(position, step); @@ -508,14 +515,3 @@ void Project::setDisplayNameFor(const QString &buildConfiguration, const QString } emit buildConfigurationDisplayNameChanged(buildConfiguration); } - - -Project::~Project() -{ - qDeleteAll(m_buildSteps); - qDeleteAll(m_cleanSteps); - qDeleteAll(m_buildConfigurationValues); - delete m_editorConfiguration; -} - - diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 2a30a0e20f3be4d7a546f3f7b349ef0328f9fa30..9a8c7bf0cbe962504176ec9e4c285428f422e11b 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -31,7 +31,6 @@ ** ***************************************************************************/ - #ifndef PROJECT_H #define PROJECT_H @@ -50,7 +49,7 @@ #include <QtGui/QIcon> namespace Core { - class IFile; +class IFile; } namespace ProjectExplorer { @@ -68,8 +67,7 @@ class PROJECTEXPLORER_EXPORT Project Q_OBJECT public: - // Roles to be implemented by all models that are exported - // via model() + // Roles to be implemented by all models that are exported via model() enum ModelRoles { // Absolute file path FilePathRole = QFileSystemModel::FilePathRole @@ -82,12 +80,11 @@ public: virtual Core::IFile *file() const = 0; virtual IProjectManager *projectManager() const = 0; - virtual QList<Core::IFile *> dependencies() = 0; //NBS TODO remove virtual QList<Project *> dependsOn() = 0; //NBS TODO implement dependsOn virtual bool isApplication() const = 0; - //Build/Clean Step functions + // Build/Clean Step functions QList<BuildStep *> buildSteps() const; void insertBuildStep(int position, BuildStep *step); void removeBuildStep(int position); @@ -97,7 +94,7 @@ public: void insertCleanStep(int position, BuildStep *step); void removeCleanStep(int position); - //Build configuration + // Build configuration void addBuildConfiguration(const QString &name); void removeBuildConfiguration(const QString &name); void copyBuildConfiguration(const QString &source, const QString &dest); @@ -133,8 +130,9 @@ public: virtual BuildStepConfigWidget *createConfigWidget() = 0; virtual QList<BuildStepConfigWidget*> subConfigWidgets(); - // This method is called for new build configurations - // You should probably set some default values in this method + /* This method is called for new build configurations. You should probably + * set some default values in this method. + */ virtual void newBuildConfiguration(const QString &buildConfiguration) = 0; virtual ProjectNode *rootProjectNode() const = 0; @@ -150,19 +148,22 @@ signals: void buildConfigurationDisplayNameChanged(const QString &buildConfiguraiton); protected: - // This method is called when the project .user file is saved. - // Simply call writer.saveValue() for each value you want to save - // Make sure to always call your base class implementation - // Note: All the values from the project/buildsteps and buildconfigurations - // are automatically stored. + /* This method is called when the project .user file is saved. Simply call + * writer.saveValue() for each value you want to save. Make sure to always + * call your base class implementation. + * + * Note: All the values from the project/buildsteps and buildconfigurations + * are automatically stored. + */ virtual void saveSettingsImpl(PersistentSettingsWriter &writer); - // This method is called when the project is opened - // You can retrieve all the values you saved in saveSettingsImpl() - // in this method. - // Note: This function is also called if there is no .user file - // You should probably add some default build and run settings to the project - // so that it can be build and run + /* This method is called when the project is opened. You can retrieve all + * the values you saved in saveSettingsImpl() in this method. + * + * Note: This function is also called if there is no .user file. You should + * probably add some default build and run settings to the project so that + * it can be build and run. + */ virtual void restoreSettingsImpl(PersistentSettingsReader &reader); private: @@ -181,4 +182,4 @@ private: } // namespace ProjectExplorer -#endif // PROJECTINTERFACE_H +#endif // PROJECT_H diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 5e41913db026ed37aeb7cce03ed6915458055849..20e4e15fc8a9ae6b98d3593a18caf3757558ebf6 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -34,12 +34,13 @@ #include "applicationrunconfiguration.h" #include "allprojectsfilter.h" #include "allprojectsfind.h" -#include "currentprojectfind.h" #include "buildmanager.h" #include "buildsettingspropertiespage.h" -#include "editorsettingspropertiespage.h" +#include "currentprojectfind.h" #include "currentprojectfilter.h" #include "customexecutablerunconfiguration.h" +#include "editorsettingspropertiespage.h" +#include "dependenciespanel.h" #include "foldernavigationwidget.h" #include "iprojectmanager.h" #include "metatypedeclarations.h" @@ -215,6 +216,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin addAutoReleasedObject(new BuildSettingsPanelFactory); addAutoReleasedObject(new RunSettingsPanelFactory); addAutoReleasedObject(new EditorSettingsPanelFactory); + addAutoReleasedObject(new DependenciesPanelFactory(m_session)); ProcessStepFactory *processStepFactory = new ProcessStepFactory; addAutoReleasedObject(processStepFactory); @@ -485,11 +487,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin mbuild->addAction(cmd, Constants::G_BUILD_SESSION); msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD); - // dependencies action - m_dependenciesAction = new QAction(tr("Edit Dependencies..."), this); - cmd = am->registerAction(m_dependenciesAction, Constants::DEPENDENCIES, globalcontext); - mbuild->addAction(cmd, Constants::G_BUILD_SESSION); - // build action m_buildAction = new QAction(tr("Build Project"), this); cmd = am->registerAction(m_buildAction, Constants::BUILD, globalcontext); @@ -622,7 +619,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin connect(m_runActionContextMenu, SIGNAL(triggered()), this, SLOT(runProjectContextMenu())); connect(m_cancelBuildAction, SIGNAL(triggered()), this, SLOT(cancelBuild())); connect(m_debugAction, SIGNAL(triggered()), this, SLOT(debugProject())); - connect(m_dependenciesAction, SIGNAL(triggered()), this, SLOT(editDependencies())); connect(m_unloadAction, SIGNAL(triggered()), this, SLOT(unloadProject())); connect(m_clearSession, SIGNAL(triggered()), this, SLOT(clearSession())); connect(m_taskAction, SIGNAL(triggered()), this, SLOT(goToTaskWindow())); @@ -701,7 +697,7 @@ void ProjectExplorerPlugin::unloadProject() QList<Core::IFile*> filesToSave; filesToSave << fi; - filesToSave << m_currentProject->dependencies(); + // FIXME: What we want here is to check whether we need to safe any of the pro/pri files in this project // check the number of modified files int readonlycount = 0; @@ -1203,13 +1199,13 @@ void ProjectExplorerPlugin::updateActions() m_rebuildSessionAction->setEnabled(hasProjects && !building); m_cleanSessionAction->setEnabled(hasProjects && !building); m_cancelBuildAction->setEnabled(building); - m_dependenciesAction->setEnabled(hasProjects && !building); updateRunAction(); updateTaskActions(); } + // NBS TODO check projectOrder() // what we want here is all the projects pro depends on QStringList ProjectExplorerPlugin::allFilesWithDependencies(Project *pro) @@ -1467,14 +1463,6 @@ void ProjectExplorerPlugin::cancelBuild() m_buildManager->cancel(); } -void ProjectExplorerPlugin::editDependencies() -{ - if (debug) - qDebug() << "ProjectExplorerPlugin::editDependencies"; - - m_session->editDependencies(); -} - void ProjectExplorerPlugin::addToRecentProjects(const QString &fileName) { if (debug) diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index ff58e7ba8c667c25e369bf221c45ede7bbd3d78e..94e25159928c66cb77fd1a4a6086eeb6867410e5 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -138,7 +138,6 @@ private slots: void cleanSession(); void cancelBuild(); void debugProject(); - void editDependencies(); void loadAction(); void unloadProject(); void clearSession(); @@ -228,7 +227,6 @@ private: QAction *m_runActionContextMenu; QAction *m_cancelBuildAction; QAction *m_debugAction; - QAction *m_dependenciesAction; QAction *m_taskAction; QAction *m_addNewFileAction; QAction *m_addExistingFilesAction; diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index bbb8a4c74d9304ee40bf1f9c47141bbd4eb349ef..e345ff1c1cea37f8884e4b1843cdf2d9e80b5adc 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -15,7 +15,7 @@ HEADERS += projectexplorer.h \ persistentsettings.h \ projectfilewizardextension.h \ session.h \ - dependenciesdialog.h \ + dependenciespanel.h \ allprojectsfilter.h \ buildparserinterface.h \ projectexplorerconstants.h \ @@ -62,7 +62,7 @@ SOURCES += projectexplorer.cpp \ persistentsettings.cpp \ projectfilewizardextension.cpp \ session.cpp \ - dependenciesdialog.cpp \ + dependenciespanel.cpp \ allprojectsfilter.cpp \ currentprojectfilter.cpp \ scriptwrappers.cpp \ @@ -94,7 +94,7 @@ SOURCES += projectexplorer.cpp \ nodesvisitor.cpp \ projectmodels.cpp \ currentprojectfind.cpp -FORMS += dependenciesdialog.ui \ +FORMS += dependenciespanel.ui \ buildsettingspropertiespage.ui \ processstep.ui \ editorsettingspropertiespage.ui \ diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index ef848ff178b157c3458116a8fffd201d0df77883..f5b83d162cd2be7e07f2aacbd21dbf83a761fa5d 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -33,7 +33,6 @@ #include "session.h" -#include "dependenciesdialog.h" #include "project.h" #include "projectexplorer.h" #include "projectexplorerconstants.h" @@ -59,6 +58,7 @@ #include <QtCore/QFuture> #include <QtCore/QSettings> +#include <QtGui/QApplication> #include <QtGui/QMainWindow> #include <QtGui/QMessageBox> @@ -118,7 +118,6 @@ private: using namespace ProjectExplorer; using Internal::SessionFile; -using Internal::DependenciesDialog; void SessionFile::sessionLoadingProgress() @@ -452,7 +451,28 @@ bool SessionManager::recursiveDependencyCheck(const QString &newDep, const QStri return true; } -bool SessionManager::hasDependency(Project *project, Project *depProject) const +/* + * TODO: The dependency management exposes an interface based on projects, but + * is internally purely string based. This is suboptimal. Probably it would be + * nicer to map the filenames to projects on load and only map it back to + * filenames when saving. + */ + +QList<Project *> SessionManager::dependencies(const Project *project) const +{ + const QString &proName = project->file()->fileName(); + const QStringList &proDeps = m_file->m_depMap.value(proName); + + QList<Project *> projects; + foreach (const QString &dep, proDeps) { + if (Project *pro = projectForFile(dep)) + projects += pro; + } + + return projects; +} + +bool SessionManager::hasDependency(const Project *project, const Project *depProject) const { const QString &proName = project->file()->fileName(); const QString &depName = depProject->file()->fileName(); @@ -461,7 +481,7 @@ bool SessionManager::hasDependency(Project *project, Project *depProject) const return proDeps.contains(depName); } -bool SessionManager::canAddDependency(Project *project, Project *depProject) const +bool SessionManager::canAddDependency(const Project *project, const Project *depProject) const { const QString &newDep = project->file()->fileName(); const QString &checkDep = depProject->file()->fileName(); @@ -469,7 +489,7 @@ bool SessionManager::canAddDependency(Project *project, Project *depProject) con return recursiveDependencyCheck(newDep, checkDep); } -bool SessionManager::addDependency(Project *project, Project *depProject) +bool SessionManager::addDependency(const Project *project, const Project *depProject) { const QString &proName = project->file()->fileName(); const QString &depName = depProject->file()->fileName(); @@ -487,6 +507,20 @@ bool SessionManager::addDependency(Project *project, Project *depProject) return true; } +void SessionManager::removeDependency(const Project *project, const Project *depProject) +{ + const QString &proName = project->file()->fileName(); + const QString &depName = depProject->file()->fileName(); + + QStringList proDeps = m_file->m_depMap.value(proName); + proDeps.removeAll(depName); + if (proDeps.isEmpty()) { + m_file->m_depMap.remove(proName); + } else { + m_file->m_depMap[proName] = proDeps; + } +} + void SessionManager::setStartupProject(Project *startupProject) { if (debug) @@ -505,21 +539,6 @@ Project *SessionManager::startupProject() const return m_file->m_startupProject; } -void SessionManager::removeDependency(Project *project, - Project *depProject) -{ - const QString &proName = project->file()->fileName(); - const QString &depName = depProject->file()->fileName(); - - QStringList proDeps = m_file->m_depMap.value(proName); - proDeps.removeAll(depName); - if (proDeps.isEmpty()) { - m_file->m_depMap.remove(proName); - } else { - m_file->m_depMap[proName] = proDeps; - } -} - void SessionManager::addProject(Project *project) { addProjects(QList<Project*>() << project); @@ -702,12 +721,6 @@ bool SessionManager::clear() return success; } -void SessionManager::editDependencies() -{ - DependenciesDialog dlg(0, this); - dlg.exec(); -} - const QList<Project *> &SessionManager::projects() const { return m_file->m_projects; diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index 49d15b7e8df43b52cc6eb99d5a03a4c9d48b4e41..f8768ab468bb57087f4edcd09626ffaf5169b4f6 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -123,16 +123,13 @@ public: void removeProject(Project *project); void removeProjects(QList<Project *> remove); - void editDependencies(); void setStartupProject(Project *startupProject); - // NBS think about dependency management again. - // Probably kill these here - bool canAddDependency(Project *project, Project *depProject) const; - bool hasDependency(Project *project, Project *depProject) const; - // adds the 'requiredProject' as a dependency to 'project' - bool addDependency(Project *project, Project *depProject); - void removeDependency(Project *project, Project *depProject); + QList<Project *> dependencies(const Project *project) const; + bool hasDependency(const Project *project, const Project *depProject) const; + bool canAddDependency(const Project *project, const Project *depProject) const; + bool addDependency(const Project *project, const Project *depProject); + void removeDependency(const Project *project, const Project *depProject); Core::IFile *file() const; Project *startupProject() const; diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index 611d4930b407c062d9ed982442e521eb48440fd4..cb5d99a642b5ceea1fd4c91f69d8f5aa35d669a0 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -569,17 +569,6 @@ QStringList Qt4Project::files(FilesMode fileMode) const return files; } -QList<Core::IFile *> Qt4Project::dependencies() -{ - QList<Core::IFile *> result; - // TODO profile cache is no longer -// ProFileCache *cache = m_manager->proFileCache(); -// foreach (const QString &file, cache->dependencies(m_rootProjectNode)) { -// result << cache->fileInterface(file); -// } - return result; -} - QList<ProjectExplorer::Project*> Qt4Project::dependsOn() { // NBS implement dependsOn diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index 792ae2aed45bf374a616f6810511c1264326c52f..c589d2eb8651f66b975a44f0e8a5bc2c462d979a 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -74,7 +74,12 @@ using ProjectExplorer::ResourceType; using ProjectExplorer::UnknownFileType; // Known file types of a Qt 4 project -static const char* qt4FileTypes[] = {"CppHeaderFiles", "CppSourceFiles", "Qt4FormFiles", "Qt4ResourceFiles" }; +static const char* qt4FileTypes[] = { + "CppHeaderFiles", + "CppSourceFiles", + "Qt4FormFiles", + "Qt4ResourceFiles" +}; Qt4Manager::Qt4Manager(Qt4ProjectManagerPlugin *plugin, Core::ICore *core) : m_mimeType(QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE)),