diff --git a/src/plugins/cvs/cvseditor.cpp b/src/plugins/cvs/cvseditor.cpp index e4761ab151830780fdbaeeb3dfaba3eedba8b062..914199920d366850095f26e3a914de48c22a46e1 100644 --- a/src/plugins/cvs/cvseditor.cpp +++ b/src/plugins/cvs/cvseditor.cpp @@ -54,6 +54,7 @@ CVSEditor::CVSEditor(const VCSBase::VCSBaseEditorParameters *type, { QTC_ASSERT(m_revisionAnnotationPattern.isValid(), return); QTC_ASSERT(m_revisionLogPattern.isValid(), return); + setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\"")); } QSet<QString> CVSEditor::annotationChanges() const @@ -149,11 +150,10 @@ QString CVSEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock) cons return QString(); } -QStringList CVSEditor::annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const +QStringList CVSEditor::annotationPreviousVersions(const QString &revision) const { if (isFirstRevision(revision)) return QStringList(); - *actionTextFormat = tr("Annotate revision \"%1\""); return QStringList(previousRevision(revision)); } diff --git a/src/plugins/cvs/cvseditor.h b/src/plugins/cvs/cvseditor.h index 614f4adc88465d23bba178f0edfbf88c28ae9eea..0d313e4e41f2fecf0fb5ee5f97829fc9abca3d34 100644 --- a/src/plugins/cvs/cvseditor.h +++ b/src/plugins/cvs/cvseditor.h @@ -51,7 +51,7 @@ private: virtual VCSBase::DiffHighlighter *createDiffHighlighter() const; virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const; virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const; - virtual QStringList annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const; + virtual QStringList annotationPreviousVersions(const QString &revision) const; const QRegExp m_revisionAnnotationPattern; const QRegExp m_revisionLogPattern; diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index e81bb94341424259e8f714454127a481ac1267a3..3f3ed34d59616adb8a2f035c42187942019457a5 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -95,6 +95,9 @@ static const char * const CMD_ID_ANNOTATE_CURRENT = "CVS.AnnotateCurrent"; static const char * const CMD_ID_SEPARATOR3 = "CVS.Separator3"; static const char * const CMD_ID_STATUS = "CVS.Status"; static const char * const CMD_ID_UPDATE = "CVS.Update"; +static const char * const CMD_ID_PROJECTLOG = "CVS.ProjectLog"; +static const char * const CMD_ID_REPOSITORYLOG = "CVS.RepositoryLog"; +static const char * const CMD_ID_SEPARATOR4 = "CVS.Separator4"; static const VCSBase::VCSBaseEditorParameters editorParameters[] = { { @@ -149,6 +152,8 @@ CVSPlugin::CVSPlugin() : m_revertAction(0), m_diffProjectAction(0), m_diffCurrentAction(0), + m_logProjectAction(0), + m_logRepositoryAction(0), m_commitAllAction(0), m_commitCurrentAction(0), m_filelogCurrentAction(0), @@ -325,12 +330,24 @@ bool CVSPlugin::initialize(const QStringList & /*arguments */, QString *errorMes connect(m_statusProjectAction, SIGNAL(triggered()), this, SLOT(projectStatus())); cvsMenu->addAction(command); + m_logProjectAction = new Utils::ParameterAction(tr("Log Project"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this); + command = ami->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext); + command->setAttribute(Core::Command::CA_UpdateText); + connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject())); + cvsMenu->addAction(command); + m_updateProjectAction = new Utils::ParameterAction(tr("Update Project"), tr("Update Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this); command = ami->registerAction(m_updateProjectAction, CMD_ID_UPDATE, globalcontext); command->setAttribute(Core::Command::CA_UpdateText); connect(m_updateProjectAction, SIGNAL(triggered()), this, SLOT(updateProject())); cvsMenu->addAction(command); + cvsMenu->addAction(createSeparator(this, ami, CMD_ID_SEPARATOR4, globalcontext)); + m_logRepositoryAction = new QAction(tr("Repository Log"), this); + command = ami->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext); + connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository())); + cvsMenu->addAction(command); + // Actions of the submit editor QList<int> cvscommitcontext; cvscommitcontext << Core::UniqueIDManager::instance()->uniqueIdentifier(Constants::CVSCOMMITEDITOR); @@ -475,6 +492,8 @@ void CVSPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as) if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction)) return; + m_logRepositoryAction->setEnabled(currentState().hasTopLevel()); + const QString currentFileName = currentState().currentFileName(); m_addAction->setParameter(currentFileName); m_deleteAction->setParameter(currentFileName); @@ -488,6 +507,7 @@ void CVSPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as) m_diffProjectAction->setParameter(currentProjectName); m_statusProjectAction->setParameter(currentProjectName); m_updateProjectAction->setParameter(currentProjectName); + m_logProjectAction->setParameter(currentProjectName); m_commitAllAction->setEnabled(currentState().hasTopLevel()); } @@ -641,10 +661,26 @@ void CVSPlugin::filelogCurrentFile() { const VCSBase::VCSBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return) - filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile())); + filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true); } -void CVSPlugin::filelog(const QString &workingDir, const QStringList &files) +void CVSPlugin::logProject() +{ + const VCSBase::VCSBasePluginState state = currentState(); + QTC_ASSERT(state.hasProject(), return) + filelog(state.currentProjectTopLevel(), state.relativeCurrentProject()); +} + +void CVSPlugin::logRepository() +{ + const VCSBase::VCSBasePluginState state = currentState(); + QTC_ASSERT(state.hasTopLevel(), return) + filelog(state.topLevel()); +} + +void CVSPlugin::filelog(const QString &workingDir, + const QStringList &files, + bool enableAnnotationContextMenu) { QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, files); // no need for temp file @@ -659,7 +695,6 @@ void CVSPlugin::filelog(const QString &workingDir, const QStringList &files) // Re-use an existing view if possible to support // the common usage pattern of continuously changing and diffing a file - if (Core::IEditor *editor = locateEditor("logFileName", id)) { editor->createNew(response.stdOut); Core::EditorManager::instance()->activateEditor(editor); @@ -667,6 +702,8 @@ void CVSPlugin::filelog(const QString &workingDir, const QStringList &files) const QString title = QString::fromLatin1("cvs log %1").arg(id); Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::LogOutput, source, codec); newEditor->setProperty("logFileName", id); + if (enableAnnotationContextMenu) + VCSBase::VCSBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true); } } @@ -726,8 +763,6 @@ void CVSPlugin::annotate(const QString &workingDir, const QString &file, const QString title = QString::fromLatin1("cvs annotate %1").arg(id); Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec); newEditor->setProperty("annotateFileName", id); - connect(newEditor, SIGNAL(annotatePreviousRequested(QString,QString,int)), - this, SLOT(annotateVersion(QString,QString,int))); VCSBase::VCSBaseEditor::gotoLineOfEditor(newEditor, lineNumber); } } @@ -992,6 +1027,8 @@ Core::IEditor * CVSPlugin::showOutputInEditor(const QString& title, const QStrin qDebug() << "CVSPlugin::showOutputInEditor" << title << kind << "source=" << source << "Size= " << output.size() << " Type=" << editorType << debugCodec(codec); QString s = title; Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output.toLocal8Bit()); + connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)), + this, SLOT(annotateVersion(QString,QString,int))); CVSEditor *e = qobject_cast<CVSEditor*>(editor->widget()); if (!e) return 0; diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h index dd4eeb81d001f84655845e8ab5a42ae4c19bdef7..74eb3055cc153953d37749eb3d872fe8ac89450b 100644 --- a/src/plugins/cvs/cvsplugin.h +++ b/src/plugins/cvs/cvsplugin.h @@ -113,6 +113,8 @@ private slots: void updateProject(); void submitCurrentLog(); void diffCommitFiles(const QStringList &); + void logProject(); + void logRepository(); protected: virtual void updateActions(VCSBase::VCSBasePlugin::ActionState); @@ -135,7 +137,9 @@ private: bool describe(const QString &source, const QString &changeNr, QString *errorMessage); bool describe(const QString &toplevel, const QString &source, const QString &changeNr, QString *errorMessage); bool describe(const QString &repository, QList<CVS_LogEntry> entries, QString *errorMessage); - void filelog(const QString &workingDir, const QStringList &files = QStringList()); + void filelog(const QString &workingDir, + const QStringList &files = QStringList(), + bool enableAnnotationContextMenu = false); bool managesDirectory(const QDir &directory) const; QString findTopLevelForDirectoryI(const QString &directory) const; void startCommit(const QString &workingDir, const QStringList &files = QStringList()); @@ -152,6 +156,8 @@ private: Utils::ParameterAction *m_revertAction; Utils::ParameterAction *m_diffProjectAction; Utils::ParameterAction *m_diffCurrentAction; + Utils::ParameterAction *m_logProjectAction; + QAction *m_logRepositoryAction; QAction *m_commitAllAction; Utils::ParameterAction *m_commitCurrentAction; Utils::ParameterAction *m_filelogCurrentAction; diff --git a/src/plugins/perforce/perforceeditor.cpp b/src/plugins/perforce/perforceeditor.cpp index 44ecd104017f50b38e2ebb4a1c23f33323bca3ca..d6e3f9e9a36a996b1f41b76abbc6b221922bfe04 100644 --- a/src/plugins/perforce/perforceeditor.cpp +++ b/src/plugins/perforce/perforceeditor.cpp @@ -62,6 +62,7 @@ PerforceEditor::PerforceEditor(const VCSBase::VCSBaseEditorParameters *type, m_plugin(PerforcePlugin::perforcePluginInstance()) { QTC_ASSERT(m_changeNumberPattern.isValid(), /**/); + setAnnotateRevisionTextFormat(tr("Annotate change list \"%1\"")); if (Perforce::Constants::debug) qDebug() << "PerforceEditor::PerforceEditor" << type->type << type->kind; } @@ -154,13 +155,12 @@ QString PerforceEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock) return QString(); } -QStringList PerforceEditor::annotationPreviousVersions(const QString &v, QString *actionTextFormat) const +QStringList PerforceEditor::annotationPreviousVersions(const QString &v) const { bool ok; const int changeList = v.toInt(&ok); if (!ok || changeList < 2) return QStringList(); - *actionTextFormat = tr("Annotate change list \"%1\""); return QStringList(QString::number(changeList - 1)); } diff --git a/src/plugins/perforce/perforceeditor.h b/src/plugins/perforce/perforceeditor.h index 86bbbb6792c20c07598ffbb2709f66818930e080..50650e41d17f1df32c413b48ed19542645a5df74 100644 --- a/src/plugins/perforce/perforceeditor.h +++ b/src/plugins/perforce/perforceeditor.h @@ -53,7 +53,7 @@ private: virtual VCSBase::DiffHighlighter *createDiffHighlighter() const; virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const; virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const; - virtual QStringList annotationPreviousVersions(const QString &v, QString *actionTextFormat) const; + virtual QStringList annotationPreviousVersions(const QString &v) const; const QRegExp m_changeNumberPattern; PerforcePlugin *m_plugin; diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index c3fd22d3f24c2759adc493974a1a624058660576..2320b57d519b9c154b5d3b0d185953a0153ec5a8 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -133,6 +133,8 @@ static const char * const CMD_ID_EDIT = "Perforce.Edit"; static const char * const CMD_ID_ADD = "Perforce.Add"; static const char * const CMD_ID_DELETE_FILE = "Perforce.Delete"; static const char * const CMD_ID_OPENED = "Perforce.Opened"; +static const char * const CMD_ID_PROJECTLOG = "Perforce.ProjectLog"; +static const char * const CMD_ID_REPOSITORYLOG = "Perforce.RepositoryLog"; static const char * const CMD_ID_REVERT = "Perforce.Revert"; static const char * const CMD_ID_DIFF_CURRENT = "Perforce.DiffCurrent"; static const char * const CMD_ID_DIFF_PROJECT = "Perforce.DiffProject"; @@ -152,6 +154,7 @@ static const char * const CMD_ID_UPDATEALL = "Perforce.UpdateAll"; static const char * const CMD_ID_SEPARATOR1 = "Perforce.Separator1"; static const char * const CMD_ID_SEPARATOR2 = "Perforce.Separator2"; static const char * const CMD_ID_SEPARATOR3 = "Perforce.Separator3"; +static const char * const CMD_ID_SEPARATOR4 = "Perforce.Separator4"; //// // PerforcePlugin @@ -188,6 +191,8 @@ PerforcePlugin::PerforcePlugin() : m_annotateAction(0), m_filelogCurrentAction(0), m_filelogAction(0), + m_logProjectAction(0), + m_logRepositoryAction(0), m_submitCurrentLogAction(0), m_updateAllAction(0), m_submitActionTriggered(false), @@ -318,6 +323,12 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString * e connect(m_openedAction, SIGNAL(triggered()), this, SLOT(printOpenedFileList())); mperforce->addAction(command); + m_logProjectAction = new Utils::ParameterAction(tr("Log Project Log"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this); + command = am->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext); + command->setAttribute(Core::Command::CA_UpdateText); + connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject())); + mperforce->addAction(command); + m_submitProjectAction = new Utils::ParameterAction(tr("Submit Project"), tr("Submit Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this); command = am->registerAction(m_submitProjectAction, CMD_ID_SUBMIT, globalcontext); command->setAttribute(Core::Command::CA_UpdateText); @@ -385,6 +396,16 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString * e connect(m_filelogAction, SIGNAL(triggered()), this, SLOT(filelog())); mperforce->addAction(command); + tmpaction = new QAction(this); + tmpaction->setSeparator(true); + command = am->registerAction(tmpaction, QLatin1String(CMD_ID_SEPARATOR4), globalcontext); + mperforce->addAction(command); + + m_logRepositoryAction = new QAction(tr("Repository Log"), this); + command = am->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext); + connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository())); + mperforce->addAction(command); + m_updateAllAction = new QAction(tr("Update All"), this); command = am->registerAction(m_updateAllAction, CMD_ID_UPDATEALL, globalcontext); connect(m_updateAllAction, SIGNAL(triggered()), this, SLOT(updateAll())); @@ -715,8 +736,6 @@ void PerforcePlugin::annotate(const QString &workingDir, Core::IEditor *ed = showOutputInEditor(tr("p4 annotate %1").arg(id), result.stdOut, VCSBase::AnnotateOutput, source, codec); - connect(ed, SIGNAL(annotatePreviousRequested(QString,QString,int)), - this, SLOT(annotateVersion(QString,QString,int))); VCSBase::VCSBaseEditor::gotoLineOfEditor(ed, lineNumber); } } @@ -725,7 +744,7 @@ void PerforcePlugin::filelogCurrentFile() { const VCSBase::VCSBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return) - filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile())); + filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true); } void PerforcePlugin::filelog() @@ -737,21 +756,40 @@ void PerforcePlugin::filelog() } } -void PerforcePlugin::filelog(const QString &workingDir, const QStringList &fileNames) +void PerforcePlugin::logProject() +{ + const VCSBase::VCSBasePluginState state = currentState(); + QTC_ASSERT(state.hasProject(), return) + filelog(state.currentProjectTopLevel(), perforceRelativeFileArguments(state.relativeCurrentProject())); +} + +void PerforcePlugin::logRepository() +{ + const VCSBase::VCSBasePluginState state = currentState(); + QTC_ASSERT(state.hasTopLevel(), return) + filelog(state.topLevel(), perforceRelativeFileArguments(QStringList())); +} + +void PerforcePlugin::filelog(const QString &workingDir, const QStringList &fileNames, + bool enableAnnotationContextMenu) { const QString id = VCSBase::VCSBaseEditor::getTitleId(workingDir, fileNames); QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, fileNames); QStringList args; args << QLatin1String("filelog") << QLatin1String("-li"); + if (m_settings.logCount() > 0) + args << QLatin1String("-m") << QString::number(m_settings.logCount()); args.append(fileNames); const PerforceResponse result = runP4Cmd(workingDir, args, CommandToWindow|StdErrToWindow|ErrorToWindow, QStringList(), QByteArray(), codec); - if (!result.error) - showOutputInEditor(tr("p4 filelog %1").arg(id), result.stdOut, - VCSBase::LogOutput, - VCSBase::VCSBaseEditor::getSource(workingDir, fileNames), - codec); + if (!result.error) { + const QString source = VCSBase::VCSBaseEditor::getSource(workingDir, fileNames); + Core::IEditor *editor = showOutputInEditor(tr("p4 filelog %1").arg(id), result.stdOut, + VCSBase::LogOutput, source, codec); + if (enableAnnotationContextMenu) + VCSBase::VCSBaseEditor::getVcsBaseEditor(editor)->setFileLogAnnotateEnabled(true); + } } void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as) @@ -759,6 +797,8 @@ void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as) if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction)) return; + m_logRepositoryAction->setEnabled(currentState().hasTopLevel()); + const QString fileName = currentState().currentFileName(); m_editAction->setParameter(fileName); m_addAction->setParameter(fileName); @@ -769,6 +809,7 @@ void PerforcePlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as) m_filelogCurrentAction->setParameter(fileName); const QString projectName = currentState().currentProjectName(); + m_logProjectAction->setParameter(projectName); m_updateProjectAction->setParameter(projectName); m_diffProjectAction->setParameter(projectName); m_submitProjectAction->setParameter(projectName); @@ -1110,6 +1151,8 @@ Core::IEditor * PerforcePlugin::showOutputInEditor(const QString& title, const Q qDebug() << "PerforcePlugin::showOutputInEditor" << title << kind << "Size= " << output.size() << " Type=" << editorType << debugCodec(codec); QString s = title; Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output); + connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)), + this, SLOT(annotateVersion(QString,QString,int))); PerforceEditor *e = qobject_cast<PerforceEditor*>(editor->widget()); if (!e) return 0; diff --git a/src/plugins/perforce/perforceplugin.h b/src/plugins/perforce/perforceplugin.h index b0b4c947e953d45a0b77e27a0055f4ccfaf2f90e..8f7c3819e495bb7e15cabc096eda8e06e9eebfb1 100644 --- a/src/plugins/perforce/perforceplugin.h +++ b/src/plugins/perforce/perforceplugin.h @@ -123,6 +123,8 @@ private slots: void annotateVersion(const QString &file, const QString &revision, int lineNumber); void filelogCurrentFile(); void filelog(); + void logProject(); + void logRepository(); void submitCurrentLog(); void printPendingChanges(); @@ -177,7 +179,8 @@ private: QString clientFilePath(const QString &serverFilePath); void annotate(const QString &workingDir, const QString &fileName, const QString &changeList = QString(), int lineNumber = -1); - void filelog(const QString &workingDir, const QStringList &fileNames); + void filelog(const QString &workingDir, const QStringList &fileNames = QStringList(), + bool enableAnnotationContextMenu = false); void cleanCommitMessageFile(); bool isCommitEditorOpen() const; QSharedPointer<QTemporaryFile> createTemporaryArgumentFile(const QStringList &extraArgs) const; @@ -208,6 +211,8 @@ private: QAction *m_annotateAction; Utils::ParameterAction *m_filelogCurrentAction; QAction *m_filelogAction; + Utils::ParameterAction *m_logProjectAction; + QAction *m_logRepositoryAction; QAction *m_submitCurrentLogAction; QAction *m_updateAllAction; bool m_submitActionTriggered; diff --git a/src/plugins/perforce/perforcesettings.cpp b/src/plugins/perforce/perforcesettings.cpp index f50fbe72dc84552161eb68e9bc1bb68cb0323f6b..149e895f1727405c0856bf543fc4faca1e8b1025 100644 --- a/src/plugins/perforce/perforcesettings.cpp +++ b/src/plugins/perforce/perforcesettings.cpp @@ -47,8 +47,9 @@ static const char *clientKeyC = "Client"; static const char *userKeyC = "User"; static const char *promptToSubmitKeyC = "PromptForSubmit"; static const char *timeOutKeyC = "TimeOut"; +static const char *logCountKeyC = "LogCount"; -enum { defaultTimeOutS = 30 }; +enum { defaultTimeOutS = 30, defaultLogCount = 1000 }; static QString defaultCommand() { @@ -64,6 +65,7 @@ namespace Perforce { namespace Internal { Settings::Settings() : + logCount(defaultLogCount), defaultEnv(true), timeOutS(defaultTimeOutS), promptToSubmit(true) @@ -73,6 +75,7 @@ Settings::Settings() : bool Settings::equals(const Settings &rhs) const { return defaultEnv == rhs.defaultEnv + && logCount == rhs.logCount && p4Command == rhs.p4Command && p4Port == rhs.p4Port && p4Client == rhs.p4Client && p4User == rhs.p4User && timeOutS == rhs.timeOutS && promptToSubmit == rhs.promptToSubmit; @@ -111,6 +114,7 @@ void PerforceSettings::fromSettings(QSettings *settings) m_settings.p4User = settings->value(QLatin1String(userKeyC), QString()).toString(); m_settings.timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt(); m_settings.promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool(); + m_settings.logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt(); settings->endGroup(); } @@ -124,6 +128,7 @@ void PerforceSettings::toSettings(QSettings *settings) const settings->setValue(QLatin1String(userKeyC), m_settings.p4User); settings->setValue(QLatin1String(timeOutKeyC), m_settings.timeOutS); settings->setValue(QLatin1String(promptToSubmitKeyC), m_settings.promptToSubmit); + settings->setValue(QLatin1String(logCountKeyC), m_settings.logCount); settings->endGroup(); } diff --git a/src/plugins/perforce/perforcesettings.h b/src/plugins/perforce/perforcesettings.h index feeae3f26821bca8e9bf9e8df26c2a0fbae63f4d..2cf8cb978dfcfdec957874ebab972372ef3d68a0 100644 --- a/src/plugins/perforce/perforcesettings.h +++ b/src/plugins/perforce/perforcesettings.h @@ -57,6 +57,7 @@ struct Settings { QString p4Client; QString p4User; QString errorString; + int logCount; bool defaultEnv; int timeOutS; bool promptToSubmit; @@ -97,6 +98,8 @@ public: inline int timeOutMS() const { return m_settings.timeOutS * 1000; } inline int longTimeOutMS() const { return m_settings.timeOutS * 10000; } + inline int logCount() const { return m_settings.logCount; } + QString topLevel() const; QString topLevelSymLinkTarget() const; diff --git a/src/plugins/perforce/settingspage.cpp b/src/plugins/perforce/settingspage.cpp index 456a049805a06474f8752deb92dfc1401a42d501..793697bc42be7d39c5e1624e7da1b75487b82d41 100644 --- a/src/plugins/perforce/settingspage.cpp +++ b/src/plugins/perforce/settingspage.cpp @@ -82,6 +82,7 @@ Settings SettingsPageWidget::settings() const settings.p4User = m_ui.userLineEdit->text(); settings.p4Client= m_ui.clientLineEdit->text(); settings.timeOutS = m_ui.timeOutSpinBox->value(); + settings.logCount = m_ui.logCountSpinBox->value(); settings.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked(); return settings; } @@ -93,6 +94,7 @@ void SettingsPageWidget::setSettings(const PerforceSettings &s) m_ui.portLineEdit->setText(s.p4Port()); m_ui.clientLineEdit->setText(s.p4Client()); m_ui.userLineEdit->setText(s.p4User()); + m_ui.logCountSpinBox->setValue(s.logCount()); m_ui.timeOutSpinBox->setValue(s.timeOutS()); m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit()); } diff --git a/src/plugins/perforce/settingspage.ui b/src/plugins/perforce/settingspage.ui index a81afdc3e766877a7dd36c898a3e93aa1ddae482..dcdd04c0833e6112b611e7f477373464198e2485 100644 --- a/src/plugins/perforce/settingspage.ui +++ b/src/plugins/perforce/settingspage.ui @@ -90,21 +90,17 @@ <string>Miscellaneous</string> </property> <layout class="QFormLayout" name="formLayout_2"> - <item row="1" column="0" colspan="2"> - <widget class="QCheckBox" name="promptToSubmitCheckBox"> - <property name="text"> - <string>Prompt on submit</string> - </property> - </widget> - </item> - <item row="0" column="0"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::ExpandingFieldsGrow</enum> + </property> + <item row="1" column="0"> <widget class="QLabel" name="timeOutLabel"> <property name="text"> <string>Timeout:</string> </property> </widget> </item> - <item row="0" column="1"> + <item row="1" column="1"> <widget class="QSpinBox" name="timeOutSpinBox"> <property name="suffix"> <string>s</string> @@ -117,6 +113,27 @@ </property> </widget> </item> + <item row="2" column="0" colspan="2"> + <widget class="QCheckBox" name="promptToSubmitCheckBox"> + <property name="text"> + <string>Prompt on submit</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="logCountLabel"> + <property name="text"> + <string>Log count:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="logCountSpinBox"> + <property name="maximum"> + <number>10000</number> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/plugins/subversion/settingspage.cpp b/src/plugins/subversion/settingspage.cpp index 5976c9bdd987ce6d9e45c28f3355daa9f800b56e..6fb8352c53c202fa82524cfb40d454f15e8e2d8e 100644 --- a/src/plugins/subversion/settingspage.cpp +++ b/src/plugins/subversion/settingspage.cpp @@ -63,6 +63,7 @@ SubversionSettings SettingsPageWidget::settings() const rc.useAuthentication = false; rc.promptToSubmit = m_ui.promptToSubmitCheckBox->isChecked(); rc.spaceIgnorantAnnotation = m_ui.spaceIgnorantAnnotationCheckBox->isChecked(); + rc.logCount = m_ui.logCountSpinBox->value(); return rc; } @@ -75,6 +76,7 @@ void SettingsPageWidget::setSettings(const SubversionSettings &s) m_ui.timeOutSpinBox->setValue(s.timeOutS); m_ui.promptToSubmitCheckBox->setChecked(s.promptToSubmit); m_ui.spaceIgnorantAnnotationCheckBox->setChecked(s.spaceIgnorantAnnotation); + m_ui.logCountSpinBox->setValue(s.logCount); } QString SettingsPageWidget::searchKeywords() const diff --git a/src/plugins/subversion/settingspage.ui b/src/plugins/subversion/settingspage.ui index d74fa3c839616b9f40fe3e1bc01de6041b85a65b..861f81902f6d862bf8fe96daa7fba32b854ef001 100644 --- a/src/plugins/subversion/settingspage.ui +++ b/src/plugins/subversion/settingspage.ui @@ -2,14 +2,6 @@ <ui version="4.0"> <class>Subversion::Internal::SettingsPage</class> <widget class="QWidget" name="Subversion::Internal::SettingsPage"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>496</width> - <height>295</height> - </rect> - </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QGroupBox" name="generalGroupBox"> @@ -72,21 +64,17 @@ <string>Miscellaneous</string> </property> <layout class="QFormLayout" name="formLayout_2"> - <item row="1" column="0" colspan="2"> - <widget class="QCheckBox" name="promptToSubmitCheckBox"> - <property name="text"> - <string>Prompt on submit</string> - </property> - </widget> - </item> - <item row="0" column="0"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::ExpandingFieldsGrow</enum> + </property> + <item row="1" column="0"> <widget class="QLabel" name="timeOutLabel"> <property name="text"> <string>Timeout:</string> </property> </widget> </item> - <item row="0" column="1"> + <item row="1" column="1"> <widget class="QSpinBox" name="timeOutSpinBox"> <property name="suffix"> <string>s</string> @@ -100,12 +88,33 @@ </widget> </item> <item row="2" column="0" colspan="2"> + <widget class="QCheckBox" name="promptToSubmitCheckBox"> + <property name="text"> + <string>Prompt on submit</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> <widget class="QCheckBox" name="spaceIgnorantAnnotationCheckBox"> <property name="text"> <string>Ignore whitespace changes in annotation</string> </property> </widget> </item> + <item row="0" column="0"> + <widget class="QLabel" name="logCountLabel"> + <property name="text"> + <string>Log count:</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QSpinBox" name="logCountSpinBox"> + <property name="maximum"> + <number>10000</number> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/src/plugins/subversion/subversioneditor.cpp b/src/plugins/subversion/subversioneditor.cpp index 04eeebf2707aa94149d5b0fd5479c3275ddf5550..1a6ae8177921ff6508964a561056596d11d462a1 100644 --- a/src/plugins/subversion/subversioneditor.cpp +++ b/src/plugins/subversion/subversioneditor.cpp @@ -51,6 +51,7 @@ SubversionEditor::SubversionEditor(const VCSBase::VCSBaseEditorParameters *type, { QTC_ASSERT(m_changeNumberPattern.isValid(), return); QTC_ASSERT(m_revisionNumberPattern.isValid(), return); + setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\"")); } QSet<QString> SubversionEditor::annotationChanges() const @@ -138,12 +139,11 @@ QString SubversionEditor::fileNameFromDiffSpecification(const QTextBlock &inBloc return QString(); } -QStringList SubversionEditor::annotationPreviousVersions(const QString &v, QString *actionTextFormat) const +QStringList SubversionEditor::annotationPreviousVersions(const QString &v) const { bool ok; const int revision = v.toInt(&ok); if (!ok || revision < 2) return QStringList(); - *actionTextFormat = tr("Annotate revision \"%1\""); return QStringList(QString::number(revision - 1)); } diff --git a/src/plugins/subversion/subversioneditor.h b/src/plugins/subversion/subversioneditor.h index cbf276e229f3dab4cfe4898a911d0b05ef4166c3..3c573a9f0161106b348fc7eb9d4955878e20d039 100644 --- a/src/plugins/subversion/subversioneditor.h +++ b/src/plugins/subversion/subversioneditor.h @@ -51,7 +51,7 @@ private: virtual VCSBase::DiffHighlighter *createDiffHighlighter() const; virtual VCSBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const; virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const; - virtual QStringList annotationPreviousVersions(const QString &, QString *actionTextFormat) const; + virtual QStringList annotationPreviousVersions(const QString &) const; const QRegExp m_changeNumberPattern; const QRegExp m_revisionNumberPattern; diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index a3029043566a2d859ef6268417e8c2e40bc1af45..2404a202022541c6c87b5552b9f322d78fd411cb 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -85,7 +85,10 @@ static const char * const CMD_ID_SEPARATOR2 = "Subversion.Separator2"; static const char * const CMD_ID_FILELOG_CURRENT = "Subversion.FilelogCurrent"; static const char * const CMD_ID_ANNOTATE_CURRENT = "Subversion.AnnotateCurrent"; static const char * const CMD_ID_SEPARATOR3 = "Subversion.Separator3"; +static const char * const CMD_ID_SEPARATOR4 = "Subversion.Separator4"; static const char * const CMD_ID_STATUS = "Subversion.Status"; +static const char * const CMD_ID_PROJECTLOG = "Subversion.ProjectLog"; +static const char * const CMD_ID_REPOSITORYLOG = "Subversion.RepositoryLog"; static const char * const CMD_ID_UPDATE = "Subversion.Update"; static const char * const CMD_ID_DESCRIBE = "Subversion.Describe"; @@ -179,6 +182,8 @@ SubversionPlugin::SubversionPlugin() : m_revertAction(0), m_diffProjectAction(0), m_diffCurrentAction(0), + m_logProjectAction(0), + m_logRepositoryAction(0), m_commitAllAction(0), m_commitCurrentAction(0), m_filelogCurrentAction(0), @@ -361,12 +366,24 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e connect(m_statusProjectAction, SIGNAL(triggered()), this, SLOT(projectStatus())); subversionMenu->addAction(command); + m_logProjectAction = new Utils::ParameterAction(tr("Log Project Log"), tr("Log Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this); + command = ami->registerAction(m_logProjectAction, CMD_ID_PROJECTLOG, globalcontext); + command->setAttribute(Core::Command::CA_UpdateText); + connect(m_logProjectAction, SIGNAL(triggered()), this, SLOT(logProject())); + subversionMenu->addAction(command); + m_updateProjectAction = new Utils::ParameterAction(tr("Update Project"), tr("Update Project \"%1\""), Utils::ParameterAction::EnabledWithParameter, this); command = ami->registerAction(m_updateProjectAction, CMD_ID_UPDATE, globalcontext); connect(m_updateProjectAction, SIGNAL(triggered()), this, SLOT(updateProject())); command->setAttribute(Core::Command::CA_UpdateText); subversionMenu->addAction(command); + subversionMenu->addAction(createSeparator(this, ami, CMD_ID_SEPARATOR4, globalcontext)); + m_logRepositoryAction = new QAction(tr("Repository Log"), this); + command = ami->registerAction(m_logRepositoryAction, CMD_ID_REPOSITORYLOG, globalcontext); + connect(m_logRepositoryAction, SIGNAL(triggered()), this, SLOT(logRepository())); + subversionMenu->addAction(command); + // Actions of the submit editor QList<int> svncommitcontext; svncommitcontext << Core::UniqueIDManager::instance()->uniqueIdentifier(Constants::SUBVERSIONCOMMITEDITOR); @@ -504,10 +521,13 @@ void SubversionPlugin::updateActions(VCSBase::VCSBasePlugin::ActionState as) if (!VCSBase::VCSBasePlugin::enableMenuAction(as, m_menuAction)) return; + m_logRepositoryAction->setEnabled(currentState().hasTopLevel()); + const QString projectName = currentState().currentProjectName(); m_diffProjectAction->setParameter(projectName); m_statusProjectAction->setParameter(projectName); m_updateProjectAction->setParameter(projectName); + m_logProjectAction->setParameter(projectName); const bool repoEnabled = currentState().hasTopLevel(); m_commitAllAction->setEnabled(repoEnabled); @@ -662,14 +682,32 @@ void SubversionPlugin::filelogCurrentFile() { const VCSBase::VCSBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return) - filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile())); + filelog(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), true); +} + +void SubversionPlugin::logProject() +{ + const VCSBase::VCSBasePluginState state = currentState(); + QTC_ASSERT(state.hasProject(), return) + filelog(state.currentProjectTopLevel(), state.relativeCurrentProject()); +} + +void SubversionPlugin::logRepository() +{ + const VCSBase::VCSBasePluginState state = currentState(); + QTC_ASSERT(state.hasTopLevel(), return) + filelog(state.topLevel()); } -void SubversionPlugin::filelog(const QString &workingDir, const QStringList &files) +void SubversionPlugin::filelog(const QString &workingDir, + const QStringList &files, + bool enableAnnotationContextMenu) { QTextCodec *codec = VCSBase::VCSBaseEditor::getCodec(workingDir, files); // no need for temp file QStringList args(QLatin1String("log")); + if (m_settings.logCount > 0) + args << QLatin1String("-l") << QString::number(m_settings.logCount); foreach(const QString &file, files) args.append(QDir::toNativeSeparators(file)); @@ -689,6 +727,8 @@ void SubversionPlugin::filelog(const QString &workingDir, const QStringList &fil const QString source = VCSBase::VCSBaseEditor::getSource(workingDir, files); Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::LogOutput, source, codec); newEditor->setProperty("logFileName", id); + if (enableAnnotationContextMenu) + VCSBase::VCSBaseEditor::getVcsBaseEditor(newEditor)->setFileLogAnnotateEnabled(true); } } @@ -753,8 +793,6 @@ void SubversionPlugin::annotate(const QString &workingDir, const QString &file, } else { const QString title = QString::fromLatin1("svn annotate %1").arg(id); Core::IEditor *newEditor = showOutputInEditor(title, response.stdOut, VCSBase::AnnotateOutput, source, codec); - connect(newEditor, SIGNAL(annotatePreviousRequested(QString,QString,int)), - this, SLOT(annotateVersion(QString,QString,int))); newEditor->setProperty("annotateFileName", id); VCSBase::VCSBaseEditor::gotoLineOfEditor(newEditor, lineNumber); } @@ -939,6 +977,8 @@ Core::IEditor * SubversionPlugin::showOutputInEditor(const QString& title, const qDebug() << "SubversionPlugin::showOutputInEditor" << title << kind << "Size= " << output.size() << " Type=" << editorType << debugCodec(codec); QString s = title; Core::IEditor *editor = Core::EditorManager::instance()->openEditorWithContents(kind, &s, output); + connect(editor, SIGNAL(annotateRevisionRequested(QString,QString,int)), + this, SLOT(annotateVersion(QString,QString,int))); SubversionEditor *e = qobject_cast<SubversionEditor*>(editor->widget()); if (!e) return 0; diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h index b4aeda858a86936e654e8e7556e58c5d26285aab..3a7e3bfb4867e9569005c9136eb09871839889ff 100644 --- a/src/plugins/subversion/subversionplugin.h +++ b/src/plugins/subversion/subversionplugin.h @@ -111,7 +111,8 @@ private slots: void updateProject(); void submitCurrentLog(); void diffCommitFiles(const QStringList &); - + void logProject(); + void logRepository(); protected: virtual void updateActions(VCSBase::VCSBasePlugin::ActionState); @@ -127,7 +128,9 @@ private: bool showStdOutInOutputWindow, QTextCodec *outputCodec = 0); void annotate(const QString &workingDir, const QString &file, const QString &revision = QString(), int lineNumber = -1); - void filelog(const QString &workingDir, const QStringList &file = QStringList()); + void filelog(const QString &workingDir, + const QStringList &file = QStringList(), + bool enableAnnotationContextMenu = false); bool managesDirectory(const QDir &directory) const; QString findTopLevelForDirectoryI(const QString &directory) const; void startCommit(const QString &workingDir, const QStringList &files = QStringList()); @@ -146,6 +149,8 @@ private: Utils::ParameterAction *m_revertAction; Utils::ParameterAction *m_diffProjectAction; Utils::ParameterAction *m_diffCurrentAction; + Utils::ParameterAction *m_logProjectAction; + QAction *m_logRepositoryAction; QAction *m_commitAllAction; Utils::ParameterAction *m_commitCurrentAction; Utils::ParameterAction *m_filelogCurrentAction; diff --git a/src/plugins/subversion/subversionsettings.cpp b/src/plugins/subversion/subversionsettings.cpp index dd6bdc122ded957b1e7ebd5eae9720a8125b2773..8e0f06cba5e0743879916a13fccc43b273be51da 100644 --- a/src/plugins/subversion/subversionsettings.cpp +++ b/src/plugins/subversion/subversionsettings.cpp @@ -43,8 +43,9 @@ static const char *passwordOptionC = "--password"; static const char *promptToSubmitKeyC = "PromptForSubmit"; static const char *timeOutKeyC = "TimeOut"; static const char *spaceIgnorantAnnotationKeyC = "SpaceIgnorantAnnotation"; +static const char *logCountKeyC = "LogCount"; -enum { defaultTimeOutS = 30 }; +enum { defaultTimeOutS = 30, defaultLogCount = 1000 }; static QString defaultCommand() { @@ -61,6 +62,7 @@ using namespace Subversion::Internal; SubversionSettings::SubversionSettings() : svnCommand(defaultCommand()), useAuthentication(false), + logCount(defaultLogCount), timeOutS(defaultTimeOutS), promptToSubmit(true), spaceIgnorantAnnotation(true) @@ -77,6 +79,7 @@ void SubversionSettings::fromSettings(QSettings *settings) timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt(); promptToSubmit = settings->value(QLatin1String(promptToSubmitKeyC), true).toBool(); spaceIgnorantAnnotation = settings->value(QLatin1String(spaceIgnorantAnnotationKeyC), true).toBool(); + logCount = settings->value(QLatin1String(logCountKeyC), int(defaultLogCount)).toInt(); settings->endGroup(); } @@ -90,6 +93,7 @@ void SubversionSettings::toSettings(QSettings *settings) const settings->setValue(QLatin1String(promptToSubmitKeyC), promptToSubmit); settings->setValue(QLatin1String(timeOutKeyC), timeOutS); settings->setValue(QLatin1String(spaceIgnorantAnnotationKeyC), spaceIgnorantAnnotation); + settings->setValue(QLatin1String(logCountKeyC), logCount); settings->endGroup(); } @@ -99,6 +103,7 @@ bool SubversionSettings::equals(const SubversionSettings &s) const && useAuthentication == s.useAuthentication && user == s.user && password == s.password + && logCount == s.logCount && timeOutS == s.timeOutS && promptToSubmit == s.promptToSubmit && spaceIgnorantAnnotation == s.spaceIgnorantAnnotation; diff --git a/src/plugins/subversion/subversionsettings.h b/src/plugins/subversion/subversionsettings.h index 802c51ed35650e35316aa136f4f0352facee7f51..79c33edcb1e22dd641472a8eed1bf9ced62b2185 100644 --- a/src/plugins/subversion/subversionsettings.h +++ b/src/plugins/subversion/subversionsettings.h @@ -62,6 +62,7 @@ struct SubversionSettings bool useAuthentication; QString user; QString password; + int logCount; int timeOutS; bool promptToSubmit; bool spaceIgnorantAnnotation; diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 8cfbc6ee90d66cf4c9ae098594ffef43340ff5f3..b556835554a5f559973df4bb907deaaf04d20b20 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -85,7 +85,7 @@ public: signals: void describeRequested(const QString &source, const QString &change); - void annotatePreviousRequested(const QString &source, const QString &change, int line); + void annotateRevisionRequested(const QString &source, const QString &change, int line); private: const char *m_kind; @@ -147,11 +147,10 @@ VCSBaseDiffEditorEditable::~VCSBaseDiffEditorEditable() struct VCSBaseEditorPrivate { - VCSBaseEditorPrivate(const VCSBaseEditorParameters *type, QObject *parent); + VCSBaseEditorPrivate(const VCSBaseEditorParameters *type); const VCSBaseEditorParameters *m_parameters; - QAction *m_describeAction; QString m_currentChange; QString m_source; QString m_diffBaseDirectory; @@ -159,25 +158,27 @@ struct VCSBaseEditorPrivate QRegExp m_diffFilePattern; QList<int> m_diffSections; // line number where this section starts int m_cursorLine; + QString m_annotateRevisionTextFormat; + bool m_fileLogAnnotateEnabled; }; -VCSBaseEditorPrivate::VCSBaseEditorPrivate(const VCSBaseEditorParameters *type, QObject *parent) : - m_parameters(type), - m_describeAction(new QAction(parent)), - m_cursorLine(-1) +VCSBaseEditorPrivate::VCSBaseEditorPrivate(const VCSBaseEditorParameters *type) : + m_parameters(type), + m_cursorLine(-1), + m_annotateRevisionTextFormat(VCSBaseEditor::tr("Annotate \"%1\"")), + m_fileLogAnnotateEnabled(false) { } // ------------ VCSBaseEditor VCSBaseEditor::VCSBaseEditor(const VCSBaseEditorParameters *type, QWidget *parent) : BaseTextEditor(parent), - d(new VCSBaseEditorPrivate(type, this)) + d(new VCSBaseEditorPrivate(type)) { if (VCSBase::Constants::Internal::debug) qDebug() << "VCSBaseEditor::VCSBaseEditor" << type->type << type->kind; setReadOnly(true); - connect(d->m_describeAction, SIGNAL(triggered()), this, SLOT(describe())); viewport()->setMouseTracking(true); setBaseTextDocument(new Internal::VCSBaseTextDocument); setMimeType(QLatin1String(d->m_parameters->mimeType)); @@ -218,6 +219,26 @@ void VCSBaseEditor::setSource(const QString &source) d->m_source = source; } +QString VCSBaseEditor::annotateRevisionTextFormat() const +{ + return d->m_annotateRevisionTextFormat; +} + +void VCSBaseEditor::setAnnotateRevisionTextFormat(const QString &f) +{ + d->m_annotateRevisionTextFormat = f; +} + +bool VCSBaseEditor::isFileLogAnnotateEnabled() const +{ + return d->m_fileLogAnnotateEnabled; +} + +void VCSBaseEditor::setFileLogAnnotateEnabled(bool e) +{ + d->m_fileLogAnnotateEnabled = e; +} + QString VCSBaseEditor::diffBaseDirectory() const { return d->m_diffBaseDirectory; @@ -267,8 +288,8 @@ TextEditor::BaseTextEditorEditable *VCSBaseEditor::createEditableInterface() // Pass on signals. connect(this, SIGNAL(describeRequested(QString,QString)), editable, SIGNAL(describeRequested(QString,QString))); - connect(this, SIGNAL(annotatePreviousRequested(QString,QString,int)), - editable, SIGNAL(annotatePreviousRequested(QString,QString,int))); + connect(this, SIGNAL(annotateRevisionRequested(QString,QString,int)), + editable, SIGNAL(annotateRevisionRequested(QString,QString,int))); return editable; } @@ -345,6 +366,21 @@ void VCSBaseEditor::slotDiffCursorPositionChanged() } } +QAction *VCSBaseEditor::createDescribeAction(const QString &change) +{ + QAction *a = new QAction(tr("Describe change %1").arg(change), 0); + connect(a, SIGNAL(triggered()), this, SLOT(describe())); + return a; +} + +QAction *VCSBaseEditor::createAnnotateAction(const QString &change) +{ + QAction *a = new QAction(d->m_annotateRevisionTextFormat.arg(change), 0); + a->setData(change); + connect(a, SIGNAL(triggered()), this, SLOT(slotAnnotateRevision())); + return a; +} + void VCSBaseEditor::contextMenuEvent(QContextMenuEvent *e) { QMenu *menu = createStandardContextMenu(); @@ -352,25 +388,28 @@ void VCSBaseEditor::contextMenuEvent(QContextMenuEvent *e) if (d->m_parameters->type == LogOutput || d->m_parameters->type == AnnotateOutput) { d->m_currentChange = changeUnderCursor(cursorForPosition(e->pos())); if (!d->m_currentChange.isEmpty()) { - d->m_describeAction->setText(tr("Describe change %1").arg(d->m_currentChange)); - menu->addSeparator(); - menu->addAction(d->m_describeAction); - // Offer to annotate previous changes - if (contentType() == AnnotateOutput) { - QString actionTextFormat; - const QStringList previousVersions = annotationPreviousVersions(d->m_currentChange, &actionTextFormat); - if (!previousVersions.isEmpty()) { - if (actionTextFormat.isEmpty()) - actionTextFormat = tr("Annotate \"%1\""); + switch (d->m_parameters->type) { + case LogOutput: // Describe current / Annotate file of current + menu->addSeparator(); + menu->addAction(createDescribeAction(d->m_currentChange)); + if (d->m_fileLogAnnotateEnabled) + menu->addAction(createAnnotateAction(d->m_currentChange)); + break; + case AnnotateOutput: { // Describe current / annotate previous menu->addSeparator(); - foreach(const QString &pv, previousVersions) { - QAction *a = menu->addAction(actionTextFormat.arg(pv)); - a->setData(pv); - connect(a, SIGNAL(triggered()), this, SLOT(slotAnnotatePrevious())); - } + menu->addAction(createDescribeAction(d->m_currentChange)); + const QStringList previousVersions = annotationPreviousVersions(d->m_currentChange); + if (!previousVersions.isEmpty()) { + menu->addSeparator(); + foreach(const QString &pv, previousVersions) + menu->addAction(createAnnotateAction(pv)); + } // has previous versions } - } - } + break; + default: + break; + } // switch type + } // has current change } menu->exec(e->globalPos()); delete menu; @@ -763,14 +802,14 @@ QString VCSBaseEditor::findDiffFile(const QString &f, Core::IVersionControl *con return QString(); } -void VCSBaseEditor::slotAnnotatePrevious() +void VCSBaseEditor::slotAnnotateRevision() { if (const QAction *a = qobject_cast<const QAction *>(sender())) - emit annotatePreviousRequested(source(), a->data().toString(), + emit annotateRevisionRequested(source(), a->data().toString(), editableInterface()->currentLine()); } -QStringList VCSBaseEditor::annotationPreviousVersions(const QString &, QString *) const +QStringList VCSBaseEditor::annotationPreviousVersions(const QString &) const { return QStringList(); } diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index 7e66e83d471ab636178d92c981a1623818af133c..4b5ace33f07d127f6a381fd5f571c72000058355 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -52,15 +52,16 @@ struct VCSBaseEditorPrivate; class DiffHighlighter; class BaseAnnotationHighlighter; -// Contents of a VCSBaseEditor +// Contents of a VCSBaseEditor and its interaction. enum EditorContentType { // No special handling. RegularCommandOutput, // Log of a file under revision control. Provide 'click on change' - // description. + // description and 'Annotate' if is the log of a single file. LogOutput, // <change description>: file line // Color per change number and provide 'click on change' description. + // Context menu offers "Annotate previous version". AnnotateOutput, // Diff output. Might includes describe output, which consists of a // header and diffs. Interaction is 'double click in hunk' which @@ -89,6 +90,8 @@ class VCSBASE_EXPORT VCSBaseEditor : public TextEditor::BaseTextEditor Q_PROPERTY(QString source READ source WRITE setSource) Q_PROPERTY(QString diffBaseDirectory READ diffBaseDirectory WRITE setDiffBaseDirectory) Q_PROPERTY(QTextCodec *codec READ codec WRITE setCodec) + Q_PROPERTY(QString annotateRevisionTextFormat READ annotateRevisionTextFormat WRITE setAnnotateRevisionTextFormat) + Q_PROPERTY(bool isFileLogAnnotateEnabled READ isFileLogAnnotateEnabled WRITE setFileLogAnnotateEnabled) Q_OBJECT protected: // Initialization requires calling init() (which in turns calls @@ -103,6 +106,15 @@ public: QString source() const; void setSource(const QString &source); + // Format for "Annotate" revision menu entries. Should contain '%1" placeholder + QString annotateRevisionTextFormat() const; + void setAnnotateRevisionTextFormat(const QString &); + + // Enable "Annotate" context menu in file log view + // (set to true if the source is a single file and the VCS implements it) + bool isFileLogAnnotateEnabled() const; + void setFileLogAnnotateEnabled(bool e); + QTextCodec *codec() const; void setCodec(QTextCodec *); @@ -144,15 +156,16 @@ public: static QString getSource(const QString &workingDirectory, const QString &fileName); static QString getSource(const QString &workingDirectory, const QStringList &fileNames); // Convenience functions to determine an title/id to identify the editor - // from the arguments (','-joined arguments or directory). + // from the arguments (','-joined arguments or directory) + revision. static QString getTitleId(const QString &workingDirectory, const QStringList &fileNames, const QString &revision = QString()); signals: // These signals also exist in the opaque editable (IEditor) that is - // handled by the editor manager for convenience. + // handled by the editor manager for convenience. They are emitted + // for LogOutput/AnnotateOutput content types. void describeRequested(const QString &source, const QString &change); - void annotatePreviousRequested(const QString &source, const QString &change, int lineNumber); + void annotateRevisionRequested(const QString &source, const QString &change, int lineNumber); public slots: // Convenience slot to set data read from stdout, will use the @@ -177,7 +190,7 @@ private slots: void slotPopulateDiffBrowser(); void slotDiffBrowse(int); void slotDiffCursorPositionChanged(); - void slotAnnotatePrevious(); + void slotAnnotateRevision(); protected: /* A helper that can be used to locate a file in a diff in case it @@ -198,11 +211,12 @@ private: // (text cursor at position above change hunk) virtual QString fileNameFromDiffSpecification(const QTextBlock &diffFileSpec) const = 0; // Implement to return the previous version[s] of an annotation change - // for "Annotate previous version" and a format for the action text containing %1 - // for the revision - virtual QStringList annotationPreviousVersions(const QString &revision, QString *actionTextFormat) const; + // for "Annotate previous version" + virtual QStringList annotationPreviousVersions(const QString &revision) const; void jumpToChangeFromDiff(QTextCursor cursor); + QAction *createDescribeAction(const QString &change); + QAction *createAnnotateAction(const QString &change); VCSBaseEditorPrivate *d; };