[NEW_FEATURE] Add the Scintilla external lexer capacity under the Notepad++ plugin form.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@88 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
donho 2007-12-25 16:20:05 +00:00
parent 8daa6278fe
commit 576930dab3
11 changed files with 349 additions and 71 deletions

View File

@ -27,7 +27,7 @@ enum LangType {L_TXT, L_PHP , L_C, L_CPP, L_CS, L_OBJC, L_JAVA, L_RC,\
L_ASM, L_DIFF, L_PROPS, L_PS, L_RUBY, L_SMALLTALK, L_VHDL, L_KIX, L_AU3,\
L_CAML, L_ADA, L_VERILOG, L_MATLAB, L_HASKELL, L_INNO, L_SEARCHRESULT, L_CMAKE,\
// The end of enumated language type, so it should be always at the end
L_END};
L_EXTERNAL};
enum winVer{WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, WV_S2003, WV_XPX64, WV_VISTA};

View File

@ -93,16 +93,81 @@ bool PluginsManager::loadPlugins(const char *dir)
getCustomizedShortcuts(pi->_moduleName, pi->_funcItems, pi->_nbFuncItem);
for (int i = 0 ; i < pi->_nbFuncItem ; i++)
if (!pi->_funcItems[i]._pFunc)
for (int c = 0 ; c < pi->_nbFuncItem ; c++)
if (!pi->_funcItems[c]._pFunc)
throw string("\"FuncItems\" array is not set correctly");
pi->_pluginMenu = ::CreateMenu();
pi->_pFuncSetInfo(_nppData);
GetLexerCountFn GetLexerCount = (GetLexerCountFn)::GetProcAddress(pi->_hLib, "GetLexerCount");
// it's a lexer plugin
if (GetLexerCount)
{
GetLexerNameFn GetLexerName = (GetLexerNameFn)::GetProcAddress(pi->_hLib, "GetLexerName");
if (!GetLexerName)
throw string("Loading GetLexerName function failed.");
GetLexerStatusTextFn GetLexerStatusText = (GetLexerStatusTextFn)::GetProcAddress(pi->_hLib, "GetLexerStatusText");
if (!GetLexerStatusText)
throw string("Loading GetLexerStatusText function failed.");
// Assign a buffer for the lexer name.
char lexName[MAX_EXTERNAL_LEXER_NAME_LEN];
strcpy(lexName, "");
char lexDesc[MAX_EXTERNAL_LEXER_DESC_LEN];
strcpy(lexDesc, "");
int numLexers = GetLexerCount();
NppParameters * nppParams = NppParameters::getInstance();
ExternalLangContainer *containers[30];
for (int x = 0; x < numLexers; x++)
{
GetLexerName(x, lexName, MAX_EXTERNAL_LEXER_NAME_LEN);
GetLexerStatusText(x, lexDesc, MAX_EXTERNAL_LEXER_DESC_LEN);
if (!nppParams->isExistingExternalLangName(lexName) && nppParams->ExternalLangHasRoom())
containers[x] = new ExternalLangContainer(lexName, lexDesc);
else
containers[x] = NULL;
}
char xmlPath[MAX_PATH];
strcpy(xmlPath, nppParams->getAppDataNppDir());
PathAppend(xmlPath, "plugins\\Config");
PathAppend(xmlPath, pi->_moduleName);
PathRemoveExtension(xmlPath);
PathAddExtension(xmlPath, ".xml");
if (!PathFileExists(xmlPath))
{
throw string(string(xmlPath) + " is missing.");
}
TiXmlDocument *_pXmlDoc = new TiXmlDocument(xmlPath);
if (!_pXmlDoc->LoadFile())
{
delete _pXmlDoc;
_pXmlDoc = NULL;
throw string(string(xmlPath) + " failed to load.");
}
for (int x = 0; x < numLexers; x++) // postpone adding in case the xml is missing/corrupt
if (containers[x] != NULL)
nppParams->addExternalLangToEnd(containers[x]);
nppParams->getExternalLexerFromXmlTree(_pXmlDoc);
nppParams->getExternalLexerDoc()->push_back(_pXmlDoc);
::SendMessage(_nppData._scintillaMainHandle, SCI_LOADLEXERLIBRARY, 0, (LPARAM)dllNames[i].c_str());
}
_pluginInfos.push_back(pi);
}
catch(string s)
{

View File

@ -157,4 +157,11 @@ private:
bool hasPlugins(){return (_pluginInfos.size()!= 0);};
};
#define EXT_LEXER_DECL __stdcall
// External Lexer function definitions...
typedef int (EXT_LEXER_DECL *GetLexerCountFn)();
typedef void (EXT_LEXER_DECL *GetLexerNameFn)(unsigned int Index, char *name, int buflength);
typedef void (EXT_LEXER_DECL *GetLexerStatusTextFn)(unsigned int Index, char *desc, int buflength);
#endif //PLUGINSMANAGER_H

