Introduce ClearCase plugin

Change-Id: Ib2cebaff0f035f48ca958cad16dedfdd80f4bff9
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Orgad Shaneh
2011-06-05 17:58:02 +03:00
committed by hjk
parent 0fcf5515e5
commit 647071d84b
35 changed files with 5032 additions and 0 deletions

View File

@@ -35,6 +35,7 @@ Project {
"src/plugins/bineditor/bineditor.qbs",
"src/plugins/bookmarks/bookmarks.qbs",
"src/plugins/classview/classview.qbs",
"src/plugins/clearcase/clearcase.qbs",
"src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs",
"src/plugins/coreplugin/coreplugin.qbs",
"src/plugins/coreplugin/images/logo/logo.qbs",

View File

@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
<mime-type type="application/vnd.audc.text.clearcase.submit">
<comment>ClearCase submit template</comment>
<sub-class-of type="text/plain"/>
</mime-type>
</mime-info>

View File

@@ -0,0 +1,18 @@
<plugin name=\"ClearCase\" version=\"$$QTCREATOR_VERSION\" compatVersion=\"$$QTCREATOR_VERSION\">
<vendor>AudioCodes</vendor>
<copyright>(C) 2012 AudioCodes Ltd.</copyright>
<license>
GNU Lesser General Public License Usage
this plugin may be used under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. Please review the following information to ensure the GNU Lesser General Public License version 2.1 requirements will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
</license>
<category>Version Control</category>
<description>ClearCase integration.</description>
<url>http://www.qt-project.org</url>
<dependencyList>
<dependency name=\"TextEditor\" version=\"$$QTCREATOR_VERSION\"/>
<dependency name=\"ProjectExplorer\" version=\"$$QTCREATOR_VERSION\"/>
<dependency name=\"Core\" version=\"$$QTCREATOR_VERSION\"/>
<dependency name=\"VcsBase\" version=\"$$QTCREATOR_VERSION\"/>
</dependencyList>
</plugin>

View File

@@ -0,0 +1,123 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "activityselector.h"
#include "clearcaseconstants.h"
#include "clearcaseplugin.h"
#include <utils/qtcassert.h>
#include <QComboBox>
#include <QHBoxLayout>
#include <QLabel>
#include <QToolButton>
using namespace ClearCase;
using namespace ClearCase::Internal;
ActivitySelector::ActivitySelector(QWidget *parent) :
QWidget(parent),
m_plugin(ClearCasePlugin::instance()),
m_changed(false)
{
QHBoxLayout *hboxLayout = new QHBoxLayout(this);
hboxLayout->setContentsMargins(0, 0, 0, 0);
QLabel *lblActivity = new QLabel(tr("Select &Activity:"));
lblActivity->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
hboxLayout->addWidget(lblActivity);
m_cmbActivity = new QComboBox(this);
m_cmbActivity->setMinimumSize(QSize(350, 0));
hboxLayout->addWidget(m_cmbActivity);
QString addText = tr("Add");
if (!m_plugin->settings().autoAssignActivityName)
addText.append(QLatin1String("..."));
QToolButton *btnAdd = new QToolButton;
btnAdd->setText(addText);
hboxLayout->addWidget(btnAdd);
#ifndef QT_NO_SHORTCUT
lblActivity->setBuddy(m_cmbActivity);
#endif // QT_NO_SHORTCUT
connect(btnAdd, SIGNAL(clicked()), this, SLOT(newActivity()));
refresh();
connect(m_cmbActivity, SIGNAL(currentIndexChanged(int)), this, SLOT(userChanged()));
}
void ActivitySelector::userChanged()
{
m_changed = true;
}
bool ActivitySelector::refresh()
{
int current;
QList<QStringPair> activities = m_plugin->activities(&current);
m_cmbActivity->clear();
foreach (QStringPair activity, activities)
m_cmbActivity->addItem(activity.second, activity.first);
m_cmbActivity->setCurrentIndex(current);
m_cmbActivity->updateGeometry();
resize(size());
return !activities.isEmpty();
}
void ActivitySelector::addKeep()
{
m_cmbActivity->insertItem(0, tr("Keep item activity"), QLatin1String(Constants::KEEP_ACTIVITY));
setActivity(QLatin1String(Constants::KEEP_ACTIVITY));
}
QString ActivitySelector::activity() const
{
return m_cmbActivity->itemData(m_cmbActivity->currentIndex()).toString();
}
void ActivitySelector::setActivity(const QString &act)
{
int index = m_cmbActivity->findData(act);
if (index != -1) {
disconnect(m_cmbActivity, SIGNAL(currentIndexChanged(int)), this, SLOT(userChanged()));
m_cmbActivity->setCurrentIndex(index);
connect(m_cmbActivity, SIGNAL(currentIndexChanged(int)), this, SLOT(userChanged()));
}
}
void ActivitySelector::newActivity()
{
if (m_plugin->newActivity())
refresh();
}

View File

@@ -0,0 +1,74 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef ACTIVITYSELECTOR_H
#define ACTIVITYSELECTOR_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QComboBox;
QT_END_NAMESPACE
namespace ClearCase {
namespace Internal {
class ClearCasePlugin;
class ActivitySelector : public QWidget
{
Q_OBJECT
public:
explicit ActivitySelector(QWidget *parent = 0);
QString activity() const;
void setActivity(const QString &act);
void addKeep();
bool refresh();
bool changed() { return m_changed; }
public slots:
void newActivity();
private slots:
void userChanged();
private:
ClearCasePlugin *m_plugin;
bool m_changed;
QComboBox *m_cmbActivity;
};
} // namespace Internal
} // namespace ClearCase
#endif // ACTIVITYSELECTOR_H

View File

@@ -0,0 +1,50 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "annotationhighlighter.h"
using namespace ClearCase;
using namespace ClearCase::Internal;
ClearCaseAnnotationHighlighter::ClearCaseAnnotationHighlighter(const ChangeNumbers &changeNumbers,
const QColor &bg,
QTextDocument *document) :
VcsBase::BaseAnnotationHighlighter(changeNumbers, bg, document),
m_separator(QLatin1Char('|'))
{
}
QString ClearCaseAnnotationHighlighter::changeNumber(const QString &block) const
{
const int pos = block.indexOf(m_separator);
return pos > 1 ? block.left(pos) : QString();
}

View File

@@ -0,0 +1,58 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef ANNOTATIONHIGHLIGHTER_H
#define ANNOTATIONHIGHLIGHTER_H
#include <vcsbase/baseannotationhighlighter.h>
namespace ClearCase {
namespace Internal {
// Annotation highlighter for clearcase triggering on 'changenumber '
class ClearCaseAnnotationHighlighter : public VcsBase::BaseAnnotationHighlighter
{
Q_OBJECT
public:
explicit ClearCaseAnnotationHighlighter(const ChangeNumbers &changeNumbers, const QColor &bg,
QTextDocument *document = 0);
private:
virtual QString changeNumber(const QString &block) const;
const QChar m_separator;
};
} // namespace Internal
} // namespace ClearCase
#endif // ANNOTATIONHIGHLIGHTER_H

View File

@@ -0,0 +1,100 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "checkoutdialog.h"
#include "clearcaseplugin.h"
#include "ui_checkoutdialog.h"
#include <QList>
#include <QPair>
#include <QPalette>
namespace ClearCase {
namespace Internal {
CheckOutDialog::CheckOutDialog(const QString &fileName, QWidget *parent) :
QDialog(parent), ui(new Ui::CheckOutDialog)
{
ui->setupUi(this);
ui->lblFileName->setText(fileName);
}
CheckOutDialog::~CheckOutDialog()
{
delete ui;
}
QString CheckOutDialog::activity() const
{
return ui->actSelector->activity();
}
QString CheckOutDialog::comment() const
{
return ui->txtComment->toPlainText();
}
bool CheckOutDialog::isReserved() const
{
return ui->chkReserved->isChecked();
}
bool CheckOutDialog::isUnreserved() const
{
return ui->chkUnreserved->isChecked();
}
bool CheckOutDialog::isPreserveTime() const
{
return ui->chkPTime->isChecked();
}
bool CheckOutDialog::isUseHijacked() const
{
return ui->hijackedCheckBox->isChecked();
}
void CheckOutDialog::hideHijack()
{
ui->hijackedCheckBox->setVisible(false);
ui->hijackedCheckBox->setChecked(false);
}
void CheckOutDialog::toggleUnreserved(bool checked)
{
ui->chkUnreserved->setEnabled(checked);
if (!checked)
ui->chkUnreserved->setChecked(false);
}
} // namespace Internal
} // namespace ClearCase

View File

@@ -0,0 +1,70 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CHECKOUTDIALOG_H
#define CHECKOUTDIALOG_H
#include <QDialog>
namespace ClearCase {
namespace Internal {
namespace Ui {
class CheckOutDialog;
}
class CheckOutDialog : public QDialog
{
Q_OBJECT
public:
explicit CheckOutDialog(const QString &fileName, QWidget *parent = 0);
~CheckOutDialog();
QString activity() const;
QString comment() const;
bool isReserved() const;
bool isUnreserved() const;
bool isPreserveTime() const;
bool isUseHijacked() const;
void hideHijack();
private slots:
void toggleUnreserved(bool checked);
private:
Ui::CheckOutDialog *ui;
};
} // namespace Internal
} // namespace ClearCase
#endif // CHECKOUTDIALOG_H

View File

@@ -0,0 +1,176 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ClearCase::Internal::CheckOutDialog</class>
<widget class="QDialog" name="ClearCase::Internal::CheckOutDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>352</width>
<height>317</height>
</rect>
</property>
<property name="windowTitle">
<string>Check Out</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lblFileName">
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item>
<widget class="ActivitySelector" name="actSelector" native="true"/>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblComment">
<property name="text">
<string>&amp;Checkout Comment:</string>
</property>
<property name="buddy">
<cstring>txtComment</cstring>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="txtComment"/>
</item>
<item>
<widget class="QCheckBox" name="chkReserved">
<property name="text">
<string>&amp;Reserved</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="chkUnreserved">
<property name="text">
<string>&amp;Unreserved if already reserved</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="chkPTime">
<property name="text">
<string>&amp;Preserve file modification time</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="hijackedCheckBox">
<property name="text">
<string>Use &amp;Hijacked file</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ActivitySelector</class>
<extends>QWidget</extends>
<header>activityselector.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ClearCase::Internal::CheckOutDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ClearCase::Internal::CheckOutDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>chkReserved</sender>
<signal>toggled(bool)</signal>
<receiver>ClearCase::Internal::CheckOutDialog</receiver>
<slot>toggleUnreserved(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>50</x>
<y>173</y>
</hint>
<hint type="destinationlabel">
<x>6</x>
<y>186</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>toggleUnreserved(bool)</slot>
<slot>newActivity()</slot>
</slots>
</ui>

View File

@@ -0,0 +1,40 @@
TEMPLATE = lib
TARGET = ClearCase
# PROVIDER = AudioCodes
include(../../qtcreatorplugin.pri)
include(clearcase_dependencies.pri)
DEFINES += QT_NO_CAST_FROM_ASCII
HEADERS += annotationhighlighter.h \
clearcaseplugin.h \
clearcasecontrol.h \
settingspage.h \
clearcaseeditor.h \
clearcasesettings.h \
clearcaseconstants.h \
clearcasesubmiteditor.h \
checkoutdialog.h \
activityselector.h \
clearcasesubmiteditorwidget.h \
versionselector.h
SOURCES += annotationhighlighter.cpp \
clearcaseplugin.cpp \
clearcasecontrol.cpp \
settingspage.cpp \
clearcaseeditor.cpp \
clearcasesettings.cpp \
clearcasesubmiteditor.cpp \
checkoutdialog.cpp \
activityselector.cpp \
clearcasesubmiteditorwidget.cpp \
versionselector.cpp
FORMS += settingspage.ui \
checkoutdialog.ui \
undocheckout.ui \
versionselector.ui
RESOURCES += clearcase.qrc

View File

@@ -0,0 +1,59 @@
import qbs.base 1.0
import "../QtcPlugin.qbs" as QtcPlugin
QtcPlugin {
name: "ClearCase"
// provider: "AudioCodes"
condition: qbs.targetOS != "mac"
Depends { name: "Qt.widgets" }
Depends { name: "Core" }
Depends { name: "TextEditor" }
Depends { name: "ProjectExplorer" }
Depends { name: "Find" }
Depends { name: "VcsBase" }
Depends { name: "Locator" }
Depends { name: "cpp" }
cpp.defines: base.concat(["QT_NO_CAST_FROM_ASCII"])
cpp.includePaths: [
".",
"..",
"../../libs",
buildDirectory
]
files: [
"activityselector.cpp",
"activityselector.h",
"annotationhighlighter.cpp",
"annotationhighlighter.h",
"checkoutdialog.cpp",
"checkoutdialog.h",
"checkoutdialog.ui",
"clearcaseconstants.h",
"clearcasecontrol.cpp",
"clearcasecontrol.h",
"clearcaseeditor.cpp",
"clearcaseeditor.h",
"clearcaseplugin.cpp",
"clearcaseplugin.h",
"clearcase.qrc",
"clearcasesettings.cpp",
"clearcasesettings.h",
"clearcasesubmiteditor.cpp",
"clearcasesubmiteditor.h",
"clearcasesubmiteditorwidget.cpp",
"clearcasesubmiteditorwidget.h",
"settingspage.cpp",
"settingspage.h",
"settingspage.ui",
"undocheckout.ui",
"versionselector.cpp",
"versionselector.h",
"versionselector.ui",
]
}

View File

@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/clearcase">
<file>ClearCase.mimetypes.xml</file>
</qresource>
</RCC>

View File

@@ -0,0 +1,5 @@
include(../../plugins/projectexplorer/projectexplorer.pri)
include(../../plugins/texteditor/texteditor.pri)
include(../../plugins/coreplugin/coreplugin.pri)
include(../../plugins/vcsbase/vcsbase.pri)
include(../../libs/utils/utils.pri)

View File

@@ -0,0 +1,56 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CLEARCASE_CONSTANTS_H
#define CLEARCASE_CONSTANTS_H
#include <QtGlobal>
namespace ClearCase {
namespace Constants {
const char VCS_ID_CLEARCASE[] = "E.ClearCase";
const char CLEARCASE_ROOT_FILE[] = "view.dat";
const char CLEARCASE_SUBMIT_MIMETYPE[] = "application/vnd.audc.text.clearcase.submit";
const char CLEARCASECHECKINEDITOR[] = "ClearCase Check In Editor";
const char CLEARCASECHECKINEDITOR_ID[] = "ClearCase Check In Editor";
const char CLEARCASECHECKINEDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("VCS", "ClearCase Check In Editor");
const char CHECKIN_SELECTED[] = "ClearCase.CheckInSelected";
const char DIFF_SELECTED[] = "ClearCase.DiffSelected";
const char TASK_INDEX[] = "ClearCase.Task.Index";
const char KEEP_ACTIVITY[] = "__KEEP__";
enum { debug = 0 };
} // namespace Constants
} // namespace ClearCase
#endif // CLEARCASE_CONSTANTS_H

View File

@@ -0,0 +1,178 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "clearcasecontrol.h"
#include "clearcaseplugin.h"
#include "clearcaseconstants.h"
#include <vcsbase/vcsbaseconstants.h>
#include <utils/synchronousprocess.h>
#include <QFileInfo>
using namespace ClearCase;
using namespace ClearCase::Internal;
ClearCaseControl::ClearCaseControl(ClearCasePlugin *plugin) :
m_plugin(plugin)
{
}
QString ClearCaseControl::displayName() const
{
return QLatin1String("ClearCase");
}
Core::Id ClearCaseControl::id() const
{
return ClearCase::Constants::VCS_ID_CLEARCASE;
}
bool ClearCaseControl::isConfigured() const
{
return !Utils::SynchronousProcess::locateBinary(m_plugin->settings().ccCommand).isEmpty();
}
bool ClearCaseControl::supportsOperation(Operation operation) const
{
bool rc = isConfigured();
switch (operation) {
case OpenOperation:
case AddOperation:
case DeleteOperation:
case MoveOperation:
case AnnotateOperation:
case GetRepositoryRootOperation:
break;
case CheckoutOperation:
case CreateRepositoryOperation:
case SnapshotOperations:
rc = false;
break;
}
return rc;
}
bool ClearCaseControl::vcsOpen(const QString &fileName)
{
const QFileInfo fi(fileName);
return m_plugin->vcsOpen(fi.absolutePath(), fi.fileName());
}
Core::IVersionControl::SettingsFlags ClearCaseControl::settingsFlags() const
{
SettingsFlags rc;
if (m_plugin->settings().autoCheckOut)
rc|= AutoOpen;
return rc;
}
bool ClearCaseControl::vcsAdd(const QString &fileName)
{
const QFileInfo fi(fileName);
return m_plugin->vcsAdd(fi.absolutePath(), fi.fileName());
}
bool ClearCaseControl::vcsDelete(const QString &fileName)
{
const QFileInfo fi(fileName);
return m_plugin->vcsDelete(fi.absolutePath(), fi.fileName());
}
bool ClearCaseControl::vcsMove(const QString &from, const QString &to)
{
const QFileInfo ifrom(from);
const QFileInfo ito(to);
return m_plugin->vcsMove(ifrom.absolutePath(), ifrom.fileName(), ito.fileName());
}
QString ClearCaseControl::vcsGetRepositoryURL(const QString &directory)
{
return m_plugin->vcsGetRepositoryURL(directory);
}
bool ClearCaseControl::managesDirectory(const QString &directory, QString *topLevel) const
{
return m_plugin->managesDirectory(directory, topLevel);
}
bool ClearCaseControl::vcsAnnotate(const QString &file, int line)
{
const QFileInfo fi(file);
m_plugin->vcsAnnotate(fi.absolutePath(), fi.fileName(), QString(), line);
return true;
}
void ClearCaseControl::emitRepositoryChanged(const QString &s)
{
emit repositoryChanged(s);
}
void ClearCaseControl::emitFilesChanged(const QStringList &l)
{
emit filesChanged(l);
}
void ClearCaseControl::emitConfigurationChanged()
{
emit configurationChanged();
}
bool ClearCaseControl::vcsCheckout(const QString & /*directory*/, const QByteArray & /*url*/)
{
return false;
}
bool ClearCaseControl::vcsCreateRepository(const QString &)
{
return false;
}
QString ClearCaseControl::vcsCreateSnapshot(const QString &)
{
return QString();
}
QStringList ClearCaseControl::vcsSnapshots(const QString &)
{
return QStringList();
}
bool ClearCaseControl::vcsRestoreSnapshot(const QString &, const QString &)
{
return false;
}
bool ClearCaseControl::vcsRemoveSnapshot(const QString &, const QString &)
{
return false;
}

View File

@@ -0,0 +1,84 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CLEARCASECONTROL_H
#define CLEARCASECONTROL_H
#include <coreplugin/iversioncontrol.h>
namespace ClearCase {
namespace Internal {
class ClearCasePlugin;
// Just a proxy for ClearCasePlugin
class ClearCaseControl : public Core::IVersionControl
{
Q_OBJECT
public:
explicit ClearCaseControl(ClearCasePlugin *plugin);
QString displayName() const;
Core::Id id() const;
bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
bool isConfigured() const;
bool supportsOperation(Operation operation) const;
bool vcsOpen(const QString &fileName);
SettingsFlags settingsFlags() const;
bool vcsAdd(const QString &fileName);
bool vcsDelete(const QString &filename);
bool vcsMove(const QString &from, const QString &to);
bool vcsCreateRepository(const QString &directory);
bool vcsCheckout(const QString &directory, const QByteArray &url);
QString vcsGetRepositoryURL(const QString &directory);
QString vcsCreateSnapshot(const QString &topLevel);
QStringList vcsSnapshots(const QString &topLevel);
bool vcsRestoreSnapshot(const QString &topLevel, const QString &name);
bool vcsRemoveSnapshot(const QString &topLevel, const QString &name);
bool vcsAnnotate(const QString &file, int line);
void emitRepositoryChanged(const QString &);
void emitFilesChanged(const QStringList &);
void emitConfigurationChanged();
private:
ClearCasePlugin *m_plugin;
};
} // namespace Internal
} // namespace ClearCase
#endif // CLEARCASECONTROL_H

View File

@@ -0,0 +1,131 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "annotationhighlighter.h"
#include "clearcaseconstants.h"
#include "clearcaseeditor.h"
#include "clearcaseplugin.h"
#include <utils/qtcassert.h>
#include <vcsbase/diffhighlighter.h>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QTextBlock>
#include <QTextCursor>
using namespace ClearCase;
using namespace ClearCase::Internal;
ClearCaseEditor::ClearCaseEditor(const VcsBase::VcsBaseEditorParameters *type,
QWidget *parent) :
VcsBase::VcsBaseEditorWidget(type, parent),
m_versionNumberPattern(QLatin1String("[\\\\/]main[\\\\/][^ \t\n\"]*"))
{
QTC_ASSERT(m_versionNumberPattern.isValid(), return);
setAnnotateRevisionTextFormat(tr("Annotate version \"%1\""));
}
QSet<QString> ClearCaseEditor::annotationChanges() const
{
QSet<QString> changes;
QString txt = toPlainText();
if (txt.isEmpty())
return changes;
// search until header
int separator = txt.indexOf(QRegExp(QLatin1String("\n-{30}")));
QRegExp r(QLatin1String("([^|]*)\\|[^\n]*\n"));
QTC_ASSERT(r.isValid(), return changes);
int pos = r.indexIn(txt, 0);
while (pos != -1 && pos < separator) {
changes.insert(r.cap(1));
pos = r.indexIn(txt, pos + r.matchedLength());
}
return changes;
}
QString ClearCaseEditor::changeUnderCursor(const QTextCursor &c) const
{
QTextCursor cursor = c;
// Any number is regarded as change number.
cursor.select(QTextCursor::BlockUnderCursor);
if (!cursor.hasSelection())
return QString();
QString change = cursor.selectedText();
// Annotation output has number, log output has revision numbers
// as r1, r2...
if (m_versionNumberPattern.indexIn(change) != -1)
return m_versionNumberPattern.cap();
return QString();
}
/*
Diff header format (on Windows, native separators are used after the @@)
--- main.cpp@@\main\2
+++ main.cpp@@\main\1
@@ -6,6 +6,5 @@
*/
VcsBase::DiffHighlighter *ClearCaseEditor::createDiffHighlighter() const
{
const QRegExp filePattern(QLatin1String("^[-+][-+][-+] "));
QTC_CHECK(filePattern.isValid());
return new VcsBase::DiffHighlighter(filePattern);
}
VcsBase::BaseAnnotationHighlighter *ClearCaseEditor::createAnnotationHighlighter(const QSet<QString> &changes,
const QColor &bg) const
{
return new ClearCaseAnnotationHighlighter(changes, bg);
}
QString ClearCaseEditor::fileNameFromDiffSpecification(const QTextBlock &inBlock) const
{
// "+++ D:\depot\...\mainwindow.cpp@@\main\3"
// "+++ D:\depot\...\mainwindow.cpp[TAB]Sun May 01 14:22:37 2011"
// Go back chunks
const QString diffIndicator = QLatin1String("+++ ");
for (QTextBlock block = inBlock; block.isValid() ; block = block.previous()) {
QString diffFileName = block.text();
if (diffFileName.startsWith(diffIndicator)) {
diffFileName.remove(0, diffIndicator.size());
const int tabIndex = diffFileName.indexOf(QRegExp(QLatin1String("@@|\t")));
if (tabIndex != -1)
diffFileName.truncate(tabIndex);
const QString rc = findDiffFile(diffFileName);
if (ClearCase::Constants::debug)
qDebug() << Q_FUNC_INFO << diffFileName << rc << source();
return rc;
}
}
return QString();
}

View File

@@ -0,0 +1,64 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CLEARCASEEDITOR_H
#define CLEARCASEEDITOR_H
#include <vcsbase/vcsbaseeditor.h>
#include <QRegExp>
namespace ClearCase {
namespace Internal {
class ClearCaseEditor : public VcsBase::VcsBaseEditorWidget
{
Q_OBJECT
public:
explicit ClearCaseEditor(const VcsBase::VcsBaseEditorParameters *type,
QWidget *parent);
private:
QSet<QString> annotationChanges() const;
QString changeUnderCursor(const QTextCursor &) const;
VcsBase::DiffHighlighter *createDiffHighlighter() const;
VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes, const QColor &bg) const;
QString fileNameFromDiffSpecification(const QTextBlock &diffFileName) const;
mutable QRegExp m_versionNumberPattern;
};
} // namespace Internal
} // namespace ClearCase
#endif // CLEARCASEEDITOR_H

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,270 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CLEARCASEPLUGIN_H
#define CLEARCASEPLUGIN_H
#include "clearcasesettings.h"
#include <vcsbase/vcsbaseplugin.h>
#include <QFile>
#include <QPair>
#include <QStringList>
QT_BEGIN_NAMESPACE
class QAction;
class QComboBox;
class QDir;
template <typename T>
class QFutureInterface;
class QMutex;
typedef QPair<QString, QString> QStringPair;
class QTextCodec;
QT_END_NAMESPACE
namespace Core {
class IVersionControl;
class IEditor;
}
namespace Utils {
class ParameterAction;
}
namespace VcsBase {
class VcsBaseSubmitEditor;
}
namespace Locator {
class CommandLocator;
}
namespace ProjectExplorer {
class Project;
}
namespace ClearCase {
namespace Internal {
class ClearCaseSubmitEditor;
class ClearCaseControl;
class ClearCaseResponse
{
public:
ClearCaseResponse() : error(false) {}
bool error;
QString stdOut;
QString stdErr;
QString message;
};
struct FileStatus
{
enum Status
{
Unknown = 0x0f,
CheckedIn = 0x01,
CheckedOut = 0x02,
Hijacked = 0x04,
NotManaged = 0x08,
Missing = 0x10
} status;
QFile::Permissions permissions;
FileStatus(Status _status = Unknown, QFile::Permissions perm = 0)
: status(_status), permissions(perm)
{}
};
typedef QHash<QString, FileStatus> StatusMap;
class ClearCasePlugin : public VcsBase::VcsBasePlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ClearCase.json")
static const unsigned SilentRun =
SuppressStdErrInLogWindow |
SuppressFailMessageInLogWindow |
SuppressCommandLogging |
FullySynchronously;
public:
ClearCasePlugin();
~ClearCasePlugin();
bool initialize(const QStringList &arguments, QString *error_message);
ClearCaseSubmitEditor *openClearCaseSubmitEditor(const QString &fileName);
const ClearCaseSettings &settings() const;
void setSettings(const ClearCaseSettings &s);
// IVersionControl
bool vcsOpen(const QString &workingDir, const QString &fileName);
bool vcsAdd(const QString &workingDir, const QString &fileName);
bool vcsDelete(const QString &workingDir, const QString &fileName);
bool vcsCheckIn(const QString &workingDir, const QStringList &files, const QString &activity,
bool isIdentical, bool isPreserve, bool replaceActivity);
bool vcsUndoCheckOut(const QString &workingDir, const QString &fileName, bool keep);
bool vcsUndoHijack(const QString &workingDir, const QString &fileName, bool keep);
bool vcsMove(const QString &workingDir, const QString &from, const QString &to);
bool vcsSetActivity(const QString &workingDir, const QString &title, const QString &activity);
bool managesDirectory(const QString &directory, QString *topLevel = 0) const;
bool vcsCheckout(const QString &directory, const QByteArray &url);
QString vcsGetRepositoryURL(const QString &directory);
static ClearCasePlugin *instance();
QString ccGetCurrentActivity() const;
QList<QStringPair> activities(int *current = 0) const;
QString ccGetPredecessor(const QString &version) const;
QStringList ccGetActiveVobs() const;
bool ccFileOp(const QString &workingDir, const QString &title, const QStringList &args,
const QString &fileName, const QString &file2 = QString());
FileStatus vcsStatus(const QString &file) const;
QString currentView() const { return m_view; }
public slots:
void vcsAnnotate(const QString &workingDir, const QString &file,
const QString &revision = QString(), int lineNumber = -1) const;
bool newActivity();
private slots:
void checkOutCurrentFile();
void addCurrentFile();
void undoCheckOutCurrent();
void undoHijackCurrent();
void diffActivity();
void diffCurrentFile();
void startCheckInAll();
void startCheckInActivity();
void startCheckInCurrentFile();
void historyCurrentFile();
void annotateCurrentFile();
void annotateVersion(const QString &file, const QString &revision, int lineNumber);
void describe(const QString &source, const QString &changeNr);
void viewStatus();
void checkInSelected();
void diffCheckInFiles(const QStringList &);
void updateIndex();
void updateView();
void projectChanged(ProjectExplorer::Project *project);
void tasksFinished(const QString &type);
void syncSlot();
void closing();
protected:
void updateActions(VcsBase::VcsBasePlugin::ActionState);
bool submitEditorAboutToClose(VcsBase::VcsBaseSubmitEditor *submitEditor);
QString ccGet(const QString &workingDir, const QString &file, const QString &prefix = QString());
void refreshActivities();
QList<QStringPair> ccGetActivities() const;
private:
inline bool isCheckInEditorOpen() const;
QString findTopLevel(const QString &directory) const;
Core::IEditor * showOutputInEditor(const QString& title, const QString &output,
int editorType, const QString &source,
QTextCodec *codec) const;
QString runCleartoolSync(const QString &workingDir, const QStringList &arguments) const;
ClearCaseResponse runCleartool(const QString &workingDir,
const QStringList &arguments, int timeOut,
unsigned flags, QTextCodec *outputCodec = 0) const;
static void sync(QFutureInterface<void> &future, QString topLevel, QStringList files);
void history(const QString &workingDir,
const QStringList &file = QStringList(),
bool enableAnnotationContextMenu = false);
QString ccGetFileVersion(const QString &workingDir, const QString &file) const;
void ccUpdate(const QString &workingDir, const QStringList &relativePaths = QStringList());
void ccDiffWithPred(const QStringList &files);
void startCheckIn(const QString &workingDir, const QStringList &files = QStringList());
void cleanCheckInMessageFile();
inline ClearCaseControl *clearCaseControl() const;
QString ccGetFileActivity(const QString &workingDir, const QString &file);
void setStatus(const QString &file, FileStatus::Status status, bool update = true);
QStringList ccGetActivityVersions(const QString &workingDir, const QString &activity);
void updateStatusActions();
void diffGraphical(const QString &file1, const QString &file2 = QString());
QString diffExternal(QString file1, QString file2 = QString(), bool keep = false);
QString getFile(const QString &nativeFile, const QString &prefix);
static void rmdir(const QString &path);
QString runExtDiff(const QString &workingDir, const QStringList &arguments,
int timeOut, QTextCodec *outputCodec = 0);
QString ccGetView(const QString &workingDir, bool *isDynamic = 0) const;
void updateStreamAndView();
ClearCaseSettings m_settings;
static StatusMap s_statusMap;
QString m_checkInMessageFileName;
QString m_topLevel;
QString m_stream;
QString m_view;
QString m_intStream;
QString m_activity;
QString m_diffPrefix;
Locator::CommandLocator *m_commandLocator;
Utils::ParameterAction *m_checkOutAction;
Utils::ParameterAction *m_checkInCurrentAction;
Utils::ParameterAction *m_undoCheckOutAction;
Utils::ParameterAction *m_undoHijackAction;
Utils::ParameterAction *m_diffCurrentAction;
Utils::ParameterAction *m_historyCurrentAction;
Utils::ParameterAction *m_annotateCurrentAction;
Utils::ParameterAction *m_addFileAction;
QAction *m_diffActivityAction;
QAction *m_updateIndexAction;
Utils::ParameterAction *m_updateViewAction;
Utils::ParameterAction *m_checkInActivityAction;
QAction *m_checkInAllAction;
QAction *m_statusAction;
QAction *m_checkInSelectedAction;
QAction *m_checkInDiffAction;
QAction *m_submitUndoAction;
QAction *m_submitRedoAction;
QAction *m_menuAction;
bool m_submitActionTriggered;
QMutex *activityMutex;
QList<QStringPair> m_activities;
static ClearCasePlugin *m_clearcasePluginInstance;
};
} // namespace ClearCase
} // namespace Internal
#endif // CLEARCASEPLUGIN_H

