diff options
author | Sergey Shambir <sergey.shambir.auto@gmail.com> | 2013-01-14 23:11:10 +0400 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2013-02-07 10:17:09 +0100 |
commit | 04b9d7614e1fb6d657fca83d557b9efd5a62e141 (patch) | |
tree | 5975f3fa7404688d5c1a88213ee5175f7ee90573 /src/plugins/pythoneditor/pythoneditorplugin.cpp | |
parent | e5b304c80866ee2b2161f0d359fc9d3dcab609c1 (diff) | |
download | qt-creator-04b9d7614e1fb6d657fca83d557b9efd5a62e141.tar.gz |
Added PythonEditor plugin
Contains lexical highlighter, indenter and file wizard.
Icon loaded from theme, if possible.
Class wizard will be added later since it needs to extend libUtils.
Change-Id: If723867c01e9be83371424e406d116805c88c2b0
Reviewed-by: hjk <hjk121@nokiamail.com>
Diffstat (limited to 'src/plugins/pythoneditor/pythoneditorplugin.cpp')
-rw-r--r-- | src/plugins/pythoneditor/pythoneditorplugin.cpp | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp new file mode 100644 index 0000000000..893fac076d --- /dev/null +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -0,0 +1,286 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "pythoneditorplugin.h" +#include "pythoneditorconstants.h" +#include "wizard/pythonfilewizard.h" +#include "pythoneditorwidget.h" +#include "pythoneditorfactory.h" + +#include <coreplugin/icore.h> +#include <coreplugin/coreconstants.h> +#include <coreplugin/mimedatabase.h> +#include <coreplugin/fileiconprovider.h> +#include <coreplugin/id.h> +#include <coreplugin/editormanager/editormanager.h> +#include <extensionsystem/pluginmanager.h> +#include <texteditor/texteditorconstants.h> +#include <texteditor/texteditorsettings.h> + +#include <QtPlugin> +#include <QCoreApplication> + +using namespace PythonEditor::Constants; + +/******************************************************************************* + * List of Python keywords (includes "print" that isn't keyword in python 3 + ******************************************************************************/ +static const char *const LIST_OF_PYTHON_KEYWORDS[] = { + "and", + "as", + "assert", + "break", + "class", + "continue", + "def", + "del", + "elif", + "else", + "except", + "exec", + "finally", + "for", + "from", + "global", + "if", + "import", + "in", + "is", + "lambda", + "not", + "or", + "pass", + "print", + "raise", + "return", + "try", + "while", + "with", + "yield" +}; + +/******************************************************************************* + * List of Python magic methods and attributes + ******************************************************************************/ +static const char *const LIST_OF_PYTHON_MAGICS[] = { + // ctor & dtor + "__init__", + "__del__", + // string conversion functions + "__str__", + "__repr__", + "__unicode__", + // attribute access functions + "__setattr__", + "__getattr__", + "__delattr__", + // binary operators + "__add__", + "__sub__", + "__mul__", + "__truediv__", + "__floordiv__", + "__mod__", + "__pow__", + "__and__", + "__or__", + "__xor__", + "__eq__", + "__ne__", + "__gt__", + "__lt__", + "__ge__", + "__le__", + "__lshift__", + "__rshift__", + "__contains__", + // unary operators + "__pos__", + "__neg__", + "__inv__", + "__abs__", + "__len__", + // item operators like [] + "__getitem__", + "__setitem__", + "__delitem__", + "__getslice__", + "__setslice__", + "__delslice__", + // other functions + "__cmp__", + "__hash__", + "__nonzero__", + "__call__", + "__iter__", + "__reversed__", + "__divmod__", + "__int__", + "__long__", + "__float__", + "__complex__", + "__hex__", + "__oct__", + "__index__", + "__copy__", + "__deepcopy__", + "__sizeof__", + "__trunc__", + "__format__", + // magic attributes + "__name__", + "__module__", + "__dict__", + "__bases__", + "__doc__" +}; + +/******************************************************************************* + * List of python built-in functions and objects + ******************************************************************************/ +static const char *const LIST_OF_PYTHON_BUILTINS[] = { + "range", + "xrange", + "int", + "float", + "long", + "hex", + "oct" + "chr", + "ord", + "len", + "abs", + "None", + "True", + "False" +}; + +namespace PythonEditor { + +PythonEditorPlugin *PythonEditorPlugin::m_instance = 0; + +/// Copies identifiers from array to QSet +static void copyIdentifiers(const char * const words[], size_t bytesCount, QSet<QString> &result) +{ + const size_t count = bytesCount / sizeof(const char * const); + for (size_t i = 0; i < count; ++i) + result.insert(QLatin1String(words[i])); +} + +PythonEditorPlugin::PythonEditorPlugin() + : m_factory(0) + , m_actionHandler(0) +{ + m_instance = this; + copyIdentifiers(LIST_OF_PYTHON_KEYWORDS, sizeof(LIST_OF_PYTHON_KEYWORDS), m_keywords); + copyIdentifiers(LIST_OF_PYTHON_MAGICS, sizeof(LIST_OF_PYTHON_MAGICS), m_magics); + copyIdentifiers(LIST_OF_PYTHON_BUILTINS, sizeof(LIST_OF_PYTHON_BUILTINS), m_builtins); +} + +PythonEditorPlugin::~PythonEditorPlugin() +{ + removeObject(m_factory); + m_instance = 0; +} + +bool PythonEditorPlugin::initialize( + const QStringList &arguments, QString *errorMessage) +{ + Q_UNUSED(arguments) + + Core::ICore *pCore = Core::ICore::instance(); + + if (! pCore->mimeDatabase()->addMimeTypes( + QLatin1String(RC_PY_MIME_XML), + errorMessage)) + { + return false; + } + + m_factory = new EditorFactory(this); + addObject(m_factory); + + //////////////////////////////////////////////////////////////////////////// + // Initialize editor actions handler + //////////////////////////////////////////////////////////////////////////// + m_actionHandler.reset(new TextEditor::TextEditorActionHandler( + C_PYTHONEDITOR_ID, + TextEditor::TextEditorActionHandler::Format + | TextEditor::TextEditorActionHandler::UnCommentSelection + | TextEditor::TextEditorActionHandler::UnCollapseAll)); + m_actionHandler->initializeActions(); + + //////////////////////////////////////////////////////////////////////////// + // Add MIME overlay icons (these icons displayed at Project dock panel) + //////////////////////////////////////////////////////////////////////////// + const QIcon icon = QIcon::fromTheme(QLatin1String(C_PY_MIME_ICON)); + if (!icon.isNull()) { + Core::FileIconProvider *iconProv = Core::FileIconProvider::instance(); + Core::MimeDatabase *mimeDB = Core::ICore::instance()->mimeDatabase(); + iconProv->registerIconOverlayForMimeType( + icon, mimeDB->findByType(QLatin1String(C_PY_MIMETYPE))); + } + + //////////////////////////////////////////////////////////////////////////// + // Add Python files and classes creation dialogs + //////////////////////////////////////////////////////////////////////////// + addAutoReleasedObject(new FileWizard(Core::ICore::instance())); + + return true; +} + +void PythonEditorPlugin::extensionsInitialized() +{ +} + +void PythonEditorPlugin::initializeEditor(EditorWidget *widget) +{ + instance()->m_actionHandler->setupActions(widget); + TextEditor::TextEditorSettings::instance()->initializeEditor(widget); +} + +QSet<QString> PythonEditorPlugin::keywords() +{ + return instance()->m_keywords; +} + +QSet<QString> PythonEditorPlugin::magics() +{ + return instance()->m_magics; +} + +QSet<QString> PythonEditorPlugin::builtins() +{ + return instance()->m_builtins; +} + +} // namespace PythonEditor + +Q_EXPORT_PLUGIN(PythonEditor::PythonEditorPlugin) + |