VCS[Perforce/SVN/CVS]: Add "Annotate" to single file logs.

...over change numbers. Add missing "Log project/repository"
actions and log count limits.
Task-number: QTCREATORBUG-503
This commit is contained in:
Friedemann Kleint
2010-01-07 11:33:30 +01:00
parent aadc0b9bd6
commit b4969672d3
22 changed files with 332 additions and 99 deletions
+2 -2
View File
@@ -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));
}
+1 -1
View File
@@ -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;
+42 -5
View File
@@ -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;
+7 -1
View File
@@ -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;
+2 -2
View File
@@ -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));
}
+1 -1
View File
@@ -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;
+52 -9
View File
@@ -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;
+6 -1
View File
@@ -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;
+6 -1
View File
@@ -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();
}
+3
View File
@@ -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;
+2
View File
@@ -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());
}
+26 -9
View File
@@ -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>
+2
View File
@@ -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
+26 -17
View File
@@ -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>
+2 -2
View File
@@ -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));
}
+1 -1
View File
@@ -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;
+44 -4
View File
@@ -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::filelog(const QString &workingDir, const QStringList &files)
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,
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;
+7 -2
View File
@@ -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;
@@ -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;
@@ -62,6 +62,7 @@ struct SubversionSettings
bool useAuthentication;
QString user;
QString password;
int logCount;
int timeOutS;
bool promptToSubmit;
bool spaceIgnorantAnnotation;
+70 -31
View File
@@ -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();
}
+23 -9
View File
@@ -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;
};