00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 #include "el.h"
00013 #include <stack>
00014 #include <set>
00015 #include <string>
00016 
00017 #include "TROOT.h"
00018 #include "TInterpreter.h"
00019 
00020 using namespace std;
00021 
00022 void setKeywordColors(const char* colorTab, const char* colorBracket, const char* colorBadBracket);
00023 int selectColor(const char* str);
00024 void highlightKeywords(EditLine_t* el);
00025 int matchParentheses(EditLine_t* el);
00026 void colorWord(EditLine_t* el, int first, int num, int color);
00027 void colorBrackets(EditLine_t* el, int open, int close, int color);
00028 char** rl_complete2ROOT(const char*, int, int);
00029 
00030 
00031 int color_class = 4;           
00032 int color_type = 4;            
00033 int color_bracket = 2;         
00034 int color_badbracket = 1;      
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 void
00045 setKeywordColors(int colorType, int colorBracket, int colorBadBracket) {
00046    color_class = colorType;
00047    color_type = colorType;
00048    color_bracket = colorBracket;
00049    color_badbracket = colorBadBracket;
00050 } 
00051 
00052 
00053 
00054 
00055 
00056 
00057 void
00058 highlightKeywords(EditLine_t* el) {
00059    typedef std::set<int> HashSet_t;
00060    static HashSet_t sHashedKnownTypes;
00061 
00062    TString sBuffer(el->fLine.fBuffer, el->fLine.fLastChar - el->fLine.fBuffer);
00063 
00064    TString keyword;
00065    Ssiz_t posNextTok = 0;
00066    Ssiz_t posPrevTok = 0;
00067 
00068    
00069    while (sBuffer.Tokenize(keyword, posNextTok, "[^a-zA-Z0-9_]")) {
00070       Ssiz_t toklen = posNextTok - posPrevTok;
00071 
00072       if (posNextTok == -1) {
00073          toklen = sBuffer.Length() - posPrevTok;
00074       }
00075       TString tok = sBuffer(posPrevTok, toklen);
00076       Ssiz_t pos = posPrevTok + tok.Index(keyword);
00077       int color = -1;
00078 
00079       if (gROOT->GetListOfTypes()->FindObject(keyword)) {
00080          color = color_type;
00081       } else if (gInterpreter->CheckClassInfo(keyword, kFALSE)) {
00082          color = color_class;
00083       }
00084       colorWord(el, pos, keyword.Length(), color);
00085       posPrevTok = posNextTok;
00086    }
00087 } 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 int
00099 matchParentheses(EditLine_t* el) {
00100    static const int amtBrackets = 3;
00101    int bracketPos = -1;
00102    int foundParenIdx = -1;
00103    char bTypes[amtBrackets][2];
00104 
00105    bTypes[0][0] = '(';
00106    bTypes[0][1] = ')';
00107    bTypes[1][0] = '{';
00108    bTypes[1][1] = '}';
00109    bTypes[2][0] = '[';
00110    bTypes[2][1] = ']';
00111    
00112 
00113    
00114    
00115    std::string sBuffer = "";
00116 
00117    for (char* c = el->fLine.fBuffer; c < el->fLine.fLastChar; c++) {
00118       sBuffer += *c;
00119    }
00120 
00121    
00122    for (int i = 0; i < (el->fLine.fLastChar - el->fLine.fBuffer); i++) {
00123       if (el->fLine.fBufColor[i].fForeColor == color_bracket || el->fLine.fBufColor[i].fForeColor == color_badbracket) {
00124          el->fLine.fBufColor[i] = -1;                      
00125          term__repaint(el, i);
00126       }
00127    }
00128 
00129    
00130    stack<int> locBrackets;
00131 
00132    if (!sBuffer.empty()) {
00133       int cursorPos = el->fLine.fCursor - el->fLine.fBuffer;
00134       bracketPos = cursorPos;
00135 
00136       
00137       int bIndex = 0;
00138 
00139       for (bIndex = 0; bIndex < amtBrackets; bIndex++) {
00140          
00141          if (sBuffer[bracketPos] == bTypes[bIndex][0]) {
00142             locBrackets.push(bracketPos);
00143             foundParenIdx = 0;
00144             break;
00145          } else if (sBuffer[bracketPos] == bTypes[bIndex][1]) {
00146             locBrackets.push(bracketPos);
00147             foundParenIdx = 1;
00148             break;
00149          }
00150       }
00151 
00152       
00153       if (foundParenIdx == -1 && bracketPos > 0) {
00154          
00155          bracketPos--;
00156          
00157          bIndex = 0;
00158 
00159          for (bIndex = 0; bIndex < amtBrackets; bIndex++) {
00160             
00161             if (sBuffer[bracketPos] == bTypes[bIndex][1]) {
00162                locBrackets.push(bracketPos);
00163                foundParenIdx = 1;
00164                break;
00165             }
00166          }
00167       }
00168 
00169       
00170       if (foundParenIdx == -1) {
00171          return foundParenIdx;
00172       }
00173 
00174       
00175       
00176       
00177       int step = 1;
00178 
00179       if (foundParenIdx == 1) {
00180          step = -1;
00181       }
00182 
00183       for (int i = bracketPos + step; i >= 0 && i < (int)sBuffer.size(); i += step) {
00184          
00185          if (sBuffer[i] == bTypes[bIndex][foundParenIdx]) {
00186             
00187             locBrackets.push(i);
00188          }
00189          
00190          else if (sBuffer[i] == bTypes[bIndex][1 - foundParenIdx]) {
00191             
00192             locBrackets.pop();
00193 
00194             
00195             if (locBrackets.empty()) {
00196                colorBrackets(el, bracketPos, i, color_bracket);
00197                break;
00198             }
00199          }
00200       }
00201 
00202       if (!locBrackets.empty()) {
00203          colorBrackets(el, bracketPos, bracketPos, color_badbracket);
00204       }
00205    }
00206 
00207    return foundParenIdx;
00208 } 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 void
00219 colorWord(EditLine_t* el, int first, int num, int textColor) {
00220    int bgColor = -1;            
00221    bool anyChange = false;
00222 
00223    
00224    for (int index = first; index < first + num; ++index) {
00225       bool changed = el->fLine.fBufColor[index].fForeColor != textColor;
00226       anyChange |= changed;
00227       el->fLine.fBufColor[index].fForeColor = textColor;
00228       el->fLine.fBufColor[index].fBackColor = bgColor;
00229 
00230       if (changed) {
00231          term__repaint(el, index);
00232       }
00233    }
00234 
00235    if (anyChange) {
00236       term__setcolor(-1);
00237    }
00238 } 
00239 
00240 
00241 
00242 
00243 
00244 
00245 void
00246 colorBrackets(EditLine_t* el, int open, int close, int textColor) {
00247    int bgColor = -1;            
00248 
00249    el->fLine.fBufColor[open].fForeColor = textColor;
00250    el->fLine.fBufColor[open].fBackColor = bgColor;
00251    term__repaint(el, open);
00252 
00253    el->fLine.fBufColor[close].fForeColor = textColor;
00254    el->fLine.fBufColor[close].fBackColor = bgColor;
00255    term__repaint(el, close);
00256 
00257    term__setcolor(-1);
00258 }