View File

@ -1332,6 +1332,16 @@ void Notepad_plus::checkLangsMenu(int id) const
string Notepad_plus::getLangDesc(LangType langType, bool shortDesc)
{
if ((langType >= L_EXTERNAL) && (langType < NppParameters::getInstance()->L_END))
{
ExternalLangContainer & elc = NppParameters::getInstance()->getELCFromIndex(langType - L_EXTERNAL);
if (shortDesc)
return string(elc._name);
else
return string(elc._desc);
}
static const int maxChar = 64;
static char langDescArray[][maxChar] = {
"Normal text", "Normal text file",
@ -1511,8 +1521,10 @@ void Notepad_plus::getApiFileName(LangType langType, string &fn)
break;
}
default:
fn = "text";
if (langType >= L_EXTERNAL && langType < NppParameters::getInstance()->L_END)
fn = NppParameters::getInstance()->getELCFromIndex(langType - L_EXTERNAL)._name;
else
fn = "text";
}
}
@ -3707,6 +3719,10 @@ void Notepad_plus::command(int id)
setLangStatus(L_USER);
checkLangsMenu(id);
}
else if ((id >= IDM_LANG_EXTERNAL) && (id <= IDM_LANG_EXTERNAL_LIMIT))
{
setLanguage(id, (LangType)(id - IDM_LANG_EXTERNAL + L_EXTERNAL));
}
else if ((id >= ID_MACRO) && (id < ID_MACRO_LIMIT))
{
int i = id - ID_MACRO;
@ -5757,32 +5773,6 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
_pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), "");
checkSyncState();
//Languages Menu
hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_LANGUAGE);
if (nppGUI._excludedLangList.size() > 0)
{
for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++)
{
int cmdID = pNppParam->langTypeToCommandID(nppGUI._excludedLangList[i]._langType);
char itemName[256];
::GetMenuString(hMenu, cmdID, itemName, sizeof(itemName), MF_BYCOMMAND);
nppGUI._excludedLangList[i]._cmdID = cmdID;
nppGUI._excludedLangList[i]._langName = itemName;
::DeleteMenu(hMenu, cmdID, MF_BYCOMMAND);
DrawMenuBar(_hSelf);
}
}
// Add User Define Languages Entry
pos = ::GetMenuItemCount(hMenu) - 1;
for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++)
{
UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i);
::InsertMenu(hMenu, pos + i , MF_BYPOSITION, IDM_LANG_USER + i + 1, userLangContainer.getName());
}
// Macro Menu
std::vector<MacroShortcut> & macros = pNppParam->getMacroList();
@ -5847,6 +5837,51 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
_isCmdScModified = true;
pNppParam->setAccelerator(&_accelerator);
//Languages Menu
hMenu = ::GetSubMenu(::GetMenu(_hSelf), MENUINDEX_LANGUAGE);
// Add external languages to menu
for (int i = 0 ; i < pNppParam->getNbExternalLang() ; i++)
{
ExternalLangContainer & externalLangContainer = pNppParam->getELCFromIndex(i);
int numLangs = ::GetMenuItemCount(hMenu);
char buffer[100];
int x;
for(x = 0; (x == 0 || strcmp(externalLangContainer._name, buffer) > 0) && x < numLangs; x++)
{
::GetMenuString(hMenu, x, buffer, sizeof(buffer), MF_BYPOSITION);
}
::InsertMenu(hMenu, x-1, MF_BYPOSITION, IDM_LANG_EXTERNAL + i, externalLangContainer._name);
}
if (nppGUI._excludedLangList.size() > 0)
{
for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++)
{
int cmdID = pNppParam->langTypeToCommandID(nppGUI._excludedLangList[i]._langType);
char itemName[256];
::GetMenuString(hMenu, cmdID, itemName, sizeof(itemName), MF_BYCOMMAND);
nppGUI._excludedLangList[i]._cmdID = cmdID;
nppGUI._excludedLangList[i]._langName = itemName;
::DeleteMenu(hMenu, cmdID, MF_BYCOMMAND);
DrawMenuBar(_hSelf);
}
}
// Add User Define Languages Entry
pos = ::GetMenuItemCount(hMenu) - 1;
for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++)
{
UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i);
::InsertMenu(hMenu, pos + i, MF_BYPOSITION, IDM_LANG_USER + i + 1, userLangContainer.getName());
}
//-- Tool Bar Section --//
toolBarStatusType tbStatus = nppGUI._toolBarStatus;

