[NEW_FEATURE] Add import/export User Defined Language features.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@632 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
Don Ho 2010-05-08 22:44:45 +00:00
parent 0bb88d079b
commit a82f2de60b
6 changed files with 142 additions and 27 deletions

View File

@ -1186,19 +1186,20 @@ bool NppParameters::getUserParametersFromXmlTree()
return true; return true;
} }
bool NppParameters::getUserDefineLangsFromXmlTree() bool NppParameters::getUserDefineLangsFromXmlTree(TiXmlDocument *tixmldoc)
{ {
if (!_pXmlUserLangDoc) if (!tixmldoc)
return false; return false;
TiXmlNode *root = _pXmlUserLangDoc->FirstChild(TEXT("NotepadPlus")); TiXmlNode *root = tixmldoc->FirstChild(TEXT("NotepadPlus"));
if (!root) if (!root)
return false; return false;
feedUserLang(root); return feedUserLang(root);
return true;
} }
bool NppParameters::getShortcutsFromXmlTree() bool NppParameters::getShortcutsFromXmlTree()
{ {
if (!_pXmlShortcutDoc) if (!_pXmlShortcutDoc)
@ -2006,14 +2007,18 @@ bool NppParameters::getShortcuts(TiXmlNode *node, Shortcut & sc)
const int loadFailed = 100; const int loadFailed = 100;
const int missingName = 101; const int missingName = 101;
void NppParameters::feedUserLang(TiXmlNode *node) bool NppParameters::feedUserLang(TiXmlNode *node)
{ {
bool isEverythingOK = true;
bool hasFoundElement = false;
for (TiXmlNode *childNode = node->FirstChildElement(TEXT("UserLang")); for (TiXmlNode *childNode = node->FirstChildElement(TEXT("UserLang"));
childNode && (_nbUserLang < NB_MAX_USER_LANG); childNode && (_nbUserLang < NB_MAX_USER_LANG);
childNode = childNode->NextSibling(TEXT("UserLang")) ) childNode = childNode->NextSibling(TEXT("UserLang")) )
{ {
const TCHAR *name = (childNode->ToElement())->Attribute(TEXT("name")); const TCHAR *name = (childNode->ToElement())->Attribute(TEXT("name"));
const TCHAR *ext = (childNode->ToElement())->Attribute(TEXT("ext")); const TCHAR *ext = (childNode->ToElement())->Attribute(TEXT("ext"));
hasFoundElement = true;
try { try {
if (!name || !name[0] || !ext) throw int(missingName); if (!name || !name[0] || !ext) throw int(missingName);
@ -2035,8 +2040,41 @@ void NppParameters::feedUserLang(TiXmlNode *node)
} catch (int e) { } catch (int e) {
if (e == loadFailed) if (e == loadFailed)
delete _userLangArray[--_nbUserLang]; delete _userLangArray[--_nbUserLang];
isEverythingOK = false;
} }
} }
if (isEverythingOK)
isEverythingOK = hasFoundElement;
return isEverythingOK;
}
bool NppParameters::importUDLFromFile(generic_string sourceFile)
{
TiXmlDocument *pXmlUserLangDoc = new TiXmlDocument(sourceFile);
bool loadOkay = pXmlUserLangDoc->LoadFile();
if (loadOkay)
{
loadOkay = getUserDefineLangsFromXmlTree(pXmlUserLangDoc);
}
delete pXmlUserLangDoc;
return loadOkay;
}
bool NppParameters::exportUDLToFile(int langIndex2export, generic_string fileName2save)
{
if (langIndex2export != -1 && langIndex2export >= _nbUserLang)
return false;
TiXmlDocument *pNewXmlUserLangDoc = new TiXmlDocument(fileName2save);
TiXmlNode *newRoot2export = pNewXmlUserLangDoc->InsertEndChild(TiXmlElement(TEXT("NotepadPlus")));
bool b = false;
insertUserLang2Tree(newRoot2export, _userLangArray[langIndex2export]);
b = pNewXmlUserLangDoc->SaveFile();
delete pNewXmlUserLangDoc;
return b;
} }
LangType NppParameters::getLangFromExt(const TCHAR *ext) LangType NppParameters::getLangFromExt(const TCHAR *ext)
@ -2100,6 +2138,7 @@ void NppParameters::writeUserDefinedLang()
stylerStrOp(FREE); stylerStrOp(FREE);
} }
void NppParameters::insertCmd(TiXmlNode *shortcutsRoot, const CommandShortcut & cmd) void NppParameters::insertCmd(TiXmlNode *shortcutsRoot, const CommandShortcut & cmd)
{ {
const KeyCombo & key = cmd.getKeyCombo(); const KeyCombo & key = cmd.getKeyCombo();

View File

@ -1422,6 +1422,8 @@ public:
}; };
PluginList & getPluginList() {return _pluginList;}; PluginList & getPluginList() {return _pluginList;};
bool importUDLFromFile(generic_string sourceFile);
bool exportUDLToFile(int langIndex2export, generic_string fileName2save);
private: private:
NppParameters(); NppParameters();
@ -1528,7 +1530,11 @@ private:
void getLangKeywordsFromXmlTree(); void getLangKeywordsFromXmlTree();
bool getUserParametersFromXmlTree(); bool getUserParametersFromXmlTree();
bool getUserStylersFromXmlTree(); bool getUserStylersFromXmlTree();
bool getUserDefineLangsFromXmlTree(); bool getUserDefineLangsFromXmlTree(TiXmlDocument *tixmldoc);
bool getUserDefineLangsFromXmlTree() {
return getUserDefineLangsFromXmlTree(_pXmlUserLangDoc);
};
bool getShortcutsFromXmlTree(); bool getShortcutsFromXmlTree();
bool getMacrosFromXmlTree(); bool getMacrosFromXmlTree();
@ -1548,7 +1554,8 @@ private:
bool feedStylerArray(TiXmlNode *node); bool feedStylerArray(TiXmlNode *node);
void getAllWordStyles(TCHAR *lexerName, TiXmlNode *lexerNode); void getAllWordStyles(TCHAR *lexerName, TiXmlNode *lexerNode);
void feedUserLang(TiXmlNode *node); bool feedUserLang(TiXmlNode *node);
int getIndexFromKeywordListName(const TCHAR *name); int getIndexFromKeywordListName(const TCHAR *name);
void feedUserStyles(TiXmlNode *node); void feedUserStyles(TiXmlNode *node);
void feedUserKeywordList(TiXmlNode *node); void feedUserKeywordList(TiXmlNode *node);

