diff --git a/src/libs/utils/settingsutils.cpp b/src/libs/utils/stringutils.cpp similarity index 50% rename from src/libs/utils/settingsutils.cpp rename to src/libs/utils/stringutils.cpp index 14727b364548f19116d17f6fa6363ad19c8ae56a..e809cb478653b223fb2c43377da4337bdcf30a62 100644 --- a/src/libs/utils/settingsutils.cpp +++ b/src/libs/utils/stringutils.cpp @@ -27,9 +27,12 @@ ** **************************************************************************/ -#include "settingsutils.h" +#include "stringutils.h" #include <QtCore/QString> +#include <QtCore/QStringList> + +#include <limits.h> namespace Utils { @@ -46,4 +49,53 @@ QTCREATOR_UTILS_EXPORT QString settingsKey(const QString &category) return rc; } +// Figure out length of common start of string ("C:\a", "c:\b" -> "c:\" +static inline int commonPartSize(const QString &s1, const QString &s2) +{ + const int size = qMin(s1.size(), s2.size()); + for (int i = 0; i < size; i++) + if (s1.at(i) != s2.at(i)) + return i; + return size; +} + +QTCREATOR_UTILS_EXPORT QString commonPrefix(const QStringList &strings) +{ + switch (strings.size()) { + case 0: + return QString(); + case 1: + return strings.front(); + default: + break; + } + // Figure out common string part: "C:\foo\bar1" "C:\foo\bar2" -> "C:\foo\bar" + int commonLength = INT_MAX; + const int last = strings.size() - 1; + for (int i = 0; i < last; i++) + commonLength = qMin(commonLength, commonPartSize(strings.at(i), strings.at(i + 1))); + if (!commonLength) + return QString(); + return strings.at(0).left(commonLength); +} + +QTCREATOR_UTILS_EXPORT QString commonPath(const QStringList &files) +{ + QString common = commonPrefix(files); + // Find common directory part: "C:\foo\bar" -> "C:\foo" + int lastSeparatorPos = common.lastIndexOf(QLatin1Char('/')); + if (lastSeparatorPos == -1) + lastSeparatorPos = common.lastIndexOf(QLatin1Char('\\')); + if (lastSeparatorPos == -1) + return QString(); + if (lastSeparatorPos == -1) + return QString(); +#ifdef Q_OS_UNIX + if (lastSeparatorPos == 0) // Unix: "/a", "/b" -> '/' + lastSeparatorPos = 1; +#endif + common.truncate(lastSeparatorPos); + return common; +} + } // namespace Utils diff --git a/src/libs/utils/settingsutils.h b/src/libs/utils/stringutils.h similarity index 79% rename from src/libs/utils/settingsutils.h rename to src/libs/utils/stringutils.h index 0e1aac3f450b1c79355e9276847a08634e9dcfb2..f1d5688cd29476cb50e5e022675f589e96241d67 100644 --- a/src/libs/utils/settingsutils.h +++ b/src/libs/utils/stringutils.h @@ -32,12 +32,24 @@ #include "utils_global.h" +QT_BEGIN_NAMESPACE +class QStringList; +QT_END_NAMESPACE + namespace Utils { // Create a usable settings key from a category, // for example Editor|C++ -> Editor_C__ QTCREATOR_UTILS_EXPORT QString settingsKey(const QString &category); +// Return the common prefix part of a string list: +// "C:\foo\bar1" "C:\foo\bar2" -> "C:\foo\bar" +QTCREATOR_UTILS_EXPORT QString commonPrefix(const QStringList &strings); + +// Return the common path of a list of files: +// "C:\foo\bar1" "C:\foo\bar2" -> "C:\foo" +QTCREATOR_UTILS_EXPORT QString commonPath(const QStringList &files); + } // namespace Utils #endif // SETTINGSTUTILS_H diff --git a/src/libs/utils/utils.pro b/src/libs/utils/utils.pro index e48e240b5d7302d4482666ad393b09f8571fb045..fde373e6fe6573e77799dac0da32ac5ad652c351 100644 --- a/src/libs/utils/utils.pro +++ b/src/libs/utils/utils.pro @@ -5,7 +5,7 @@ QT += gui \ DEFINES += QTCREATOR_UTILS_LIB include(../../qtcreatorlibrary.pri) SOURCES += reloadpromptutils.cpp \ - settingsutils.cpp \ + stringutils.cpp \ filesearch.cpp \ pathchooser.cpp \ pathlisteditor.cpp \ @@ -47,7 +47,7 @@ win32 { else:SOURCES += consoleprocess_unix.cpp HEADERS += utils_global.h \ reloadpromptutils.h \ - settingsutils.h \ + stringutils.h \ filesearch.h \ listutils.h \ pathchooser.h \ diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 0fa8619e27047d9bb43a98b3c753c2bde6832037..5f5849a17a95d5bf458278ceddcc7065d3ce894c 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -54,6 +54,7 @@ #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/vcsmanager.h> #include <projectexplorer/projectexplorer.h> +#include <utils/stringutils.h> #include <utils/qtcassert.h> #include <QtCore/QDebug> @@ -68,8 +69,6 @@ #include <QtGui/QMenu> #include <QtGui/QMessageBox> -#include <limits.h> - namespace CVS { namespace Internal { @@ -963,13 +962,6 @@ static inline QString processStdErr(QProcess &proc) return QString::fromLocal8Bit(proc.readAllStandardError()).remove(QLatin1Char('\r')); } -static inline QString processStdOut(QProcess &proc, QTextCodec *outputCodec = 0) -{ - const QByteArray stdOutData = proc.readAllStandardOutput(); - QString stdOut = outputCodec ? outputCodec->toUnicode(stdOutData) : QString::fromLocal8Bit(stdOutData); - return stdOut.remove(QLatin1Char('\r')); -} - /* Tortoise CVS does not allow for absolute path names * (which it claims to be CVS standard behaviour). * So, try to figure out the common root of the file arguments, @@ -980,16 +972,6 @@ static inline QString processStdOut(QProcess &proc, QTextCodec *outputCodec = 0) * Usually, there is only one file argument, which is not * problematic; it is just split using QFileInfo. */ -// Figure out length of common start of string ("C:\a", "c:\b" -> "c:\" -static inline int commonPartSize(const QString &s1, const QString &s2) -{ - const int size = qMin(s1.size(), s2.size()); - for (int i = 0; i < size; i++) - if (s1.at(i) != s2.at(i)) - return i; - return size; -} - static inline QString fixFileArgs(QStringList *files) { switch (files->size()) { @@ -1003,27 +985,10 @@ static inline QString fixFileArgs(QStringList *files) default: break; } - // Figure out common string part: "C:\foo\bar1" "C:\foo\bar2" -> "C:\foo\bar" - int commonLength = INT_MAX; - const int last = files->size() - 1; - for (int i = 0; i < last; i++) - commonLength = qMin(commonLength, commonPartSize(files->at(i), files->at(i + 1))); - if (!commonLength) - return QString(); - // Find directory part: "C:\foo\bar" -> "C:\foo" - QString common = files->at(0).left(commonLength); - int lastSlashPos = common.lastIndexOf(QLatin1Char('/')); - if (lastSlashPos == -1) - lastSlashPos = common.lastIndexOf(QLatin1Char('\\')); - if (lastSlashPos == -1) - return QString(); -#ifdef Q_OS_UNIX - if (lastSlashPos == 0) // leave "/a", "/b" untouched - return QString(); -#endif - common.truncate(lastSlashPos); + // Find common directory part: "C:\foo\bar" -> "C:\foo" + const QString common = Utils::commonPath(*files); // remove up until slash from the files - commonLength = lastSlashPos + 1; + const int commonLength = common.size() + 1; const QStringList::iterator end = files->end(); for (QStringList::iterator it = files->begin(); it != end; ++it) { it->remove(0, commonLength); diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 197237954c5d03943f8e3941092037bb51de0720..58db1e95025a23cbdb8ef0d0e39ef06a3ab5fa09 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -31,6 +31,8 @@ #include "ui_projectwizardpage.h" #include "projectnodes.h" +#include <utils/stringutils.h> + #include <QtCore/QDebug> #include <QtCore/QFileInfo> #include <QtCore/QTextStream> @@ -134,13 +136,21 @@ void ProjectWizardPage::setVCSDisplay(const QString &vcsName) void ProjectWizardPage::setFilesDisplay(const QStringList &files) { QString fileMessage; + const QString commonPath = Utils::commonPath(files); { QTextStream str(&fileMessage); - str << "<qt>" << tr("Files to be added:"); - str << "<pre>"; - const QStringList::const_iterator cend = files.constEnd(); - for (QStringList::const_iterator it = files.constBegin(); it != cend; ++it) - str << *it << '\n'; + str << "<qt>" + << (commonPath.isEmpty() ? tr("Files to be added:") : tr("Files to be added in")) + << "<pre>"; + if (commonPath.isEmpty()) { + foreach(const QString &f, files) + str << f << '\n'; + } else { + str << commonPath << ":\n\n"; + const int prefixSize = commonPath.size() + 1; + foreach(const QString &f, files) + str << f.right(f.size() - prefixSize) << '\n'; + } str << "</pre>"; } m_ui->filesLabel->setText(fileMessage); diff --git a/src/plugins/texteditor/fontsettingspage.cpp b/src/plugins/texteditor/fontsettingspage.cpp index de2bf702f0dfb0206c89e0691ff71158e8538197..5b165e9c78a53f157082c4985b28c10739b75dbd 100644 --- a/src/plugins/texteditor/fontsettingspage.cpp +++ b/src/plugins/texteditor/fontsettingspage.cpp @@ -35,7 +35,7 @@ #include "ui_fontsettingspage.h" #include <coreplugin/icore.h> -#include <utils/settingsutils.h> +#include <utils/stringutils.h> #include <utils/qtcassert.h> #include <QtCore/QDebug>