Simplify Qt external editors (Linguist, Designer)

Remove unneeded extra classes, and unneeded parameters.

Change-Id: Ib4ceccd7d92bd8ca5de122e174f2579a2a8a9390
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Eike Ziller
2016-09-28 15:43:13 +02:00
parent 2f9a721fbf
commit 2cb3beab42
3 changed files with 76 additions and 106 deletions

View File

@@ -61,27 +61,32 @@ static inline QString msgAppNotFound(const QString &id)
}
// -- Commands and helpers
static QString linguistBinary()
static QString linguistBinary(const QtSupport::BaseQtVersion *qtVersion)
{
if (qtVersion)
return qtVersion->linguistCommand();
return QLatin1String(Utils::HostOsInfo::isMacHost() ? "Linguist" : "linguist");
}
static QString designerBinary()
static QString designerBinary(const QtSupport::BaseQtVersion *qtVersion)
{
if (qtVersion)
return qtVersion->designerCommand();
return QLatin1String(Utils::HostOsInfo::isMacHost() ? "Designer" : "designer");
}
// Mac: Change the call 'Foo.app/Contents/MacOS/Foo <filelist>' to
// 'open -a Foo.app <filelist>'. doesn't support generic command line arguments
static void createMacOpenCommand(QString *binary, QStringList *arguments)
static ExternalQtEditor::LaunchData createMacOpenCommand(const ExternalQtEditor::LaunchData &data)
{
const int appFolderIndex = binary->lastIndexOf(QLatin1String("/Contents/MacOS/"));
ExternalQtEditor::LaunchData openData = data;
const int appFolderIndex = data.binary.lastIndexOf(QLatin1String("/Contents/MacOS/"));
if (appFolderIndex != -1) {
binary->truncate(appFolderIndex);
arguments->push_front(*binary);
arguments->push_front(QLatin1String("-a"));
*binary = QLatin1String("open");
openData.binary = "open";
openData.arguments = QStringList({ QString("-a"), data.binary.left(appFolderIndex) })
+ data.arguments;
}
return openData;
}
static const char designerIdC[] = "Qt.Designer";
@@ -94,14 +99,34 @@ static const char linguistDisplayName[] = QT_TRANSLATE_NOOP("OpenWith::Editors",
ExternalQtEditor::ExternalQtEditor(Core::Id id,
const QString &displayName,
const QString &mimetype,
QObject *parent) :
Core::IExternalEditor(parent),
const CommandForQtVersion &commandForQtVersion) :
m_mimeTypes(mimetype),
m_id(id),
m_displayName(displayName)
m_displayName(displayName),
m_commandForQtVersion(commandForQtVersion)
{
}
ExternalQtEditor *ExternalQtEditor::createLinguistEditor()
{
return new ExternalQtEditor(linguistIdC,
QLatin1String(linguistDisplayName),
QLatin1String(ProjectExplorer::Constants::LINGUIST_MIMETYPE),
linguistBinary);
}
ExternalQtEditor *ExternalQtEditor::createDesignerEditor()
{
if (Utils::HostOsInfo::isMacHost()) {
return new ExternalQtEditor(designerIdC,
QLatin1String(designerDisplayName),
QLatin1String(ProjectExplorer::Constants::FORM_MIMETYPE),
designerBinary);
} else {
return new DesignerExternalEditor;
}
}
QStringList ExternalQtEditor::mimeTypes() const
{
return m_mimeTypes;
@@ -118,41 +143,43 @@ QString ExternalQtEditor::displayName() const
}
bool ExternalQtEditor::getEditorLaunchData(const QString &fileName,
QtVersionCommandAccessor commandAccessor,
const QString &fallbackBinary,
const QStringList &additionalArguments,
bool useMacOpenCommand,
EditorLaunchData *data,
LaunchData *data,
QString *errorMessage) const
{
// Get the binary either from the current Qt version of the project or Path
if (Project *project = SessionManager::projectForFile(Utils::FileName::fromString(fileName))) {
if (const Target *target = project->activeTarget()) {
if (const QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(target->kit())) {
data->binary = (qtVersion->*commandAccessor)();
data->binary = m_commandForQtVersion(qtVersion);
data->workingDirectory = project->projectDirectory().toString();
}
}
}
if (data->binary.isEmpty()) {
data->workingDirectory.clear();
data->binary = Utils::SynchronousProcess::locateBinary(fallbackBinary);
data->binary = Utils::SynchronousProcess::locateBinary(m_commandForQtVersion(nullptr));
}
if (data->binary.isEmpty()) {
*errorMessage = msgAppNotFound(id().toString());
return false;
}
// Setup binary + arguments, use Mac Open if appropriate
data->arguments = additionalArguments;
data->arguments.push_back(fileName);
if (Utils::HostOsInfo::isMacHost() && useMacOpenCommand)
createMacOpenCommand(&(data->binary), &(data->arguments));
if (Utils::HostOsInfo::isMacHost())
*data = createMacOpenCommand(*data);
if (debug)
qDebug() << Q_FUNC_INFO << '\n' << data->binary << data->arguments;
return true;
}
bool ExternalQtEditor::startEditorProcess(const EditorLaunchData &data, QString *errorMessage)
bool ExternalQtEditor::startEditor(const QString &fileName, QString *errorMessage)
{
LaunchData data;
return getEditorLaunchData(fileName, &data, errorMessage)
&& startEditorProcess(data, errorMessage);
}
bool ExternalQtEditor::startEditorProcess(const LaunchData &data, QString *errorMessage)
{
if (debug)
qDebug() << Q_FUNC_INFO << '\n' << data.binary << data.arguments << data.workingDirectory;
@@ -164,47 +191,12 @@ bool ExternalQtEditor::startEditorProcess(const EditorLaunchData &data, QString
return true;
}
// --------------- LinguistExternalEditor
LinguistExternalEditor::LinguistExternalEditor(QObject *parent) :
ExternalQtEditor(linguistIdC,
QLatin1String(linguistDisplayName),
QLatin1String(ProjectExplorer::Constants::LINGUIST_MIMETYPE),
parent)
{
}
bool LinguistExternalEditor::startEditor(const QString &fileName, QString *errorMessage)
{
EditorLaunchData data;
return getEditorLaunchData(fileName, &QtSupport::BaseQtVersion::linguistCommand,
linguistBinary(), QStringList(), true, &data, errorMessage)
&& startEditorProcess(data, errorMessage);
}
// --------------- MacDesignerExternalEditor, using Mac 'open'
MacDesignerExternalEditor::MacDesignerExternalEditor(QObject *parent) :
ExternalQtEditor(designerIdC,
QLatin1String(designerDisplayName),
QLatin1String(ProjectExplorer::Constants::FORM_MIMETYPE),
parent)
{
}
bool MacDesignerExternalEditor::startEditor(const QString &fileName, QString *errorMessage)
{
EditorLaunchData data;
return getEditorLaunchData(fileName, &QtSupport::BaseQtVersion::designerCommand,
designerBinary(), QStringList(), true, &data, errorMessage)
&& startEditorProcess(data, errorMessage);
return false;
}
// --------------- DesignerExternalEditor with Designer Tcp remote control.
DesignerExternalEditor::DesignerExternalEditor(QObject *parent) :
DesignerExternalEditor::DesignerExternalEditor() :
ExternalQtEditor(designerIdC,
QLatin1String(designerDisplayName),
QLatin1String(Designer::Constants::FORM_MIMETYPE),
parent)
designerBinary)
{
}
@@ -225,10 +217,9 @@ void DesignerExternalEditor::processTerminated(const QString &binary)
bool DesignerExternalEditor::startEditor(const QString &fileName, QString *errorMessage)
{
EditorLaunchData data;
LaunchData data;
// Find the editor binary
if (!getEditorLaunchData(fileName, &QtSupport::BaseQtVersion::designerCommand,
designerBinary(), QStringList(), false, &data, errorMessage)) {
if (!getEditorLaunchData(fileName, &data, errorMessage)) {
return false;
}
// Known one?

View File

@@ -52,64 +52,46 @@ class ExternalQtEditor : public Core::IExternalEditor
Q_OBJECT
public:
virtual QStringList mimeTypes() const;
virtual Core::Id id() const;
virtual QString displayName() const;
static ExternalQtEditor *createLinguistEditor();
static ExternalQtEditor *createDesignerEditor();
protected:
// Member function pointer for a QtVersion function return a string (command)
typedef QString (QtSupport::BaseQtVersion::*QtVersionCommandAccessor)() const;
QStringList mimeTypes() const override;
Core::Id id() const override;
QString displayName() const override;
bool startEditor(const QString &fileName, QString *errorMessage) override;
// Data required to launch the editor
struct EditorLaunchData {
struct LaunchData {
QString binary;
QStringList arguments;
QString workingDirectory;
};
explicit ExternalQtEditor(Core::Id id,
const QString &displayName,
const QString &mimetype,
QObject *parent = 0);
protected:
// Member function pointer for a QtVersion function return a string (command)
using CommandForQtVersion = std::function<QString(const QtSupport::BaseQtVersion *)>;
ExternalQtEditor(Core::Id id,
const QString &displayName,
const QString &mimetype,
const CommandForQtVersion &commandForQtVersion);
// Try to retrieve the binary of the editor from the Qt version,
// prepare arguments accordingly (Mac "open" if desired)
bool getEditorLaunchData(const QString &fileName,
QtVersionCommandAccessor commandAccessor,
const QString &fallbackBinary,
const QStringList &additionalArguments,
bool useMacOpenCommand,
EditorLaunchData *data,
LaunchData *data,
QString *errorMessage) const;
// Create and start a detached GUI process executing in the background.
// Set the project environment if there is one.
bool startEditorProcess(const EditorLaunchData &data, QString *errorMessage);
bool startEditorProcess(const LaunchData &data, QString *errorMessage);
private:
const QStringList m_mimeTypes;
const Core::Id m_id;
const QString m_displayName;
};
// Qt Linguist
class LinguistExternalEditor : public ExternalQtEditor
{
Q_OBJECT
public:
explicit LinguistExternalEditor(QObject *parent = 0);
virtual bool startEditor(const QString &fileName, QString *errorMessage);
};
// Qt Designer on Mac: Make use of the Mac's 'open' mechanism to
// ensure files are opened in the same (per version) instance.
class MacDesignerExternalEditor : public ExternalQtEditor
{
Q_OBJECT
public:
explicit MacDesignerExternalEditor(QObject *parent = 0);
virtual bool startEditor(const QString &fileName, QString *errorMessage);
const CommandForQtVersion m_commandForQtVersion;
};
/* Qt Designer on the remaining platforms: Uses Designer's own
@@ -120,9 +102,9 @@ class DesignerExternalEditor : public ExternalQtEditor
{
Q_OBJECT
public:
explicit DesignerExternalEditor(QObject *parent = 0);
DesignerExternalEditor();
virtual bool startEditor(const QString &fileName, QString *errorMessage);
bool startEditor(const QString &fileName, QString *errorMessage) override;
private:
void processTerminated(const QString &binary);

View File

@@ -111,11 +111,8 @@ bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString
addAutoReleasedObject(new QmakeBuildConfigurationFactory);
addAutoReleasedObject(new DesktopQmakeRunConfigurationFactory);
if (Utils::HostOsInfo::isMacHost())
addAutoReleasedObject(new MacDesignerExternalEditor);
else
addAutoReleasedObject(new DesignerExternalEditor);
addAutoReleasedObject(new LinguistExternalEditor);
addAutoReleasedObject(ExternalQtEditor::createDesignerEditor());
addAutoReleasedObject(ExternalQtEditor::createLinguistEditor());
addAutoReleasedObject(new ProFileEditorFactory);