View File

@ -22,6 +22,7 @@
#include "Parameters.h" #include "Parameters.h"
#include "resource.h" #include "resource.h"
#include "Notepad_plus_msgs.h" #include "Notepad_plus_msgs.h"
#include "FileDialog.h"
UserLangContainer * SharedParametersDialog::_pUserLang = NULL; UserLangContainer * SharedParametersDialog::_pUserLang = NULL;
ScintillaEditView * SharedParametersDialog::_pScintilla = NULL; ScintillaEditView * SharedParametersDialog::_pScintilla = NULL;
@ -1338,6 +1339,18 @@ UserDefineDialog::~UserDefineDialog()
delete _pCurrentUserLang; delete _pCurrentUserLang;
} }
void UserDefineDialog::reloadLangCombo()
{
NppParameters *pNppParam = NppParameters::getInstance();
::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_RESETCONTENT, 0, 0);
::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("User Define Language"));
for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++)
{
UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i);
::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_ADDSTRING, 0, (LPARAM)userLangContainer.getName());
}
}
void UserDefineDialog::changeStyle() void UserDefineDialog::changeStyle()
{ {
display(false); display(false);
@ -1427,7 +1440,7 @@ BOOL CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPARAM
_ctrlTab.display(); _ctrlTab.display();
RECT arc; RECT arc;
::GetWindowRect(::GetDlgItem(_hSelf, IDC_ADDNEW_BUTTON), &arc); ::GetWindowRect(::GetDlgItem(_hSelf, IDC_IMPORT_BUTTON), &arc);
POINT p; POINT p;
p.x = arc.left; p.x = arc.left;
@ -1445,13 +1458,9 @@ BOOL CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPARAM
_commentStyleDlg.reSizeTo(rc); _commentStyleDlg.reSizeTo(rc);
_symbolsStyleDlg.reSizeTo(rc); _symbolsStyleDlg.reSizeTo(rc);
::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("User Define Language")); reloadLangCombo();
for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++) ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_SETCURSEL, 0, 0);
{
UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i);
::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_ADDSTRING, 0, (LPARAM)userLangContainer.getName());
}
::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_SETCURSEL, 0, 0);
enableLangAndControlsBy(0); enableLangAndControlsBy(0);
_pUserLang = _pCurrentUserLang; _pUserLang = _pCurrentUserLang;
@ -1679,6 +1688,60 @@ BOOL CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPARAM
return TRUE; return TRUE;
} }
case IDC_IMPORT_BUTTON :
{
NppParameters *pNppParam = NppParameters::getInstance();
FileDialog fDlg(_hSelf, ::GetModuleHandle(NULL));
fDlg.setExtFilter(TEXT("UDL"), TEXT(".xml"), NULL);
TCHAR *fn = fDlg.doOpenSingleFileDlg();
if (!fn) break;
generic_string sourceFile = fn;
bool isSuccessful = pNppParam->importUDLFromFile(sourceFile);
if (isSuccessful)
{
int i = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0);
reloadLangCombo();
::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_SETCURSEL, i, 0);
_isDirty = true;
printStr(TEXT("Import successful."));
}
else
{
printStr(TEXT("Fail to import."));
}
break;
}
case IDC_EXPORT_BUTTON :
{
NppParameters *pNppParam = NppParameters::getInstance();
FileDialog fDlg(_hSelf, ::GetModuleHandle(NULL));
fDlg.setExtFilter(TEXT("UDL"), TEXT(".xml"), NULL);
TCHAR *fn = fDlg.doSaveDlg();
if (!fn) break;
generic_string fileName2save = fn;
int i2Export = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0);
if (i2Export > 0)
{
bool isSuccessful = pNppParam->exportUDLToFile(i2Export - 1, fileName2save);
if (isSuccessful)
{
printStr(TEXT("Export successful"));
}
else
{
printStr(TEXT("Fail to export."));
}
}
break;
}
case IDC_UD_TRANSPARENT_CHECK : case IDC_UD_TRANSPARENT_CHECK :
{ {

View File

@ -252,6 +252,7 @@ public :
display(); display();
}; };
void reloadLangCombo();
void changeStyle(); void changeStyle();
bool isDocked() const {return _status == DOCK;}; bool isDocked() const {return _status == DOCK;};
void setDockStatus(bool isDocked) {_status = isDocked;}; void setDockStatus(bool isDocked) {_status = isDocked;};

