From ea4cd94c25e23f38feaa3ca61cefe0c8c1e17ce2 Mon Sep 17 00:00:00 2001
From: Marc Zinnschlag <marc@zpages.de>
Date: Sun, 24 Aug 2014 17:56:20 +0200
Subject: [PATCH] syntax highlighter modes

---
 apps/opencs/view/world/scriptedit.cpp        |  8 ++++----
 apps/opencs/view/world/scriptedit.hpp        |  7 ++++---
 apps/opencs/view/world/scripthighlighter.cpp | 16 ++++++++++++++--
 apps/opencs/view/world/scripthighlighter.hpp | 10 +++++++++-
 apps/opencs/view/world/scriptsubview.cpp     |  2 +-
 apps/opencs/view/world/util.cpp              |  2 +-
 6 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/apps/opencs/view/world/scriptedit.cpp b/apps/opencs/view/world/scriptedit.cpp
index 89c27970f1..5bed4760fd 100644
--- a/apps/opencs/view/world/scriptedit.cpp
+++ b/apps/opencs/view/world/scriptedit.cpp
@@ -11,7 +11,6 @@
 #include "../../model/world/universalid.hpp"
 #include "../../model/world/tablemimedata.hpp"
 
-#include "scripthighlighter.hpp"
 
 CSVWorld::ScriptEdit::ChangeLock::ChangeLock (ScriptEdit& edit) : mEdit (edit)
 {
@@ -24,8 +23,9 @@ CSVWorld::ScriptEdit::ChangeLock::~ChangeLock()
 }
 
 
-CSVWorld::ScriptEdit::ScriptEdit (const CSMDoc::Document& document, QWidget* parent) :
-    QTextEdit (parent),
+CSVWorld::ScriptEdit::ScriptEdit (const CSMDoc::Document& document, ScriptHighlighter::Mode mode,
+    QWidget* parent)
+    : QTextEdit (parent),
     mDocument (document),
     mWhiteListQoutes("^[a-z|_]{1}[a-z|0-9|_]{0,}$", Qt::CaseInsensitive),
     mChangeLocked (0)