View File

@ -28,7 +28,7 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty
_pXmlUserLangDoc(NULL), _pXmlNativeLangDoc(NULL),\
_nbLang(0), _nbFile(0), _nbMaxFile(10), _pXmlToolIconsDoc(NULL),\
_pXmlShortcutDoc(NULL), _pXmlContextMenuDoc(NULL), _pXmlSessionDoc(NULL),\
_nbUserLang(0), _hUser32(NULL), _hUXTheme(NULL),\
_nbUserLang(0), _nbExternalLang(0), _hUser32(NULL), _hUXTheme(NULL),\
_transparentFuncAddr(NULL), _enableThemeDialogTextureFuncAddr(NULL),\
_isTaskListRBUTTONUP_Active(false), _fileSaveDlgFilterIndex(-1)
{
@ -71,6 +71,7 @@ void cutString(const char *str2cut, vector<string> & patternVect)
bool NppParameters::load(/*bool noUserPath*/)
{
L_END = L_EXTERNAL;
bool isAllLaoded = true;
for (int i = 0 ; i < NB_LANG ; _langList[i] = NULL, i++);
char nppPath[MAX_PATH];
@ -359,6 +360,10 @@ bool NppParameters::load(/*bool noUserPath*/)
getSessionFromXmlTree();
delete _pXmlSessionDoc;
for (size_t i = 0 ; i < _pXmlExternalLexerDoc.size() ; i++)
if (_pXmlExternalLexerDoc[i])
delete _pXmlExternalLexerDoc[i];
_pXmlSessionDoc = NULL;
}
return isAllLaoded;
@ -426,6 +431,22 @@ void NppParameters::getLangKeywordsFromXmlTree()
if (!root) return;
feedKeyWordsParameters(root);
}
void NppParameters::getExternalLexerFromXmlTree(TiXmlDocument *doc)
{
TiXmlNode *root = doc->FirstChild("NotepadPlus");
if (!root) return;
feedKeyWordsParameters(root);
feedStylerArray(root);
}
int NppParameters::addExternalLangToEnd(ExternalLangContainer * externalLang)
{
_externalLangArray[_nbExternalLang] = externalLang;
_nbExternalLang++;
L_END++;
return _nbExternalLang-1;
}
bool NppParameters::getUserStylersFromXmlTree()
{
@ -1371,9 +1392,16 @@ bool NppParameters::feedStylerArray(TiXmlNode *node)
const char *lexerName = element->Attribute("name");
const char *lexerDesc = element->Attribute("desc");
const char *lexerUserExt = element->Attribute("ext");
const char *lexerExcluded = element->Attribute("excluded");
if (lexerName)
{
_lexerStylerArray.addLexerStyler(lexerName, lexerDesc, lexerUserExt, childNode);
if (lexerExcluded != NULL && !strcmp(lexerExcluded, "yes"))
{
int index = getExternalLangIndexFromName(lexerName);
if (index != -1)
_nppGUI._excludedLangList.push_back(LangMenuItem((LangType)(index + L_EXTERNAL)));
}
}
}
@ -1578,29 +1606,13 @@ LangType NppParameters::getLangIDFromStr(const char *langName)
if (!strcmp("inno", langName)) return L_INNO;
if (!strcmp("searchResult", langName)) return L_SEARCHRESULT;
if (!strcmp("cmake", langName)) return L_CMAKE;
int id = _pSelf->getExternalLangIndexFromName(langName);
if (id != -1) return (LangType)(id + L_EXTERNAL);
return L_TXT;
}
int NppParameters::getIndexFromStr(const char *indexName) const
{
string str(indexName);
if (str == "instre1")
return LANG_INDEX_INSTR;
else if (str == "instre2")
return LANG_INDEX_INSTR2;
else if (str == "type1")
return LANG_INDEX_TYPE;
else if (str == "type2")
return LANG_INDEX_TYPE2;
else if (str == "type3")
return LANG_INDEX_TYPE3;
else if (str == "type4")
return LANG_INDEX_TYPE4;
else
return -1;
}
void NppParameters::feedKeyWordsParameters(TiXmlNode *node)
{
@ -1633,9 +1645,9 @@ void NppParameters::feedKeyWordsParameters(TiXmlNode *node)
if ((indexName) && (kwVal))
keyWords = kwVal->Value();
int i = getIndexFromStr(indexName);
int i = getKwClassFromName(indexName);
if (i != -1)
if (i >= 0 && i <= KEYWORDSET_MAX)
_langList[_nbLang]->setWords(keyWords, i);
}
_nbLang++;
@ -3034,8 +3046,13 @@ void NppParameters::writeExcludedLangList(TiXmlElement *element)
for (size_t i = 0 ; i < _nppGUI._excludedLangList.size() ; i++)
{
int nGrp = _nppGUI._excludedLangList[i]._langType / 8;
int nMask = 1 << _nppGUI._excludedLangList[i]._langType % 8;
LangType langType = _nppGUI._excludedLangList[i]._langType;
if (langType >= L_EXTERNAL && langType < L_END)
continue;
int nGrp = langType / 8;
int nMask = 1 << langType % 8;
switch (nGrp)
{
@ -3200,7 +3217,10 @@ int NppParameters::langTypeToCommandID(LangType lt) const
case L_TXT :
id = IDM_LANG_TEXT; break;
default :
id = IDM_LANG_TEXT;
if(lt >= L_EXTERNAL && lt < L_END)
id = lt - L_EXTERNAL + IDM_LANG_EXTERNAL;
else
id = IDM_LANG_TEXT;
}
return id;
}
@ -3218,13 +3238,10 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g
LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm);
LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm);
const char *extStr = pLs->getLexerUserExt();
//pLs2->setLexerUserExt(extStr);
element->SetAttribute("ext", extStr);
if (pLs)
{
const char *extStr = pLs->getLexerUserExt();
element->SetAttribute("ext", extStr);
for (TiXmlNode *grChildNode = childNode->FirstChildElement("WordsStyle");
grChildNode ;
grChildNode = grChildNode->NextSibling("WordsStyle"))
@ -3243,6 +3260,46 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g
}
}
}
for(size_t x = 0; x < _pXmlExternalLexerDoc.size(); x++)
{
TiXmlNode *lexersRoot = ( _pXmlExternalLexerDoc[x]->FirstChild("NotepadPlus"))->FirstChildElement("LexerStyles");
for (TiXmlNode *childNode = lexersRoot->FirstChildElement("LexerType");
childNode ;
childNode = childNode->NextSibling("LexerType"))
{
TiXmlElement *element = childNode->ToElement();
const char *nm = element->Attribute("name");
LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm);
LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm);
if (pLs)
{
const char *extStr = pLs->getLexerUserExt();
//pLs2->setLexerUserExt(extStr);
element->SetAttribute("ext", extStr);
for (TiXmlNode *grChildNode = childNode->FirstChildElement("WordsStyle");
grChildNode ;
grChildNode = grChildNode->NextSibling("WordsStyle"))
{
TiXmlElement *grElement = grChildNode->ToElement();
const char *styleName = grElement->Attribute("name");
int i = pLs->getStylerIndexByName(styleName);
if (i != -1)
{
Style & style = pLs->getStyler(i);
Style & style2Sync = pLs2->getStyler(i);
writeStyle2Element(style, style2Sync, grElement);
}
}
}
}
_pXmlExternalLexerDoc[x]->SaveFile();
}
TiXmlNode *globalStylesRoot = (_pXmlUserStylerDoc->FirstChild("NotepadPlus"))->FirstChildElement("GlobalStyles");

