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;
+ }
+
+}