View File

@@ -0,0 +1,144 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "clearcasesettings.h"
#include <utils/environment.h>
#include <QSettings>
static const char groupC[] = "ClearCase";
static const char commandKeyC[] = "Command";
static const char historyCountKeyC[] = "HistoryCount";
static const char timeOutKeyC[] = "TimeOut";
static const char autoCheckOutKeyC[] = "AutoCheckOut";
static const char diffTypeKeyC[] = "DiffType";
static const char extDiffCommandKeyC[] = "ExternalDiffCommand";
static const char diffArgsKeyC[] = "DiffArgs";
static const char autoAssignActivityKeyC[] = "AutoAssignActivityName";
static const char promptToCheckInKeyC[] = "PromptToCheckIn";
static const char disableIndexerKeyC[] = "DisableIndexer";
static const char totalFilesKeyC[] = "TotalFiles";
static const char indexOnlyVOBsC[] = "IndexOnlyVOBs";
static const char defaultDiffArgs[] = "-ubp";
enum { defaultTimeOutS = 30, defaultHistoryCount = 50 };
static QString defaultCommand(const char *command)
{
QString rc = QLatin1String(command);
QString expanded = Utils::Environment::systemEnvironment().searchInPath(rc);
return expanded.isEmpty() ? rc : expanded;
}
using namespace ClearCase::Internal;
ClearCaseSettings::ClearCaseSettings() :
ccCommand(defaultCommand("cleartool")),
historyCount(defaultHistoryCount),
timeOutS(defaultTimeOutS),
diffType(GraphicalDiff),
diffArgs(QLatin1String(defaultDiffArgs)),
autoAssignActivityName(true),
autoCheckOut(true),
promptToCheckIn(false),
disableIndexer(false)
{
}
void ClearCaseSettings::fromSettings(QSettings *settings)
{
settings->beginGroup(QLatin1String(groupC));
ccCommand = settings->value(QLatin1String(commandKeyC), defaultCommand("cleartool")).toString();
timeOutS = settings->value(QLatin1String(timeOutKeyC), defaultTimeOutS).toInt();
autoCheckOut = settings->value(QLatin1String(autoCheckOutKeyC), false).toBool();
QString sDiffType = settings->value(QLatin1String(diffTypeKeyC), QLatin1String("Graphical")).toString();
switch (sDiffType[0].toUpper().toLatin1()) {
case 'G': diffType = GraphicalDiff; break;
case 'E': diffType = ExternalDiff; break;
}
diffArgs = settings->value(QLatin1String(diffArgsKeyC), QLatin1String(defaultDiffArgs)).toString();
autoAssignActivityName = settings->value(QLatin1String(autoAssignActivityKeyC), true).toBool();
historyCount = settings->value(QLatin1String(historyCountKeyC), int(defaultHistoryCount)).toInt();
promptToCheckIn = settings->value(QLatin1String(promptToCheckInKeyC), false).toBool();
disableIndexer = settings->value(QLatin1String(disableIndexerKeyC), false).toBool();
indexOnlyVOBs = settings->value(QLatin1String(indexOnlyVOBsC), QString()).toString();
settings->beginGroup(QLatin1String(totalFilesKeyC));
foreach (const QString &view, settings->childKeys())
totalFiles[view] = settings->value(view).toInt();
settings->endGroup();
settings->endGroup();
}
void ClearCaseSettings::toSettings(QSettings *settings) const
{
settings->beginGroup(QLatin1String(groupC));
settings->setValue(QLatin1String(commandKeyC), ccCommand);
settings->setValue(QLatin1String(autoCheckOutKeyC), autoCheckOut);
settings->setValue(QLatin1String(timeOutKeyC), timeOutS);
QString sDiffType;
switch (diffType) {
case ExternalDiff: sDiffType = QLatin1String("External"); break;
default: sDiffType = QLatin1String("Graphical"); break;
}
settings->setValue(QLatin1String(diffArgsKeyC), diffArgs);
settings->setValue(QLatin1String(diffTypeKeyC), sDiffType);
settings->setValue(QLatin1String(autoAssignActivityKeyC), autoAssignActivityName);
settings->setValue(QLatin1String(historyCountKeyC), historyCount);
settings->setValue(QLatin1String(promptToCheckInKeyC), promptToCheckIn);
settings->setValue(QLatin1String(disableIndexerKeyC), disableIndexer);
settings->setValue(QLatin1String(indexOnlyVOBsC), indexOnlyVOBs);
settings->beginGroup(QLatin1String(totalFilesKeyC));
foreach (const QString &view, totalFiles.keys())
settings->setValue(view, totalFiles[view]);
settings->endGroup();
settings->endGroup();
}
bool ClearCaseSettings::equals(const ClearCaseSettings &s) const
{
return ccCommand == s.ccCommand
&& historyCount == s.historyCount
&& timeOutS == s.timeOutS
&& autoCheckOut == s.autoCheckOut
&& diffType == s.diffType
&& diffArgs == s.diffArgs
&& autoAssignActivityName == s.autoAssignActivityName
&& promptToCheckIn == s.promptToCheckIn
&& disableIndexer == s.disableIndexer
&& indexOnlyVOBs == s.indexOnlyVOBs
&& totalFiles == s.totalFiles;
}

View File

@@ -0,0 +1,86 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CLEARCASESETTINGS_H
#define CLEARCASESETTINGS_H
#include <QHash>
#include <QStringList>
QT_BEGIN_NAMESPACE
class QSettings;
QT_END_NAMESPACE
namespace ClearCase {
namespace Internal {
enum DiffType
{
GraphicalDiff,
ExternalDiff
};
class ClearCaseSettings
{
public:
ClearCaseSettings();
void fromSettings(QSettings *);
void toSettings(QSettings *) const;
inline int timeOutMS() const { return timeOutS * 1000; }
inline int longTimeOutMS() const { return timeOutS * 10000; }
bool equals(const ClearCaseSettings &s) const;
QString ccCommand;
int historyCount;
int timeOutS;
DiffType diffType;
QString diffArgs;
bool autoAssignActivityName;
bool autoCheckOut;
bool promptToCheckIn;
bool disableIndexer;
QString indexOnlyVOBs;
QHash<QString, int> totalFiles;
};
inline bool operator==(const ClearCaseSettings &p1, const ClearCaseSettings &p2)
{ return p1.equals(p2); }
inline bool operator!=(const ClearCaseSettings &p1, const ClearCaseSettings &p2)
{ return !p1.equals(p2); }
} // namespace Internal
} // namespace ClearCase
#endif // CLEARCASESETTINGS_H

View File

@@ -0,0 +1,69 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "clearcasesubmiteditor.h"
#include "clearcasesubmiteditorwidget.h"
#include <utils/submiteditorwidget.h>
#include <vcsbase/submitfilemodel.h>
using namespace ClearCase::Internal;
ClearCaseSubmitEditor::ClearCaseSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *parameters,
QWidget *parentWidget) :
VcsBase::VcsBaseSubmitEditor(parameters, new ClearCaseSubmitEditorWidget(parentWidget))
{
setDisplayName(tr("ClearCase Check In"));
}
ClearCaseSubmitEditorWidget *ClearCaseSubmitEditor::submitEditorWidget()
{
return static_cast<ClearCaseSubmitEditorWidget *>(widget());
}
void ClearCaseSubmitEditor::setStatusList(const QStringList &statusOutput)
{
typedef QStringList::const_iterator ConstIterator;
VcsBase::SubmitFileModel *model = new VcsBase::SubmitFileModel(this);
const ConstIterator cend = statusOutput.constEnd();
for (ConstIterator it = statusOutput.constBegin(); it != cend; ++it)
model->addFile(*it, QLatin1String("C"), true);
setFileModel(model, checkScriptWorkingDirectory());
if (statusOutput.count() > 1)
submitEditorWidget()->addKeep();
}
QByteArray ClearCaseSubmitEditor::fileContents() const
{
return VcsBase::VcsBaseSubmitEditor::fileContents().trimmed();
}

