Files
qt-creator/src/plugins/qtscripteditor/qtscripteditor.cpp

170 lines
5.6 KiB
C++
Raw Normal View History

2008-12-02 12:01:29 +01:00
/***************************************************************************
**
** This file is part of Qt Creator
**
2009-01-13 19:21:51 +01:00
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
2008-12-02 12:01:29 +01:00
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
**
** Non-Open Source Usage
**
2008-12-02 12:01:29 +01:00
** 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
**
2008-12-02 12:01:29 +01:00
** 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.
**
***************************************************************************/
2008-12-02 16:19:05 +01:00
2008-12-02 12:01:29 +01:00
#include "qtscripteditor.h"
#include "qtscripteditorconstants.h"
#include "qtscripthighlighter.h"
#include "qtscripteditorplugin.h"
#include <indenter.h>
#include <coreplugin/icore.h>
#include <coreplugin/actionmanager/actionmanager.h>
2008-12-02 12:01:29 +01:00
#include <texteditor/basetextdocument.h>
#include <texteditor/fontsettings.h>
#include <texteditor/textblockiterator.h>
#include <texteditor/texteditorconstants.h>
#include <QtGui/QMenu>
namespace QtScriptEditor {
namespace Internal {
ScriptEditorEditable::ScriptEditorEditable(ScriptEditor *editor, const QList<int>& context)
: BaseTextEditorEditable(editor), m_context(context)
{
}
ScriptEditor::ScriptEditor(const Context &context,
TextEditor::TextEditorActionHandler *ah,
QWidget *parent) :
TextEditor::BaseTextEditor(parent),
m_context(context),
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<ScriptEditor*>(editor())->duplicate(parent)->editableInterface();
}
ScriptEditor *ScriptEditor::duplicate(QWidget *parent)
{
ScriptEditor *editor = new ScriptEditor(m_context, m_ah, parent);
2008-12-02 12:01:29 +01:00
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<QtScriptHighlighter*>(baseTextDocument()->syntaxHighlighter());
if (!highlighter)
return;
static QVector<QString> 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 <class Iterator>
static void indentScriptBlock(const TextEditor::TabSettings &ts,
const QTextBlock &block,
const Iterator &programBegin,
const Iterator &programEnd,
QChar typedChar)
{
typedef typename SharedTools::Indenter<Iterator> 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::ActionContainer *mcontext = Core::ICore::instance()->actionManager()->actionContainer(QtScriptEditor::Constants::M_CONTEXT)) {
2008-12-02 12:01:29 +01:00
QMenu *contextMenu = mcontext->menu();
2008-12-09 11:07:24 +01:00
foreach (QAction *action, contextMenu->actions())
2008-12-02 12:01:29 +01:00
menu->addAction(action);
}
menu->exec(e->globalPos());
delete menu;
}
} // namespace Internal
} // namespace QtScriptEditor