View File

@ -220,6 +220,10 @@ static int getKwClassFromName(const char *str) {
if (!strcmp("type3", str)) return LANG_INDEX_TYPE3;
if (!strcmp("type4", str)) return LANG_INDEX_TYPE4;
if (!strcmp("type5", str)) return LANG_INDEX_TYPE5;
if ((str[1] == '\0') && (str[0] >= '0') && (str[0] <= '8')) // up to KEYWORDSET_MAX
return str[0] - '0';
return -1;
};
@ -404,7 +408,7 @@ private :
char _lexerUserExt[256];
};
const int MAX_LEXER_STYLE = 50;
const int MAX_LEXER_STYLE = 80;
struct LexerStylerArray
{
@ -595,6 +599,7 @@ struct ScintillaViewParams
const int NB_LIST = 20;
const int NB_MAX_LRF_FILE = 30;
const int NB_MAX_USER_LANG = 30;
const int NB_MAX_EXTERNAL_LANG = 30;
const int LANG_NAME_LEN = 32;
struct Lang
@ -724,7 +729,22 @@ private:
bool _isPrefix[nbPrefixListAllowed];
};
const int NB_LANG = 50;
#define MAX_EXTERNAL_LEXER_NAME_LEN 16
#define MAX_EXTERNAL_LEXER_DESC_LEN 32
class ExternalLangContainer
{
public:
char _name[MAX_EXTERNAL_LEXER_NAME_LEN];
char _desc[MAX_EXTERNAL_LEXER_DESC_LEN];
ExternalLangContainer(const char *name, const char *desc) {
strncpy(_name, name, MAX_EXTERNAL_LEXER_NAME_LEN);
strncpy(_desc, desc, MAX_EXTERNAL_LEXER_DESC_LEN);
};
};
const int NB_LANG = 80;
const bool DUP = true;
const bool FREE = false;
@ -738,6 +758,7 @@ public:
void destroyInstance();
bool _isTaskListRBUTTONUP_Active;
int L_END;
const NppGUI & getNppGUI() const {
return _nppGUI;
@ -853,6 +874,22 @@ public:
//qui doit etre jamais passer
return *_userLangArray[0];
};
int getNbExternalLang() const {return _nbExternalLang;};
int getExternalLangIndexFromName(const char *externalLangName) const {
for (int i = 0 ; i < _nbExternalLang ; i++)
{
if (!strcmp(externalLangName, _externalLangArray[i]->_name))
return i;
}
return -1;
};
ExternalLangContainer & getELCFromIndex(int i) {return *_externalLangArray[i];};
bool ExternalLangHasRoom() const {return _nbExternalLang < NB_MAX_EXTERNAL_LANG;};
void getExternalLexerFromXmlTree(TiXmlDocument *doc);
vector<TiXmlDocument *> * getExternalLexerDoc() { return &_pXmlExternalLexerDoc;};
void writeUserDefinedLang();
void writeShortcuts(bool rewriteCmdSc, bool rewriteMacrosSc, bool rewriteUserCmdSc, bool rewriteScintillaKey, bool rewritePluginCmdSc);
@ -888,6 +925,21 @@ public:
int addUserLangToEnd(const UserLangContainer & userLang, const char *newName);
void removeUserLang(int index);
bool isExistingExternalLangName(const char *newName) const {
if ((!newName) || (!newName[0]))
return true;
for (int i = 0 ; i < _nbExternalLang ; i++)
{
if (!strcmp(_externalLangArray[i]->_name, newName))
return true;
}
return false;
};
int addExternalLangToEnd(ExternalLangContainer * externalLang);
TiXmlDocument * getNativeLang() const {return _pXmlNativeLangDoc;};
TiXmlDocument * getToolIcons() const {return _pXmlToolIconsDoc;};
@ -1006,6 +1058,8 @@ private:
TiXmlDocument *_pXmlDoc, *_pXmlUserDoc, *_pXmlUserStylerDoc, *_pXmlUserLangDoc, *_pXmlNativeLangDoc,\
*_pXmlToolIconsDoc, *_pXmlShortcutDoc, *_pXmlContextMenuDoc, *_pXmlSessionDoc;
vector<TiXmlDocument *> _pXmlExternalLexerDoc;
NppGUI _nppGUI;
ScintillaViewParams _svp[2];
@ -1019,6 +1073,8 @@ private:
UserLangContainer *_userLangArray[NB_MAX_USER_LANG];
int _nbUserLang;
char _userDefineLangPath[MAX_PATH];
ExternalLangContainer *_externalLangArray[NB_MAX_EXTERNAL_LANG];
int _nbExternalLang;
CmdLineParams _cmdLineParams;
@ -1113,7 +1169,6 @@ private:
bool getShortcuts(TiXmlNode *node, Shortcut & sc);
bool getScintKey(TiXmlNode *node, ScintillaKeyMap & skm);
int getIndexFromStr(const char *indexName) const;
void writeStyle2Element(Style & style2Wite, Style & style2Sync, TiXmlElement *element);
void insertUserLang2Tree(TiXmlNode *node, UserLangContainer *userLang);
void insertCmd(TiXmlNode *cmdRoot, const CommandShortcut & cmd);