View File

@@ -0,0 +1,65 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CLEARCASESUBMITEDITOR_H
#define CLEARCASESUBMITEDITOR_H
#include <QPair>
#include <QStringList>
#include <vcsbase/vcsbasesubmiteditor.h>
namespace ClearCase {
namespace Internal {
class ClearCaseSubmitEditorWidget;
class ClearCaseSubmitEditor : public VcsBase::VcsBaseSubmitEditor
{
Q_OBJECT
public:
explicit ClearCaseSubmitEditor(const VcsBase::VcsBaseSubmitEditorParameters *parameters,
QWidget *parentWidget = 0);
static QString fileFromStatusLine(const QString &statusLine);
void setStatusList(const QStringList &statusOutput);
ClearCaseSubmitEditorWidget *submitEditorWidget();
protected:
virtual QByteArray fileContents() const;
};
} // namespace Internal
} // namespace ClearCase
#endif // CLEARCASESUBMITEDITOR_H

View File

@@ -0,0 +1,101 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "activityselector.h"
#include "clearcasesubmiteditorwidget.h"
#include <vcsbase/submitfilemodel.h>
#include <QCheckBox>
#include <QFrame>
#include <QVBoxLayout>
using namespace ClearCase::Internal;
ClearCaseSubmitEditorWidget::ClearCaseSubmitEditorWidget(QWidget *parent) :
Utils::SubmitEditorWidget(parent)
{
setDescriptionMandatory(false);
QWidget *checkInWidget = new QWidget(this);
QVBoxLayout *verticalLayout = new QVBoxLayout(checkInWidget);
m_actSelector = new ActivitySelector;
verticalLayout->addWidget(m_actSelector);
QFrame *line = new QFrame;
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
verticalLayout->addWidget(line);
m_chkIdentical = new QCheckBox(tr("Chec&k in even if identical to previous version"));
verticalLayout->addWidget(m_chkIdentical);
m_chkPTime = new QCheckBox(tr("&Preserve file modification time"));
verticalLayout->addWidget(m_chkPTime);
insertTopWidget(checkInWidget);
}
QString ClearCaseSubmitEditorWidget::activity() const
{
return m_actSelector->activity();
}
bool ClearCaseSubmitEditorWidget::isIdentical() const
{
return m_chkIdentical->isChecked();
}
bool ClearCaseSubmitEditorWidget::isPreserve() const
{
return m_chkPTime->isChecked();
}
void ClearCaseSubmitEditorWidget::setActivity(const QString &act)
{
m_actSelector->setActivity(act);
}
bool ClearCaseSubmitEditorWidget::activityChanged() const
{
return m_actSelector->changed();
}
void ClearCaseSubmitEditorWidget::addKeep()
{
m_actSelector->addKeep();
}
QString ClearCaseSubmitEditorWidget::commitName() const
{
return tr("&Check In");
}