View File

@ -242,18 +242,22 @@ EXSTYLE WS_EX_TOOLWINDOW
CAPTION "User-Defined" CAPTION "User-Defined"
FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0
BEGIN BEGIN
PUSHBUTTON "Rename",IDC_RENAME_BUTTON,174,40,62,14 LTEXT "User language : ",IDC_LANGNAME_STATIC,0,3,63,8,0,WS_EX_RIGHT
PUSHBUTTON "Create New...",IDC_ADDNEW_BUTTON,34,40,62,14 COMBOBOX IDC_LANGNAME_COMBO,64,1,90,58,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Dock",IDC_DOCK_BUTTON,275,1,50,14,BS_FLAT
COMBOBOX IDC_LANGNAME_COMBO,71,23,95,58,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Remove",IDC_REMOVELANG_BUTTON,243,40,62,14
PUSHBUTTON "Save As...",IDC_SAVEAS_BUTTON,104,40,62,14
LTEXT "User language : ",IDC_LANGNAME_STATIC,5,24,63,8,0,WS_EX_RIGHT
EDITTEXT IDC_EXT_EDIT,291,23,33,14,ES_AUTOHSCROLL
RTEXT "Ext. :",IDC_EXT_STATIC,257,25,33,8,0,WS_EX_RIGHT
CONTROL "Transparency",IDC_UD_TRANSPARENT_CHECK,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,150,3,66,10 CONTROL "Transparency",IDC_UD_TRANSPARENT_CHECK,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,150,3,66,10
CONTROL "",IDC_UD_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,209,3,53,10 CONTROL "",IDC_UD_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,209,3,53,10
PUSHBUTTON "Dock",IDC_DOCK_BUTTON,275,1,50,14,BS_FLAT
PUSHBUTTON "Create New...",IDC_ADDNEW_BUTTON,34,20,62,14
PUSHBUTTON "Save As...",IDC_SAVEAS_BUTTON,104,20,62,14
CONTROL "Ignore case",IDC_LANGNAME_IGNORECASE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,175,24,76,10 CONTROL "Ignore case",IDC_LANGNAME_IGNORECASE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,175,24,76,10
RTEXT "Ext. :",IDC_EXT_STATIC,257,25,33,8,0,WS_EX_RIGHT
EDITTEXT IDC_EXT_EDIT,291,23,33,14,ES_AUTOHSCROLL
PUSHBUTTON "Import...",IDC_IMPORT_BUTTON,34,40,62,14
PUSHBUTTON "Export...",IDC_EXPORT_BUTTON,104,40,62,14
PUSHBUTTON "Rename",IDC_RENAME_BUTTON,174,40,62,14
PUSHBUTTON "Remove",IDC_REMOVELANG_BUTTON,243,40,62,14
END END
IDD_STRING_DLG DIALOGEX 0, 0, 151, 52 IDD_STRING_DLG DIALOGEX 0, 0, 151, 52

View File

@ -34,7 +34,8 @@
#define IDC_LANGNAME_IGNORECASE_CHECK (IDD_GLOBAL_USERDEFINE_DLG + 12) #define IDC_LANGNAME_IGNORECASE_CHECK (IDD_GLOBAL_USERDEFINE_DLG + 12)
#define IDC_AUTOCOMPLET_EDIT (IDD_GLOBAL_USERDEFINE_DLG + 13) #define IDC_AUTOCOMPLET_EDIT (IDD_GLOBAL_USERDEFINE_DLG + 13)
#define IDC_AUTOCOMPLET_STATIC (IDD_GLOBAL_USERDEFINE_DLG + 14) #define IDC_AUTOCOMPLET_STATIC (IDD_GLOBAL_USERDEFINE_DLG + 14)
#define IDC_IMPORT_BUTTON (IDD_GLOBAL_USERDEFINE_DLG + 15)
#define IDC_EXPORT_BUTTON (IDD_GLOBAL_USERDEFINE_DLG + 16)
#define IDD_FOLDER_STYLE_DLG 21000 #define IDD_FOLDER_STYLE_DLG 21000
#define IDC_DEFAULT (IDD_FOLDER_STYLE_DLG + 100) #define IDC_DEFAULT (IDD_FOLDER_STYLE_DLG + 100)