View File

@ -365,6 +365,33 @@ void ScintillaEditView::setUserLexer(const char *userLangName)
}
}
void ScintillaEditView::setExternalLexer(LangType typeDoc)
{
int id = typeDoc - L_EXTERNAL;
char * name = NppParameters::getInstance()->getELCFromIndex(id)._name;
execute(SCI_SETLEXERLANGUAGE, 0, (LPARAM)name);
LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(name);
if (pStyler)
{
for (int i = 0 ; i < pStyler->getNbStyler() ; i++)
{
Style & style = pStyler->getStyler(i);
setStyle(style._styleID, style._fgColor, style._bgColor, style._fontName, style._fontStyle, style._fontSize);
if (style._keywordClass >= 0 && style._keywordClass <= KEYWORDSET_MAX)
{
string kwl("");
if (style._keywords)
kwl = *(style._keywords);
execute(SCI_SETKEYWORDS, style._keywordClass, (LPARAM)getCompleteKeywordList(kwl, typeDoc, style._keywordClass));
}
}
}
}
void ScintillaEditView::setCppLexer(LangType langType)
{
const char *cppInstrs;
@ -745,7 +772,11 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
case L_TXT :
default :
execute(SCI_SETLEXER, (_codepage == CP_CHINESE_TRADITIONAL)?SCLEX_MAKEFILE:SCLEX_NULL); break;
if(typeDoc >= L_EXTERNAL && typeDoc < NppParameters::getInstance()->L_END)
setExternalLexer(typeDoc);
else
execute(SCI_SETLEXER, (_codepage == CP_CHINESE_TRADITIONAL)?SCLEX_MAKEFILE:SCLEX_NULL);
break;
}