View File

@@ -0,0 +1,72 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef CLEARCASESUBMITEDITORWIDGET_H
#define CLEARCASESUBMITEDITORWIDGET_H
#include <utils/submiteditorwidget.h>
QT_BEGIN_NAMESPACE
class QCheckBox;
QT_END_NAMESPACE
namespace ClearCase {
namespace Internal {
class ActivitySelector;
class ClearCaseSubmitEditorWidget : public Utils::SubmitEditorWidget
{
Q_OBJECT
public:
explicit ClearCaseSubmitEditorWidget(QWidget *parent = 0);
QString activity() const;
bool isIdentical() const;
bool isPreserve() const;
void setActivity(const QString &act);
bool activityChanged() const;
void addKeep();
protected:
QString commitName() const;
private:
ActivitySelector *m_actSelector;
QCheckBox *m_chkIdentical;
QCheckBox *m_chkPTime;
};
} // namespace Internal
} // namespace ClearCase
#endif // CLEARCASESUBMITEDITORWIDGET_H

View File

@@ -0,0 +1,142 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "clearcaseconstants.h"
#include "clearcasesettings.h"
#include "clearcaseplugin.h"
#include "settingspage.h"
#include <coreplugin/icore.h>
#include <extensionsystem/pluginmanager.h>
#include <utils/pathchooser.h>
#include <QCoreApplication>
#include <QFileDialog>
#include <QTextStream>
using namespace ClearCase::Internal;
using namespace Utils;
SettingsPageWidget::SettingsPageWidget(QWidget *parent) :
QWidget(parent)
{
m_ui.setupUi(this);
m_ui.commandPathChooser->setPromptDialogTitle(tr("ClearCase Command"));
m_ui.commandPathChooser->setExpectedKind(PathChooser::ExistingCommand);
}
ClearCaseSettings SettingsPageWidget::settings() const
{
ClearCaseSettings rc;
rc.ccCommand = m_ui.commandPathChooser->path();
rc.timeOutS = m_ui.timeOutSpinBox->value();
rc.autoCheckOut = m_ui.autoCheckOutCheckBox->isChecked();
if (m_ui.graphicalDiffRadioButton->isChecked())
rc.diffType = GraphicalDiff;
else if (m_ui.externalDiffRadioButton->isChecked())
rc.diffType = ExternalDiff;
rc.autoAssignActivityName = m_ui.autoAssignActivityCheckBox->isChecked();
rc.historyCount = m_ui.historyCountSpinBox->value();
rc.promptToCheckIn = m_ui.promptCheckBox->isChecked();
rc.disableIndexer = m_ui.disableIndexerCheckBox->isChecked();
rc.diffArgs = m_ui.diffArgsEdit->text();
rc.indexOnlyVOBs = m_ui.indexOnlyVOBsEdit->text();
return rc;
}
void SettingsPageWidget::setSettings(const ClearCaseSettings &s)
{
m_ui.commandPathChooser->setPath(s.ccCommand);
m_ui.timeOutSpinBox->setValue(s.timeOutS);
m_ui.autoCheckOutCheckBox->setChecked(s.autoCheckOut);
switch (s.diffType) {
case GraphicalDiff:
m_ui.graphicalDiffRadioButton->setChecked(true);
m_ui.diffWidget->setEnabled(false);
break;
case ExternalDiff:
m_ui.externalDiffRadioButton->setChecked(true);
m_ui.diffWidget->setEnabled(true);
break;
}
m_ui.autoAssignActivityCheckBox->setChecked(s.autoAssignActivityName);
m_ui.historyCountSpinBox->setValue(s.historyCount);
m_ui.promptCheckBox->setChecked(s.promptToCheckIn);
m_ui.disableIndexerCheckBox->setChecked(s.disableIndexer);
m_ui.diffArgsEdit->setText(s.diffArgs);
m_ui.indexOnlyVOBsEdit->setText(s.indexOnlyVOBs);
}
QString SettingsPageWidget::searchKeywords() const
{
QString rc;
QLatin1Char sep(' ');
QTextStream(&rc) << m_ui.commandLabel->text()
<< sep << m_ui.autoCheckOutCheckBox->text()
<< sep << m_ui.externalDiffRadioButton->text()
<< sep << m_ui.graphicalDiffRadioButton->text()
<< sep << m_ui.diffArgsLabel->text()
<< sep << m_ui.historyCountLabel->text()
<< sep << m_ui.promptCheckBox->text()
<< sep << m_ui.disableIndexerCheckBox->text()
<< sep << m_ui.timeOutLabel->text()
<< sep << m_ui.indexOnlyVOBsLabel->text()
;
rc.remove(QLatin1Char('&'));
return rc;
}
SettingsPage::SettingsPage() :
m_widget(0)
{
setId(QLatin1String(ClearCase::Constants::VCS_ID_CLEARCASE));
setDisplayName(tr("ClearCase"));
}
QWidget *SettingsPage::createPage(QWidget *parent)
{
m_widget = new SettingsPageWidget(parent);
m_widget->setSettings(ClearCasePlugin::instance()->settings());
if (m_searchKeywords.isEmpty())
m_searchKeywords = m_widget->searchKeywords();
return m_widget;
}
void SettingsPage::apply()
{
ClearCasePlugin::instance()->setSettings(m_widget->settings());
}
bool SettingsPage::matches(const QString &s) const
{
return m_searchKeywords.contains(s, Qt::CaseInsensitive);
}

