/**************************************************************************** ** ** Copyright (C) 2016 Lorenz Haas ** Contact: https://www.qt.io/licensing/ ** ** 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 ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #include "beautifierplugin.h" #include "beautifierconstants.h" #include "generaloptionspage.h" #include "generalsettings.h" #include "artisticstyle/artisticstyle.h" #include "clangformat/clangformat.h" #include "uncrustify/uncrustify.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace TextEditor; namespace Beautifier { namespace Internal { bool isAutoFormatApplicable(const Core::IDocument *document, const QList &allowedMimeTypes) { if (!document) return false; if (allowedMimeTypes.isEmpty()) return true; const Utils::MimeType documentMimeType = Utils::mimeTypeForName(document->mimeType()); return Utils::anyOf(allowedMimeTypes, [&documentMimeType](const Utils::MimeType &mime) { return documentMimeType.inherits(mime.name()); }); } class BeautifierPluginPrivate : public QObject { public: BeautifierPluginPrivate(); void updateActions(Core::IEditor *editor = nullptr); void autoFormatOnSave(Core::IDocument *document); QSharedPointer m_generalSettings; ArtisticStyle::ArtisticStyle artisticStyleBeautifier; ClangFormat::ClangFormat clangFormatBeautifier; Uncrustify::Uncrustify uncrustifyBeautifier; QList m_tools; }; static BeautifierPluginPrivate *dd = nullptr; bool BeautifierPlugin::initialize(const QStringList &arguments, QString *errorString) { Q_UNUSED(arguments) Q_UNUSED(errorString) Core::ActionContainer *menu = Core::ActionManager::createMenu(Constants::MENU_ID); menu->menu()->setTitle(QCoreApplication::translate("Beautifier", "Bea&utifier")); menu->setOnAllDisabledBehavior(Core::ActionContainer::Show); Core::ActionManager::actionContainer(Core::Constants::M_TOOLS)->addMenu(menu); return true; } void BeautifierPlugin::extensionsInitialized() { dd = new BeautifierPluginPrivate; } BeautifierPluginPrivate::BeautifierPluginPrivate() : m_tools({&artisticStyleBeautifier, &uncrustifyBeautifier, &clangFormatBeautifier}) { QStringList toolIds; toolIds.reserve(m_tools.count()); for (BeautifierAbstractTool *tool : m_tools) toolIds << tool->id(); m_generalSettings.reset(new GeneralSettings); new GeneralOptionsPage(m_generalSettings, toolIds, this); updateActions(); const Core::EditorManager *editorManager = Core::EditorManager::instance(); connect(editorManager, &Core::EditorManager::currentEditorChanged, this, &BeautifierPluginPrivate::updateActions); connect(editorManager, &Core::EditorManager::aboutToSave, this, &BeautifierPluginPrivate::autoFormatOnSave); } void BeautifierPluginPrivate::updateActions(Core::IEditor *editor) { for (BeautifierAbstractTool *tool : m_tools) tool->updateActions(editor); } void BeautifierPluginPrivate::autoFormatOnSave(Core::IDocument *document) { if (!m_generalSettings->autoFormatOnSave()) return; if (!isAutoFormatApplicable(document, m_generalSettings->autoFormatMime())) return; // Check if file is contained in the current project (if wished) if (m_generalSettings->autoFormatOnlyCurrentProject()) { const ProjectExplorer::Project *pro = ProjectExplorer::ProjectTree::currentProject(); if (!pro || !pro->files(ProjectExplorer::Project::SourceFiles).contains(document->filePath())) { return; } } // Find tool to use by id and format file! const QString id = m_generalSettings->autoFormatTool(); auto tool = std::find_if(m_tools.constBegin(), m_tools.constEnd(), [&id](const BeautifierAbstractTool *t){return t->id() == id;}); if (tool != m_tools.constEnd()) { if (!(*tool)->isApplicable(document)) return; const TextEditor::Command command = (*tool)->command(); if (!command.isValid()) return; const QList editors = Core::DocumentModel::editorsForDocument(document); if (editors.isEmpty()) return; if (auto widget = qobject_cast(editors.first()->widget())) TextEditor::formatEditor(widget, command); } } void BeautifierPlugin::showError(const QString &error) { Core::MessageManager::write(tr("Error in Beautifier: %1").arg(error.trimmed())); } QString BeautifierPlugin::msgCannotGetConfigurationFile(const QString &command) { return tr("Cannot get configuration file for %1.").arg(command); } QString BeautifierPlugin::msgFormatCurrentFile() { //: Menu entry return tr("Format &Current File"); } QString BeautifierPlugin::msgFormatSelectedText() { //: Menu entry return tr("Format &Selected Text"); } QString BeautifierPlugin::msgFormatAtCursor() { //: Menu entry return tr("&Format at Cursor"); } QString BeautifierPlugin::msgDisableFormattingSelectedText() { //: Menu entry return tr("&Disable Formatting for Selected Text"); } QString BeautifierPlugin::msgCommandPromptDialogTitle(const QString &command) { //: File dialog title for path chooser when choosing binary return tr("%1 Command").arg(command); } } // namespace Internal } // namespace Beautifier