summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2014-04-24 20:25:29 +0200
committerKarsten Heimrich <karsten.heimrich@digia.com>2014-04-24 20:33:12 +0200
commit56e326946159407a13eda62e894e11be5a824a4c (patch)
tree0b9e34c9a72ea41bcc0f49a83388aa91c9e487c3 /src/libs
parentd7ce137c11ca63eebe816eedcda1fb1f058ad8bb (diff)
Merge TargetDirectoryPage and TargetDirectoryPageImpl.
Change-Id: I613dbcb431452729bb672b5546e4108c0f613299 Reviewed-by: Karsten Heimrich <karsten.heimrich@digia.com>
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/installer/packagemanagergui.cpp164
-rw-r--r--src/libs/installer/packagemanagergui.h8
2 files changed, 140 insertions, 32 deletions
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index 14388776a..f31ade6aa 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -77,6 +77,10 @@
#include <QVBoxLayout>
#include <QShowEvent>
+#ifdef Q_OS_WIN
+# include <qt_windows.h>
+#endif
+
using namespace KDUpdater;
using namespace QInstaller;
@@ -1351,6 +1355,16 @@ TargetDirectoryPage::TargetDirectoryPage(PackageManagerCore *core)
hlayout->addWidget(browseButton);
layout->addLayout(hlayout);
+
+ QPalette palette;
+ palette.setColor(QPalette::WindowText, Qt::red);
+
+ m_warningLabel = new QLabel(this);
+ m_warningLabel->setPalette(palette);
+ m_warningLabel->setWordWrap(true);
+ m_warningLabel->setObjectName(QLatin1String("WarningLabel"));
+ layout->addWidget(m_warningLabel);
+
setLayout(layout);
}
@@ -1381,38 +1395,42 @@ void TargetDirectoryPage::initializePage()
bool TargetDirectoryPage::validatePage()
{
- if (targetDir().isEmpty()) {
- MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("EmptyTargetDirectoryMessage"), tr("Error"), tr("The install directory "
- "cannot be empty, please specify a valid folder."), QMessageBox::Ok);
- return false;
- }
+ if (!isVisible())
+ return true;
- const QDir dir(targetDir());
- // it exists, but is empty (might be created by the Browse button (getExistingDirectory)
- if (dir.exists() && dir.entryList(QDir::NoDotAndDotDot).isEmpty())
+ const QString remove = packageManagerCore()->value(QLatin1String("RemoveTargetDir"));
+ if (!QVariant(remove).toBool())
return true;
- if (dir.exists() && dir.isReadable()) {
- // it exists, but is not empty
- if (dir == QDir::root()) {
- MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("ForbiddenTargetDirectoryMessage"), tr("Error"), tr("As the install "
- "directory is completely deleted on uninstall, installing in %1 is forbidden.")
- .arg(QDir::rootPath()),
- QMessageBox::Ok);
- return false;
- }
+ const QString targetDir = this->targetDir();
+ const QDir dir(targetDir);
+ // the directory exists and is empty...
+ if (dir.exists() && dir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot).isEmpty())
+ return true;
- if (!QVariant(packageManagerCore()->value(scRemoveTargetDir)).toBool())
- return true;
+ const QFileInfo fi(targetDir);
+ if (fi.isDir()) {
+ QString fileName = packageManagerCore()->settings().uninstallerName();
+#if defined(Q_OS_MAC)
+ if (QFileInfo(QCoreApplication::applicationDirPath() + QLatin1String("/../..")).isBundle())
+ fileName += QLatin1String(".app/Contents/MacOS/") + fileName;
+#elif defined(Q_OS_WIN)
+ fileName += QLatin1String(".exe");
+#endif
- return MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(),
- QLatin1String("OverwriteTargetDirectoryMessage"), tr("Warning"), tr("You have "
- "selected an existing, non-empty folder for installation. Note that it will be "
- "completely wiped on uninstallation of this application. It is not advisable to "
- "install into this folder as installation might fail. Do you want to continue?"),
- QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes;
+ QFileInfo fi2(targetDir + QDir::separator() + fileName);
+ if (fi2.exists()) {
+ return failWithError(QLatin1String("TargetDirectoryInUse"), tr("The folder you selected already "
+ "exists and contains an installation. Choose a different target for installation."));
+ }
+
+ return askQuestion(QLatin1String("OverwriteTargetDirectory"),
+ tr("You have selected an existing, non-empty folder for installation.\nNote that it will be "
+ "completely wiped on uninstallation of this application.\nIt is not advisable to install into "
+ "this folder as installation might fail.\nDo you want to continue?"));
+ } else if (fi.isFile() || fi.isSymLink()) {
+ return failWithError(QLatin1String("WrongTargetDirectory"), tr("You have selected an existing file "
+ "or symlink, please choose a different target for installation."));
}
return true;
}
@@ -1430,10 +1448,6 @@ void TargetDirectoryPage::leaving()
packageManagerCore()->setValue(scTargetDir, targetDir());
}
-void TargetDirectoryPage::targetDirSelected()
-{
-}
-
void TargetDirectoryPage::dirRequested()
{
const QString newDirName = QFileDialog::getExistingDirectory(this,
@@ -1443,6 +1457,94 @@ void TargetDirectoryPage::dirRequested()
m_lineEdit->setText(QDir::toNativeSeparators(newDirName));
}
+bool TargetDirectoryPage::isComplete() const
+{
+ m_warningLabel->setText(targetDirWarning());
+ return m_warningLabel->text().isEmpty();
+}
+
+QString TargetDirectoryPage::targetDirWarning() const
+{
+ if (targetDir().isEmpty()) {
+ return tr("The installation path cannot be empty, please specify a valid "
+ "folder.");
+ }
+
+ if (QDir(targetDir()).isRelative()) {
+ return tr("The installation path cannot be relative, please specify an "
+ "absolute path.");
+ }
+
+ QDir target(targetDir());
+ target = target.canonicalPath();
+
+ if (target.isRoot()) {
+ return tr("As the install directory is completely deleted, installing "
+ "in %1 is forbidden.").arg(QDir::toNativeSeparators(QDir::rootPath()));
+ }
+
+ if (target == QDir::home()) {
+ return tr("As the install directory is completely deleted, installing "
+ "in %1 is forbidden.").arg(QDir::toNativeSeparators(QDir::homePath()));
+ }
+
+ QString dir = QDir::toNativeSeparators(targetDir());
+#ifdef Q_OS_WIN
+ // folder length (set by user) + maintenance tool name length (no extension) + extra padding
+ if ((dir.length() + packageManagerCore()->settings().uninstallerName().length() + 20) >= MAX_PATH) {
+ return tr("The path you have entered is too long, please make sure to "
+ "specify a valid path.");
+ }
+
+ if (dir.count() >= 3 && dir.indexOf(QRegExp(QLatin1String("[a-zA-Z]:"))) == 0
+ && dir.at(2) != QLatin1Char('\\')) {
+ return tr("The path you have entered is not valid, please make sure to "
+ "specify a valid drive.");
+ }
+
+ // remove e.g. "c:"
+ dir = dir.mid(2);
+#endif
+
+ QString ambiguousChars = QLatin1String("[~<>|?*!@#$%^&:,; ]");
+ if (packageManagerCore()->settings().allowSpaceInPath())
+ ambiguousChars.remove(QLatin1Char(' '));
+
+ // check if there are not allowed characters in the target path
+ if (dir.contains(QRegExp(ambiguousChars))) {
+ return tr("The installation path must not contain %1, "
+ "please specify a valid folder.").arg(ambiguousChars);
+ }
+
+ dir = targetDir();
+ if (!packageManagerCore()->settings().allowNonAsciiCharacters()) {
+ for (int i = 0; i < dir.length(); ++i) {
+ if (dir.at(i).unicode() & 0xff80) {
+ return tr("The path or installation directory contains non ASCII "
+ "characters. This is currently not supported! Please choose a different path or "
+ "installation directory.");
+ }
+ }
+ }
+
+ return QString();
+}
+
+bool TargetDirectoryPage::askQuestion(const QString &identifier, const QString &message)
+{
+ QMessageBox::StandardButton bt =
+ MessageBoxHandler::warning(MessageBoxHandler::currentBestSuitParent(), identifier,
+ tr("Warning"), message, QMessageBox::Yes | QMessageBox::No);
+ return bt == QMessageBox::Yes;
+}
+
+bool TargetDirectoryPage::failWithError(const QString &identifier, const QString &message)
+{
+ MessageBoxHandler::critical(MessageBoxHandler::currentBestSuitParent(), identifier,
+ tr("Error"), message);
+ return false;
+}
+
// -- StartMenuDirectoryPage
diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h
index 906f3530d..e1544306a 100644
--- a/src/libs/installer/packagemanagergui.h
+++ b/src/libs/installer/packagemanagergui.h
@@ -299,17 +299,23 @@ public:
void initializePage();
bool validatePage();
+ bool isComplete() const;
protected:
void entering();
void leaving();
private Q_SLOTS:
- void targetDirSelected();
void dirRequested();
private:
+ QString targetDirWarning() const;
+ bool askQuestion(const QString &identifier, const QString &message);
+ bool failWithError(const QString &identifier, const QString &message);
+
+private:
QLineEdit *m_lineEdit;
+ QLabel *m_warningLabel;
};