View File

@@ -0,0 +1,90 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef SETTINGSPAGE_H
#define SETTINGSPAGE_H
#include "ui_settingspage.h"
#include <vcsbase/vcsbaseoptionspage.h>
#include <QPointer>
#include <QString>
#include <QWidget>
QT_BEGIN_NAMESPACE
class QSettings;
QT_END_NAMESPACE
namespace ClearCase {
namespace Internal {
class ClearCaseSettings;
class SettingsPageWidget : public QWidget
{
Q_OBJECT
public:
explicit SettingsPageWidget(QWidget *parent = 0);
ClearCaseSettings settings() const;
void setSettings(const ClearCaseSettings &);
QString searchKeywords() const;
private:
Ui::SettingsPage m_ui;
};
class SettingsPage : public VcsBase::VcsBaseOptionsPage
{
Q_OBJECT
public:
SettingsPage();
QWidget *createPage(QWidget *parent);
void apply();
void finish() { }
bool matches(const QString &) const;
private:
QString m_searchKeywords;
SettingsPageWidget* m_widget;
};
} // namespace ClearCase
} // namespace Internal
#endif // SETTINGSPAGE_H

View File

@@ -0,0 +1,236 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ClearCase::Internal::SettingsPage</class>
<widget class="QWidget" name="ClearCase::Internal::SettingsPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>363</width>
<height>384</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="generalGroupBox">
<property name="title">
<string>Configuration</string>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="commandLabel">
<property name="text">
<string>&amp;Command:</string>
</property>
<property name="buddy">
<cstring>commandPathChooser</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="Utils::PathChooser" name="commandPathChooser" native="true"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Diff</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QRadioButton" name="graphicalDiffRadioButton">
<property name="text">
<string>&amp;Graphical (Single file only)</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="externalDiffRadioButton">
<property name="text">
<string>&amp;External</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QWidget" name="diffWidget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="diffArgsLabel">
<property name="text">
<string>Arg&amp;uments:</string>
</property>
<property name="buddy">
<cstring>diffArgsEdit</cstring>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="diffArgsEdit"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="miscGroupBox">
<property name="title">
<string>Miscellaneous</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="historyCountLabel">
<property name="text">
<string>&amp;History count:</string>
</property>
<property name="buddy">
<cstring>historyCountSpinBox</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="historyCountSpinBox">
<property name="maximum">
<number>10000</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="timeOutLabel">
<property name="text">
<string>&amp;Timeout:</string>
</property>
<property name="buddy">
<cstring>timeOutSpinBox</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="timeOutSpinBox">
<property name="suffix">
<string>s</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>360</number>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="autoCheckOutCheckBox">
<property name="text">
<string>&amp;Automatically check out files on edit</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="autoAssignActivityCheckBox">
<property name="toolTip">
<string>Check this if you have a trigger that renames the activity automatically. You will not be prompted for activity name</string>
</property>
<property name="text">
<string>Aut&amp;o assign activity names</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="promptCheckBox">
<property name="text">
<string>&amp;Prompt on check-in</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QCheckBox" name="disableIndexerCheckBox">
<property name="text">
<string>Di&amp;sable indexer</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="indexOnlyVOBsLabel">
<property name="text">
<string>&amp;Index only VOBs:</string>
</property>
<property name="buddy">
<cstring>indexOnlyVOBsEdit</cstring>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="indexOnlyVOBsEdit">
<property name="toolTip">
<string>VOBs list, separated by comma. Indexer will only traverse the specified VOBs. If left blank, all active VOBs will be indexed</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>Utils::PathChooser</class>
<extends>QWidget</extends>
<header location="global">utils/pathchooser.h</header>
<container>1</container>
<slots>
<signal>editingFinished()</signal>
<signal>browsingFinished()</signal>
</slots>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>graphicalDiffRadioButton</tabstop>
<tabstop>externalDiffRadioButton</tabstop>
<tabstop>historyCountSpinBox</tabstop>
<tabstop>timeOutSpinBox</tabstop>
<tabstop>autoCheckOutCheckBox</tabstop>
<tabstop>autoAssignActivityCheckBox</tabstop>
<tabstop>indexOnlyVOBsEdit</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>externalDiffRadioButton</sender>
<signal>toggled(bool)</signal>
<receiver>diffWidget</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>83</x>
<y>122</y>
</hint>
<hint type="destinationlabel">
<x>203</x>
<y>140</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ClearCase::Internal::UndoCheckOut</class>
<widget class="QDialog" name="ClearCase::Internal::UndoCheckOut">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>323</width>
<height>105</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lblMessage"/>
</item>
<item>
<widget class="QLabel" name="lblModified">
<property name="palette">
<palette>
<active>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</active>
<inactive>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>255</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</colorrole>
</inactive>
<disabled>
<colorrole role="WindowText">
<brush brushstyle="SolidPattern">
<color alpha="255">
<red>68</red>
<green>96</green>
<blue>92</blue>
</color>
</brush>
</colorrole>
</disabled>
</palette>
</property>
<property name="text">
<string>The file was changed!</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="chkKeep">
<property name="text">
<string>&amp;Save copy of the file with a '.keep' extension</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::No|QDialogButtonBox::Yes</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ClearCase::Internal::UndoCheckOut</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ClearCase::Internal::UndoCheckOut</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -0,0 +1,110 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#include "versionselector.h"
#include "ui_versionselector.h"
#include <QRegExp>
#include <QTextStream>
namespace ClearCase {
namespace Internal {
VersionSelector::VersionSelector(const QString &fileName, const QString &message, QWidget *parent) :
QDialog(parent),
ui(new Ui::VersionSelector)
{
ui->setupUi(this);
ui->headerLabel->setText(ui->headerLabel->text().arg(fileName));
m_stream = new QTextStream(message.toLocal8Bit(), QIODevice::ReadOnly | QIODevice::Text);
QString line;
while (!m_stream->atEnd() && !line.contains(QLatin1String("1) Loaded version")))
line = m_stream->readLine();
if (!readValues())
return;
ui->loadedLabel->setText(m_versionID);
ui->loadedCreatedByLabel->setText(m_createdBy);
ui->loadedCreatedOnLabel->setText(m_createdOn);
ui->loadedText->insertPlainText(m_message + QLatin1Char(' '));
line = m_stream->readLine(); // 2) Version after update
if (!readValues())
return;
ui->updatedLabel->setText(m_versionID);
ui->updatedCreatedByLabel->setText(m_createdBy);
ui->updatedCreatedOnLabel->setText(m_createdOn);
ui->updatedText->setPlainText(m_message);
}
VersionSelector::~VersionSelector()
{
delete m_stream;
delete ui;
}
bool VersionSelector::readValues()
{
QString line;
line = m_stream->readLine();
QRegExp id(QLatin1String("Version ID: (.*)"));
if (id.indexIn(line) == -1)
return false;
m_versionID = id.cap(1);
line = m_stream->readLine();
QRegExp owner(QLatin1String("Created by: (.*)"));
if (owner.indexIn(line) == -1)
return false;
m_createdBy = owner.cap(1);
line = m_stream->readLine();
QRegExp dateTimeRE(QLatin1String("Created on: (.*)"));
if (dateTimeRE.indexIn(line) == -1)
return false;
m_createdOn = dateTimeRE.cap(1);
QStringList messageLines;
do
{
line = m_stream->readLine().trimmed();
if (line.isEmpty())
break;
messageLines << line;
} while (!m_stream->atEnd());
m_message = messageLines.join(QLatin1String(" "));
return true;
}
bool VersionSelector::isUpdate() const
{
return (ui->updatedRadioButton->isChecked());
}
} // namespace Internal
} // namespace ClearCase