@@ -65,7 +65,7 @@ CSVWorld::ScriptEdit::ScriptEdit (const CSMDoc::Document& document, QWidget* par
                   <<CSMWorld::UniversalId::Type_Script
                   <<CSMWorld::UniversalId::Type_Region;
 
-    mHighlighter = new ScriptHighlighter (document.getData(), ScriptEdit::document());
+    mHighlighter = new ScriptHighlighter (document.getData(), mode, ScriptEdit::document());
 
     connect (&document.getData(), SIGNAL (idListChanged()), this, SLOT (idListChanged()));
 
diff --git a/apps/opencs/view/world/scriptedit.hpp b/apps/opencs/view/world/scriptedit.hpp
index 5713f2426d..0b91c17c70 100644
--- a/apps/opencs/view/world/scriptedit.hpp
+++ b/apps/opencs/view/world/scriptedit.hpp
@@ -7,6 +7,8 @@
 
 #include "../../model/world/universalid.hpp"
 
+#include "scripthighlighter.hpp"
+
 class QWidget;
 class QRegExp;
 
@@ -17,8 +19,6 @@ namespace CSMDoc
 
 namespace CSVWorld
 {
-    class ScriptHighlighter;
-
     class ScriptEdit : public QTextEdit
     {
             Q_OBJECT
@@ -48,7 +48,8 @@ namespace CSVWorld
 
         public:
 
-            ScriptEdit (const CSMDoc::Document& document, QWidget* parent);
+            ScriptEdit (const CSMDoc::Document& document, ScriptHighlighter::Mode mode,
+                QWidget* parent);
 
             /// Should changes to the data be ignored (i.e. not cause updated)?
             ///
diff --git a/apps/opencs/view/world/scripthighlighter.cpp b/apps/opencs/view/world/scripthighlighter.cpp
index e06dab3727..36cebcb768 100644
--- a/apps/opencs/view/world/scripthighlighter.cpp
+++ b/apps/opencs/view/world/scripthighlighter.cpp
@@ -30,6 +30,16 @@ bool CSVWorld::ScriptHighlighter::parseName (const std::string& name, const Comp
 bool CSVWorld::ScriptHighlighter::parseKeyword (int keyword, const Compiler::TokenLoc& loc,
     Compiler::Scanner& scanner)
 {
+    if (((mMode==Mode_Console || mMode==Mode_Dialogue) &&
+        (keyword==Compiler::Scanner::K_begin || keyword==Compiler::Scanner::K_end ||
+        keyword==Compiler::Scanner::K_short || keyword==Compiler::Scanner::K_long ||
+        keyword==Compiler::Scanner::K_float))
+        || (mMode==Mode_Console && (keyword==Compiler::Scanner::K_if ||
+        keyword==Compiler::Scanner::K_endif || keyword==Compiler::Scanner::K_else ||
+        keyword==Compiler::Scanner::K_elseif || keyword==Compiler::Scanner::K_while ||
+        keyword==Compiler::Scanner::K_endwhile)))
+        return parseName (loc.mLiteral, loc, scanner);
+
     highlight (loc, Type_Keyword);
     return true;
 }
@@ -63,8 +73,10 @@ void CSVWorld::ScriptHighlighter::highlight (const Compiler::TokenLoc& loc, Type
     setFormat (index, length, mScheme[type]);
 }
 
-CSVWorld::ScriptHighlighter::ScriptHighlighter (const CSMWorld::Data& data, QTextDocument *parent)
-: QSyntaxHighlighter (parent), Compiler::Parser (mErrorHandler, mContext), mContext (data)
+CSVWorld::ScriptHighlighter::ScriptHighlighter (const CSMWorld::Data& data, Mode mode,
+    QTextDocument *parent)
+: QSyntaxHighlighter (parent), Compiler::Parser (mErrorHandler, mContext), mContext (data),
+  mMode (mode)
 {
     /// \todo replace this with user settings
     {
diff --git a/apps/opencs/view/world/scripthighlighter.hpp b/apps/opencs/view/world/scripthighlighter.hpp
index 495c2e6a3a..953f2f953a 100644
--- a/apps/opencs/view/world/scripthighlighter.hpp
+++ b/apps/opencs/view/world/scripthighlighter.hpp
@@ -28,12 +28,20 @@ namespace CSVWorld
                 Type_Id
             };
 
+            enum Mode
+            {
+                Mode_General,
+                Mode_Console,
+                Mode_Dialogue
+            };
+
         private:
 
             Compiler::NullErrorHandler mErrorHandler;
             Compiler::Extensions mExtensions;
             CSMWorld::ScriptContext mContext;
             std::map<Type, QTextCharFormat> mScheme;
+            Mode mMode;
 
         private:
 
@@ -74,7 +82,7 @@ namespace CSVWorld
 
         public:
 
-            ScriptHighlighter (const CSMWorld::Data& data, QTextDocument *parent);
+            ScriptHighlighter (const CSMWorld::Data& data, Mode mode, QTextDocument *parent);
 
             virtual void highlightBlock (const QString& text);
 
diff --git a/apps/opencs/view/world/scriptsubview.cpp b/apps/opencs/view/world/scriptsubview.cpp
index d2cde1db2f..df3fd87be5 100644
--- a/apps/opencs/view/world/scriptsubview.cpp
+++ b/apps/opencs/view/world/scriptsubview.cpp
@@ -15,7 +15,7 @@
 CSVWorld::ScriptSubView::ScriptSubView (const CSMWorld::UniversalId& id, CSMDoc::Document& document)
 : SubView (id), mDocument (document), mColumn (-1)
 {
-    setWidget (mEditor = new ScriptEdit (mDocument, this));
+    setWidget (mEditor = new ScriptEdit (mDocument, ScriptHighlighter::Mode_General, this));
 
     mModel = &dynamic_cast<CSMWorld::IdTable&> (
         *document.getData().getTableModel (CSMWorld::UniversalId::Type_Scripts));
diff --git a/apps/opencs/view/world/util.cpp b/apps/opencs/view/world/util.cpp
index 8ff3b69422..4e82eab63e 100644
--- a/apps/opencs/view/world/util.cpp
+++ b/apps/opencs/view/world/util.cpp
@@ -195,7 +195,7 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
 
         case CSMWorld::ColumnBase::Display_ScriptLines:
 
-            return new ScriptEdit (mDocument, parent);
+            return new ScriptEdit (mDocument, ScriptHighlighter::Mode_Console, parent);
 
         default: