2012-10-15 11:53:22 +02:00
|
|
|
/****************************************************************************
|
|
|
|
|
**
|
2015-01-14 18:07:15 +01:00
|
|
|
** Copyright (C) 2015 The Qt Company Ltd.
|
|
|
|
|
** Contact: http://www.qt.io/licensing
|
2012-10-15 11:53:22 +02:00
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator.
|
|
|
|
|
**
|
|
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
2015-01-14 18:07:15 +01:00
|
|
|
** a written agreement between you and The Qt Company. For licensing terms and
|
|
|
|
|
** conditions see http://www.qt.io/terms-conditions. For further information
|
2014-10-01 13:21:18 +02:00
|
|
|
** use the contact form at http://www.qt.io/contact-us.
|
2012-10-15 11:53:22 +02:00
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
2014-10-01 13:21:18 +02:00
|
|
|
** General Public License version 2.1 or version 3 as published by the Free
|
|
|
|
|
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
|
|
|
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
|
|
|
** following information to ensure the GNU Lesser General Public License
|
|
|
|
|
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
|
|
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2012-10-15 11:53:22 +02:00
|
|
|
**
|
2015-01-14 18:07:15 +01:00
|
|
|
** In addition, as a special exception, The Qt Company gives you certain additional
|
|
|
|
|
** rights. These rights are described in The Qt Company LGPL Exception
|
2012-10-15 11:53:22 +02:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "readonlyfilesdialog.h"
|
|
|
|
|
#include "ui_readonlyfilesdialog.h"
|
|
|
|
|
|
2014-07-18 17:11:57 +02:00
|
|
|
#include <coreplugin/editormanager/editormanager_p.h>
|
2013-08-29 16:36:42 +02:00
|
|
|
#include <coreplugin/fileiconprovider.h>
|
2012-10-15 11:53:22 +02:00
|
|
|
#include <coreplugin/icore.h>
|
|
|
|
|
#include <coreplugin/idocument.h>
|
|
|
|
|
#include <coreplugin/iversioncontrol.h>
|
|
|
|
|
#include <coreplugin/vcsmanager.h>
|
|
|
|
|
|
|
|
|
|
#include <utils/fileutils.h>
|
|
|
|
|
#include <utils/hostosinfo.h>
|
|
|
|
|
|
|
|
|
|
#include <QDir>
|
|
|
|
|
#include <QFileInfo>
|
|
|
|
|
#include <QMap>
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
#include <QPushButton>
|
|
|
|
|
#include <QRadioButton>
|
|
|
|
|
|
|
|
|
|
namespace Core {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
class ReadOnlyFilesDialogPrivate
|
|
|
|
|
{
|
2014-09-20 21:52:56 +02:00
|
|
|
Q_DECLARE_TR_FUNCTIONS(Core::ReadOnlyFilesDialog)
|
|
|
|
|
|
2012-10-15 11:53:22 +02:00
|
|
|
public:
|
2014-09-20 21:52:56 +02:00
|
|
|
ReadOnlyFilesDialogPrivate(ReadOnlyFilesDialog *parent, IDocument *document = 0, bool useSaveAs = false);
|
2012-10-15 11:53:22 +02:00
|
|
|
~ReadOnlyFilesDialogPrivate();
|
|
|
|
|
|
2014-09-20 21:52:56 +02:00
|
|
|
enum ReadOnlyFilesTreeColumn {
|
|
|
|
|
MakeWritable = ReadOnlyFilesDialog::MakeWritable,
|
|
|
|
|
OpenWithVCS = ReadOnlyFilesDialog::OpenWithVCS,
|
|
|
|
|
SaveAs = ReadOnlyFilesDialog::SaveAs,
|
|
|
|
|
FileName = ReadOnlyFilesDialog::FileName,
|
|
|
|
|
Folder = ReadOnlyFilesDialog::Folder,
|
|
|
|
|
NumberOfColumns
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void initDialog(const QStringList &fileNames);
|
|
|
|
|
void promptFailWarning(const QStringList &files, ReadOnlyFilesDialog::ReadOnlyResult type) const;
|
|
|
|
|
QRadioButton *createRadioButtonForItem(QTreeWidgetItem *item, QButtonGroup *group, ReadOnlyFilesTreeColumn type);
|
|
|
|
|
|
|
|
|
|
void setAll(int index);
|
|
|
|
|
void updateSelectAll();
|
|
|
|
|
|
|
|
|
|
ReadOnlyFilesDialog *q;
|
|
|
|
|
|
2012-10-15 11:53:22 +02:00
|
|
|
// Buttongroups containing the operation for one file.
|
|
|
|
|
struct ButtonGroupForFile
|
|
|
|
|
{
|
|
|
|
|
QString fileName;
|
|
|
|
|
QButtonGroup *group;
|
|
|
|
|
};
|
|
|
|
|
QList <ButtonGroupForFile> buttonGroups;
|
|
|
|
|
|
|
|
|
|
QMap <int, int> setAllIndexForOperation;
|
|
|
|
|
// The version control systems for every file, if the file isn't in VCS the value is 0.
|
|
|
|
|
QHash <QString, IVersionControl*> versionControls;
|
|
|
|
|
|
|
|
|
|
// Define if some specific operations should be allowed to make the files writable.
|
|
|
|
|
const bool useSaveAs;
|
|
|
|
|
bool useVCS;
|
|
|
|
|
|
|
|
|
|
// Define if an error should be displayed when an operation fails.
|
|
|
|
|
bool showWarnings;
|
|
|
|
|
QString failWarning;
|
|
|
|
|
|
|
|
|
|
// The document is necessary for the Save As operation.
|
|
|
|
|
IDocument *document;
|
|
|
|
|
|
|
|
|
|
// Operation text for the tree widget header and combo box entries for
|
|
|
|
|
// modifying operations for all files.
|
|
|
|
|
const QString mixedText;
|
|
|
|
|
QString makeWritableText;
|
|
|
|
|
QString versionControlOpenText;
|
|
|
|
|
const QString saveAsText;
|
2014-09-20 21:52:56 +02:00
|
|
|
|
|
|
|
|
Ui::ReadOnlyFilesDialog ui;
|
2012-10-15 11:53:22 +02:00
|
|
|
};
|
|
|
|
|
|
2014-09-20 21:52:56 +02:00
|
|
|
ReadOnlyFilesDialogPrivate::ReadOnlyFilesDialogPrivate(ReadOnlyFilesDialog *parent, IDocument *document, bool displaySaveAs)
|
|
|
|
|
: q(parent)
|
|
|
|
|
, useSaveAs(displaySaveAs)
|
2012-10-15 11:53:22 +02:00
|
|
|
, useVCS(false)
|
|
|
|
|
, showWarnings(false)
|
|
|
|
|
, document(document)
|
2014-09-20 21:52:56 +02:00
|
|
|
, mixedText(tr("Mixed"))
|
|
|
|
|
, makeWritableText(tr("Make Writable"))
|
|
|
|
|
, versionControlOpenText(tr("Open with VCS"))
|
|
|
|
|
, saveAsText(tr("Save As"))
|
2012-10-15 11:53:22 +02:00
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
ReadOnlyFilesDialogPrivate::~ReadOnlyFilesDialogPrivate()
|
|
|
|
|
{
|
|
|
|
|
foreach (const ButtonGroupForFile &groupForFile, buttonGroups)
|
|
|
|
|
delete groupForFile.group;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-20 21:52:56 +02:00
|
|
|
} // namespace Internal
|
|
|
|
|
|
|
|
|
|
using namespace Internal;
|
|
|
|
|
|
2012-10-15 11:53:22 +02:00
|
|
|
/*!
|
|
|
|
|
* \class ReadOnlyFilesDialog
|
2013-06-05 14:29:24 +02:00
|
|
|
* \brief The ReadOnlyFilesDialog class implements a dialog to show a set of
|
|
|
|
|
* files that are classified as not writable.
|
2012-10-15 11:53:22 +02:00
|
|
|
*
|
|
|
|
|
* Automatically checks which operations are allowed to make the file writable. These operations
|
|
|
|
|
* are Make Writable which tries to set the file permissions in the file system,
|
|
|
|
|
* Open With Version Control System if the open operation is allowed by the version control system
|
|
|
|
|
* and Save As which is used to save the changes to a document in another file.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
ReadOnlyFilesDialog::ReadOnlyFilesDialog(const QList<QString> &fileNames, QWidget *parent)
|
|
|
|
|
: QDialog(parent)
|
2014-09-20 21:52:56 +02:00
|
|
|
, d(new ReadOnlyFilesDialogPrivate(this))
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
2014-09-20 21:52:56 +02:00
|
|
|
d->initDialog(fileNames);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReadOnlyFilesDialog::ReadOnlyFilesDialog(const QString &fileName, QWidget *parent)
|
|
|
|
|
: QDialog(parent)
|
2014-09-20 21:52:56 +02:00
|
|
|
, d(new ReadOnlyFilesDialogPrivate(this))
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
2014-09-20 21:52:56 +02:00
|
|
|
d->initDialog(QStringList(fileName));
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReadOnlyFilesDialog::ReadOnlyFilesDialog(IDocument *document, QWidget *parent,
|
|
|
|
|
bool displaySaveAs)
|
|
|
|
|
: QDialog(parent)
|
2014-09-20 21:52:56 +02:00
|
|
|
, d(new ReadOnlyFilesDialogPrivate(this, document, displaySaveAs))
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
2014-12-21 21:54:30 +02:00
|
|
|
d->initDialog(QStringList(document->filePath().toString()));
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
2014-05-19 18:27:46 +03:00
|
|
|
ReadOnlyFilesDialog::ReadOnlyFilesDialog(const QList<IDocument *> &documents, QWidget *parent)
|
2012-10-15 11:53:22 +02:00
|
|
|
: QDialog(parent)
|
2014-09-20 21:52:56 +02:00
|
|
|
, d(new ReadOnlyFilesDialogPrivate(this))
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
|
|
|
|
QStringList files;
|
|
|
|
|
foreach (IDocument *document, documents)
|
2014-12-21 21:54:30 +02:00
|
|
|
files << document->filePath().toString();
|
2014-09-20 21:52:56 +02:00
|
|
|
d->initDialog(files);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReadOnlyFilesDialog::~ReadOnlyFilesDialog()
|
|
|
|
|
{
|
|
|
|
|
delete d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Sets a user defined message in the dialog.
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*/
|
|
|
|
|
void ReadOnlyFilesDialog::setMessage(const QString &message)
|
|
|
|
|
{
|
2014-09-20 21:52:56 +02:00
|
|
|
d->ui.msgLabel->setText(message);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Enables the error output to the user via a message box. \a warning should
|
|
|
|
|
* show the possible consequences if the file is still read only.
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*/
|
|
|
|
|
void ReadOnlyFilesDialog::setShowFailWarning(bool show, const QString &warning)
|
|
|
|
|
{
|
|
|
|
|
d->showWarnings = show;
|
|
|
|
|
d->failWarning = warning;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Opens a message box with an error description according to the type.
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*/
|
2014-09-20 21:52:56 +02:00
|
|
|
void ReadOnlyFilesDialogPrivate::promptFailWarning(const QStringList &files, ReadOnlyFilesDialog::ReadOnlyResult type) const
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
|
|
|
|
if (files.isEmpty())
|
|
|
|
|
return;
|
|
|
|
|
QString title;
|
|
|
|
|
QString message;
|
|
|
|
|
QString details;
|
|
|
|
|
if (files.count() == 1) {
|
|
|
|
|
const QString file = files.first();
|
|
|
|
|
switch (type) {
|
2014-09-20 21:52:56 +02:00
|
|
|
case ReadOnlyFilesDialog::RO_OpenVCS: {
|
|
|
|
|
if (IVersionControl *vc = versionControls[file]) {
|
2012-10-15 11:53:22 +02:00
|
|
|
const QString openText = vc->vcsOpenText().remove(QLatin1Char('&'));
|
2013-05-14 16:13:29 +02:00
|
|
|
title = tr("Failed to %1 File").arg(openText);
|
2013-10-17 13:48:04 +02:00
|
|
|
message = tr("%1 file %2 from version control system %3 failed.")
|
2012-10-15 11:53:22 +02:00
|
|
|
.arg(openText)
|
|
|
|
|
.arg(QDir::toNativeSeparators(file))
|
2014-09-20 21:52:56 +02:00
|
|
|
.arg(vc->displayName())
|
|
|
|
|
+ QLatin1Char('\n')
|
|
|
|
|
+ failWarning;
|
2012-10-15 11:53:22 +02:00
|
|
|
} else {
|
|
|
|
|
title = tr("No Version Control System Found");
|
|
|
|
|
message = tr("Cannot open file %1 from version control system.\n"
|
2013-10-17 13:48:04 +02:00
|
|
|
"No version control system found.")
|
2014-09-20 21:52:56 +02:00
|
|
|
.arg(QDir::toNativeSeparators(file))
|
|
|
|
|
+ QLatin1Char('\n')
|
|
|
|
|
+ failWarning;;
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2014-09-20 21:52:56 +02:00
|
|
|
case ReadOnlyFilesDialog::RO_MakeWritable:
|
2012-10-15 11:53:22 +02:00
|
|
|
title = tr("Cannot Set Permissions");
|
2013-10-17 13:48:04 +02:00
|
|
|
message = tr("Cannot set permissions for %1 to writable.")
|
2014-09-20 21:52:56 +02:00
|
|
|
.arg(QDir::toNativeSeparators(file))
|
|
|
|
|
+ QLatin1Char('\n')
|
|
|
|
|
+ failWarning;
|
2012-10-15 11:53:22 +02:00
|
|
|
break;
|
2014-09-20 21:52:56 +02:00
|
|
|
case ReadOnlyFilesDialog::RO_SaveAs:
|
2012-10-15 11:53:22 +02:00
|
|
|
title = tr("Cannot Save File");
|
2014-09-20 21:52:56 +02:00
|
|
|
message = tr("Cannot save file %1").arg(QDir::toNativeSeparators(file))
|
|
|
|
|
+ QLatin1Char('\n')
|
|
|
|
|
+ failWarning;
|
2012-10-15 11:53:22 +02:00
|
|
|
break;
|
|
|
|
|
default:
|
2013-04-15 13:43:16 +02:00
|
|
|
title = tr("Canceled Changing Permissions");
|
2014-09-20 21:52:56 +02:00
|
|
|
message = failWarning;
|
2012-10-15 11:53:22 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2013-05-14 16:13:29 +02:00
|
|
|
title = tr("Could Not Change Permissions on Some Files");
|
2014-09-20 21:52:56 +02:00
|
|
|
message = failWarning + QLatin1Char('\n')
|
|
|
|
|
+ tr("See details for a complete list of files.");
|
2014-08-23 01:19:53 +02:00
|
|
|
details = files.join(QLatin1Char('\n'));
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
2014-05-30 10:46:34 +02:00
|
|
|
QMessageBox msgBox(QMessageBox::Warning, title, message,
|
|
|
|
|
QMessageBox::Ok, ICore::dialogParent());
|
2012-10-15 11:53:22 +02:00
|
|
|
msgBox.setDetailedText(details);
|
|
|
|
|
msgBox.exec();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Executes the ReadOnlyFilesDialog dialog.
|
|
|
|
|
* Returns ReadOnlyResult to provide information about the operation that was
|
|
|
|
|
* used to make the files writable.
|
2013-10-17 13:48:04 +02:00
|
|
|
*
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*
|
2013-09-06 16:38:53 +02:00
|
|
|
* Also displays an error dialog when some operations cannot be executed and the
|
|
|
|
|
* function \c setShowFailWarning() was called.
|
2012-10-15 11:53:22 +02:00
|
|
|
*/
|
|
|
|
|
int ReadOnlyFilesDialog::exec()
|
|
|
|
|
{
|
|
|
|
|
if (QDialog::exec() != QDialog::Accepted)
|
|
|
|
|
return RO_Cancel;
|
|
|
|
|
|
2013-05-29 08:45:13 +02:00
|
|
|
ReadOnlyResult result = RO_Cancel;
|
2012-10-15 11:53:22 +02:00
|
|
|
QStringList failedToMakeWritable;
|
2013-11-20 09:20:37 +01:00
|
|
|
foreach (ReadOnlyFilesDialogPrivate::ButtonGroupForFile buttongroup, d->buttonGroups) {
|
|
|
|
|
result = static_cast<ReadOnlyResult>(buttongroup.group->checkedId());
|
2012-10-15 11:53:22 +02:00
|
|
|
switch (result) {
|
|
|
|
|
case RO_MakeWritable:
|
2013-11-20 09:20:37 +01:00
|
|
|
if (!Utils::FileUtils::makeWritable(Utils::FileName(QFileInfo(buttongroup.fileName)))) {
|
|
|
|
|
failedToMakeWritable << buttongroup.fileName;
|
2012-10-15 11:53:22 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case RO_OpenVCS:
|
2013-11-20 09:20:37 +01:00
|
|
|
if (!d->versionControls[buttongroup.fileName]->vcsOpen(buttongroup.fileName)) {
|
|
|
|
|
failedToMakeWritable << buttongroup.fileName;
|
2012-10-15 11:53:22 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case RO_SaveAs:
|
2014-07-18 17:11:57 +02:00
|
|
|
if (!EditorManagerPrivate::saveDocumentAs(d->document)) {
|
2013-11-20 09:20:37 +01:00
|
|
|
failedToMakeWritable << buttongroup.fileName;
|
2012-10-15 11:53:22 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2013-11-20 09:20:37 +01:00
|
|
|
failedToMakeWritable << buttongroup.fileName;
|
2012-10-15 11:53:22 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
2013-11-20 09:20:37 +01:00
|
|
|
if (!QFileInfo(buttongroup.fileName).isWritable())
|
|
|
|
|
failedToMakeWritable << buttongroup.fileName;
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
if (!failedToMakeWritable.isEmpty()) {
|
|
|
|
|
if (d->showWarnings)
|
2014-09-20 21:52:56 +02:00
|
|
|
d->promptFailWarning(failedToMakeWritable, result);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
return failedToMakeWritable.isEmpty() ? result : RO_Cancel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Creates a radio button in the group \a group and in the column specified by
|
|
|
|
|
* \a type.
|
|
|
|
|
* Returns the created button.
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*/
|
2014-09-20 21:52:56 +02:00
|
|
|
QRadioButton *ReadOnlyFilesDialogPrivate::createRadioButtonForItem(QTreeWidgetItem *item, QButtonGroup *group,
|
|
|
|
|
ReadOnlyFilesTreeColumn type)
|
2012-10-15 11:53:22 +02:00
|
|
|
|
|
|
|
|
{
|
2014-09-20 21:52:56 +02:00
|
|
|
QRadioButton *radioButton = new QRadioButton(q);
|
2012-10-15 11:53:22 +02:00
|
|
|
group->addButton(radioButton, type);
|
|
|
|
|
item->setTextAlignment(type, Qt::AlignHCenter);
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.treeWidget->setItemWidget(item, type, radioButton);
|
2012-10-15 11:53:22 +02:00
|
|
|
return radioButton;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Checks the type of the select all combo box and changes the user selection
|
|
|
|
|
* per file accordingly.
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*/
|
2014-09-20 21:52:56 +02:00
|
|
|
void ReadOnlyFilesDialogPrivate::setAll(int index)
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
|
|
|
|
// If mixed is the current index, no need to change the user selection.
|
2014-09-20 21:52:56 +02:00
|
|
|
if (index == setAllIndexForOperation[-1/*mixed*/])
|
2012-10-15 11:53:22 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Get the selected type from the select all combo box.
|
2013-05-29 08:45:13 +02:00
|
|
|
ReadOnlyFilesTreeColumn type = NumberOfColumns;
|
2014-09-20 21:52:56 +02:00
|
|
|
if (index == setAllIndexForOperation[MakeWritable])
|
2012-10-15 11:53:22 +02:00
|
|
|
type = MakeWritable;
|
2014-09-20 21:52:56 +02:00
|
|
|
else if (index == setAllIndexForOperation[OpenWithVCS])
|
2012-10-15 11:53:22 +02:00
|
|
|
type = OpenWithVCS;
|
2014-09-20 21:52:56 +02:00
|
|
|
else if (index == setAllIndexForOperation[SaveAs])
|
2012-10-15 11:53:22 +02:00
|
|
|
type = SaveAs;
|
|
|
|
|
|
|
|
|
|
// Check for every file if the selected operation is available and change it to the operation.
|
2014-09-20 21:52:56 +02:00
|
|
|
foreach (ReadOnlyFilesDialogPrivate::ButtonGroupForFile groupForFile, buttonGroups) {
|
2012-10-15 11:53:22 +02:00
|
|
|
QRadioButton *radioButton = qobject_cast<QRadioButton*> (groupForFile.group->button(type));
|
|
|
|
|
if (radioButton)
|
|
|
|
|
radioButton->setChecked(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Updates the select all combo box depending on the selection the user made in
|
|
|
|
|
* the tree widget.
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*/
|
2014-09-20 21:52:56 +02:00
|
|
|
void ReadOnlyFilesDialogPrivate::updateSelectAll()
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
|
|
|
|
int selectedOperation = -1;
|
2014-09-20 21:52:56 +02:00
|
|
|
foreach (ReadOnlyFilesDialogPrivate::ButtonGroupForFile groupForFile, buttonGroups) {
|
2012-10-15 11:53:22 +02:00
|
|
|
if (selectedOperation == -1) {
|
|
|
|
|
selectedOperation = groupForFile.group->checkedId();
|
|
|
|
|
} else if (selectedOperation != groupForFile.group->checkedId()) {
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.setAll->setCurrentIndex(0);
|
2012-10-15 11:53:22 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.setAll->setCurrentIndex(setAllIndexForOperation[selectedOperation]);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
2013-09-06 16:38:53 +02:00
|
|
|
* Adds files to the dialog and checks for a possible operation to make the file
|
|
|
|
|
* writable.
|
|
|
|
|
* \a fileNames contains the list of the files that should be added to the
|
|
|
|
|
* dialog.
|
2012-10-15 11:53:22 +02:00
|
|
|
* \internal
|
|
|
|
|
*/
|
2014-09-20 21:52:56 +02:00
|
|
|
void ReadOnlyFilesDialogPrivate::initDialog(const QStringList &fileNames)
|
2012-10-15 11:53:22 +02:00
|
|
|
{
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.setupUi(q);
|
|
|
|
|
ui.buttonBox->addButton(tr("Change &Permission"), QDialogButtonBox::AcceptRole);
|
|
|
|
|
ui.buttonBox->addButton(QDialogButtonBox::Cancel);
|
2012-10-15 11:53:22 +02:00
|
|
|
|
|
|
|
|
QString vcsOpenTextForAll;
|
|
|
|
|
QString vcsMakeWritableTextForAll;
|
|
|
|
|
bool useMakeWritable = false;
|
|
|
|
|
foreach (const QString &fileName, fileNames) {
|
|
|
|
|
const QFileInfo info = QFileInfo(fileName);
|
|
|
|
|
const QString visibleName = info.fileName();
|
|
|
|
|
const QString directory = info.absolutePath();
|
|
|
|
|
|
|
|
|
|
// Setup a default entry with filename folder and make writable radio button.
|
2014-09-20 21:52:56 +02:00
|
|
|
QTreeWidgetItem *item = new QTreeWidgetItem(ui.treeWidget);
|
2012-10-15 11:53:22 +02:00
|
|
|
item->setText(FileName, visibleName);
|
2013-09-12 16:06:33 +02:00
|
|
|
item->setIcon(FileName, FileIconProvider::icon(fileName));
|
2012-10-15 11:53:22 +02:00
|
|
|
item->setText(Folder, Utils::FileUtils::shortNativePath(Utils::FileName(QFileInfo(directory))));
|
|
|
|
|
QButtonGroup *radioButtonGroup = new QButtonGroup;
|
|
|
|
|
|
|
|
|
|
// Add a button for opening the file with a version control system
|
|
|
|
|
// if the file is managed by an version control system which allows opening files.
|
|
|
|
|
IVersionControl *versionControlForFile =
|
2013-08-30 17:13:29 +02:00
|
|
|
VcsManager::findVersionControlForDirectory(directory);
|
2012-10-15 11:53:22 +02:00
|
|
|
const bool fileManagedByVCS = versionControlForFile
|
2013-11-07 12:31:22 +01:00
|
|
|
&& versionControlForFile->openSupportMode(fileName) != IVersionControl::NoOpen;
|
2012-10-15 11:53:22 +02:00
|
|
|
if (fileManagedByVCS) {
|
|
|
|
|
const QString vcsOpenTextForFile =
|
|
|
|
|
versionControlForFile->vcsOpenText().remove(QLatin1Char('&'));
|
|
|
|
|
const QString vcsMakeWritableTextforFile =
|
|
|
|
|
versionControlForFile->vcsMakeWritableText().remove(QLatin1Char('&'));
|
2014-09-20 21:52:56 +02:00
|
|
|
if (!useVCS) {
|
2012-10-15 11:53:22 +02:00
|
|
|
vcsOpenTextForAll = vcsOpenTextForFile;
|
|
|
|
|
vcsMakeWritableTextForAll = vcsMakeWritableTextforFile;
|
2014-09-20 21:52:56 +02:00
|
|
|
useVCS = true;
|
2012-10-15 11:53:22 +02:00
|
|
|
} else {
|
|
|
|
|
// If there are different open or make writable texts choose the default one.
|
|
|
|
|
if (vcsOpenTextForFile != vcsOpenTextForAll)
|
|
|
|
|
vcsOpenTextForAll.clear();
|
|
|
|
|
if (vcsMakeWritableTextforFile != vcsMakeWritableTextForAll)
|
|
|
|
|
vcsMakeWritableTextForAll.clear();
|
|
|
|
|
}
|
|
|
|
|
// Add make writable if it is supported by the reposetory.
|
2013-11-07 12:31:22 +01:00
|
|
|
if (versionControlForFile->openSupportMode(fileName) == IVersionControl::OpenOptional) {
|
2012-10-15 11:53:22 +02:00
|
|
|
useMakeWritable = true;
|
|
|
|
|
createRadioButtonForItem(item, radioButtonGroup, MakeWritable);
|
|
|
|
|
}
|
|
|
|
|
createRadioButtonForItem(item, radioButtonGroup, OpenWithVCS)->setChecked(true);
|
|
|
|
|
} else {
|
|
|
|
|
useMakeWritable = true;
|
|
|
|
|
createRadioButtonForItem(item, radioButtonGroup, MakeWritable)->setChecked(true);
|
|
|
|
|
}
|
|
|
|
|
// Add a Save As radio button if requested.
|
2014-09-20 21:52:56 +02:00
|
|
|
if (useSaveAs)
|
2012-10-15 11:53:22 +02:00
|
|
|
createRadioButtonForItem(item, radioButtonGroup, SaveAs);
|
|
|
|
|
// If the file is managed by a version control system save the vcs for this file.
|
2014-09-20 21:52:56 +02:00
|
|
|
versionControls[fileName] = fileManagedByVCS ? versionControlForFile : 0;
|
2012-10-15 11:53:22 +02:00
|
|
|
|
|
|
|
|
// Also save the buttongroup for every file to get the result for each entry.
|
|
|
|
|
ReadOnlyFilesDialogPrivate::ButtonGroupForFile groupForFile;
|
|
|
|
|
groupForFile.fileName = fileName;
|
|
|
|
|
groupForFile.group = radioButtonGroup;
|
2014-09-20 21:52:56 +02:00
|
|
|
buttonGroups.append(groupForFile);
|
|
|
|
|
QObject::connect(radioButtonGroup, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
|
|
|
|
|
[this](int) { updateSelectAll(); });
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Apply the Mac file dialog style.
|
|
|
|
|
if (Utils::HostOsInfo::isMacHost())
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.treeWidget->setAlternatingRowColors(true);
|
2012-10-15 11:53:22 +02:00
|
|
|
|
|
|
|
|
// Do not show any options to the user if he has no choice.
|
2014-09-20 21:52:56 +02:00
|
|
|
if (!useSaveAs && (useVCS || !useMakeWritable)) {
|
|
|
|
|
ui.treeWidget->setColumnHidden(MakeWritable, true);
|
|
|
|
|
ui.treeWidget->setColumnHidden(OpenWithVCS, true);
|
|
|
|
|
ui.treeWidget->setColumnHidden(SaveAs, true);
|
|
|
|
|
ui.treeWidget->resizeColumnToContents(FileName);
|
|
|
|
|
ui.treeWidget->resizeColumnToContents(Folder);
|
|
|
|
|
ui.setAll->setVisible(false);
|
|
|
|
|
ui.setAllLabel->setVisible(false);
|
|
|
|
|
ui.verticalLayout->removeItem(ui.setAllLayout);
|
|
|
|
|
if (useVCS)
|
|
|
|
|
ui.msgLabel->setText(tr("The following files are not checked out yet.\n"
|
2013-05-14 16:13:29 +02:00
|
|
|
"Do you want to check them out now?"));
|
2012-10-15 11:53:22 +02:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If there is just one file entry, there is no need to show the select all combo box
|
|
|
|
|
if (fileNames.count() < 2) {
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.setAll->setVisible(false);
|
|
|
|
|
ui.setAllLabel->setVisible(false);
|
|
|
|
|
ui.verticalLayout->removeItem(ui.setAllLayout);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add items to the Set all combo box.
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.setAll->addItem(mixedText);
|
|
|
|
|
setAllIndexForOperation[-1/*mixed*/] = ui.setAll->count() - 1;
|
|
|
|
|
if (useVCS) {
|
2012-10-15 11:53:22 +02:00
|
|
|
// If the files are managed by just one version control system, the Open and Make Writable
|
|
|
|
|
// text for the specific system is used.
|
2014-09-20 21:52:56 +02:00
|
|
|
if (!vcsOpenTextForAll.isEmpty() && vcsOpenTextForAll != versionControlOpenText) {
|
|
|
|
|
versionControlOpenText = vcsOpenTextForAll;
|
|
|
|
|
ui.treeWidget->headerItem()->setText(OpenWithVCS, versionControlOpenText);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
2014-09-20 21:52:56 +02:00
|
|
|
if (!vcsMakeWritableTextForAll.isEmpty() && vcsMakeWritableTextForAll != makeWritableText) {
|
|
|
|
|
makeWritableText = vcsMakeWritableTextForAll;
|
|
|
|
|
ui.treeWidget->headerItem()->setText(MakeWritable, makeWritableText);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.setAll->addItem(versionControlOpenText);
|
|
|
|
|
ui.setAll->setCurrentIndex(ui.setAll->count() - 1);
|
|
|
|
|
setAllIndexForOperation[OpenWithVCS] = ui.setAll->count() - 1;
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
if (useMakeWritable) {
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.setAll->addItem(makeWritableText);
|
|
|
|
|
setAllIndexForOperation[MakeWritable] = ui.setAll->count() - 1;
|
|
|
|
|
if (ui.setAll->currentIndex() == -1)
|
|
|
|
|
ui.setAll->setCurrentIndex(ui.setAll->count() - 1);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
2014-09-20 21:52:56 +02:00
|
|
|
if (useSaveAs) {
|
|
|
|
|
ui.setAll->addItem(saveAsText);
|
|
|
|
|
setAllIndexForOperation[SaveAs] = ui.setAll->count() - 1;
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
2014-09-20 21:52:56 +02:00
|
|
|
QObject::connect(ui.setAll, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated),
|
|
|
|
|
[this](int index) { setAll(index); });
|
2012-10-15 11:53:22 +02:00
|
|
|
|
|
|
|
|
// Filter which columns should be visible and resize them to content.
|
|
|
|
|
for (int i = 0; i < NumberOfColumns; ++i) {
|
2014-09-20 21:52:56 +02:00
|
|
|
if ((i == SaveAs && !useSaveAs) || (i == OpenWithVCS && !useVCS)
|
2012-10-15 11:53:22 +02:00
|
|
|
|| (i == MakeWritable && !useMakeWritable)) {
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.treeWidget->setColumnHidden(i, true);
|
2012-10-15 11:53:22 +02:00
|
|
|
continue;
|
|
|
|
|
}
|
2014-09-20 21:52:56 +02:00
|
|
|
ui.treeWidget->resizeColumnToContents(i);
|
2012-10-15 11:53:22 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}// namespace Core
|