View File

@ -631,6 +631,7 @@ protected:
void setXmlLexer(LangType type);
void setUserLexer();
void setUserLexer(const char *userLangName);
void setExternalLexer(LangType typeDoc);
void setEmbeddedJSLexer();
void setPhpEmbeddedLexer();
void setEmbeddedAspLexer();

View File

@ -650,7 +650,7 @@ BOOL CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM
::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0);
int index = 0;
for (int i = L_TXT ; i < L_END ; i++)
for (int i = L_TXT ; i < pNppParam->L_END ; i++)
{
string str;
if ((LangType)i != L_USER)
@ -726,7 +726,7 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara
{
case WM_INITDIALOG :
{
for (int i = L_TXT ; i < L_END ; i++)
for (int i = L_TXT ; i < pNppParam->L_END ; i++)
{
string str;
if ((LangType)i != L_USER)
@ -839,6 +839,29 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara
::EnableWindow(::GetDlgItem(_hSelf, idButton2Enable), TRUE);
::EnableWindow(::GetDlgItem(_hSelf, idButton2Disable), FALSE);
if ((lmi._langType >= L_EXTERNAL) && (lmi._langType < pNppParam->L_END))
{
bool found(false);
for(size_t x = 0; x < pNppParam->getExternalLexerDoc()->size() && !found; x++)
{
TiXmlNode *lexersRoot = pNppParam->getExternalLexerDoc()->at(x)->FirstChild("NotepadPlus")->FirstChildElement("LexerStyles");
for (TiXmlNode *childNode = lexersRoot->FirstChildElement("LexerType");
childNode ;
childNode = childNode->NextSibling("LexerType"))
{
TiXmlElement *element = childNode->ToElement();
if (string(element->Attribute("name")) == lmi._langName)
{
element->SetAttribute("excluded", (LOWORD(wParam)==IDC_BUTTON_REMOVE)?"yes":"no");
pNppParam->getExternalLexerDoc()->at(x)->SaveFile();
found = true;
break;
}
}
}
}
HWND grandParent;
grandParent = ::GetParent(_hParent);

View File

@ -230,8 +230,11 @@
#define IDM_LANG_INNO (IDM_LANG + 47)
#define IDM_LANG_CMAKE (IDM_LANG + 48)
#define IDM_LANG_USER (IDM_LANG + 50) //46050
#define IDM_LANG_USER_LIMIT (IDM_LANG + 80) //46080
#define IDM_LANG_EXTERNAL (IDM_LANG + 50)
#define IDM_LANG_EXTERNAL_LIMIT (IDM_LANG + 79)
#define IDM_LANG_USER (IDM_LANG + 80) //46080
#define IDM_LANG_USER_LIMIT (IDM_LANG + 110) //46110
#define IDM_ABOUT (IDM + 7000)

View File

@ -173,6 +173,7 @@ static void ColouriseSearchResultDoc(unsigned int startPos, int length, int, Wor
ColouriseSearchResultLine(keywordlists, lineBuffer, linePos, startLine, i, styler);
linePos = 0;
startLine = i + 1;
while (!AtEOL(styler, i)) i++;
}
}
if (linePos > 0) { // Last line does not have ending characters