/*************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** ** Non-Open Source Usage ** ** Licensees may use this file in accordance with the Qt Beta Version ** License Agreement, Agreement version 2.2 provided with the Software or, ** alternatively, in accordance with the terms contained in a written ** agreement between you and Nokia. ** ** GNU General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the packaging ** of this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and ** http://www.gnu.org/copyleft/gpl.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt GPL Exception ** version 1.3, included in the file GPL_EXCEPTION.txt in this package. ** ***************************************************************************/ #include "qtscripteditor.h" #include "qtscripteditorconstants.h" #include "qtscripthighlighter.h" #include "qtscripteditorplugin.h" #include #include #include #include #include #include #include #include namespace QtScriptEditor { namespace Internal { ScriptEditorEditable::ScriptEditorEditable(ScriptEditor *editor, const QList& context) : BaseTextEditorEditable(editor), m_context(context) { } ScriptEditor::ScriptEditor(const Context &context, Core::ICore *core, TextEditor::TextEditorActionHandler *ah, QWidget *parent) : TextEditor::BaseTextEditor(parent), m_context(context), m_core(core), m_ah(ah) { setParenthesesMatchingEnabled(true); setMarksVisible(true); setCodeFoldingVisible(true); setMimeType(QtScriptEditor::Constants::C_QTSCRIPTEDITOR_MIMETYPE); baseTextDocument()->setSyntaxHighlighter(new QtScriptHighlighter); } ScriptEditor::~ScriptEditor() { } Core::IEditor *ScriptEditorEditable::duplicate(QWidget *parent) { return qobject_cast(editor())->duplicate(parent)->editableInterface(); } ScriptEditor *ScriptEditor::duplicate(QWidget *parent) { ScriptEditor *editor = new ScriptEditor(m_context, m_core, m_ah, parent); editor->duplicateFrom(this); QtScriptEditorPlugin::initializeEditor(editor); return editor; } const char *ScriptEditorEditable::kind() const { return QtScriptEditor::Constants::C_QTSCRIPTEDITOR; } ScriptEditor::Context ScriptEditorEditable::context() const { return m_context; } void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs) { TextEditor::BaseTextEditor::setFontSettings(fs); QtScriptHighlighter *highlighter = qobject_cast(baseTextDocument()->syntaxHighlighter()); if (!highlighter) return; static QVector categories; if (categories.isEmpty()) { categories << QLatin1String(TextEditor::Constants::C_NUMBER) << QLatin1String(TextEditor::Constants::C_STRING) << QLatin1String(TextEditor::Constants::C_TYPE) << QLatin1String(TextEditor::Constants::C_KEYWORD) << QLatin1String(TextEditor::Constants::C_PREPROCESSOR) << QLatin1String(TextEditor::Constants::C_LABEL) << QLatin1String(TextEditor::Constants::C_COMMENT); } highlighter->setFormats(fs.toTextCharFormats(categories)); highlighter->rehighlight(); } bool ScriptEditor::isElectricCharacter(const QChar &ch) const { if (ch == QLatin1Char('{') || ch == QLatin1Char('}')) return true; return false; } // Indent a code line based on previous template static void indentScriptBlock(const TextEditor::TabSettings &ts, const QTextBlock &block, const Iterator &programBegin, const Iterator &programEnd, QChar typedChar) { typedef typename SharedTools::Indenter Indenter ; Indenter &indenter = Indenter::instance(); indenter.setIndentSize(ts.m_tabSize); const TextEditor::TextBlockIterator current(block); const int indent = indenter.indentForBottomLine(current, programBegin, programEnd, typedChar); ts.indentLine(block, indent); } void ScriptEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar) { const TextEditor::TextBlockIterator begin(doc->begin()); const TextEditor::TextBlockIterator end(block.next()); indentScriptBlock(tabSettings(), block, begin, end, typedChar); } void ScriptEditor::contextMenuEvent(QContextMenuEvent *e) { QMenu *menu = createStandardContextMenu(); if (Core::IActionContainer *mcontext = m_core->actionManager()->actionContainer(QtScriptEditor::Constants::M_CONTEXT)) { QMenu *contextMenu = mcontext->menu(); foreach (QAction *action, contextMenu->actions()) menu->addAction(action); } menu->exec(e->globalPos()); delete menu; } } // namespace Internal } // namespace QtScriptEditor