View File

@@ -0,0 +1,70 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 AudioCodes Ltd.
**
** Author: Orgad Shaneh <orgad.shaneh@audiocodes.com>
**
** Contact: http://www.qt-project.org/
**
**
** GNU Lesser General Public License Usage
**
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this file.
** Please review the following information to ensure the GNU Lesser General
** Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**************************************************************************/
#ifndef VERSIONSELECTOR_H
#define VERSIONSELECTOR_H
#include <QDialog>
#include <QDateTime>
#include <QString>
QT_BEGIN_NAMESPACE
class QTextStream;
QT_END_NAMESPACE
namespace ClearCase {
namespace Internal {
namespace Ui {
class VersionSelector;
}
class VersionSelector : public QDialog
{
Q_OBJECT
public:
explicit VersionSelector(const QString &fileName, const QString &message, QWidget *parent = 0);
~VersionSelector();
bool isUpdate() const;
private:
Ui::VersionSelector *ui;
QTextStream *m_stream;
QString m_versionID, m_createdBy, m_createdOn, m_message;
bool readValues();
};
} // namespace Internal
} // namespace ClearCase
#endif // VERSIONSELECTOR_H

View File

@@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ClearCase::Internal::VersionSelector</class>
<widget class="QDialog" name="ClearCase::Internal::VersionSelector">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>413</width>
<height>435</height>
</rect>
</property>
<property name="windowTitle">
<string>Confirm Version to Check Out</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="headerLabel">
<property name="text">
<string>There are multiple versions of '%1' which can be considered for checkout. Please select version to checkout:</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="loadedLayout">
<item row="0" column="0">
<widget class="QRadioButton" name="loadedRadioButton">
<property name="text">
<string>&amp;Loaded Version</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="loadedLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="loadedCreatedByHeaderLabel">
<property name="text">
<string>Created By:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="loadedCreatedByLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="loadedCreatedOnHeaderLabel">
<property name="text">
<string>Created On:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="loadedCreatedOnLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QTextEdit" name="loadedText">
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt; font-weight:600;&quot;&gt;NOTE: You will not be able to check in this file without merging the changes (not supported by the plugin)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="updatedLayout">
<item row="0" column="1">
<widget class="QLabel" name="updatedLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="updatedCreatedByHeaderLabel">
<property name="text">
<string>Created By:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="updatedCreatedByLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="updatedCreatedOnHeaderLabel">
<property name="text">
<string>Created On:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="updatedCreatedOnLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPlainTextEdit" name="updatedText">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="updatedRadioButton">
<property name="text">
<string>Version after &amp;update</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ClearCase::Internal::VersionSelector</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ClearCase::Internal::VersionSelector</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -57,6 +57,7 @@ isEmpty(IDE_PACKAGE_MODE) {
linux-* {
SUBDIRS += debugger/ptracepreload.pro
}
!macx:SUBDIRS += plugin_clearcase
include(../../qtcreator.pri)
@@ -331,3 +332,7 @@ plugin_qnx.depends = plugin_remotelinux
plugin_qnx.depends += plugin_qt4projectmanager
plugin_qnx.depends += plugin_coreplugin
plugin_clearcase.subdir = clearcase
plugin_clearcase.depends = plugin_vcsbase
plugin_clearcase.depends += plugin_projectexplorer
plugin_clearcase.depends += plugin_coreplugin