diff --git a/src/libs/utils/uncommentselection.cpp b/src/libs/utils/uncommentselection.cpp index c6e4b624b0d81cf58a0b8eee14742c8066be9553..facae876716f8d903673d0b1aaee34ecbc6e501e 100644 --- a/src/libs/utils/uncommentselection.cpp +++ b/src/libs/utils/uncommentselection.cpp @@ -28,13 +28,92 @@ **************************************************************************/ #include "uncommentselection.h" +#include <QtCore/QtGlobal> #include <QtGui/QPlainTextEdit> #include <QtGui/QTextCursor> #include <QtGui/QTextBlock> #include <QtGui/QTextDocument> -void Utils::unCommentSelection(QPlainTextEdit *edit) +using namespace Utils; + +CommentDefinition::CommentDefinition() : + m_afterWhiteSpaces(false), + m_singleLine(QLatin1String("//")), + m_multiLineStart(QLatin1String("/*")), + m_multiLineEnd(QLatin1String("*/")) +{} + +CommentDefinition &CommentDefinition::setAfterWhiteSpaces(const bool afterWhiteSpaces) +{ + m_afterWhiteSpaces = afterWhiteSpaces; + return *this; +} + +CommentDefinition &CommentDefinition::setSingleLine(const QString &singleLine) +{ + m_singleLine = singleLine; + return *this; +} + +CommentDefinition &CommentDefinition::setMultiLineStart(const QString &multiLineStart) +{ + m_multiLineStart = multiLineStart; + return *this; +} + +CommentDefinition &CommentDefinition::setMultiLineEnd(const QString &multiLineEnd) +{ + m_multiLineEnd = multiLineEnd; + return *this; +} + +bool CommentDefinition::isAfterWhiteSpaces() const +{ return m_afterWhiteSpaces; } + +const QString &CommentDefinition::singleLine() const +{ return m_singleLine; } + +const QString &CommentDefinition::multiLineStart() const +{ return m_multiLineStart; } + +const QString &CommentDefinition::multiLineEnd() const +{ return m_multiLineEnd; } + +bool CommentDefinition::hasSingleLineStyle() const +{ return !m_singleLine.isEmpty(); } + +bool CommentDefinition::hasMultiLineStyle() const +{ return !m_multiLineStart.isEmpty() && !m_multiLineEnd.isEmpty(); } + +namespace { + +bool isComment(const QString &text, + int index, + const CommentDefinition &definition, + const QString & (CommentDefinition::* comment) () const) +{ + const QString &commentType = ((definition).*(comment))(); + const int length = commentType.length(); + + Q_ASSERT(text.length() - index >= length); + + int i = 0; + while (i < length) { + if (text.at(index + i) != commentType.at(i)) + return false; + ++i; + } + return true; +} + +} // namespace anynomous + + +void Utils::unCommentSelection(QPlainTextEdit *edit, const CommentDefinition &definition) { + if (!definition.hasSingleLineStyle() && !definition.hasMultiLineStyle()) + return; + QTextCursor cursor = edit->textCursor(); QTextDocument *doc = cursor.document(); cursor.beginEditBlock(); @@ -53,78 +132,107 @@ void Utils::unCommentSelection(QPlainTextEdit *edit) endBlock = endBlock.previous(); } - bool doCStyleUncomment = false; - bool doCStyleComment = false; - bool doCppStyleUncomment = false; + bool doMultiLineStyleUncomment = false; + bool doMultiLineStyleComment = false; + bool doSingleLineStyleUncomment = false; bool hasSelection = cursor.hasSelection(); - if (hasSelection) { + if (hasSelection && definition.hasMultiLineStyle()) { + QString startText = startBlock.text(); int startPos = start - startBlock.position(); + const int multiLineStartLength = definition.multiLineStart().length(); bool hasLeadingCharacters = !startText.left(startPos).trimmed().isEmpty(); - if ((startPos >= 2 - && startText.at(startPos-2) == QLatin1Char('/') - && startText.at(startPos-1) == QLatin1Char('*'))) { - startPos -= 2; - start -= 2; - } - bool hasSelStart = (startPos < startText.length() - 1 - && startText.at(startPos) == QLatin1Char('/') - && startText.at(startPos+1) == QLatin1Char('*')); + if (startPos >= multiLineStartLength + && isComment(startText, + startPos - multiLineStartLength, + definition, + &CommentDefinition::multiLineStart)) { + startPos -= multiLineStartLength; + start -= multiLineStartLength; + } + bool hasSelStart = (startPos < startText.length() - multiLineStartLength + && isComment(startText, + startPos, + definition, + &CommentDefinition::multiLineStart)); QString endText = endBlock.text(); int endPos = end - endBlock.position(); - bool hasTrailingCharacters = !endText.left(endPos).remove(QLatin1String("//")).trimmed().isEmpty() - && !endText.mid(endPos).trimmed().isEmpty(); - if ((endPos <= endText.length() - 2 - && endText.at(endPos) == QLatin1Char('*') - && endText.at(endPos+1) == QLatin1Char('/'))) { - endPos += 2; - end += 2; + const int multiLineEndLength = definition.multiLineEnd().length(); + bool hasTrailingCharacters = + !endText.left(endPos).remove(definition.singleLine()).trimmed().isEmpty() + && !endText.mid(endPos).trimmed().isEmpty(); + + if (endPos <= endText.length() - multiLineEndLength + && isComment(endText, endPos, definition, &CommentDefinition::multiLineEnd)) { + endPos += multiLineEndLength; + end += multiLineEndLength; } - bool hasSelEnd = (endPos >= 2 - && endText.at(endPos-2) == QLatin1Char('*') - && endText.at(endPos-1) == QLatin1Char('/')); + bool hasSelEnd = (endPos >= multiLineEndLength + && isComment(endText, + endPos - multiLineEndLength, + definition, + &CommentDefinition::multiLineEnd)); - doCStyleUncomment = hasSelStart && hasSelEnd; - doCStyleComment = !doCStyleUncomment && (hasLeadingCharacters || hasTrailingCharacters); + doMultiLineStyleUncomment = hasSelStart && hasSelEnd; + doMultiLineStyleComment = !doMultiLineStyleUncomment + && (hasLeadingCharacters + || hasTrailingCharacters + || !definition.hasSingleLineStyle()); + } else if (!hasSelection && !definition.hasSingleLineStyle()) { + + QString text = startBlock.text().trimmed(); + doMultiLineStyleUncomment = text.startsWith(definition.multiLineStart()) + && text.endsWith(definition.multiLineEnd()); + doMultiLineStyleComment = !doMultiLineStyleUncomment && !text.isEmpty(); + + start = startBlock.position(); + end = endBlock.position() + endBlock.length() - 1; } - if (doCStyleUncomment) { + if (doMultiLineStyleUncomment) { cursor.setPosition(end); - cursor.movePosition(QTextCursor::PreviousCharacter, QTextCursor::KeepAnchor, 2); + cursor.movePosition(QTextCursor::PreviousCharacter, + QTextCursor::KeepAnchor, + definition.multiLineEnd().length()); cursor.removeSelectedText(); cursor.setPosition(start); - cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, 2); + cursor.movePosition(QTextCursor::NextCharacter, + QTextCursor::KeepAnchor, + definition.multiLineStart().length()); cursor.removeSelectedText(); - } else if (doCStyleComment) { + } else if (doMultiLineStyleComment) { cursor.setPosition(end); - cursor.insertText(QLatin1String("*/")); + cursor.insertText(definition.multiLineEnd()); cursor.setPosition(start); - cursor.insertText(QLatin1String("/*")); + cursor.insertText(definition.multiLineStart()); } else { endBlock = endBlock.next(); - doCppStyleUncomment = true; + doSingleLineStyleUncomment = true; for (QTextBlock block = startBlock; block != endBlock; block = block.next()) { QString text = block.text().trimmed(); - if (!text.isEmpty() && !text.startsWith(QLatin1String("//"))) { - doCppStyleUncomment = false; + if (!text.isEmpty() && !text.startsWith(definition.singleLine())) { + doSingleLineStyleUncomment = false; break; } } + + const int singleLineLength = definition.singleLine().length(); for (QTextBlock block = startBlock; block != endBlock; block = block.next()) { - if (doCppStyleUncomment) { + if (doSingleLineStyleUncomment) { QString text = block.text(); int i = 0; - while (i < text.size() - 1) { - if (text.at(i) == QLatin1Char('/') - && text.at(i + 1) == QLatin1Char('/')) { + while (i <= text.size() - singleLineLength) { + if (isComment(text, i, definition, &CommentDefinition::singleLine)) { cursor.setPosition(block.position() + i); - cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, 2); + cursor.movePosition(QTextCursor::NextCharacter, + QTextCursor::KeepAnchor, + singleLineLength); cursor.removeSelectedText(); break; } @@ -136,8 +244,11 @@ void Utils::unCommentSelection(QPlainTextEdit *edit) QString text = block.text(); foreach(QChar c, text) { if (!c.isSpace()) { - cursor.setPosition(block.position()); - cursor.insertText(QLatin1String("//")); + if (definition.isAfterWhiteSpaces()) + cursor.setPosition(block.position() + text.indexOf(c)); + else + cursor.setPosition(block.position()); + cursor.insertText(definition.singleLine()); break; } } @@ -146,10 +257,10 @@ void Utils::unCommentSelection(QPlainTextEdit *edit) } // adjust selection when commenting out - if (hasSelection && !doCStyleUncomment && !doCppStyleUncomment) { + if (hasSelection && !doMultiLineStyleUncomment && !doSingleLineStyleUncomment) { cursor = edit->textCursor(); - if (!doCStyleComment) - start = startBlock.position(); // move the double slashes into the selection + if (!doMultiLineStyleComment) + start = startBlock.position(); // move the comment into the selection int lastSelPos = anchorIsStart ? cursor.position() : cursor.anchor(); if (anchorIsStart) { cursor.setPosition(start); @@ -163,4 +274,3 @@ void Utils::unCommentSelection(QPlainTextEdit *edit) cursor.endEditBlock(); } - diff --git a/src/libs/utils/uncommentselection.h b/src/libs/utils/uncommentselection.h index 4a4a666767b4bdc1ffd8e24d43d9146a23275e35..a984d512b32a17175f9e5ac7c0663b8e247b6de4 100644 --- a/src/libs/utils/uncommentselection.h +++ b/src/libs/utils/uncommentselection.h @@ -32,13 +32,42 @@ #include "utils_global.h" +#include <QtCore/QString> + QT_BEGIN_NAMESPACE class QPlainTextEdit; QT_END_NAMESPACE namespace Utils { -QTCREATOR_UTILS_EXPORT void unCommentSelection(QPlainTextEdit *edit); +class QTCREATOR_UTILS_EXPORT CommentDefinition +{ +public: + CommentDefinition(); + + CommentDefinition &setAfterWhiteSpaces(const bool); + CommentDefinition &setSingleLine(const QString &singleLine); + CommentDefinition &setMultiLineStart(const QString &multiLineStart); + CommentDefinition &setMultiLineEnd(const QString &multiLineEnd); + + bool isAfterWhiteSpaces() const; + const QString &singleLine() const; + const QString &multiLineStart() const; + const QString &multiLineEnd() const; + + bool hasSingleLineStyle() const; + bool hasMultiLineStyle() const; + +private: + bool m_afterWhiteSpaces; + QString m_singleLine; + QString m_multiLineStart; + QString m_multiLineEnd; +}; + +QTCREATOR_UTILS_EXPORT +void unCommentSelection(QPlainTextEdit *edit, + const CommentDefinition &definiton = CommentDefinition()); } // end of namespace Utils diff --git a/src/plugins/genericeditor/editor.cpp b/src/plugins/genericeditor/editor.cpp index 18a13c79039288fdd540cf49ef437c1fc3f9f5fa..1d50eb1ec3dec2105e7efaf58a2076af36f7ef8f 100644 --- a/src/plugins/genericeditor/editor.cpp +++ b/src/plugins/genericeditor/editor.cpp @@ -43,9 +43,50 @@ #include <QtCore/QSharedPointer> #include <QtCore/QFileInfo> +#include <QDebug> + using namespace GenericEditor; using namespace Internal; +Editor::Editor(QWidget *parent) : TextEditor::BaseTextEditor(parent) +{ + connect(file(), SIGNAL(changed()), this, SLOT(configure())); +} + +void Editor::unCommentSelection() +{ + Utils::unCommentSelection(this, m_commentDefinition); +} + +TextEditor::BaseTextEditorEditable *Editor::createEditableInterface() +{ + EditorEditable *editable = new EditorEditable(this); + return editable; +} + +void Editor::configure() +{ + const QString &mimeType = Core::ICore::instance()->mimeDatabase()->findByFile( + QFileInfo(file()->fileName())).type(); + baseTextDocument()->setMimeType(mimeType); + + try { + const QString &definitionId = + GenericEditorPlugin::instance()->definitionIdByMimeType(mimeType); + QSharedPointer<HighlightDefinition> definition = + GenericEditorPlugin::instance()->definition(definitionId); + + baseTextDocument()->setSyntaxHighlighter(new Highlighter(definition->initialContext())); + + m_commentDefinition.setAfterWhiteSpaces(definition->isCommentAfterWhiteSpaces()); + m_commentDefinition.setSingleLine(definition->singleLineComment()); + m_commentDefinition.setMultiLineStart(definition->multiLineCommentStart()); + m_commentDefinition.setMultiLineEnd(definition->multiLineCommentEnd()); + } catch (const HighlighterException &) { + // No highlighter will be set. + } +} + EditorEditable::EditorEditable(Editor *editor) : TextEditor::BaseTextEditorEditable(editor) { @@ -68,34 +109,7 @@ bool EditorEditable::duplicateSupported() const Core::IEditor *EditorEditable::duplicate(QWidget *parent) { - Editor *newEditor = new Editor(editor()->mimeType(), parent); + Editor *newEditor = new Editor(parent); newEditor->duplicateFrom(editor()); return newEditor->editableInterface(); } - -bool EditorEditable::open(const QString &fileName) -{ - if (TextEditor::BaseTextEditorEditable::open(fileName)) { - editor()->setMimeType( - Core::ICore::instance()->mimeDatabase()->findByFile(QFileInfo(fileName)).type()); - return true; - } - return false; -} - -Editor::Editor(const QString &definitionId, QWidget *parent) : TextEditor::BaseTextEditor(parent) -{ - try { - QSharedPointer<HighlightDefinition> definition = - GenericEditorPlugin::instance()->definition(definitionId); - baseTextDocument()->setSyntaxHighlighter(new Highlighter(definition->initialContext())); - } catch (const HighlighterException &) { - // No highlighter will be set. - } -} - -TextEditor::BaseTextEditorEditable *Editor::createEditableInterface() -{ - EditorEditable *editable = new EditorEditable(this); - return editable; -} diff --git a/src/plugins/genericeditor/editor.h b/src/plugins/genericeditor/editor.h index 1947d2a5a72c868c320b38eb9c73a69ca065bcc2..b8bd9aa6d243db8ee4d9d3d8e44f5e8340e89b4f 100644 --- a/src/plugins/genericeditor/editor.h +++ b/src/plugins/genericeditor/editor.h @@ -31,6 +31,7 @@ #define GENERICEDITOR_H #include <texteditor/basetexteditor.h> +#include <utils/uncommentselection.h> #include <QtCore/QList> @@ -41,12 +42,27 @@ QT_END_NAMESPACE namespace GenericEditor { namespace Internal { -class Editor; +class Editor : public TextEditor::BaseTextEditor +{ + Q_OBJECT +public: + Editor(QWidget *parent = 0); + + virtual void unCommentSelection(); + +protected: + virtual TextEditor::BaseTextEditorEditable *createEditableInterface(); + +private slots: + void configure(); + +private: + Utils::CommentDefinition m_commentDefinition; +}; class EditorEditable : public TextEditor::BaseTextEditorEditable { Q_OBJECT - public: EditorEditable(Editor *editor); @@ -56,22 +72,12 @@ protected: virtual bool isTemporary() const; virtual bool duplicateSupported() const; virtual Core::IEditor *duplicate(QWidget *parent); - virtual bool open(const QString & fileName); private: QList<int> m_context; }; -class Editor : public TextEditor::BaseTextEditor -{ - Q_OBJECT - -public: - Editor(const QString &definitionId, QWidget *parent = 0); -protected: - virtual TextEditor::BaseTextEditorEditable *createEditableInterface(); -}; } // namespace Internal } // namespace GenericEditor diff --git a/src/plugins/genericeditor/editorfactory.cpp b/src/plugins/genericeditor/editorfactory.cpp index be64519e7ba24626718967b13f4ca95422c07afc..ef1764af30eec87f26db70937c8bfe417d26dbcf 100644 --- a/src/plugins/genericeditor/editorfactory.cpp +++ b/src/plugins/genericeditor/editorfactory.cpp @@ -30,22 +30,41 @@ #include "editorfactory.h" #include "genericeditorconstants.h" #include "editor.h" +#include "genericeditorplugin.h" #include <coreplugin/editormanager/editormanager.h> using namespace GenericEditor; using namespace Internal; -EditorFactory::EditorFactory(QObject *parent) : - Core::IEditorFactory(parent) -{} +EditorFactory::EditorFactory(QObject *parent) : Core::IEditorFactory(parent) +{ + // Note: This is temporary until it is definied how definition files should be "integrated". + m_mimeTypes << QLatin1String(GenericEditor::Constants::C_HEADER_MIMETYPE) + << QLatin1String(GenericEditor::Constants::C_SOURCE_MIMETYPE) + << QLatin1String(GenericEditor::Constants::CPP_HEADER_MIMETYPE) + << QLatin1String(GenericEditor::Constants::CPP_SOURCE_MIMETYPE) + << QLatin1String(GenericEditor::Constants::CSS_MIMETYPE) + << QLatin1String(GenericEditor::Constants::FORTRAN_MIMETYPE) + << QLatin1String(GenericEditor::Constants::HTML_MIMETYPE) + << QLatin1String(GenericEditor::Constants::JAVA_MIMETYPE) + << QLatin1String(GenericEditor::Constants::JAVASCRIPT_MIMETYPE) + << QLatin1String(GenericEditor::Constants::OBJECTIVEC_MIMETYPE) + << QLatin1String(GenericEditor::Constants::PERL_MIMETYPE) + << QLatin1String(GenericEditor::Constants::PHP_MIMETYPE) + << QLatin1String(GenericEditor::Constants::PYTHON_MIMETYPE) + << QLatin1String(GenericEditor::Constants::RUBY_MIMETYPE) + << QLatin1String(GenericEditor::Constants::SQL_MIMETYPE) + << QLatin1String(GenericEditor::Constants::TCL_MIMETYPE); +} EditorFactory::~EditorFactory() {} Core::IEditor *EditorFactory::createEditor(QWidget *parent) { - Editor *genericEditor = createGenericEditor(parent); + Editor *genericEditor = new Editor(parent); + GenericEditorPlugin::instance()->initializeEditor(genericEditor); return genericEditor->editableInterface(); } @@ -67,6 +86,3 @@ Core::IFile *EditorFactory::open(const QString &fileName) Core::IEditor *iface = Core::EditorManager::instance()->openEditor(fileName, id()); return iface ? iface->file() : 0; } - -void EditorFactory::addMimeType(const QString &mimeType) -{ m_mimeTypes.append(mimeType); } diff --git a/src/plugins/genericeditor/editorfactory.h b/src/plugins/genericeditor/editorfactory.h index 8eb42cab5b43cf7c64dcd62fe6fa7983f9ab87ba..e804658d801da3ca4b425ce534adc915181c5ec3 100644 --- a/src/plugins/genericeditor/editorfactory.h +++ b/src/plugins/genericeditor/editorfactory.h @@ -47,21 +47,13 @@ public: EditorFactory(QObject *parent = 0); virtual ~EditorFactory(); - // Currently there are language specific factores which configure the correct highlighter. - // Would it be a good idea if the createEditor method also received the mime type? This would - // also discard the necessity of overriding the open method. virtual Core::IEditor *createEditor(QWidget *parent); virtual QStringList mimeTypes() const; virtual QString id() const; virtual QString displayName() const; virtual Core::IFile *open(const QString &fileName); -protected: - void addMimeType(const QString &mimeType); - -private: - virtual Editor *createGenericEditor(QWidget *parent) = 0; - +private: QStringList m_mimeTypes; }; diff --git a/src/plugins/genericeditor/genericeditor.pro b/src/plugins/genericeditor/genericeditor.pro index 69bec2850dba9094b20489886a78a4296de58df6..4e684148980cab3b12d1ed7105c671e8dd6d91e0 100644 --- a/src/plugins/genericeditor/genericeditor.pro +++ b/src/plugins/genericeditor/genericeditor.pro @@ -8,7 +8,6 @@ CONFIG += help HEADERS += \ genericeditorplugin.h \ progressdata.h \ - languagespecificfactories.h \ specificrules.h \ rule.h \ reuse.h \ @@ -28,7 +27,6 @@ HEADERS += \ SOURCES += \ genericeditorplugin.cpp \ progressdata.cpp \ - languagespecificfactories.cpp \ specificrules.cpp \ rule.cpp \ keywordlist.cpp \ diff --git a/src/plugins/genericeditor/genericeditor_dependencies.pri b/src/plugins/genericeditor/genericeditor_dependencies.pri index 53dbf455c6b74976db1412d5ba7619021ae0a757..accac405003efe37ee7c4b20beef618d5f714dc6 100644 --- a/src/plugins/genericeditor/genericeditor_dependencies.pri +++ b/src/plugins/genericeditor/genericeditor_dependencies.pri @@ -1,2 +1,3 @@ include(../../plugins/coreplugin/coreplugin.pri) include(../../plugins/texteditor/texteditor.pri) +include(../../libs/utils/utils.pri) diff --git a/src/plugins/genericeditor/genericeditorplugin.cpp b/src/plugins/genericeditor/genericeditorplugin.cpp index ad2d72cf09971233fc75230c47c7ad86e63561db..2b5e0c3eb0bddc9d0b8a28713e36c538acbb97e4 100644 --- a/src/plugins/genericeditor/genericeditorplugin.cpp +++ b/src/plugins/genericeditor/genericeditorplugin.cpp @@ -28,12 +28,13 @@ **************************************************************************/ #include "genericeditorplugin.h" -#include "languagespecificfactories.h" #include "highlightdefinition.h" #include "highlightdefinitionhandler.h" #include "highlighter.h" #include "highlighterexception.h" #include "genericeditorconstants.h" +#include "editor.h" +#include "editorfactory.h" #include <coreplugin/icore.h> #include <coreplugin/mimedatabase.h> @@ -48,6 +49,7 @@ using namespace GenericEditor; using namespace Internal; +// Todo: Temp. const QLatin1String GenericEditorPlugin::kAlertDefinitionId(":/genericeditor/XML/alert.xml"); const QLatin1String GenericEditorPlugin::kCDefinitionId(":/genericeditor/XML/c.xml"); const QLatin1String GenericEditorPlugin::kCppDefinitionId(":/genericeditor/XML/cpp.xml"); @@ -73,7 +75,8 @@ const QLatin1String GenericEditorPlugin::kTclDefinitionId(":/genericeditor/XML/t GenericEditorPlugin *GenericEditorPlugin::m_instance = 0; -GenericEditorPlugin::GenericEditorPlugin() +GenericEditorPlugin::GenericEditorPlugin() : + m_actionHandler(0) { QTC_ASSERT(!m_instance, return); m_instance = this; @@ -117,7 +120,13 @@ GenericEditorPlugin::GenericEditorPlugin() } GenericEditorPlugin::~GenericEditorPlugin() -{} +{ + delete m_actionHandler; + m_instance = 0; +} + +GenericEditorPlugin *GenericEditorPlugin::instance() +{ return m_instance; } bool GenericEditorPlugin::initialize(const QStringList &arguments, QString *errorString) { @@ -129,20 +138,12 @@ bool GenericEditorPlugin::initialize(const QStringList &arguments, QString *erro return false; } - addAutoReleasedObject(new CFactory(this)); - addAutoReleasedObject(new CppFactory(this)); - addAutoReleasedObject(new CssFactory(this)); - addAutoReleasedObject(new FortranFactory(this)); - addAutoReleasedObject(new HtmlFactory(this)); - addAutoReleasedObject(new JavaFactory(this)); - addAutoReleasedObject(new JavascriptFactory(this)); - addAutoReleasedObject(new ObjectiveCFactory(this)); - addAutoReleasedObject(new PerlFactory(this)); - addAutoReleasedObject(new PhpFactory(this)); // Php definition file is broken. - addAutoReleasedObject(new PythonFactory(this)); - addAutoReleasedObject(new RubyFactory(this)); - addAutoReleasedObject(new SqlFactory(this)); - addAutoReleasedObject(new TclFactory(this)); + addAutoReleasedObject(new EditorFactory(this)); + + m_actionHandler = new TextEditor::TextEditorActionHandler( + GenericEditor::Constants::GENERIC_EDITOR, + TextEditor::TextEditorActionHandler::UnCommentSelection); + m_actionHandler->initializeActions(); return true; } @@ -150,8 +151,10 @@ bool GenericEditorPlugin::initialize(const QStringList &arguments, QString *erro void GenericEditorPlugin::extensionsInitialized() {} -GenericEditorPlugin *GenericEditorPlugin::instance() -{ return m_instance; } +void GenericEditorPlugin::initializeEditor(Editor *editor) +{ + m_actionHandler->setupActions(editor); +} QString GenericEditorPlugin::definitionIdByName(const QString &name) const { return m_idByName.value(name.toLower()); } @@ -187,5 +190,4 @@ const QSharedPointer<HighlightDefinition> &GenericEditorPlugin::definition(const return *m_definitions.constFind(id); } - Q_EXPORT_PLUGIN(GenericEditorPlugin) diff --git a/src/plugins/genericeditor/genericeditorplugin.h b/src/plugins/genericeditor/genericeditorplugin.h index 8e32e5cf80978c3c8f769b87ebc70eced94c95e8..a8a9332a5bcc7ce976b26d1273df8befdcfe5168 100644 --- a/src/plugins/genericeditor/genericeditorplugin.h +++ b/src/plugins/genericeditor/genericeditorplugin.h @@ -31,6 +31,7 @@ #define GENERICEDITORPLUGIN_H #include <extensionsystem/iplugin.h> +#include <texteditor/texteditoractionhandler.h> #include <QtCore/QString> #include <QtCore/QLatin1String> @@ -42,6 +43,7 @@ namespace GenericEditor { namespace Internal { class HighlightDefinition; +class Editor; // Note: The general interface of this class is temporary. Still need discussing details about // the definition files integration with Creator. @@ -59,9 +61,10 @@ public: virtual bool initialize(const QStringList &arguments, QString *errorString); virtual void extensionsInitialized(); + void initializeEditor(Editor *editor); + QString definitionIdByName(const QString &name) const; QString definitionIdByMimeType(const QString &mimeType) const; - bool isBuildingDefinition(const QString &id) const; const QSharedPointer<HighlightDefinition> &definition(const QString &id); @@ -87,12 +90,14 @@ private: GenericEditorPlugin(const GenericEditorPlugin &HighlighterPlugin); const GenericEditorPlugin &operator=(const GenericEditorPlugin &HighlighterPlugin); + static GenericEditorPlugin *m_instance; + QSet<QString> m_isBuilding; QHash<QString, QString> m_idByName; QHash<QString, QString> m_idByMimeType; QHash<QString, QSharedPointer<HighlightDefinition> > m_definitions; - static GenericEditorPlugin *m_instance; + TextEditor::TextEditorActionHandler *m_actionHandler; }; } // namespace Internal diff --git a/src/plugins/genericeditor/highlightdefinition.cpp b/src/plugins/genericeditor/highlightdefinition.cpp index f489e926f22141a8ae12e50937c11de94306143a..c71c975750987d8940d28267232c3eb74f99d646 100644 --- a/src/plugins/genericeditor/highlightdefinition.cpp +++ b/src/plugins/genericeditor/highlightdefinition.cpp @@ -41,7 +41,6 @@ using namespace Internal; HighlightDefinition::HighlightDefinition() : m_delimiters(QLatin1String(".():!+,-<=>%&/;?[]^{|}~\\*, \t")), - m_singleLineCommentPosition(0), m_singleLineCommentAfterWhiteSpaces(false), m_keywordCaseSensitivity(Qt::CaseSensitive) {} @@ -110,22 +109,13 @@ void HighlightDefinition::setSingleLineComment(const QString &start) const QString &HighlightDefinition::singleLineComment() const { return m_singleLineComment; } -void HighlightDefinition::setSingleLineCommentPosition(const QString &position) +void HighlightDefinition::setCommentAfterWhitespaces(const QString &after) { - if (position == QLatin1String("afterwhitespace")) { + if (after == QLatin1String("afterwhitespace")) m_singleLineCommentAfterWhiteSpaces = true; - } else { - bool ok; - m_singleLineCommentPosition = position.toInt(&ok); - if (!ok) - m_singleLineCommentPosition = 0; - } } -int HighlightDefinition::singleLineCommentPosition() const -{ return m_singleLineCommentPosition; } - -bool HighlightDefinition::isSingleLineCommentAfterWhiteSpaces() const +bool HighlightDefinition::isCommentAfterWhiteSpaces() const { return m_singleLineCommentAfterWhiteSpaces; } void HighlightDefinition::setMultiLineCommentStart(const QString &start) diff --git a/src/plugins/genericeditor/highlightdefinition.h b/src/plugins/genericeditor/highlightdefinition.h index e3247ac9ef59b776b404aef1de22d641327c185e..f1879068a91cbf66928f930efa099817c28cceda 100644 --- a/src/plugins/genericeditor/highlightdefinition.h +++ b/src/plugins/genericeditor/highlightdefinition.h @@ -69,9 +69,8 @@ public: void setSingleLineComment(const QString &start); const QString &singleLineComment() const; - void setSingleLineCommentPosition(const QString &position); - int singleLineCommentPosition() const; - bool isSingleLineCommentAfterWhiteSpaces() const; + void setCommentAfterWhitespaces(const QString &after); + bool isCommentAfterWhiteSpaces() const; void setMultiLineCommentStart(const QString &start); const QString &multiLineCommentStart() const; @@ -112,7 +111,6 @@ private: QString m_delimiters; QString m_singleLineComment; - int m_singleLineCommentPosition; bool m_singleLineCommentAfterWhiteSpaces; QString m_multiLineCommentStart; diff --git a/src/plugins/genericeditor/highlightdefinitionhandler.cpp b/src/plugins/genericeditor/highlightdefinitionhandler.cpp index 6179ca5b5c5581b4587e96854b35d55cffc65f2f..ff4717474ec747f38d33a3be99c533d870d5d71a 100644 --- a/src/plugins/genericeditor/highlightdefinitionhandler.cpp +++ b/src/plugins/genericeditor/highlightdefinitionhandler.cpp @@ -281,10 +281,10 @@ void HighlightDefinitionHandler::itemDataElementStarted(const QXmlAttributes &at void HighlightDefinitionHandler::commentElementStarted(const QXmlAttributes &atts) const { const QString &commentType = atts.value(kName); - if (commentType == kSingleLine) { + if (commentType.compare(kSingleLine, Qt::CaseInsensitive) == 0) { m_definition->setSingleLineComment(atts.value(kStart)); - m_definition->setSingleLineCommentPosition(atts.value(kPosition)); - } else if (commentType == kMultiLine) { + m_definition->setCommentAfterWhitespaces(atts.value(kPosition)); + } else if (commentType.compare(kMultiLine, Qt::CaseInsensitive) == 0) { m_definition->setMultiLineCommentStart(atts.value(kStart)); m_definition->setMultiLineCommentEnd(atts.value(kEnd)); m_definition->setMultiLineCommentRegion(atts.value(kRegion)); diff --git a/src/plugins/genericeditor/languagespecificfactories.cpp b/src/plugins/genericeditor/languagespecificfactories.cpp deleted file mode 100644 index 026ea290a605b64075a60240655efaae594a3a2b..0000000000000000000000000000000000000000 --- a/src/plugins/genericeditor/languagespecificfactories.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#include "languagespecificfactories.h" -#include "genericeditorconstants.h" -#include "editor.h" -#include "genericeditorplugin.h" - -#include <coreplugin/icore.h> -#include <coreplugin/mimedatabase.h> - -using namespace GenericEditor; -using namespace Internal; - -// C -CFactory::CFactory(QObject *parent) : EditorFactory(parent) -{ - addMimeType(QLatin1String(GenericEditor::Constants::C_HEADER_MIMETYPE)); - addMimeType(QLatin1String(GenericEditor::Constants::C_SOURCE_MIMETYPE)); -} - -Editor *CFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kCDefinitionId, parent); } - -// C++ -CppFactory::CppFactory(QObject *parent) : EditorFactory(parent) -{ - addMimeType(QLatin1String(GenericEditor::Constants::CPP_HEADER_MIMETYPE)); - addMimeType(QLatin1String(GenericEditor::Constants::CPP_SOURCE_MIMETYPE)); -} - -Editor *CppFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kCppDefinitionId, parent); } - -// Css -CssFactory::CssFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::CSS_MIMETYPE)); } - -Editor *CssFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kCssDefinitionId, parent); } - -// Fortran -FortranFactory::FortranFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::FORTRAN_MIMETYPE)); } - -Editor *FortranFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kFortranDefinitionId, parent); } - -// Html -HtmlFactory::HtmlFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::HTML_MIMETYPE)); } - -Editor *HtmlFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kHtmlDefinitionId, parent); } - -// Java -JavaFactory::JavaFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::JAVA_MIMETYPE)); } - -Editor *JavaFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kJavaDefinitionId, parent); } - -// Javascript -JavascriptFactory::JavascriptFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::JAVASCRIPT_MIMETYPE)); } - -Editor *JavascriptFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kJavascriptDefinitionId, parent); } - -// ObjectiveC -ObjectiveCFactory::ObjectiveCFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::OBJECTIVEC_MIMETYPE)); } - -Editor *ObjectiveCFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kObjectiveCDefinitionId, parent); } - -// Perl -PerlFactory::PerlFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::PERL_MIMETYPE)); } - -Editor *PerlFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kPerlDefinitionId, parent); } - -// Php -PhpFactory::PhpFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::PHP_MIMETYPE)); } - -Editor *PhpFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kPhpDefinitionId, parent); } - -// Python -PythonFactory::PythonFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::PYTHON_MIMETYPE)); } - -Editor *PythonFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kPythonDefinitionId, parent); } - -// Ruby -RubyFactory::RubyFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::RUBY_MIMETYPE)); } - -Editor *RubyFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kRubyDefinitionId, parent); } - -// SQL -SqlFactory::SqlFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::SQL_MIMETYPE)); } - -Editor *SqlFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kSqlDefinitionId, parent); } - -// Tcl -TclFactory::TclFactory(QObject *parent) : EditorFactory(parent) -{ addMimeType(QLatin1String(GenericEditor::Constants::TCL_MIMETYPE)); } - -Editor *TclFactory::createGenericEditor(QWidget *parent) -{ return new Editor(GenericEditorPlugin::kTclDefinitionId, parent); } diff --git a/src/plugins/genericeditor/languagespecificfactories.h b/src/plugins/genericeditor/languagespecificfactories.h deleted file mode 100644 index 792bb7f1b9624bc429c2b49ae0ce53100a8b49b8..0000000000000000000000000000000000000000 --- a/src/plugins/genericeditor/languagespecificfactories.h +++ /dev/null @@ -1,195 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#ifndef LANGUAGESPECIFICFACTORIES_H -#define LANGUAGESPECIFICFACTORIES_H - -#include "editorfactory.h" - -namespace GenericEditor { -namespace Internal { - -class CFactory : public EditorFactory -{ - Q_OBJECT -public: - CFactory(QObject *parent = 0); - virtual ~CFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class CppFactory : public EditorFactory -{ - Q_OBJECT -public: - CppFactory(QObject *parent = 0); - virtual ~CppFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class CssFactory : public EditorFactory -{ - Q_OBJECT -public: - CssFactory(QObject *parent = 0); - virtual ~CssFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class FortranFactory : public EditorFactory -{ - Q_OBJECT -public: - FortranFactory(QObject *parent = 0); - virtual ~FortranFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class HtmlFactory : public EditorFactory -{ - Q_OBJECT -public: - HtmlFactory(QObject *parent = 0); - virtual ~HtmlFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class JavaFactory : public EditorFactory -{ - Q_OBJECT -public: - JavaFactory(QObject *parent = 0); - virtual ~JavaFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class JavascriptFactory : public EditorFactory -{ - Q_OBJECT -public: - JavascriptFactory(QObject *parent = 0); - virtual ~JavascriptFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class ObjectiveCFactory : public EditorFactory -{ - Q_OBJECT -public: - ObjectiveCFactory(QObject *parent = 0); - virtual ~ObjectiveCFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class PerlFactory : public EditorFactory -{ - Q_OBJECT -public: - PerlFactory(QObject *parent = 0); - virtual ~PerlFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class PhpFactory : public EditorFactory -{ - Q_OBJECT -public: - PhpFactory(QObject *parent = 0); - virtual ~PhpFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class PythonFactory : public EditorFactory -{ - Q_OBJECT -public: - PythonFactory(QObject *parent = 0); - virtual ~PythonFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class RubyFactory : public EditorFactory -{ - Q_OBJECT -public: - RubyFactory(QObject *parent = 0); - virtual ~RubyFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class SqlFactory : public EditorFactory -{ - Q_OBJECT -public: - SqlFactory(QObject *parent = 0); - virtual ~SqlFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -class TclFactory : public EditorFactory -{ - Q_OBJECT -public: - TclFactory(QObject *parent = 0); - virtual ~TclFactory() {} - -private: - virtual Editor *createGenericEditor(QWidget *parent); -}; - -} // namespace Internal -} // namespace GenericEditor - -#endif // LANGUAGESPECIFICFACTORIES_H