diff options
author | nyamatongwe <devnull@localhost> | 2001-05-01 11:12:42 +0000 |
---|---|---|
committer | nyamatongwe <devnull@localhost> | 2001-05-01 11:12:42 +0000 |
commit | 2bf292a604d2b8e2bb07be283d8ab0067f24a43b (patch) | |
tree | 2d1d090c6804a9af2f81f04c4554c22e819a1487 | |
parent | 581baaf98ebddddf0984b7b5bab90216069ac8b6 (diff) | |
download | scintilla-mirror-2bf292a604d2b8e2bb07be283d8ab0067f24a43b.tar.gz |
External lexer feature added by Simon allows lexers to be housed in DLLs with
a .lexer extension which are automatically loaded at startup.
Minor fix to IME support in ScintillaWin.cxx to deal with current mingw headers.
-rw-r--r-- | include/Accessor.h | 1 | ||||
-rw-r--r-- | include/WindowAccessor.h | 3 | ||||
-rw-r--r-- | src/DocumentAccessor.h | 9 | ||||
-rw-r--r-- | src/ScintillaBase.cxx | 3 | ||||
-rw-r--r-- | src/ScintillaBase.h | 2 | ||||
-rw-r--r-- | vcbuild/SciLexer.dsp | 4 | ||||
-rw-r--r-- | win32/ExternalLexer.cxx | 283 | ||||
-rw-r--r-- | win32/ExternalLexer.h | 74 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 68 | ||||
-rw-r--r-- | win32/deps.mak | 7 | ||||
-rw-r--r-- | win32/makefile | 8 | ||||
-rw-r--r-- | win32/scintilla.mak | 5 |
12 files changed, 457 insertions, 10 deletions
diff --git a/include/Accessor.h b/include/Accessor.h index 5254d2264..17c951067 100644 --- a/include/Accessor.h +++ b/include/Accessor.h @@ -64,6 +64,7 @@ public: virtual int GetLineState(int line)=0; virtual int SetLineState(int line, int state)=0; virtual int GetPropertyInt(const char *key, int defaultValue=0)=0; + virtual char *GetProperties()=0; // Style setting virtual void StartAt(unsigned int start, char chMask=31)=0; diff --git a/include/WindowAccessor.h b/include/WindowAccessor.h index 4810a4aa9..7fd8e30fd 100644 --- a/include/WindowAccessor.h +++ b/include/WindowAccessor.h @@ -42,6 +42,9 @@ public: int GetPropertyInt(const char *key, int defaultValue=0) { return props.GetInt(key, defaultValue); } + char *GetProperties() { + return props.ToString(); + } void StartAt(unsigned int start, char chMask=31); void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; diff --git a/src/DocumentAccessor.h b/src/DocumentAccessor.h index abbb55f18..48742a9b4 100644 --- a/src/DocumentAccessor.h +++ b/src/DocumentAccessor.h @@ -18,6 +18,7 @@ class DocumentAccessor : public Accessor { protected: Document *pdoc; PropSet &props; + WindowID id; int lenDoc; char styleBuf[bufferSize]; @@ -30,8 +31,8 @@ protected: void Fill(int position); public: - DocumentAccessor(Document *pdoc_, PropSet &props_) : - Accessor(), pdoc(pdoc_), props(props_), + DocumentAccessor(Document *pdoc_, PropSet &props_, WindowID id_=0) : + Accessor(), pdoc(pdoc_), props(props_), id(id_), lenDoc(-1), validLen(0), chFlags(0), chWhile(0) { } ~DocumentAccessor(); @@ -46,6 +47,10 @@ public: int GetPropertyInt(const char *key, int defaultValue=0) { return props.GetInt(key, defaultValue); } + char *GetProperties() { + return props.ToString(); + } + WindowID GetWindow() { return id; } void StartAt(unsigned int start, char chMask=31); void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; }; diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index fe873b0f2..2840e08fb 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -41,6 +41,7 @@ ScintillaBase::ScintillaBase() { lexCurrent = 0; for (int wl = 0;wl < numWordLists;wl++) keyWordLists[wl] = new WordList; + keyWordLists[numWordLists] = 0; #endif } @@ -362,7 +363,7 @@ void ScintillaBase::Colourise(int start, int end) { int len = end - start; //WindowAccessor styler(wMain.GetID(), props); - DocumentAccessor styler(pdoc, props); + DocumentAccessor styler(pdoc, props, wMain.GetID()); int styleStart = 0; if (start > 0) diff --git a/src/ScintillaBase.h b/src/ScintillaBase.h index 13172031a..d5b1e8ba0 100644 --- a/src/ScintillaBase.h +++ b/src/ScintillaBase.h @@ -43,7 +43,7 @@ protected: LexerModule *lexCurrent; PropSet props; enum {numWordLists=5}; - WordList *keyWordLists[numWordLists]; + WordList *keyWordLists[numWordLists+1]; void SetLexer(uptr_t wParam); void SetLexerLanguage(const char *languageName); void Colourise(int start, int end); diff --git a/vcbuild/SciLexer.dsp b/vcbuild/SciLexer.dsp index af8b12c8d..7adbe615d 100644 --- a/vcbuild/SciLexer.dsp +++ b/vcbuild/SciLexer.dsp @@ -122,6 +122,10 @@ SOURCE=..\src\Editor.cxx # End Source File # Begin Source File +SOURCE=..\win32\ExternalLexer.cxx +# End Source File +# Begin Source File + SOURCE=..\src\Indicator.cxx # End Source File # Begin Source File diff --git a/win32/ExternalLexer.cxx b/win32/ExternalLexer.cxx new file mode 100644 index 000000000..83aee0677 --- /dev/null +++ b/win32/ExternalLexer.cxx @@ -0,0 +1,283 @@ +// Scintilla source code edit control +/** @file ExternalLexer.cxx + ** Support external lexers in DLLs. + **/ +// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson. +// The License.txt file describes the conditions under which this software may be distributed. + +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> + +#include "SciLexer.h" +#include "Platform.h" +#include "PropSet.h" +#include "Accessor.h" +#include "DocumentAccessor.h" +#include "KeyWords.h" +#include "ExternalLexer.h" + +// Initialise the static vars... +int LexerManager::UseCount = 0; +LexerLibrary *LexerManager::first = NULL; +LexerLibrary *LexerManager::last = NULL; + +//------------------------------------------ +// +// ExternalLexerModule +// +//------------------------------------------ + +char **WordListsToStrings(WordList *val[]) { + int dim = 0; + while (val[dim]) + dim++; + char **wls = new char * [dim + 1]; + for (int i = 0;i < dim;i++) { + SString words; + words = ""; + for (int n = 0; n < val[i]->len; n++) { + words += val[i]->words[n]; + if (n != val[i]->len - 1) + words += " "; + } + wls[i] = new char[words.length() + 1]; + strcpy(wls[i], words.c_str()); + } + wls[dim] = 0; + return wls; +} + +void DeleteWLStrings(char *strs[]) { + int dim = 0; + while (strs[dim]) { + delete strs[dim]; + dim++; + } + delete [] strs; +} + +void ExternalLexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) { + if (!fneLexer) + return ; + + char **kwds = WordListsToStrings(keywordlists); + char *ps = styler.GetProperties(); + + // The accessor passed in is always a DocumentAccessor so this cast and the subsequent + // access will work. Can not use the stricter dynamic_cast as that requires RTTI. + DocumentAccessor &da = static_cast<DocumentAccessor &>(styler); + WindowID wID = da.GetWindow(); + + fneLexer(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); + + delete ps; + DeleteWLStrings(kwds); +} + +void ExternalLexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) { + if (!fneFolder) + return ; + + char **kwds = WordListsToStrings(keywordlists); + char *ps = styler.GetProperties(); + + // The accessor passed in is always a DocumentAccessor so this cast and the subsequent + // access will work. Can not use the stricter dynamic_cast as that requires RTTI. + DocumentAccessor &da = static_cast<DocumentAccessor &>(styler); + WindowID wID = da.GetWindow(); + + fneFolder(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); + + delete ps; + DeleteWLStrings(kwds); +} + +void ExternalLexerModule::SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index) { + fneLexer = fLexer; + fneFolder = fFolder; + externalLanguage = index; +} + +//------------------------------------------ +// +// LexerLibrary +// +//------------------------------------------ + +LexerLibrary::LexerLibrary(LPCTSTR ModuleName) { + // Initialise some members... + first = NULL; + last = NULL; + + // Load the DLL + m_hModule = LoadLibrary(ModuleName); + if (m_hModule) { + m_sModuleName = ModuleName; + GetLexerCountFn GetLexerCount = (GetLexerCountFn)GetProcAddress(m_hModule, "GetLexerCount"); + + if (GetLexerCount) { + ExternalLexerModule *lex; + LexerMinder *lm; + + // Find functions in the DLL + GetLexerNameFn GetLexerName = (GetLexerNameFn)GetProcAddress(m_hModule, "GetLexerName"); + ExtLexerFunction Lexer = (ExtLexerFunction)GetProcAddress(m_hModule, "Lex"); + ExtFoldFunction Folder = (ExtFoldFunction)GetProcAddress(m_hModule, "Fold"); + + // Assign a buffer for the lexer name. + char lexname[100]; + strcpy(lexname, ""); + + int nl = GetLexerCount(); + + for (int i = 0; i < nl; i++) { + GetLexerName(i, lexname, 100); + lex = new ExternalLexerModule(SCLEX_AUTOMATIC, NULL, lexname, NULL); + + // Create a LexerMinder so we don't leak the ExternalLexerModule... + lm = new LexerMinder; + lm->self = lex; + lm->next = NULL; + if (first != NULL) { + last->next = lm; + last = lm; + } else { + first = lm; + last = lm; + } + + // The external lexer needs to know how to call into its DLL to + // do its lexing and folding, we tell it here. Folder may be null. + lex->SetExternal(Lexer, Folder, i); + + } + } + } + next = NULL; +} + +LexerLibrary::~LexerLibrary() { + Release(); +} + +void LexerLibrary::Release() { + //TODO maintain a list of lexers created, and delete them! + LexerMinder *lm; + LexerMinder *next; + lm = first; + while (NULL != lm) { + next = lm->next; + delete lm->self; + delete lm; + lm = next; + } + + first = NULL; + last = NULL; + + // Release the DLL + if (NULL != m_hModule) { + FreeLibrary(m_hModule); + } +} + +//------------------------------------------ +// +// LexerManager +// +//------------------------------------------ + +int FindLastSlash(char *inp) { + int i; + int ret = -1; + for (i = strlen(inp) - 1; i >= 0; i--) { + if (inp[i] == '\\' || inp[i] == '/') { + // if you don't like break: + /* + if (ret == -1) + */ + ret = i; + break; + } + } + return ret; +} + +LexerManager::LexerManager() { + + UseCount++; + if (1 == UseCount) { + EnumerateLexers(); + } +} + +void LexerManager::EnumerateLexers() { + HANDLE hFind; + WIN32_FIND_DATA FindFileData; + + char path[MAX_PATH + 1]; + + GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH); + + int i = FindLastSlash(path); + + if (i == -1) + i = strlen(path); + + SString sPath(path, 0, i); + + // Ensure a trailing slash... + if ( sPath[sPath.size() - 1] != '/' && sPath[sPath.size() - 1] != '\\' ) { + sPath += '\\'; + } + + SString sPattern(sPath); + + sPattern.append("*.lexer"); + + hFind = FindFirstFile(sPattern.c_str(), &FindFileData); + if (hFind != INVALID_HANDLE_VALUE) { + //Found the first file... + BOOL found = TRUE; + LexerLibrary *lib = NULL; + SString to_open; + + while (found) { + to_open.assign(sPath); + to_open += FindFileData.cFileName; + lib = new LexerLibrary(to_open.c_str()); + if (NULL != first) { + last->next = lib; + last = lib; + } else { + first = lib; + last = lib; + } + found = FindNextFile(hFind, &FindFileData); + } + + FindClose(hFind); + + } +} + +LexerManager::~LexerManager() { + // If this is the last LexerManager to be freed then + // we delete all of our LexerLibrarys. + UseCount--; + if (0 == UseCount) { + if (NULL != first) { + LexerLibrary *cur = first; + LexerLibrary *next = first->next; + while (first) { + delete cur; + cur = next; + } + first = NULL; + last = NULL; + } + } +} diff --git a/win32/ExternalLexer.h b/win32/ExternalLexer.h new file mode 100644 index 000000000..bbc2cf4f6 --- /dev/null +++ b/win32/ExternalLexer.h @@ -0,0 +1,74 @@ +// Scintilla source code edit control +/** @file ExternalLexer.h + ** Support external lexers in DLLs. + **/ +// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson. +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef EXTERNALLEXER_H +#define EXTERNALLEXER_H + +// External Lexer function definitions... +typedef void (__stdcall *ExtLexerFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void (__stdcall *ExtFoldFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void* (__stdcall *GetLexerFunction)(unsigned int Index); +typedef int (__stdcall *GetLexerCountFn)(); +typedef void (__stdcall *GetLexerNameFn)(unsigned int Index, char *name, int buflength); + +// Sub-class of LexerModule to use an external lexer. +class ExternalLexerModule : protected LexerModule { +protected: + ExtLexerFunction fneLexer; + ExtFoldFunction fneFolder; + int externalLanguage; + char name[100]; +public: + ExternalLexerModule(int language_, LexerFunction fnLexer_, + const char *languageName_=0, LexerFunction fnFolder_=0) : LexerModule(language_, fnLexer_, 0, fnFolder_){ + strncpy(name, languageName_, sizeof(name)); + languageName = name; + }; + virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler); + virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler); + virtual void SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index); +}; + +// LexerMinder points to an ExternalLexerModule - so we don't leak them. +class LexerMinder { +public: + ExternalLexerModule *self; + LexerMinder *next; +}; + +// LexerLibrary exists for every External Lexer DLL, contains LexerMinders. +class LexerLibrary { +public: + LexerLibrary(LPCTSTR ModuleName); + ~LexerLibrary(); + void Release(); + // Variables + LexerLibrary *next; + SString m_sModuleName; +private: + HMODULE m_hModule; + LexerMinder *first; + LexerMinder *last; +}; + +// LexerManager manages external lexers, contains LexerLibrarys. +class LexerManager { +public: + LexerManager(); + ~LexerManager(); +private: + void EnumerateLexers(); + static int UseCount; + static LexerLibrary *first; + static LexerLibrary *last; +}; + +#endif diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 79a3d1183..c0756938b 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -36,12 +36,33 @@ #include "ScintillaBase.h" #include "UniConversion.h" +#ifdef SCI_LEXER +#include "ExternalLexer.h" +#endif + //#include "CElapsed.h" #ifndef SPI_GETWHEELSCROLLLINES #define SPI_GETWHEELSCROLLLINES 104 #endif +// These undefinitions are required to work around differences between different versions +// of the mingw headers, some of which define these twice, in both winuser.h and imm.h. +#ifdef __MINGW_H +#undef WM_IME_STARTCOMPOSITION +#undef WM_IME_ENDCOMPOSITION +#undef WM_IME_COMPOSITION +#undef WM_IME_KEYLAST +#undef WM_IME_SETCONTEXT +#undef WM_IME_NOTIFY +#undef WM_IME_CONTROL +#undef WM_IME_COMPOSITIONFULL +#undef WM_IME_SELECT +#undef WM_IME_CHAR +#undef WM_IME_KEYDOWN +#undef WM_IME_KEYUP +#endif + #ifndef WM_IME_STARTCOMPOSITION #include <imm.h> #endif @@ -126,6 +147,10 @@ class ScintillaWin : static HINSTANCE hInstance; +#ifdef SCI_LEXER + LexerManager *lexMan; +#endif + ScintillaWin(HWND hwnd); ScintillaWin(const ScintillaWin &) : ScintillaBase() {} virtual ~ScintillaWin(); @@ -193,6 +218,12 @@ public: /// Implement important part of IDataObject STDMETHODIMP GetData(FORMATETC *pFEIn, STGMEDIUM *pSTM); + // External Lexers +#ifdef SCI_LEXER + void SetLexerLanguage(const char *languageName); + void SetLexer(uptr_t wParam); +#endif + bool IsUnicodeMode() const; static void Register(HINSTANCE hInstance_); @@ -235,6 +266,10 @@ void ScintillaWin::Initialise() { // no effect. If the app hasnt, we really shouldnt ask them to call // it just so this internal feature works. OleInitialize(NULL); + +#ifdef SCI_LEXER + lexMan = new LexerManager; +#endif } void ScintillaWin::Finalise() { @@ -242,6 +277,10 @@ void ScintillaWin::Finalise() { SetTicking(false); RevokeDragDrop(wMain.GetID()); OleUninitialize(); + +#ifdef SCI_LEXER + delete lexMan; +#endif } void ScintillaWin::StartDrag() { @@ -860,6 +899,35 @@ void ScintillaWin::ClaimSelection() { // Windows does not have a primary selection } +#ifdef SCI_LEXER + +/* + + Initial Windows-Only implementation of the external lexer + system in ScintillaWin class. Intention is to create a LexerModule + subclass (?) to have lex and fold methods which will call out to their + relevant DLLs... + +*/ + +void ScintillaWin::SetLexer(uptr_t wParam) { + lexLanguage = wParam; + lexCurrent = LexerModule::Find(lexLanguage); + if (!lexCurrent) + lexCurrent = LexerModule::Find(SCLEX_NULL); +} + +void ScintillaWin::SetLexerLanguage(const char *languageName) { + lexLanguage = SCLEX_CONTAINER; + lexCurrent = LexerModule::Find(languageName); + if (!lexCurrent) + lexCurrent = LexerModule::Find(SCLEX_NULL); + if (lexCurrent) + lexLanguage = lexCurrent->GetLanguage(); +} + +#endif + /// Implement IUnknown STDMETHODIMP_(ULONG)FormatEnumerator_AddRef(FormatEnumerator *fe); diff --git a/win32/deps.mak b/win32/deps.mak index f46cfa7ef..f2b1908d7 100644 --- a/win32/deps.mak +++ b/win32/deps.mak @@ -1,3 +1,7 @@ +ExternalLexer.o: ExternalLexer.cxx ..\include\SciLexer.h \ + ..\include\platform.h ..\include\propset.h ..\include\SString.h \ + ..\include\accessor.h ..\src\DocumentAccessor.h ..\include\KeyWords.h \ + ExternalLexer.h PlatWin.o: PlatWin.cxx ..\include\Platform.h PlatformRes.h \ ..\src\UniConversion.h ScintillaWin.o: ScintillaWin.cxx ..\include\Platform.h \ @@ -45,9 +49,6 @@ LexConf.o: ../src/LexConf.cxx ..\include\Platform.h \ LexCPP.o: ../src/LexCPP.cxx ..\include\Platform.h ..\include\PropSet.h \ ..\include\SString.h ..\include\Accessor.h ..\include\KeyWords.h \ ..\include\Scintilla.h ..\include\SciLexer.h -LexerManager.o: ../src/LexerManager.cxx ..\include\SciLexer.h \ - ..\include\platform.h ..\include\propset.h ..\include\SString.h \ - ..\include\accessor.h ..\include\KeyWords.h ..\include\LexerManager.h LexHTML.o: ../src/LexHTML.cxx ..\include\Platform.h \ ..\include\PropSet.h ..\include\SString.h ..\include\Accessor.h \ ..\include\KeyWords.h ..\include\Scintilla.h ..\include\SciLexer.h diff --git a/win32/makefile b/win32/makefile index d177302b2..91407950a 100644 --- a/win32/makefile +++ b/win32/makefile @@ -52,7 +52,7 @@ LOBJS = ScintillaWinL.o ScintillaBaseL.o Editor.o Document.o \ ContractionState.o CellBuffer.o CallTip.o \ ScintRes.o PlatWin.o KeyMap.o Indicator.o LineMarker.o RESearch.o \ Style.o ViewStyle.o AutoComplete.o UniConversion.o KeyWords.o \ - DocumentAccessor.o PropSet.o $(LEXOBJS) + DocumentAccessor.o PropSet.o ExternalLexer.o $(LEXOBJS) $(LEXCOMPONENT): $(LOBJS) $(DLLWRAP) --target i386-mingw32 -o $@ $(LOBJS) $(LDFLAGS) -s --relocatable @@ -63,11 +63,13 @@ include deps.mak ScintillaBaseL.o: ScintillaBase.cxx Platform.h Scintilla.h SciLexer.h \ ContractionState.h CellBuffer.h CallTip.h KeyMap.h Indicator.h \ LineMarker.h Style.h AutoComplete.h ViewStyle.h Document.h Editor.h \ - ScintillaBase.h PropSet.h SString.h Accessor.h DocumentAccessor.h KeyWords.h + ScintillaBase.h PropSet.h SString.h Accessor.h DocumentAccessor.h \ + KeyWords.h ExternalLexer.h ScintillaWinL.o: ScintillaWin.cxx Platform.h Scintilla.h SciLexer.h \ ContractionState.h CellBuffer.h CallTip.h KeyMap.h Indicator.h \ LineMarker.h Style.h AutoComplete.h ViewStyle.h Document.h Editor.h \ - ScintillaBase.h PropSet.h SString.h Accessor.h KeyWords.h UniConversion.h + ScintillaBase.h PropSet.h SString.h Accessor.h KeyWords.h \ + ExternalLexer.h UniConversion.h ScintillaWinS.o: ScintillaWin.cxx Platform.h Scintilla.h \ ContractionState.h CellBuffer.h CallTip.h KeyMap.h Indicator.h \ LineMarker.h Style.h AutoComplete.h ViewStyle.h Document.h Editor.h \ diff --git a/win32/scintilla.mak b/win32/scintilla.mak index 5d6d9a3f5..89596d045 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -126,6 +126,7 @@ LOBJS=\ $(DIR_O)\Document.obj \ $(DIR_O)\DocumentAccessor.obj \ $(DIR_O)\Editor.obj \ + $(DIR_O)\ExternalLexer.obj \ $(DIR_O)\Indicator.obj \ $(DIR_O)\KeyMap.obj \ $(DIR_O)\KeyWords.obj \ @@ -207,6 +208,10 @@ $(DIR_O)\Editor.obj: ..\src\Editor.cxx ..\include\Platform.h ..\include\Scintill ..\src\CellBuffer.h ..\src\KeyMap.h ..\src\Indicator.h ..\src\LineMarker.h ..\src\Style.h ..\src\ViewStyle.h \ ..\src\Document.h ..\src\Editor.h +$(DIR_O)\ExternalLexer.obj: ExternalLexer.cxx ExternalLexer.h \ + ..\include\SciLexer.h ..\include\Platform.h ..\include\PropSet.h ..\include\SString.h \ + ..\include\Accessor.h ..\src\DocumentAccessor.h ..\include\KeyWords.h \ + $(DIR_O)\Indicator.obj: ..\src\Indicator.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\Indicator.h $(DIR_O)\KeyMap.obj: ..\src\KeyMap.cxx ..\include\Platform.h ..\include\Scintilla.h ..\src\KeyMap.h |