From 8235aa44925d4653e52d05e030db5eee294c0a39 Mon Sep 17 00:00:00 2001 From: Matthew Bastien Date: Wed, 23 Sep 2015 13:22:06 -0400 Subject: [PATCH] Bug 478211 - Create Qt Project File Editor Also added bracket matching to the QML editor. Change-Id: Ieb960bdec103a1c2055c3fda3dcda028ce73bb0a Signed-off-by: Matthew Bastien --- qt/org.eclipse.cdt.qt.ui/plugin.properties | 1 + qt/org.eclipse.cdt.qt.ui/plugin.xml | 7 + .../cdt/internal/qt/ui/editor/QMLEditor.java | 26 ++ .../qt/ui/editor/QtProjectFileEditor.java | 46 +++ .../qt/ui/editor/QtProjectFileKeyword.java | 329 ++++++++++++++++++ ...tProjectFileSourceViewerConfiguration.java | 92 +++++ 6 files changed, 501 insertions(+) create mode 100644 qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileEditor.java create mode 100644 qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileKeyword.java create mode 100644 qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/text/QtProjectFileSourceViewerConfiguration.java diff --git a/qt/org.eclipse.cdt.qt.ui/plugin.properties b/qt/org.eclipse.cdt.qt.ui/plugin.properties index 0cf254ce126..9a3bdbc7b29 100644 --- a/qt/org.eclipse.cdt.qt.ui/plugin.properties +++ b/qt/org.eclipse.cdt.qt.ui/plugin.properties @@ -8,6 +8,7 @@ pluginName=C/C++ Qt Support UI providerName=Eclipse CDT qmlEditor.name=QML Editor +qtProjectFileEditor.name=Qt Project File Editor qtHighlighting.extName=Qt Semantic Highlighting qtHighlighting.displayName=Qt Keywords diff --git a/qt/org.eclipse.cdt.qt.ui/plugin.xml b/qt/org.eclipse.cdt.qt.ui/plugin.xml index 617838eac83..a46e2ccd46e 100644 --- a/qt/org.eclipse.cdt.qt.ui/plugin.xml +++ b/qt/org.eclipse.cdt.qt.ui/plugin.xml @@ -56,6 +56,13 @@ id="org.eclipse.cdt.qt.ui.QMLEditor" name="%qmlEditor.name"> + + diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java index 685ea7fdb0b..fea75afdeac 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QMLEditor.java @@ -10,8 +10,14 @@ *******************************************************************************/ package org.eclipse.cdt.internal.qt.ui.editor; +import org.eclipse.cdt.internal.qt.ui.QtUIPlugin; import org.eclipse.cdt.internal.qt.ui.text.QMLSourceViewerConfiguration; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.text.IDocumentExtension3; +import org.eclipse.jface.text.source.DefaultCharacterPairMatcher; +import org.eclipse.jface.text.source.ICharacterPairMatcher; import org.eclipse.ui.editors.text.TextEditor; +import org.eclipse.ui.texteditor.SourceViewerDecorationSupport; /** * Basic editor for QML. Thus far has only syntax highlighting capabilities. @@ -19,8 +25,28 @@ import org.eclipse.ui.editors.text.TextEditor; public class QMLEditor extends TextEditor { public static final String EDITOR_ID = "org.eclipse.cdt.qt.ui.QMLEditor"; //$NON-NLS-1$ + public static final String BRACKET_MATCHING_COLOR_PREFERENCE = "org.eclipse.cdt.qt.ui.qmlMatchingBracketsColor"; //$NON-NLS-1$ + private static final String BRACKET_MATCHING_PREFERENCE = "org.eclipse.cdt.qt.ui.qmlMatchingBrackets"; //$NON-NLS-1$ + + private static final char[] BRACKETS = { '{', '}', '(', ')', '[', ']' }; + @Override protected void initializeEditor() { + setPreferenceStore(QtUIPlugin.getDefault().getPreferenceStore()); setSourceViewerConfiguration(new QMLSourceViewerConfiguration()); } + + @Override + protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) { + super.configureSourceViewerDecorationSupport(support); + + // Setup bracket matching with default color being gray + ICharacterPairMatcher matcher = new DefaultCharacterPairMatcher(BRACKETS, IDocumentExtension3.DEFAULT_PARTITIONING); + support.setCharacterPairMatcher(matcher); + support.setMatchingCharacterPainterPreferenceKeys(BRACKET_MATCHING_PREFERENCE, BRACKET_MATCHING_COLOR_PREFERENCE); + + IPreferenceStore store = getPreferenceStore(); + store.setDefault(BRACKET_MATCHING_PREFERENCE, true); + store.setDefault(BRACKET_MATCHING_COLOR_PREFERENCE, "155,155,155"); //$NON-NLS-1$ + } } diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileEditor.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileEditor.java new file mode 100644 index 00000000000..dae26fd96ac --- /dev/null +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileEditor.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX Software Systems - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.qt.ui.editor; + +import org.eclipse.cdt.internal.qt.ui.text.QtProjectFileSourceViewerConfiguration; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.text.IDocumentExtension3; +import org.eclipse.jface.text.source.DefaultCharacterPairMatcher; +import org.eclipse.jface.text.source.ICharacterPairMatcher; +import org.eclipse.ui.editors.text.TextEditor; +import org.eclipse.ui.texteditor.SourceViewerDecorationSupport; + +public class QtProjectFileEditor extends TextEditor { + public static final String EDITOR_ID = "org.eclipse.cdt.qt.ui.QtProjectFileEditor"; //$NON-NLS-1$ + + public static final String BRACKET_MATCHING_COLOR_PREFERENCE = "org.eclipse.cdt.qt.ui.qtproMatchingBracketsColor"; //$NON-NLS-1$ + private static final String BRACKET_MATCHING_PREFERENCE = "org.eclipse.cdt.qt.ui.qtproMatchingBrackets"; //$NON-NLS-1$ + + private static final char[] BRACKETS = { '{', '}', '(', ')', '[', ']' }; + + public QtProjectFileEditor() { + setSourceViewerConfiguration(new QtProjectFileSourceViewerConfiguration()); + } + + @Override + protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) { + super.configureSourceViewerDecorationSupport(support); + + // Setup bracket matching with default color being gray + ICharacterPairMatcher matcher = new DefaultCharacterPairMatcher(BRACKETS, IDocumentExtension3.DEFAULT_PARTITIONING); + support.setCharacterPairMatcher(matcher); + support.setMatchingCharacterPainterPreferenceKeys(BRACKET_MATCHING_PREFERENCE, BRACKET_MATCHING_COLOR_PREFERENCE); + + IPreferenceStore store = getPreferenceStore(); + store.setDefault(BRACKET_MATCHING_PREFERENCE, true); + store.setDefault(BRACKET_MATCHING_COLOR_PREFERENCE, "155,155,155"); //$NON-NLS-1$ + } +} diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileKeyword.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileKeyword.java new file mode 100644 index 00000000000..323a922f19b --- /dev/null +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/editor/QtProjectFileKeyword.java @@ -0,0 +1,329 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX Software Systems - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.qt.ui.editor; + +import java.util.ArrayList; + +/** + * Various keywords associated with Qt Project Files. Namely, special function and variable names used by qmake. + */ +public enum QtProjectFileKeyword { + // QMake function keywords + FUNC_MEMBER("member"), //$NON-NLS-1$ + FUNC_FIRST("first"), //$NON-NLS-1$ + FUNC_LAST("last"), //$NON-NLS-1$ + FUNC_SIZE("size"), //$NON-NLS-1$ + FUNC_CAT("cat"), //$NON-NLS-1$ + FUNC_FROMFILE("fromfile"), //$NON-NLS-1$ + FUNC_EVAL("eval"), //$NON-NLS-1$ + FUNC_LIST("list"), //$NON-NLS-1$ + FUNC_SPRINTF("sprintf"), //$NON-NLS-1$ + FUNC_FORMAT_NUMBER("format_number"), //$NON-NLS-1$ + FUNC_JOIN("join"), //$NON-NLS-1$ + FUNC_SPLIT("split"), //$NON-NLS-1$ + FUNC_BASENAME("basename"), //$NON-NLS-1$ + FUNC_DIRNAME("dirname"), //$NON-NLS-1$ + FUNC_SECTION("section"), //$NON-NLS-1$ + FUNC_FIND("find"), //$NON-NLS-1$ + FUNC_SYSTEM("system"), //$NON-NLS-1$ + FUNC_UNIQUE("unique"), //$NON-NLS-1$ + FUNC_REVERSE("reverse"), //$NON-NLS-1$ + FUNC_QUOTE("quote"), //$NON-NLS-1$ + FUNC_ESCAPE_EXPAND("escape_expand"), //$NON-NLS-1$ + FUNC_UPPER("upper"), //$NON-NLS-1$ + FUNC_LOWER("lower"), //$NON-NLS-1$ + FUNC_TITLE("title"), //$NON-NLS-1$ + FUNC_RE_ESCAPE("re_escape"), //$NON-NLS-1$ + FUNC_VAL_ESCAPE("val_escape"), //$NON-NLS-1$ + FUNC_FILES("files"), //$NON-NLS-1$ + FUNC_PROMPT("prompt"), //$NON-NLS-1$ + FUNC_REPLACE("replace"), //$NON-NLS-1$ + FUNC_SORT_DEPENDS("sort_depends"), //$NON-NLS-1$ + FUNC_RESOLVE_DEPENDS("resolve_depends"), //$NON-NLS-1$ + FUNC_ENUMERATE_VARS("enumerate_vars"), //$NON-NLS-1$ + FUNC_SHADOWED("shadowed"), //$NON-NLS-1$ + FUNC_ABSOLUTE_PATH("absolute_path"), //$NON-NLS-1$ + FUNC_RELATIVE_PATH("relative_path"), //$NON-NLS-1$ + FUNC_CLEAN_PATH("clean_path"), //$NON-NLS-1$ + FUNC_SYSTEM_PATH("system_path"), //$NON-NLS-1$ + FUNC_SHELL_PATH("shell_path"), //$NON-NLS-1$ + FUNC_SYSTEM_QUOTE("system_quote"), //$NON-NLS-1$ + FUNC_SHELL_QUOTE("shell_quote"), //$NON-NLS-1$ + FUNC_REQUIRES("requires"), //$NON-NLS-1$ + FUNC_GREATERTHAN("greaterThan"), //$NON-NLS-1$ + FUNC_LESSTHAN("lessThan"), //$NON-NLS-1$ + FUNC_EQUALS("equals"), //$NON-NLS-1$ + FUNC_ISEQUAL("isEqual"), //$NON-NLS-1$ + FUNC_EXISTS("exists"), //$NON-NLS-1$ + FUNC_EXPORT("export"), //$NON-NLS-1$ + FUNC_CLEAR("clear"), //$NON-NLS-1$ + FUNC_UNSET("unset"), //$NON-NLS-1$ + FUNC_IF("if"), //$NON-NLS-1$ + FUNC_ISACTIVECONFIG("isActiveConfig"), //$NON-NLS-1$ + FUNC_DEFINED("defined"), //$NON-NLS-1$ + FUNC_CONTAINS("contains"), //$NON-NLS-1$ + FUNC_INFILE("infile"), //$NON-NLS-1$ + FUNC_COUNT("count"), //$NON-NLS-1$ + FUNC_ISEMPTY("isEmpty"), //$NON-NLS-1$ + FUNC_PARSEJSON("parseJson"), //$NON-NLS-1$ + FUNC_LOAD("load"), //$NON-NLS-1$ + FUNC_INCLUDE("include"), //$NON-NLS-1$ + FUNC_DEBUG("debug"), //$NON-NLS-1$ + FUNC_LOG("log"), //$NON-NLS-1$ + FUNC_MESSAGE("message"), //$NON-NLS-1$ + FUNC_WARNING("warning"), //$NON-NLS-1$ + FUNC_ERROR("error"), //$NON-NLS-1$ + FUNC_MKPATH("mkpath"), //$NON-NLS-1$ + FUNC_WRITE_FILE("write_file"), //$NON-NLS-1$ + FUNC_TOUCH("touch"), //$NON-NLS-1$ + FUNC_CACHE("cache"), //$NON-NLS-1$ + + // QMake variable keywords + VAR_CCFLAG("CCFLAG"), //$NON-NLS-1$ + VAR_CLEAN_DEPS("CLEAN_DEPS"), //$NON-NLS-1$ + VAR_CONFIG("CONFIG"), //$NON-NLS-1$ + VAR_DEFINES("DEFINES"), //$NON-NLS-1$ + VAR_DEF_FILE("DEF_FILE"), //$NON-NLS-1$ + VAR_DEPENDPATH("DEPENDPATH"), //$NON-NLS-1$ + VAR_DEPLOYMENT("DEPLOYMENT"), //$NON-NLS-1$ + VAR_DEPLOYMENT_PLUGIN("DEPLOYMENT_PLUGIN"), //$NON-NLS-1$ + VAR_DESTDIR("DESTDIR"), //$NON-NLS-1$ + VAR_DESTDIR_TARGET("DESTDIR_TARGET"), //$NON-NLS-1$ + VAR_DISTFILES("DISTFILES"), //$NON-NLS-1$ + VAR_DLLDESTDIR("DLLDESTDIR"), //$NON-NLS-1$ + VAR_DSP_TEMPLATE("DSP_TEMPLATE"), //$NON-NLS-1$ + VAR_FORMS("FORMS"), //$NON-NLS-1$ + VAR_FORMS3("FORMS3"), //$NON-NLS-1$ + VAR_GUID("GUID"), //$NON-NLS-1$ + VAR_HEADERS("HEADERS"), //$NON-NLS-1$ + VAR_ICON("ICON"), //$NON-NLS-1$ + VAR_INCLUDEPATH("INCLUDEPATH"), //$NON-NLS-1$ + VAR_INSTALLS("INSTALLS"), //$NON-NLS-1$ + VAR_LEXIMPLS("LEXIMPLS"), //$NON-NLS-1$ + VAR_LEXOBJECTS("LEXOBJECTS"), //$NON-NLS-1$ + VAR_LEXSOURCES("LEXSOURCES"), //$NON-NLS-1$ + VAR_LIBS("LIBS"), //$NON-NLS-1$ + VAR_LITERAL_HASH("LITERAL_HASH"), //$NON-NLS-1$ + VAR_MAKEFILE("MAKEFILE"), //$NON-NLS-1$ + VAR_MAKEFILE_GENERATOR("MAKEFILE_GENERATOR"), //$NON-NLS-1$ + VAR_MOBILITY("MOBILITY"), //$NON-NLS-1$ + VAR_MOC_DIR("MOC_DIR"), //$NON-NLS-1$ + VAR_OBJECTIVE_HEADERS("OBJECTIVE_HEADERS"), //$NON-NLS-1$ + VAR_OBJECTIVE_SOURCES("OBJECTIVE_SOURCES"), //$NON-NLS-1$ + VAR_OBJECTS("OBJECTS"), //$NON-NLS-1$ + VAR_OBJECTS_DIR("OBJECTS_DIR"), //$NON-NLS-1$ + VAR_OBJMOC("OBJMOC"), //$NON-NLS-1$ + VAR_OTHER_FILES("OTHER_FILES"), //$NON-NLS-1$ + VAR_OUT_PWD("OUT_PWD"), //$NON-NLS-1$ + VAR_PKGCONFIG("PKGCONFIG"), //$NON-NLS-1$ + VAR_POST_TARGETDEPS("POST_TARGETDEPS"), //$NON-NLS-1$ + VAR_PRECOMPILED_HEADER("PRECOMPILED_HEADER"), //$NON-NLS-1$ + VAR_PRE_TARGETDEPS("PRE_TARGETDEPS"), //$NON-NLS-1$ + VAR_PWD("PWD"), //$NON-NLS-1$ + VAR_QMAKE("QMAKE"), //$NON-NLS-1$ + VAR_QMAKESPEC("QMAKESPEC"), //$NON-NLS-1$ + VAR_QMAKE_APP_FLAG("QMAKE_APP_FLAG"), //$NON-NLS-1$ + VAR_QMAKE_APP_OR_DLL("QMAKE_APP_OR_DLL"), //$NON-NLS-1$ + VAR_QMAKE_AR_CMD("QMAKE_AR_CMD"), //$NON-NLS-1$ + VAR_QMAKE_BUNDLE_DATA("QMAKE_BUNDLE_DATA"), //$NON-NLS-1$ + VAR_QMAKE_BUNDLE_EXTENSION("QMAKE_BUNDLE_EXTENSION"), //$NON-NLS-1$ + VAR_QMAKE_CC("QMAKE_CC"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS("QMAKE_CFLAGS"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_DEBUG("QMAKE_CFLAGS_DEBUG"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_MT("QMAKE_CFLAGS_MT"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_MT_DBG("QMAKE_CFLAGS_MT_DBG"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_MT_DLL("QMAKE_CFLAGS_MT_DLL"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_MT_DLLDBG("QMAKE_CFLAGS_MT_DLLDBG"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_RELEASE("QMAKE_CFLAGS_RELEASE"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_SHLIB("QMAKE_CFLAGS_SHLIB"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_THREAD("QMAKE_CFLAGS_THREAD"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_WARN_OFF("QMAKE_CFLAGS_WARN_OFF"), //$NON-NLS-1$ + VAR_QMAKE_CFLAGS_WARN_ON("QMAKE_CFLAGS_WARN_ON"), //$NON-NLS-1$ + VAR_QMAKE_CLEAN("QMAKE_CLEAN"), //$NON-NLS-1$ + VAR_QMAKE_CXX("QMAKE_CXX"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS("QMAKE_CXXFLAGS"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_DEBUG("QMAKE_CXXFLAGS_DEBUG"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_MT("QMAKE_CXXFLAGS_MT"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_MT_DBG("QMAKE_CXXFLAGS_MT_DBG"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_MT_DLL("QMAKE_CXXFLAGS_MT_DLL"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_MT_DLLDBG("QMAKE_CXXFLAGS_MT_DLLDBG"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_RELEASE("QMAKE_CXXFLAGS_RELEASE"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_SHLIB("QMAKE_CXXFLAGS_SHLIB"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_THREAD("QMAKE_CXXFLAGS_THREAD"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_WARN_OFF("QMAKE_CXXFLAGS_WARN_OFF"), //$NON-NLS-1$ + VAR_QMAKE_CXXFLAGS_WARN_ON("QMAKE_CXXFLAGS_WARN_ON"), //$NON-NLS-1$ + VAR_QMAKE_DISTCLEAN("QMAKE_DISTCLEAN"), //$NON-NLS-1$ + VAR_QMAKE_EXTENSION_SHLIB("QMAKE_EXTENSION_SHLIB"), //$NON-NLS-1$ + VAR_QMAKE_EXTRA_COMPILERS("QMAKE_EXTRA_COMPILERS"), //$NON-NLS-1$ + VAR_QMAKE_EXTRA_TARGETS("QMAKE_EXTRA_TARGETS"), //$NON-NLS-1$ + VAR_QMAKE_EXT_CPP("QMAKE_EXT_CPP"), //$NON-NLS-1$ + VAR_QMAKE_EXT_H("QMAKE_EXT_H"), //$NON-NLS-1$ + VAR_QMAKE_EXT_LEX("QMAKE_EXT_LEX"), //$NON-NLS-1$ + VAR_QMAKE_EXT_MOC("QMAKE_EXT_MOC"), //$NON-NLS-1$ + VAR_QMAKE_EXT_OBJ("QMAKE_EXT_OBJ"), //$NON-NLS-1$ + VAR_QMAKE_EXT_PRL("QMAKE_EXT_PRL"), //$NON-NLS-1$ + VAR_QMAKE_EXT_UI("QMAKE_EXT_UI"), //$NON-NLS-1$ + VAR_QMAKE_EXT_YACC("QMAKE_EXT_YACC"), //$NON-NLS-1$ + VAR_QMAKE_FAILED_REQUIREMENTS("QMAKE_FAILED_REQUIREMENTS"), //$NON-NLS-1$ + VAR_QMAKE_FRAMEWORK_BUNDLE_NAME("QMAKE_FRAMEWORK_BUNDLE_NAME"), //$NON-NLS-1$ + VAR_QMAKE_FRAMEWORK_VERSION("QMAKE_FRAMEWORK_VERSION"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR("QMAKE_INCDIR"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_EGL("QMAKE_INCDIR_EGL"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_OPENGL("QMAKE_INCDIR_OPENGL"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_OPENGL_ES1("QMAKE_INCDIR_OPENGL_ES1"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_OPENGL_ES2("QMAKE_INCDIR_OPENGL_ES2"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_OPENVG("QMAKE_INCDIR_OPENVG"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_QT("QMAKE_INCDIR_QT"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_THREAD("QMAKE_INCDIR_THREAD"), //$NON-NLS-1$ + VAR_QMAKE_INCDIR_X("QMAKE_INCDIR_X11"), //$NON-NLS-1$ + VAR_QMAKE_INFO_PLIST("QMAKE_INFO_PLIST"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS("QMAKE_LFLAGS"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_CONSOLE("QMAKE_LFLAGS_CONSOLE"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_CONSOLE_DLL("QMAKE_LFLAGS_CONSOLE_DLL"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_DEBUG("QMAKE_LFLAGS_DEBUG"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_PLUGIN("QMAKE_LFLAGS_PLUGIN"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_QT_DLL("QMAKE_LFLAGS_QT_DLL"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_RELEASE("QMAKE_LFLAGS_RELEASE"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_RPATH("QMAKE_LFLAGS_RPATH"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_SHAPP("QMAKE_LFLAGS_SHAPP"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_SHLIB("QMAKE_LFLAGS_SHLIB"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_SONAME("QMAKE_LFLAGS_SONAME"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_THREAD("QMAKE_LFLAGS_THREAD"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_WINDOWS("QMAKE_LFLAGS_WINDOWS"), //$NON-NLS-1$ + VAR_QMAKE_LFLAGS_WINDOWS_DLL("QMAKE_LFLAGS_WINDOWS_DLL"), //$NON-NLS-1$ + VAR_QMAKE_LIBDIR("QMAKE_LIBDIR"), //$NON-NLS-1$ + VAR_QMAKE_LIBDIR_EGL("QMAKE_LIBDIR_EGL"), //$NON-NLS-1$ + VAR_QMAKE_LIBDIR_FLAGS("QMAKE_LIBDIR_FLAGS"), //$NON-NLS-1$ + VAR_QMAKE_LIBDIR_OPENGL("QMAKE_LIBDIR_OPENGL"), //$NON-NLS-1$ + VAR_QMAKE_LIBDIR_OPENVG("QMAKE_LIBDIR_OPENVG"), //$NON-NLS-1$ + VAR_QMAKE_LIBDIR_QT("QMAKE_LIBDIR_QT"), //$NON-NLS-1$ + VAR_QMAKE_LIBDIR_X("QMAKE_LIBDIR_X11"), //$NON-NLS-1$ + VAR_QMAKE_LIBS("QMAKE_LIBS"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_CONSOLE("QMAKE_LIBS_CONSOLE"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_EGL("QMAKE_LIBS_EGL"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_OPENGL("QMAKE_LIBS_OPENGL"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_OPENGL_ES1("QMAKE_LIBS_OPENGL_ES1"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_OPENGL_ES2("QMAKE_LIBS_OPENGL_ES2"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_OPENGL_QT("QMAKE_LIBS_OPENGL_QT"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_OPENVG("QMAKE_LIBS_OPENVG"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_QT("QMAKE_LIBS_QT"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_QT_DLL("QMAKE_LIBS_QT_DLL"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_QT_OPENGL("QMAKE_LIBS_QT_OPENGL"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_QT_THREAD("QMAKE_LIBS_QT_THREAD"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_RT("QMAKE_LIBS_RT"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_RTMT("QMAKE_LIBS_RTMT"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_THREAD("QMAKE_LIBS_THREAD"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_WINDOWS("QMAKE_LIBS_WINDOWS"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_X11("QMAKE_LIBS_X11"), //$NON-NLS-1$ + VAR_QMAKE_LIBS_X11SM("QMAKE_LIBS_X11SM"), //$NON-NLS-1$ + VAR_QMAKE_LIB_FLAG("QMAKE_LIB_FLAG"), //$NON-NLS-1$ + VAR_QMAKE_LINK("QMAKE_LINK"), //$NON-NLS-1$ + VAR_QMAKE_LINK_SHLIB_CMD("QMAKE_LINK_SHLIB_CMD"), //$NON-NLS-1$ + VAR_QMAKE_LN_SHLIB("QMAKE_LN_SHLIB"), //$NON-NLS-1$ + VAR_QMAKE_MACOSX_DEPLOYMENT_TARGET("QMAKE_MACOSX_DEPLOYMENT_TARGET"), //$NON-NLS-1$ + VAR_QMAKE_MAC_SDK("QMAKE_MAC_SDK"), //$NON-NLS-1$ + VAR_QMAKE_MAKEFILE("QMAKE_MAKEFILE"), //$NON-NLS-1$ + VAR_QMAKE_MOC_SRC("QMAKE_MOC_SRC"), //$NON-NLS-1$ + VAR_QMAKE_POST_LINK("QMAKE_POST_LINK"), //$NON-NLS-1$ + VAR_QMAKE_PRE_LINK("QMAKE_PRE_LINK"), //$NON-NLS-1$ + VAR_QMAKE_PROJECT_NAME("QMAKE_PROJECT_NAME"), //$NON-NLS-1$ + VAR_QMAKE_QMAKE("QMAKE_QMAKE"), //$NON-NLS-1$ + VAR_QMAKE_QT_DLL("QMAKE_QT_DLL"), //$NON-NLS-1$ + VAR_QMAKE_RESOURCE_FLAGS("QMAKE_RESOURCE_FLAGS"), //$NON-NLS-1$ + VAR_QMAKE_RPATH("QMAKE_RPATH"), //$NON-NLS-1$ + VAR_QMAKE_RPATHDIR("QMAKE_RPATHDIR"), //$NON-NLS-1$ + VAR_QMAKE_RUN_CC("QMAKE_RUN_CC"), //$NON-NLS-1$ + VAR_QMAKE_RUN_CC_IMP("QMAKE_RUN_CC_IMP"), //$NON-NLS-1$ + VAR_QMAKE_RUN_CXX("QMAKE_RUN_CXX"), //$NON-NLS-1$ + VAR_QMAKE_RUN_CXX_IMP("QMAKE_RUN_CXX_IMP"), //$NON-NLS-1$ + VAR_QMAKE_TARGET("QMAKE_TARGET"), //$NON-NLS-1$ + VAR_QMAKE_UIC("QMAKE_UIC"), //$NON-NLS-1$ + VAR_QT("QT"), //$NON-NLS-1$ + VAR_QTPLUGIN("QTPLUGIN"), //$NON-NLS-1$ + VAR_QT_MAJOR_VERSION("QT_MAJOR_VERSION"), //$NON-NLS-1$ + VAR_QT_MINOR_VERSION("QT_MINOR_VERSION"), //$NON-NLS-1$ + VAR_QT_PATCH_VERSION("QT_PATCH_VERSION"), //$NON-NLS-1$ + VAR_QT_VERSION("QT_VERSION"), //$NON-NLS-1$ + VAR_RCC_DIR("RCC_DIR"), //$NON-NLS-1$ + VAR_RC_FILE("RC_FILE"), //$NON-NLS-1$ + VAR_REQUIRES("REQUIRES"), //$NON-NLS-1$ + VAR_RESOURCES("RESOURCES"), //$NON-NLS-1$ + VAR_RES_FILE("RES_FILE"), //$NON-NLS-1$ + VAR_RSS_RULES("RSS_RULES"), //$NON-NLS-1$ + VAR_SIGNATURE_FILE("SIGNATURE_FILE"), //$NON-NLS-1$ + VAR_SOURCES("SOURCES"), //$NON-NLS-1$ + VAR_SRCMOC("SRCMOC"), //$NON-NLS-1$ + VAR_STATECHARTS("STATECHARTS"), //$NON-NLS-1$ + VAR_SUBDIRS("SUBDIRS"), //$NON-NLS-1$ + VAR_TARGET("TARGET"), //$NON-NLS-1$ + VAR_TEMPLATE("TEMPLATE"), //$NON-NLS-1$ + VAR_TRANSLATIONS("TRANSLATIONS"), //$NON-NLS-1$ + VAR_UICIMPLS("UICIMPLS"), //$NON-NLS-1$ + VAR_UICOBJECTS("UICOBJECTS"), //$NON-NLS-1$ + VAR_UI_DIR("UI_DIR"), //$NON-NLS-1$ + VAR_UI_HEADERS_DIR("UI_HEADERS_DIR"), //$NON-NLS-1$ + VAR_UI_SOURCES_DIR("UI_SOURCES_DIR"), //$NON-NLS-1$ + VAR_VERSION("VERSION"), //$NON-NLS-1$ + VAR_VERSION_PE_HEADER("VERSION_PE_HEADER"), //$NON-NLS-1$ + VAR_VER_MAJ("VER_MAJ"), //$NON-NLS-1$ + VAR_VER_MIN("VER_MIN"), //$NON-NLS-1$ + VAR_VER_PAT("VER_PAT"), //$NON-NLS-1$ + VAR_VPATH("VPATH"), //$NON-NLS-1$ + VAR_YACCIMPLS("YACCIMPLS"), //$NON-NLS-1$ + VAR_YACCOBJECTS("YACCOBJECTS"), //$NON-NLS-1$ + VAR_YACCSOURCES("YACCSOURCES"), //$NON-NLS-1$ + VAR__PRO_FILE_("_PRO_FILE_"), //$NON-NLS-1$ + VAR__PRO_FILE_PWD_("_PRO_FILE_PWD_"); //$NON-NLS-1$ + + private final String keyword; + + QtProjectFileKeyword(String key) { + this.keyword = key; + } + + /** + * Returns a String containing this keyword's identifier. + * + * @return a string + */ + public String getKeyword() { + return keyword; + } + + private static QtProjectFileKeyword[] getKeywordsWithPrefix(String prefix) { + ArrayList list = new ArrayList<>(); + for (QtProjectFileKeyword word : QtProjectFileKeyword.values()) { + if (word.name().startsWith(prefix)) { + list.add(word); + } + } + QtProjectFileKeyword[] array = new QtProjectFileKeyword[list.size()]; + return list.toArray(array); + } + + /** + * Returns all keywords associated with functions in qmake. + * + * @return an array of keywords + */ + public static QtProjectFileKeyword[] getFunctionKeywords() { + return getKeywordsWithPrefix("FUNC_"); //$NON-NLS-1$ + } + + /** + * Returns all keywords associated with variables in qmake. + * + * @return an array of keywords + */ + public static QtProjectFileKeyword[] getVariableKeywords() { + return getKeywordsWithPrefix("VAR_"); //$NON-NLS-1$ + } +} diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/text/QtProjectFileSourceViewerConfiguration.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/text/QtProjectFileSourceViewerConfiguration.java new file mode 100644 index 00000000000..e3371369c84 --- /dev/null +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/text/QtProjectFileSourceViewerConfiguration.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2015 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX Software Systems - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.qt.ui.text; + +import org.eclipse.cdt.internal.qt.ui.editor.QtProjectFileKeyword; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentExtension3; +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.presentation.IPresentationReconciler; +import org.eclipse.jface.text.presentation.PresentationReconciler; +import org.eclipse.jface.text.rules.DefaultDamagerRepairer; +import org.eclipse.jface.text.rules.EndOfLineRule; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.ITokenScanner; +import org.eclipse.jface.text.rules.IWordDetector; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.jface.text.rules.WordRule; +import org.eclipse.jface.text.source.ISourceViewer; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.editors.text.TextSourceViewerConfiguration; + +public class QtProjectFileSourceViewerConfiguration extends TextSourceViewerConfiguration { + private static int TOKEN_DEFAULT = 0; + private static int TOKEN_FUNCTION_KEYWORD = 1; + private static int TOKEN_VARIABLE_KEYWORD = 2; + private static int TOKEN_COMMENT = 3; + + // TODO: Add preference page for syntax highlighting + private static IToken[] allTokens = new IToken[] { + new Token(null), + new Token(new TextAttribute(new Color(Display.getCurrent(), new RGB(140, 140, 0)))), + new Token(new TextAttribute(new Color(Display.getCurrent(), new RGB(140, 0, 100)))), + new Token(new TextAttribute(new Color(Display.getCurrent(), new RGB(0, 140, 0)))) + }; + + @Override + public IPresentationReconciler getPresentationReconciler(ISourceViewer viewer) { + PresentationReconciler reconciler = new PresentationReconciler(); + reconciler.setDocumentPartitioning(IDocumentExtension3.DEFAULT_PARTITIONING); + + DefaultDamagerRepairer dr; + dr = new DefaultDamagerRepairer(createDefaultTokenScanner()); + reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); + reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); + return reconciler; + } + + private ITokenScanner createDefaultTokenScanner() { + RuleBasedScanner scanner = new RuleBasedScanner(); + + WordRule wordRule = new WordRule(new IWordDetector() { + @Override + public boolean isWordStart(char c) { + return Character.isJavaIdentifierStart(c) && c != '$'; + } + + @Override + public boolean isWordPart(char c) { + return Character.isJavaIdentifierPart(c) && c != '$'; + } + }, allTokens[TOKEN_DEFAULT]); + + // QMake function keywords + for (QtProjectFileKeyword keyword : QtProjectFileKeyword.getFunctionKeywords()) { + wordRule.addWord(keyword.getKeyword(), allTokens[TOKEN_FUNCTION_KEYWORD]); + } + + // QMake variable keywords + for (QtProjectFileKeyword keyword : QtProjectFileKeyword.getVariableKeywords()) { + wordRule.addWord(keyword.getKeyword(), allTokens[TOKEN_VARIABLE_KEYWORD]); + } + + scanner.setRules(new IRule[] { + wordRule, + new EndOfLineRule("#", allTokens[TOKEN_COMMENT]) //$NON-NLS-1$ + }); + return scanner; + } + +}