Remove ambiguous symbols (part 8)

Relace TCHAR, generic_string & TEXT("") par wchar_t, wstring & L"" respectively.
Follow up: 94af271

Close #15385
pull/15388/head
Don Ho 2024-07-01 18:09:29 +02:00
parent 88bd09e67d
commit dc5cea8947
14 changed files with 635 additions and 631 deletions

View File

@ -27,8 +27,8 @@
using namespace std; using namespace std;
const TCHAR * USERMSG = TEXT(" is not compatible with the current version of Notepad++.\n\n\ const wchar_t * USERMSG = L" is not compatible with the current version of Notepad++.\n\n\
Do you want to remove this plugin from the plugins directory to prevent this message from the next launch?"); Do you want to remove this plugin from the plugins directory to prevent this message from the next launch?";
bool PluginsManager::unloadPlugin(int index, HWND nppHandle) bool PluginsManager::unloadPlugin(int index, HWND nppHandle)
@ -45,20 +45,20 @@ bool PluginsManager::unloadPlugin(int index, HWND nppHandle)
if (::FreeLibrary(_pluginInfos[index]->_hLib)) if (::FreeLibrary(_pluginInfos[index]->_hLib))
{ {
_pluginInfos[index]->_hLib = nullptr; _pluginInfos[index]->_hLib = nullptr;
printStr(TEXT("we're good")); printStr(L"we're good");
} }
else else
printStr(TEXT("not ok")); printStr(L"not ok");
//delete _pluginInfos[index]; //delete _pluginInfos[index];
// printInt(index); // printInt(index);
//vector<PluginInfo *>::iterator it = _pluginInfos.begin() + index; //vector<PluginInfo *>::iterator it = _pluginInfos.begin() + index;
//_pluginInfos.erase(it); //_pluginInfos.erase(it);
//printStr(TEXT("remove")); //printStr(L"remove");
return true; return true;
} }
static WORD getBinaryArchitectureType(const TCHAR *filePath) static WORD getBinaryArchitectureType(const wchar_t *filePath)
{ {
HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
if (hFile == INVALID_HANDLE_VALUE) if (hFile == INVALID_HANDLE_VALUE)
@ -101,9 +101,9 @@ static WORD getBinaryArchitectureType(const TCHAR *filePath)
#define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000 #define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000
#endif #endif
int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath) int PluginsManager::loadPluginFromPath(const wchar_t *pluginFilePath)
{ {
const TCHAR *pluginFileName = ::PathFindFileName(pluginFilePath); const wchar_t *pluginFileName = ::PathFindFileName(pluginFilePath);
if (isInLoadedDlls(pluginFileName)) if (isInLoadedDlls(pluginFileName))
return 0; return 0;
@ -116,66 +116,66 @@ int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath)
int archType = nppParams.archType(); int archType = nppParams.archType();
if (getBinaryArchitectureType(pluginFilePath) != archType) if (getBinaryArchitectureType(pluginFilePath) != archType)
{ {
const TCHAR* archErrMsg = TEXT("Cannot load plugin."); const wchar_t* archErrMsg = L"Cannot load plugin.";
switch (archType) switch (archType)
{ {
case IMAGE_FILE_MACHINE_ARM64: case IMAGE_FILE_MACHINE_ARM64:
archErrMsg = TEXT("Cannot load ARM64 plugin."); archErrMsg = L"Cannot load ARM64 plugin.";
break; break;
case IMAGE_FILE_MACHINE_I386: case IMAGE_FILE_MACHINE_I386:
archErrMsg = TEXT("Cannot load 32-bit plugin."); archErrMsg = L"Cannot load 32-bit plugin.";
break; break;
case IMAGE_FILE_MACHINE_AMD64: case IMAGE_FILE_MACHINE_AMD64:
archErrMsg = TEXT("Cannot load 64-bit plugin."); archErrMsg = L"Cannot load 64-bit plugin.";
break; break;
} }
throw generic_string(archErrMsg); throw wstring(archErrMsg);
} }
const DWORD dwFlags = GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "AddDllDirectory") != NULL ? LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS : 0; const DWORD dwFlags = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "AddDllDirectory") != NULL ? LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS : 0;
pi->_hLib = ::LoadLibraryEx(pluginFilePath, NULL, dwFlags); pi->_hLib = ::LoadLibraryEx(pluginFilePath, NULL, dwFlags);
if (!pi->_hLib) if (!pi->_hLib)
{ {
generic_string lastErrorMsg = GetLastErrorAsString(); wstring lastErrorMsg = GetLastErrorAsString();
if (lastErrorMsg.empty()) if (lastErrorMsg.empty())
throw generic_string(TEXT("Load Library has failed.\nChanging the project's \"Runtime Library\" setting to \"Multi-threaded(/MT)\" might solve this problem.")); throw wstring(L"Load Library has failed.\nChanging the project's \"Runtime Library\" setting to \"Multi-threaded(/MT)\" might solve this problem.");
else else
throw generic_string(lastErrorMsg.c_str()); throw wstring(lastErrorMsg.c_str());
} }
pi->_pFuncIsUnicode = (PFUNCISUNICODE)GetProcAddress(pi->_hLib, "isUnicode"); pi->_pFuncIsUnicode = (PFUNCISUNICODE)GetProcAddress(pi->_hLib, "isUnicode");
if (!pi->_pFuncIsUnicode || !pi->_pFuncIsUnicode()) if (!pi->_pFuncIsUnicode || !pi->_pFuncIsUnicode())
throw generic_string(TEXT("This ANSI plugin is not compatible with your Unicode Notepad++.")); throw wstring(L"This ANSI plugin is not compatible with your Unicode Notepad++.");
pi->_pFuncSetInfo = (PFUNCSETINFO)GetProcAddress(pi->_hLib, "setInfo"); pi->_pFuncSetInfo = (PFUNCSETINFO)GetProcAddress(pi->_hLib, "setInfo");
if (!pi->_pFuncSetInfo) if (!pi->_pFuncSetInfo)
throw generic_string(TEXT("Missing \"setInfo\" function")); throw wstring(L"Missing \"setInfo\" function");
pi->_pFuncGetName = (PFUNCGETNAME)GetProcAddress(pi->_hLib, "getName"); pi->_pFuncGetName = (PFUNCGETNAME)GetProcAddress(pi->_hLib, "getName");
if (!pi->_pFuncGetName) if (!pi->_pFuncGetName)
throw generic_string(TEXT("Missing \"getName\" function")); throw wstring(L"Missing \"getName\" function");
pi->_funcName = pi->_pFuncGetName(); pi->_funcName = pi->_pFuncGetName();
pi->_pBeNotified = (PBENOTIFIED)GetProcAddress(pi->_hLib, "beNotified"); pi->_pBeNotified = (PBENOTIFIED)GetProcAddress(pi->_hLib, "beNotified");
if (!pi->_pBeNotified) if (!pi->_pBeNotified)
throw generic_string(TEXT("Missing \"beNotified\" function")); throw wstring(L"Missing \"beNotified\" function");
pi->_pMessageProc = (PMESSAGEPROC)GetProcAddress(pi->_hLib, "messageProc"); pi->_pMessageProc = (PMESSAGEPROC)GetProcAddress(pi->_hLib, "messageProc");
if (!pi->_pMessageProc) if (!pi->_pMessageProc)
throw generic_string(TEXT("Missing \"messageProc\" function")); throw wstring(L"Missing \"messageProc\" function");
pi->_pFuncSetInfo(_nppData); pi->_pFuncSetInfo(_nppData);
pi->_pFuncGetFuncsArray = (PFUNCGETFUNCSARRAY)GetProcAddress(pi->_hLib, "getFuncsArray"); pi->_pFuncGetFuncsArray = (PFUNCGETFUNCSARRAY)GetProcAddress(pi->_hLib, "getFuncsArray");
if (!pi->_pFuncGetFuncsArray) if (!pi->_pFuncGetFuncsArray)
throw generic_string(TEXT("Missing \"getFuncsArray\" function")); throw wstring(L"Missing \"getFuncsArray\" function");
pi->_funcItems = pi->_pFuncGetFuncsArray(&pi->_nbFuncItem); pi->_funcItems = pi->_pFuncGetFuncsArray(&pi->_nbFuncItem);
if ((!pi->_funcItems) || (pi->_nbFuncItem <= 0)) if ((!pi->_funcItems) || (pi->_nbFuncItem <= 0))
throw generic_string(TEXT("Missing \"FuncItems\" array, or the nb of Function Item is not set correctly")); throw wstring(L"Missing \"FuncItems\" array, or the nb of Function Item is not set correctly");
pi->_pluginMenu = ::CreateMenu(); pi->_pluginMenu = ::CreateMenu();
@ -185,27 +185,27 @@ int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath)
{ {
Lexilla::GetLexerNameFn GetLexerName = (Lexilla::GetLexerNameFn)::GetProcAddress(pi->_hLib, LEXILLA_GETLEXERNAME); Lexilla::GetLexerNameFn GetLexerName = (Lexilla::GetLexerNameFn)::GetProcAddress(pi->_hLib, LEXILLA_GETLEXERNAME);
if (!GetLexerName) if (!GetLexerName)
throw generic_string(TEXT("Loading GetLexerName function failed.")); throw wstring(L"Loading GetLexerName function failed.");
//Lexilla::GetLexerFactoryFn GetLexerFactory = (Lexilla::GetLexerFactoryFn)::GetProcAddress(pi->_hLib, LEXILLA_GETLEXERFACTORY); //Lexilla::GetLexerFactoryFn GetLexerFactory = (Lexilla::GetLexerFactoryFn)::GetProcAddress(pi->_hLib, LEXILLA_GETLEXERFACTORY);
//if (!GetLexerFactory) //if (!GetLexerFactory)
//throw generic_string(TEXT("Loading GetLexerFactory function failed.")); //throw wstring(L"Loading GetLexerFactory function failed.");
Lexilla::CreateLexerFn CreateLexer = (Lexilla::CreateLexerFn)::GetProcAddress(pi->_hLib, LEXILLA_CREATELEXER); Lexilla::CreateLexerFn CreateLexer = (Lexilla::CreateLexerFn)::GetProcAddress(pi->_hLib, LEXILLA_CREATELEXER);
if (!CreateLexer) if (!CreateLexer)
throw generic_string(TEXT("Loading CreateLexer function failed.")); throw wstring(L"Loading CreateLexer function failed.");
//Lexilla::GetLibraryPropertyNamesFn GetLibraryPropertyNames = (Lexilla::GetLibraryPropertyNamesFn)::GetProcAddress(pi->_hLib, LEXILLA_GETLIBRARYPROPERTYNAMES); //Lexilla::GetLibraryPropertyNamesFn GetLibraryPropertyNames = (Lexilla::GetLibraryPropertyNamesFn)::GetProcAddress(pi->_hLib, LEXILLA_GETLIBRARYPROPERTYNAMES);
//if (!GetLibraryPropertyNames) //if (!GetLibraryPropertyNames)
//throw generic_string(TEXT("Loading GetLibraryPropertyNames function failed.")); //throw wstring(L"Loading GetLibraryPropertyNames function failed.");
//Lexilla::SetLibraryPropertyFn SetLibraryProperty = (Lexilla::SetLibraryPropertyFn)::GetProcAddress(pi->_hLib, LEXILLA_SETLIBRARYPROPERTY); //Lexilla::SetLibraryPropertyFn SetLibraryProperty = (Lexilla::SetLibraryPropertyFn)::GetProcAddress(pi->_hLib, LEXILLA_SETLIBRARYPROPERTY);
//if (!SetLibraryProperty) //if (!SetLibraryProperty)
//throw generic_string(TEXT("Loading SetLibraryProperty function failed.")); //throw wstring(L"Loading SetLibraryProperty function failed.");
//Lexilla::GetNameSpaceFn GetNameSpace = (Lexilla::GetNameSpaceFn)::GetProcAddress(pi->_hLib, LEXILLA_GETNAMESPACE); //Lexilla::GetNameSpaceFn GetNameSpace = (Lexilla::GetNameSpaceFn)::GetProcAddress(pi->_hLib, LEXILLA_GETNAMESPACE);
//if (!GetNameSpace) //if (!GetNameSpace)
//throw generic_string(TEXT("Loading GetNameSpace function failed.")); //throw wstring(L"Loading GetNameSpace function failed.");
// Assign a buffer for the lexer name. // Assign a buffer for the lexer name.
char lexName[MAX_EXTERNAL_LEXER_NAME_LEN]; char lexName[MAX_EXTERNAL_LEXER_NAME_LEN];
@ -232,25 +232,25 @@ int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath)
} }
} }
TCHAR xmlPath[MAX_PATH]; wchar_t xmlPath[MAX_PATH];
wcscpy_s(xmlPath, nppParams.getNppPath().c_str()); wcscpy_s(xmlPath, nppParams.getNppPath().c_str());
PathAppend(xmlPath, TEXT("plugins\\Config")); PathAppend(xmlPath, L"plugins\\Config");
PathAppend(xmlPath, pi->_moduleName.c_str()); PathAppend(xmlPath, pi->_moduleName.c_str());
PathRemoveExtension(xmlPath); PathRemoveExtension(xmlPath);
PathAddExtension(xmlPath, TEXT(".xml")); PathAddExtension(xmlPath, L".xml");
if (!PathFileExists(xmlPath)) if (!PathFileExists(xmlPath))
{ {
lstrcpyn(xmlPath, TEXT("\0"), MAX_PATH ); lstrcpyn(xmlPath, L"\0", MAX_PATH );
wcscpy_s(xmlPath, nppParams.getAppDataNppDir() ); wcscpy_s(xmlPath, nppParams.getAppDataNppDir() );
PathAppend(xmlPath, TEXT("plugins\\Config")); PathAppend(xmlPath, L"plugins\\Config");
PathAppend(xmlPath, pi->_moduleName.c_str()); PathAppend(xmlPath, pi->_moduleName.c_str());
PathRemoveExtension( xmlPath ); PathRemoveExtension( xmlPath );
PathAddExtension( xmlPath, TEXT(".xml") ); PathAddExtension( xmlPath, L".xml" );
if (! PathFileExists( xmlPath ) ) if (! PathFileExists( xmlPath ) )
{ {
throw generic_string(generic_string(xmlPath) + TEXT(" is missing.")); throw wstring(wstring(xmlPath) + L" is missing.");
} }
} }
@ -260,7 +260,7 @@ int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath)
{ {
delete pXmlDoc; delete pXmlDoc;
pXmlDoc = NULL; pXmlDoc = NULL;
throw generic_string(generic_string(xmlPath) + TEXT(" failed to load.")); throw wstring(wstring(xmlPath) + L" failed to load.");
} }
for (int x = 0; x < numLexers; ++x) // postpone adding in case the xml is missing/corrupt for (int x = 0; x < numLexers; ++x) // postpone adding in case the xml is missing/corrupt
@ -287,14 +287,14 @@ int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath)
pluginExceptionAlert(pluginFileName, e); pluginExceptionAlert(pluginFileName, e);
return -1; return -1;
} }
catch (generic_string& s) catch (wstring& s)
{ {
if (pi && pi->_hLib) if (pi && pi->_hLib)
{ {
::FreeLibrary(pi->_hLib); ::FreeLibrary(pi->_hLib);
} }
s += TEXT("\n\n"); s += L"\n\n";
s += pluginFileName; s += pluginFileName;
s += USERMSG; s += USERMSG;
if (::MessageBox(_nppData._nppHandle, s.c_str(), pluginFilePath, MB_YESNO) == IDYES) if (::MessageBox(_nppData._nppHandle, s.c_str(), pluginFilePath, MB_YESNO) == IDYES)
@ -312,8 +312,8 @@ int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath)
::FreeLibrary(pi->_hLib); ::FreeLibrary(pi->_hLib);
} }
generic_string msg = TEXT("Failed to load"); wstring msg = L"Failed to load";
msg += TEXT("\n\n"); msg += L"\n\n";
msg += pluginFileName; msg += pluginFileName;
msg += USERMSG; msg += USERMSG;
if (::MessageBox(_nppData._nppHandle, msg.c_str(), pluginFilePath, MB_YESNO) == IDYES) if (::MessageBox(_nppData._nppHandle, msg.c_str(), pluginFilePath, MB_YESNO) == IDYES)
@ -325,17 +325,17 @@ int PluginsManager::loadPluginFromPath(const TCHAR *pluginFilePath)
} }
} }
bool PluginsManager::loadPlugins(const TCHAR* dir, const PluginViewList* pluginUpdateInfoList, PluginViewList* pluginIncompatibleList) bool PluginsManager::loadPlugins(const wchar_t* dir, const PluginViewList* pluginUpdateInfoList, PluginViewList* pluginIncompatibleList)
{ {
if (_isDisabled) if (_isDisabled)
return false; return false;
vector<generic_string> dllNames; vector<wstring> dllNames;
NppParameters& nppParams = NppParameters::getInstance(); NppParameters& nppParams = NppParameters::getInstance();
generic_string nppPath = nppParams.getNppPath(); wstring nppPath = nppParams.getNppPath();
generic_string pluginsFolder; wstring pluginsFolder;
if (dir && dir[0]) if (dir && dir[0])
{ {
pluginsFolder = dir; pluginsFolder = dir;
@ -343,34 +343,34 @@ bool PluginsManager::loadPlugins(const TCHAR* dir, const PluginViewList* pluginU
else else
{ {
pluginsFolder = nppPath; pluginsFolder = nppPath;
pathAppend(pluginsFolder, TEXT("plugins")); pathAppend(pluginsFolder, L"plugins");
} }
generic_string pluginsFolderFilter = pluginsFolder; wstring pluginsFolderFilter = pluginsFolder;
pathAppend(pluginsFolderFilter, TEXT("*.*")); pathAppend(pluginsFolderFilter, L"*.*");
WIN32_FIND_DATA foundData; WIN32_FIND_DATA foundData;
HANDLE hFindFolder = ::FindFirstFile(pluginsFolderFilter.c_str(), &foundData); HANDLE hFindFolder = ::FindFirstFile(pluginsFolderFilter.c_str(), &foundData);
HANDLE hFindDll = INVALID_HANDLE_VALUE; HANDLE hFindDll = INVALID_HANDLE_VALUE;
// Get Notepad++ current version // Get Notepad++ current version
TCHAR nppFullPathName[MAX_PATH]; wchar_t nppFullPathName[MAX_PATH];
GetModuleFileName(NULL, nppFullPathName, MAX_PATH); GetModuleFileName(NULL, nppFullPathName, MAX_PATH);
Version nppVer; Version nppVer;
nppVer.setVersionFrom(nppFullPathName); nppVer.setVersionFrom(nppFullPathName);
const TCHAR* incompatibleWarning = L"%s's version %s is not compatible to this version of Notepad++ (v%s).\r\nAs a result the plugin cannot be loaded."; const wchar_t* incompatibleWarning = L"%s's version %s is not compatible to this version of Notepad++ (v%s).\r\nAs a result the plugin cannot be loaded.";
const TCHAR* incompatibleWarningWithSolution = L"%s's version %s is not compatible to this version of Notepad++ (v%s).\r\nAs a result the plugin cannot be loaded.\r\n\r\nGo to Updates section and update your plugin to %s for solving the compatibility issue."; const wchar_t* incompatibleWarningWithSolution = L"%s's version %s is not compatible to this version of Notepad++ (v%s).\r\nAs a result the plugin cannot be loaded.\r\n\r\nGo to Updates section and update your plugin to %s for solving the compatibility issue.";
// get plugin folder // get plugin folder
if (hFindFolder != INVALID_HANDLE_VALUE && (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) if (hFindFolder != INVALID_HANDLE_VALUE && (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{ {
generic_string foundFileName = foundData.cFileName; wstring foundFileName = foundData.cFileName;
if (foundFileName != TEXT(".") && foundFileName != TEXT("..") && wcsicmp(foundFileName.c_str(), TEXT("Config")) != 0) if (foundFileName != L"." && foundFileName != L".." && wcsicmp(foundFileName.c_str(), L"Config") != 0)
{ {
generic_string pluginsFullPathFilter = pluginsFolder; wstring pluginsFullPathFilter = pluginsFolder;
pathAppend(pluginsFullPathFilter, foundFileName); pathAppend(pluginsFullPathFilter, foundFileName);
generic_string dllName = foundFileName; wstring dllName = foundFileName;
dllName += TEXT(".dll"); dllName += L".dll";
pathAppend(pluginsFullPathFilter, dllName); pathAppend(pluginsFullPathFilter, dllName);
// get plugin // get plugin
@ -401,7 +401,7 @@ bool PluginsManager::loadPlugins(const TCHAR* dir, const PluginViewList* pluginU
{ {
PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui); PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui);
incompatiblePlg->_version = v; incompatiblePlg->_version = v;
TCHAR msg[1024]; wchar_t msg[1024];
wsprintf(msg, incompatibleWarning, incompatiblePlg->_displayName.c_str(), v.toString().c_str(), nppVer.toString().c_str()); wsprintf(msg, incompatibleWarning, incompatiblePlg->_displayName.c_str(), v.toString().c_str(), nppVer.toString().c_str());
incompatiblePlg->_description = msg; incompatiblePlg->_description = msg;
pluginIncompatibleList->pushBack(incompatiblePlg); pluginIncompatibleList->pushBack(incompatiblePlg);
@ -419,7 +419,7 @@ bool PluginsManager::loadPlugins(const TCHAR* dir, const PluginViewList* pluginU
{ {
PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui); PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui);
incompatiblePlg->_version = v; incompatiblePlg->_version = v;
TCHAR msg[1024]; wchar_t msg[1024];
wsprintf(msg, incompatibleWarningWithSolution, incompatiblePlg->_displayName.c_str(), v.toString().c_str(), nppVer.toString().c_str(), pui->_version.toString().c_str()); wsprintf(msg, incompatibleWarningWithSolution, incompatiblePlg->_displayName.c_str(), v.toString().c_str(), nppVer.toString().c_str(), pui->_version.toString().c_str());
incompatiblePlg->_description = msg; incompatiblePlg->_description = msg;
pluginIncompatibleList->pushBack(incompatiblePlg); pluginIncompatibleList->pushBack(incompatiblePlg);
@ -436,14 +436,14 @@ bool PluginsManager::loadPlugins(const TCHAR* dir, const PluginViewList* pluginU
// get plugin folder // get plugin folder
while (::FindNextFile(hFindFolder, &foundData)) while (::FindNextFile(hFindFolder, &foundData))
{ {
generic_string foundFileName2 = foundData.cFileName; wstring foundFileName2 = foundData.cFileName;
if (foundFileName2 != TEXT(".") && foundFileName2 != TEXT("..") && wcsicmp(foundFileName2.c_str(), TEXT("Config")) != 0) if (foundFileName2 != L"." && foundFileName2 != L".." && wcsicmp(foundFileName2.c_str(), L"Config") != 0)
{ {
generic_string pluginsFullPathFilter2 = pluginsFolder; wstring pluginsFullPathFilter2 = pluginsFolder;
pathAppend(pluginsFullPathFilter2, foundFileName2); pathAppend(pluginsFullPathFilter2, foundFileName2);
generic_string pluginsFolderPath2 = pluginsFullPathFilter2; wstring pluginsFolderPath2 = pluginsFullPathFilter2;
generic_string dllName2 = foundFileName2; wstring dllName2 = foundFileName2;
dllName2 += TEXT(".dll"); dllName2 += L".dll";
pathAppend(pluginsFullPathFilter2, dllName2); pathAppend(pluginsFullPathFilter2, dllName2);
// get plugin // get plugin
@ -479,7 +479,7 @@ bool PluginsManager::loadPlugins(const TCHAR* dir, const PluginViewList* pluginU
{ {
PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui2); PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui2);
incompatiblePlg->_version = v2; incompatiblePlg->_version = v2;
TCHAR msg[1024]; wchar_t msg[1024];
wsprintf(msg, incompatibleWarning, incompatiblePlg->_displayName.c_str(), v2.toString().c_str(), nppVer.toString().c_str()); wsprintf(msg, incompatibleWarning, incompatiblePlg->_displayName.c_str(), v2.toString().c_str(), nppVer.toString().c_str());
incompatiblePlg->_description = msg; incompatiblePlg->_description = msg;
pluginIncompatibleList->pushBack(incompatiblePlg); pluginIncompatibleList->pushBack(incompatiblePlg);
@ -497,7 +497,7 @@ bool PluginsManager::loadPlugins(const TCHAR* dir, const PluginViewList* pluginU
{ {
PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui2); PluginUpdateInfo* incompatiblePlg = new PluginUpdateInfo(*pui2);
incompatiblePlg->_version = v2; incompatiblePlg->_version = v2;
TCHAR msg[1024]; wchar_t msg[1024];
wsprintf(msg, incompatibleWarningWithSolution, incompatiblePlg->_displayName.c_str(), v2.toString().c_str(), nppVer.toString().c_str(), pui2->_version.toString().c_str()); wsprintf(msg, incompatibleWarningWithSolution, incompatiblePlg->_displayName.c_str(), v2.toString().c_str(), nppVer.toString().c_str(), pui2->_version.toString().c_str());
incompatiblePlg->_description = msg; incompatiblePlg->_description = msg;
pluginIncompatibleList->pushBack(incompatiblePlg); pluginIncompatibleList->pushBack(incompatiblePlg);
@ -591,7 +591,7 @@ void PluginsManager::addInMenuFromPMIndex(int i)
{ {
if (_pluginInfos[i]->_funcItems[j]._pFunc == NULL) if (_pluginInfos[i]->_funcItems[j]._pFunc == NULL)
{ {
::InsertMenu(_pluginInfos[i]->_pluginMenu, j, MF_BYPOSITION | MF_SEPARATOR, 0, TEXT("")); ::InsertMenu(_pluginInfos[i]->_pluginMenu, j, MF_BYPOSITION | MF_SEPARATOR, 0, L"");
continue; continue;
} }
@ -633,12 +633,12 @@ HMENU PluginsManager::initMenu(HMENU hMenu, bool enablePluginAdmin)
int i = 1; int i = 1;
if (nbPlugin > 0) if (nbPlugin > 0)
::InsertMenu(_hPluginsMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, TEXT("")); ::InsertMenu(_hPluginsMenu, 0, MF_BYPOSITION | MF_SEPARATOR, 0, L"");
if (enablePluginAdmin) if (enablePluginAdmin)
{ {
::InsertMenu(_hPluginsMenu, i++, MF_BYPOSITION, IDM_SETTING_PLUGINADM, TEXT("Plugins Admin...")); ::InsertMenu(_hPluginsMenu, i++, MF_BYPOSITION, IDM_SETTING_PLUGINADM, L"Plugins Admin...");
::InsertMenu(_hPluginsMenu, i++, MF_BYPOSITION | MF_SEPARATOR, 0, TEXT("")); ::InsertMenu(_hPluginsMenu, i++, MF_BYPOSITION | MF_SEPARATOR, 0, L"");
} }
} }
@ -667,8 +667,8 @@ void PluginsManager::runPluginCommand(size_t i)
catch (...) catch (...)
{ {
constexpr size_t bufSize = 128; constexpr size_t bufSize = 128;
TCHAR funcInfo[bufSize] = { '\0' }; wchar_t funcInfo[bufSize] = { '\0' };
swprintf(funcInfo, bufSize, TEXT("runPluginCommand(size_t i : %zd)"), i); swprintf(funcInfo, bufSize, L"runPluginCommand(size_t i : %zd)", i);
pluginCrashAlert(_pluginsCommands[i]._pluginName.c_str(), funcInfo); pluginCrashAlert(_pluginsCommands[i]._pluginName.c_str(), funcInfo);
} }
} }
@ -676,7 +676,7 @@ void PluginsManager::runPluginCommand(size_t i)
} }
void PluginsManager::runPluginCommand(const TCHAR *pluginName, int commandID) void PluginsManager::runPluginCommand(const wchar_t *pluginName, int commandID)
{ {
for (size_t i = 0, len = _pluginsCommands.size() ; i < len ; ++i) for (size_t i = 0, len = _pluginsCommands.size() ; i < len ; ++i)
{ {
@ -695,8 +695,8 @@ void PluginsManager::runPluginCommand(const TCHAR *pluginName, int commandID)
catch (...) catch (...)
{ {
constexpr size_t bufSize = 128; constexpr size_t bufSize = 128;
TCHAR funcInfo[bufSize] = { '\0' }; wchar_t funcInfo[bufSize] = { '\0' };
swprintf(funcInfo, bufSize, TEXT("runPluginCommand(const TCHAR *pluginName : %s, int commandID : %d)"), pluginName, commandID); swprintf(funcInfo, bufSize, L"runPluginCommand(const wchar_t *pluginName : %s, int commandID : %d)", pluginName, commandID);
pluginCrashAlert(_pluginsCommands[i]._pluginName.c_str(), funcInfo); pluginCrashAlert(_pluginsCommands[i]._pluginName.c_str(), funcInfo);
} }
} }
@ -726,8 +726,8 @@ void PluginsManager::notify(size_t indexPluginInfo, const SCNotification *notifi
catch (...) catch (...)
{ {
constexpr size_t bufSize = 256; constexpr size_t bufSize = 256;
TCHAR funcInfo[bufSize] = { '\0' }; wchar_t funcInfo[bufSize] = { '\0' };
swprintf(funcInfo, bufSize, TEXT("notify(SCNotification *notification) : \r notification->nmhdr.code == %d\r notification->nmhdr.hwndFrom == %p\r notification->nmhdr.idFrom == %" PRIuPTR), \ swprintf(funcInfo, bufSize, L"notify(SCNotification *notification) : \r notification->nmhdr.code == %d\r notification->nmhdr.hwndFrom == %p\r notification->nmhdr.idFrom == %" PRIuPTR, \
scNotif.nmhdr.code, scNotif.nmhdr.hwndFrom, scNotif.nmhdr.idFrom); scNotif.nmhdr.code, scNotif.nmhdr.hwndFrom, scNotif.nmhdr.idFrom);
pluginCrashAlert(_pluginInfos[indexPluginInfo]->_moduleName.c_str(), funcInfo); pluginCrashAlert(_pluginInfos[indexPluginInfo]->_moduleName.c_str(), funcInfo);
} }
@ -765,8 +765,8 @@ void PluginsManager::relayNppMessages(UINT Message, WPARAM wParam, LPARAM lParam
catch (...) catch (...)
{ {
constexpr size_t bufSize = 128; constexpr size_t bufSize = 128;
TCHAR funcInfo[bufSize] = { '\0' }; wchar_t funcInfo[bufSize] = { '\0' };
swprintf(funcInfo, bufSize, TEXT("relayNppMessages(UINT Message : %u, WPARAM wParam : %" PRIuPTR ", LPARAM lParam : %" PRIiPTR ")"), Message, wParam, lParam); swprintf(funcInfo, bufSize, L"relayNppMessages(UINT Message : %u, WPARAM wParam : %" PRIuPTR ", LPARAM lParam : %" PRIiPTR ")", Message, wParam, lParam);
pluginCrashAlert(_pluginInfos[i]->_moduleName.c_str(), funcInfo); pluginCrashAlert(_pluginInfos[i]->_moduleName.c_str(), funcInfo);
} }
} }
@ -776,7 +776,7 @@ void PluginsManager::relayNppMessages(UINT Message, WPARAM wParam, LPARAM lParam
bool PluginsManager::relayPluginMessages(UINT Message, WPARAM wParam, LPARAM lParam) bool PluginsManager::relayPluginMessages(UINT Message, WPARAM wParam, LPARAM lParam)
{ {
const TCHAR * moduleName = (const TCHAR *)wParam; const wchar_t * moduleName = (const wchar_t *)wParam;
if (!moduleName || !moduleName[0] || !lParam) if (!moduleName || !moduleName[0] || !lParam)
return false; return false;
@ -797,8 +797,8 @@ bool PluginsManager::relayPluginMessages(UINT Message, WPARAM wParam, LPARAM lPa
catch (...) catch (...)
{ {
constexpr size_t bufSize = 128; constexpr size_t bufSize = 128;
TCHAR funcInfo[bufSize] = { '\0' }; wchar_t funcInfo[bufSize] = { '\0' };
swprintf(funcInfo, bufSize, TEXT("relayPluginMessages(UINT Message : %u, WPARAM wParam : %" PRIuPTR ", LPARAM lParam : %" PRIiPTR ")"), Message, wParam, lParam); swprintf(funcInfo, bufSize, L"relayPluginMessages(UINT Message : %u, WPARAM wParam : %" PRIuPTR ", LPARAM lParam : %" PRIiPTR ")", Message, wParam, lParam);
pluginCrashAlert(_pluginInfos[i]->_moduleName.c_str(), funcInfo); pluginCrashAlert(_pluginInfos[i]->_moduleName.c_str(), funcInfo);
} }
return true; return true;
@ -847,18 +847,18 @@ bool PluginsManager::allocateIndicator(int numberRequired, int* start)
return retVal; return retVal;
} }
generic_string PluginsManager::getLoadedPluginNames() const wstring PluginsManager::getLoadedPluginNames() const
{ {
generic_string pluginPaths; wstring pluginPaths;
PluginUpdateInfo pl; PluginUpdateInfo pl;
for (const auto &dll : _loadedDlls) for (const auto &dll : _loadedDlls)
{ {
pl = PluginUpdateInfo(dll._fullFilePath, dll._fileName); pl = PluginUpdateInfo(dll._fullFilePath, dll._fileName);
pluginPaths += TEXT("\r\n "); pluginPaths += L"\r\n ";
pluginPaths += dll._displayName; pluginPaths += dll._displayName;
pluginPaths += TEXT(" ("); pluginPaths += L" (";
pluginPaths += pl._version.toString(); pluginPaths += pl._version.toString();
pluginPaths += TEXT(")"); pluginPaths += L")";
} }
return pluginPaths; return pluginPaths;
} }

View File

@ -27,10 +27,10 @@ class PluginViewList;
struct PluginCommand struct PluginCommand
{ {
generic_string _pluginName; std::wstring _pluginName;
int _funcID = 0; int _funcID = 0;
PFUNCPLUGINCMD _pFunc = nullptr; PFUNCPLUGINCMD _pFunc = nullptr;
PluginCommand(const TCHAR *pluginName, int funcID, PFUNCPLUGINCMD pFunc): _pluginName(pluginName), _funcID(funcID), _pFunc(pFunc) {}; PluginCommand(const wchar_t *pluginName, int funcID, PFUNCPLUGINCMD pFunc): _pluginName(pluginName), _funcID(funcID), _pFunc(pFunc) {};
}; };
struct PluginInfo struct PluginInfo
@ -57,17 +57,17 @@ struct PluginInfo
FuncItem *_funcItems = nullptr; FuncItem *_funcItems = nullptr;
int _nbFuncItem = 0; int _nbFuncItem = 0;
generic_string _moduleName; std::wstring _moduleName;
generic_string _funcName; std::wstring _funcName;
}; };
struct LoadedDllInfo struct LoadedDllInfo
{ {
generic_string _fullFilePath; std::wstring _fullFilePath;
generic_string _fileName; std::wstring _fileName;
generic_string _displayName; std::wstring _displayName;
LoadedDllInfo(const generic_string & fullFilePath, const generic_string & fileName) : _fullFilePath(fullFilePath), _fileName(fileName) LoadedDllInfo(const std::wstring & fullFilePath, const std::wstring & fileName) : _fullFilePath(fullFilePath), _fileName(fileName)
{ {
// the plugin module's name, without '.dll' // the plugin module's name, without '.dll'
_displayName = fileName.substr(0, fileName.find_last_of('.')); _displayName = fileName.substr(0, fileName.find_last_of('.'));
@ -92,12 +92,12 @@ public:
_nppData = nppData; _nppData = nppData;
} }
bool loadPlugins(const TCHAR *dir = NULL, const PluginViewList* pluginUpdateInfoList = nullptr, PluginViewList* pluginImcompatibleList = nullptr); bool loadPlugins(const wchar_t *dir = NULL, const PluginViewList* pluginUpdateInfoList = nullptr, PluginViewList* pluginImcompatibleList = nullptr);
bool unloadPlugin(int index, HWND nppHandle); bool unloadPlugin(int index, HWND nppHandle);
void runPluginCommand(size_t i); void runPluginCommand(size_t i);
void runPluginCommand(const TCHAR *pluginName, int commandID); void runPluginCommand(const wchar_t *pluginName, int commandID);
void addInMenuFromPMIndex(int i); void addInMenuFromPMIndex(int i);
HMENU initMenu(HMENU hMenu, bool enablePluginAdmin = false); HMENU initMenu(HMENU hMenu, bool enablePluginAdmin = false);
@ -119,7 +119,7 @@ public:
bool allocateMarker(int numberRequired, int* start); bool allocateMarker(int numberRequired, int* start);
bool allocateIndicator(int numberRequired, int* start); bool allocateIndicator(int numberRequired, int* start);
generic_string getLoadedPluginNames() const; std::wstring getLoadedPluginNames() const;
private: private:
NppData _nppData; NppData _nppData;
@ -134,32 +134,32 @@ private:
IDAllocator _indicatorAlloc; IDAllocator _indicatorAlloc;
bool _noMoreNotification = false; bool _noMoreNotification = false;
int loadPluginFromPath(const TCHAR* pluginFilePath); int loadPluginFromPath(const wchar_t* pluginFilePath);
void pluginCrashAlert(const TCHAR *pluginName, const TCHAR *funcSignature) { void pluginCrashAlert(const wchar_t *pluginName, const wchar_t *funcSignature) {
generic_string msg = pluginName; std::wstring msg = pluginName;
msg += TEXT(" just crashed in\r"); msg += L" just crashed in\r";
msg += funcSignature; msg += funcSignature;
::MessageBox(NULL, msg.c_str(), TEXT("Plugin Crash"), MB_OK|MB_ICONSTOP); ::MessageBox(NULL, msg.c_str(), L"Plugin Crash", MB_OK|MB_ICONSTOP);
} }
void pluginExceptionAlert(const TCHAR *pluginName, const std::exception& e) { void pluginExceptionAlert(const wchar_t *pluginName, const std::exception& e) {
generic_string msg = TEXT("An exception occurred due to plugin: "); std::wstring msg = L"An exception occurred due to plugin: ";
msg += pluginName; msg += pluginName;
msg += TEXT("\r\n\r\nException reason: "); msg += L"\r\n\r\nException reason: ";
msg += s2ws(e.what()); msg += s2ws(e.what());
::MessageBox(NULL, msg.c_str(), TEXT("Plugin Exception"), MB_OK); ::MessageBox(NULL, msg.c_str(), L"Plugin Exception", MB_OK);
} }
bool isInLoadedDlls(const TCHAR *fn) const { bool isInLoadedDlls(const wchar_t *fn) const {
for (size_t i = 0; i < _loadedDlls.size(); ++i) for (size_t i = 0; i < _loadedDlls.size(); ++i)
if (wcsicmp(fn, _loadedDlls[i]._fileName.c_str()) == 0) if (wcsicmp(fn, _loadedDlls[i]._fileName.c_str()) == 0)
return true; return true;
return false; return false;
} }
void addInLoadedDlls(const TCHAR *fullPath, const TCHAR *fn) { void addInLoadedDlls(const wchar_t *fullPath, const wchar_t *fn) {
_loadedDlls.push_back(LoadedDllInfo(fullPath, fn)); _loadedDlls.push_back(LoadedDllInfo(fullPath, fn));
} }
}; };

View File

@ -252,7 +252,7 @@ using namespace std;
constexpr size_t tagMaxLen = 256; constexpr size_t tagMaxLen = 256;
static bool isInList(const generic_string& word, const vector<generic_string> & wordArray) static bool isInList(const wstring& word, const vector<wstring> & wordArray)
{ {
for (size_t i = 0, len = wordArray.size(); i < len; ++i) for (size_t i = 0, len = wordArray.size(); i < len; ++i)
if (wordArray[i] == word) if (wordArray[i] == word)
@ -260,7 +260,7 @@ static bool isInList(const generic_string& word, const vector<generic_string> &
return false; return false;
} }
static bool isAllDigits(const generic_string &str) static bool isAllDigits(const wstring &str)
{ {
for (const auto& i : str) for (const auto& i : str)
{ {
@ -270,12 +270,12 @@ static bool isAllDigits(const generic_string &str)
return true; return true;
} }
static void sortInsensitive(vector<generic_string> &wordArray) static void sortInsensitive(vector<wstring> &wordArray)
{ {
sort( sort(
wordArray.begin(), wordArray.begin(),
wordArray.end(), wordArray.end(),
[](const generic_string &a, const generic_string &b) [](const wstring &a, const wstring &b)
{ {
return lexicographical_compare( return lexicographical_compare(
a.begin(), a.end(), a.begin(), a.end(),
@ -305,7 +305,7 @@ bool AutoCompletion::showAutoComplete(AutocompleteType autocType, bool autoInser
size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos); size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos);
generic_string words; wstring words;
if (autocType == autocFunc) if (autocType == autocFunc)
{ {
@ -324,16 +324,16 @@ bool AutoCompletion::showAutoComplete(AutocompleteType autocType, bool autoInser
if (lena >= bufSize) if (lena >= bufSize)
return false; return false;
TCHAR beginChars[bufSize]; wchar_t beginChars[bufSize];
_pEditView->getGenericText(beginChars, bufSize, startPos, curPos); _pEditView->getGenericText(beginChars, bufSize, startPos, curPos);
// Get word array containing all words beginning with beginChars, excluding word equal to allChars // Get word array containing all words beginning with beginChars, excluding word equal to allChars
vector<generic_string> wordArray; vector<wstring> wordArray;
if (autocType == autocWord || autocType == autocFuncAndWord) if (autocType == autocWord || autocType == autocFuncAndWord)
{ {
TCHAR allChars[bufSize]; wchar_t allChars[bufSize];
_pEditView->getGenericText(allChars, bufSize, startPos, endPos); _pEditView->getGenericText(allChars, bufSize, startPos, endPos);
getWordArray(wordArray, beginChars, allChars); getWordArray(wordArray, beginChars, allChars);
} }
@ -349,7 +349,7 @@ bool AutoCompletion::showAutoComplete(AutocompleteType autocType, bool autoInser
if (_ignoreCase) if (_ignoreCase)
{ {
generic_string kwSufix = _keyWordArray[i].substr(0, len); wstring kwSufix = _keyWordArray[i].substr(0, len);
compareResult = wcsicmp(beginChars, kwSufix.c_str()); compareResult = wcsicmp(beginChars, kwSufix.c_str());
} }
else else
@ -399,7 +399,7 @@ bool AutoCompletion::showAutoComplete(AutocompleteType autocType, bool autoInser
{ {
words += wordArray[i]; words += wordArray[i];
if (i != wordArrayLen - 1) if (i != wordArrayLen - 1)
words += TEXT(" "); words += L" ";
} }
} }
@ -451,7 +451,7 @@ bool AutoCompletion::showApiAndWordComplete()
return showAutoComplete(autocFuncAndWord, false); return showAutoComplete(autocFuncAndWord, false);
} }
void AutoCompletion::getWordArray(vector<generic_string> & wordArray, TCHAR *beginChars, TCHAR *allChars) void AutoCompletion::getWordArray(vector<wstring> & wordArray, wchar_t *beginChars, wchar_t *allChars)
{ {
const size_t bufSize = 256; const size_t bufSize = 256;
const NppGUI & nppGUI = NppParameters::getInstance().getNppGUI(); const NppGUI & nppGUI = NppParameters::getInstance().getNppGUI();
@ -459,9 +459,9 @@ void AutoCompletion::getWordArray(vector<generic_string> & wordArray, TCHAR *beg
if (nppGUI._autocIgnoreNumbers && isAllDigits(beginChars)) if (nppGUI._autocIgnoreNumbers && isAllDigits(beginChars))
return; return;
generic_string expr(TEXT("\\<")); wstring expr(L"\\<");
expr += beginChars; expr += beginChars;
expr += TEXT("[^ \\t\\n\\r.,;:\"(){}=<>'+!?\\[\\]]+"); expr += L"[^ \\t\\n\\r.,;:\"(){}=<>'+!?\\[\\]]+";
size_t docLength = _pEditView->execute(SCI_GETLENGTH); size_t docLength = _pEditView->execute(SCI_GETLENGTH);
@ -473,8 +473,8 @@ void AutoCompletion::getWordArray(vector<generic_string> & wordArray, TCHAR *beg
_pEditView->execute(SCI_SETSEARCHFLAGS, flags); _pEditView->execute(SCI_SETSEARCHFLAGS, flags);
intptr_t posFind = _pEditView->searchInTarget(expr.c_str(), expr.length(), 0, docLength); intptr_t posFind = _pEditView->searchInTarget(expr.c_str(), expr.length(), 0, docLength);
generic_string boxId = TEXT("\x1E") + intToString(BOX_IMG_ID); wstring boxId = L"\x1E" + intToString(BOX_IMG_ID);
generic_string funcId = TEXT("\x1E") + intToString(FUNC_IMG_ID); wstring funcId = L"\x1E" + intToString(FUNC_IMG_ID);
while (posFind >= 0) while (posFind >= 0)
{ {
@ -484,7 +484,7 @@ void AutoCompletion::getWordArray(vector<generic_string> & wordArray, TCHAR *beg
size_t foundTextLen = wordEnd - wordStart; size_t foundTextLen = wordEnd - wordStart;
if (foundTextLen < bufSize) if (foundTextLen < bufSize)
{ {
TCHAR w[bufSize]; wchar_t w[bufSize];
_pEditView->getGenericText(w, bufSize, wordStart, wordEnd); _pEditView->getGenericText(w, bufSize, wordStart, wordEnd);
if (!allChars || (wcsncmp(w, allChars, bufSize) != 0)) if (!allChars || (wcsncmp(w, allChars, bufSize) != 0))
{ {
@ -516,7 +516,7 @@ void AutoCompletion::getWordArray(vector<generic_string> & wordArray, TCHAR *beg
} }
} }
static generic_string addTrailingSlash(const generic_string& path) static wstring addTrailingSlash(const wstring& path)
{ {
if (path.length() >=1 && path[path.length() - 1] == '\\') if (path.length() >=1 && path[path.length() - 1] == '\\')
return path; return path;
@ -524,7 +524,7 @@ static generic_string addTrailingSlash(const generic_string& path)
return path + L"\\"; return path + L"\\";
} }
static generic_string removeTrailingSlash(const generic_string& path) static wstring removeTrailingSlash(const wstring& path)
{ {
if (path.length() >= 1 && path[path.length() - 1] == '\\') if (path.length() >= 1 && path[path.length() - 1] == '\\')
return path.substr(0, path.length() - 1); return path.substr(0, path.length() - 1);
@ -532,25 +532,25 @@ static generic_string removeTrailingSlash(const generic_string& path)
return path; return path;
} }
static bool isDirectory(const generic_string& path) static bool isDirectory(const wstring& path)
{ {
DWORD type = ::GetFileAttributes(path.c_str()); DWORD type = ::GetFileAttributes(path.c_str());
return type != INVALID_FILE_ATTRIBUTES && (type & FILE_ATTRIBUTE_DIRECTORY); return type != INVALID_FILE_ATTRIBUTES && (type & FILE_ATTRIBUTE_DIRECTORY);
} }
static bool isFile(const generic_string& path) static bool isFile(const wstring& path)
{ {
DWORD type = ::GetFileAttributes(path.c_str()); DWORD type = ::GetFileAttributes(path.c_str());
return type != INVALID_FILE_ATTRIBUTES && ! (type & FILE_ATTRIBUTE_DIRECTORY); return type != INVALID_FILE_ATTRIBUTES && ! (type & FILE_ATTRIBUTE_DIRECTORY);
} }
static bool isAllowedBeforeDriveLetter(TCHAR c) static bool isAllowedBeforeDriveLetter(wchar_t c)
{ {
locale loc; locale loc;
return c == '\'' || c == '"' || c == '(' || std::isspace(c, loc); return c == '\'' || c == '"' || c == '(' || std::isspace(c, loc);
} }
static bool getRawPath(const generic_string& input, generic_string &rawPath_out) static bool getRawPath(const wstring& input, wstring &rawPath_out)
{ {
// Try to find a path in the given input. // Try to find a path in the given input.
// Algorithm: look for a colon. The colon must be preceded by an alphabetic character. // Algorithm: look for a colon. The colon must be preceded by an alphabetic character.
@ -571,9 +571,9 @@ static bool getRawPath(const generic_string& input, generic_string &rawPath_out)
return true; return true;
} }
static bool getPathsForPathCompletion(const generic_string& input, generic_string &rawPath_out, generic_string &pathToMatch_out) static bool getPathsForPathCompletion(const wstring& input, wstring &rawPath_out, wstring &pathToMatch_out)
{ {
generic_string rawPath; wstring rawPath;
if (! getRawPath(input, rawPath)) if (! getRawPath(input, rawPath))
{ {
return false; return false;
@ -605,10 +605,10 @@ static bool getPathsForPathCompletion(const generic_string& input, generic_strin
void AutoCompletion::showPathCompletion() void AutoCompletion::showPathCompletion()
{ {
// Get current line (at most MAX_PATH characters "backwards" from current caret). // Get current line (at most MAX_PATH characters "backwards" from current caret).
generic_string currentLine; wstring currentLine;
{ {
const intptr_t bufSize = MAX_PATH; const intptr_t bufSize = MAX_PATH;
TCHAR buf[bufSize + 1] = { '\0' }; wchar_t buf[bufSize + 1] = { '\0' };
const intptr_t currentPos = _pEditView->execute(SCI_GETCURRENTPOS); const intptr_t currentPos = _pEditView->execute(SCI_GETCURRENTPOS);
const auto startPos = std::max<intptr_t>(0, currentPos - bufSize); const auto startPos = std::max<intptr_t>(0, currentPos - bufSize);
_pEditView->getGenericText(buf, bufSize + 1, startPos, currentPos); _pEditView->getGenericText(buf, bufSize + 1, startPos, currentPos);
@ -623,17 +623,17 @@ void AutoCompletion::showPathCompletion()
For instance: the user wants to autocomplete "C:\Wind", and assuming that no such directory For instance: the user wants to autocomplete "C:\Wind", and assuming that no such directory
exists, this means we should list all files and directories in C:. exists, this means we should list all files and directories in C:.
*/ */
generic_string rawPath, pathToMatch; wstring rawPath, pathToMatch;
if (! getPathsForPathCompletion(currentLine, rawPath, pathToMatch)) if (! getPathsForPathCompletion(currentLine, rawPath, pathToMatch))
return; return;
// Get all files and directories in the path. // Get all files and directories in the path.
generic_string autoCompleteEntries; wstring autoCompleteEntries;
{ {
HANDLE hFind; HANDLE hFind;
WIN32_FIND_DATA data; WIN32_FIND_DATA data;
generic_string pathToMatchPlusSlash = addTrailingSlash(pathToMatch); wstring pathToMatchPlusSlash = addTrailingSlash(pathToMatch);
generic_string searchString = pathToMatchPlusSlash + TEXT("*.*"); wstring searchString = pathToMatchPlusSlash + L"*.*";
hFind = ::FindFirstFile(searchString.c_str(), &data); hFind = ::FindFirstFile(searchString.c_str(), &data);
if (hFind != INVALID_HANDLE_VALUE) if (hFind != INVALID_HANDLE_VALUE)
{ {
@ -646,16 +646,16 @@ void AutoCompletion::showPathCompletion()
if (++counter > maxEntries) if (++counter > maxEntries)
break; break;
if (generic_string(data.cFileName) == TEXT(".") || generic_string(data.cFileName) == TEXT("..")) if (wstring(data.cFileName) == L"." || wstring(data.cFileName) == L"..")
continue; continue;
if (! autoCompleteEntries.empty()) if (! autoCompleteEntries.empty())
autoCompleteEntries += TEXT("\n"); autoCompleteEntries += L"\n";
autoCompleteEntries += pathToMatchPlusSlash; autoCompleteEntries += pathToMatchPlusSlash;
autoCompleteEntries += data.cFileName; autoCompleteEntries += data.cFileName;
if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // If directory, add trailing slash. if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // If directory, add trailing slash.
autoCompleteEntries += TEXT("\\"); autoCompleteEntries += L"\\";
} while (::FindNextFile(hFind, &data)); } while (::FindNextFile(hFind, &data));
::FindClose(hFind); ::FindClose(hFind);
@ -712,7 +712,7 @@ void AutoCompletion::getCloseTag(char *closeTag, size_t closeTagSize, size_t car
int flags = SCFIND_REGEXP | SCFIND_POSIX; int flags = SCFIND_REGEXP | SCFIND_POSIX;
_pEditView->execute(SCI_SETSEARCHFLAGS, flags); _pEditView->execute(SCI_SETSEARCHFLAGS, flags);
TCHAR tag2find[] = TEXT("<[^\\s>]*"); wchar_t tag2find[] = L"<[^\\s>]*";
intptr_t targetStart = _pEditView->searchInTarget(tag2find, lstrlen(tag2find), caretPos, 0); intptr_t targetStart = _pEditView->searchInTarget(tag2find, lstrlen(tag2find), caretPos, 0);
@ -1047,7 +1047,7 @@ void AutoCompletion::update(int character)
return; return;
const int wordSize = 64; const int wordSize = 64;
TCHAR s[wordSize]; wchar_t s[wordSize];
_pEditView->getWordToCurrentPos(s, wordSize); _pEditView->getWordToCurrentPos(s, wordSize);
if (lstrlen(s) >= int(nppGUI._autocFromLen)) if (lstrlen(s) >= int(nppGUI._autocFromLen))
@ -1086,12 +1086,12 @@ bool AutoCompletion::setLanguage(LangType language)
_curLang = language; _curLang = language;
TCHAR path[MAX_PATH]; wchar_t path[MAX_PATH];
::GetModuleFileName(NULL, path, MAX_PATH); ::GetModuleFileName(NULL, path, MAX_PATH);
PathRemoveFileSpec(path); PathRemoveFileSpec(path);
wcscat_s(path, TEXT("\\autoCompletion\\")); wcscat_s(path, L"\\autoCompletion\\");
wcscat_s(path, getApiFileName()); wcscat_s(path, getApiFileName());
wcscat_s(path, TEXT(".xml")); wcscat_s(path, L".xml");
if (_pXmlFile) if (_pXmlFile)
delete _pXmlFile; delete _pXmlFile;
@ -1103,13 +1103,13 @@ bool AutoCompletion::setLanguage(LangType language)
if (_funcCompletionActive) if (_funcCompletionActive)
{ {
_funcCompletionActive = false; //safety _funcCompletionActive = false; //safety
TiXmlNode * pNode = _pXmlFile->FirstChild(TEXT("NotepadPlus")); TiXmlNode * pNode = _pXmlFile->FirstChild(L"NotepadPlus");
if (!pNode) if (!pNode)
return false; return false;
pAutoNode = pNode = pNode->FirstChildElement(TEXT("AutoComplete")); pAutoNode = pNode = pNode->FirstChildElement(L"AutoComplete");
if (!pNode) if (!pNode)
return false; return false;
pNode = pNode->FirstChildElement(TEXT("KeyWord")); pNode = pNode->FirstChildElement(L"KeyWord");
if (!pNode) if (!pNode)
return false; return false;
_pXmlKeyword = reinterpret_cast<TiXmlElement *>(pNode); _pXmlKeyword = reinterpret_cast<TiXmlElement *>(pNode);
@ -1129,29 +1129,29 @@ bool AutoCompletion::setLanguage(LangType language)
_funcCalltip._ignoreCase = true; _funcCalltip._ignoreCase = true;
_funcCalltip._additionalWordChar.clear(); _funcCalltip._additionalWordChar.clear();
TiXmlElement * pElem = pAutoNode->FirstChildElement(TEXT("Environment")); TiXmlElement * pElem = pAutoNode->FirstChildElement(L"Environment");
if (pElem) if (pElem)
{ {
const TCHAR * val = 0; const wchar_t * val = 0;
val = pElem->Attribute(TEXT("ignoreCase")); val = pElem->Attribute(L"ignoreCase");
if (val && !lstrcmp(val, TEXT("no"))) if (val && !lstrcmp(val, L"no"))
{ {
_ignoreCase = false; _ignoreCase = false;
_funcCalltip._ignoreCase = false; _funcCalltip._ignoreCase = false;
} }
val = pElem->Attribute(TEXT("startFunc")); val = pElem->Attribute(L"startFunc");
if (val && val[0]) if (val && val[0])
_funcCalltip._start = val[0]; _funcCalltip._start = val[0];
val = pElem->Attribute(TEXT("stopFunc")); val = pElem->Attribute(L"stopFunc");
if (val && val[0]) if (val && val[0])
_funcCalltip._stop = val[0]; _funcCalltip._stop = val[0];
val = pElem->Attribute(TEXT("paramSeparator")); val = pElem->Attribute(L"paramSeparator");
if (val && val[0]) if (val && val[0])
_funcCalltip._param = val[0]; _funcCalltip._param = val[0];
val = pElem->Attribute(TEXT("terminal")); val = pElem->Attribute(L"terminal");
if (val && val[0]) if (val && val[0])
_funcCalltip._terminal = val[0]; _funcCalltip._terminal = val[0];
val = pElem->Attribute(TEXT("additionalWordChar")); val = pElem->Attribute(L"additionalWordChar");
if (val && val[0]) if (val && val[0])
_funcCalltip._additionalWordChar = val; _funcCalltip._additionalWordChar = val;
} }
@ -1175,18 +1175,18 @@ bool AutoCompletion::setLanguage(LangType language)
//Iterate through all keywords //Iterate through all keywords
TiXmlElement *funcNode = _pXmlKeyword; TiXmlElement *funcNode = _pXmlKeyword;
for (; funcNode; funcNode = funcNode->NextSiblingElement(TEXT("KeyWord")) ) for (; funcNode; funcNode = funcNode->NextSiblingElement(L"KeyWord") )
{ {
const TCHAR *name = funcNode->Attribute(TEXT("name")); const wchar_t *name = funcNode->Attribute(L"name");
if (name) if (name)
{ {
size_t len = lstrlen(name); size_t len = lstrlen(name);
if (len) if (len)
{ {
generic_string word = name; wstring word = name;
generic_string imgid = TEXT("\x1E"); wstring imgid = L"\x1E";
const TCHAR *func = funcNode->Attribute(TEXT("func")); const wchar_t *func = funcNode->Attribute(L"func");
if (func && !lstrcmp(func, TEXT("yes"))) if (func && !lstrcmp(func, L"yes"))
imgid += intToString(FUNC_IMG_ID); imgid += intToString(FUNC_IMG_ID);
else else
imgid += intToString(BOX_IMG_ID); imgid += intToString(BOX_IMG_ID);
@ -1206,13 +1206,13 @@ bool AutoCompletion::setLanguage(LangType language)
for (size_t i = 0, len = _keyWordArray.size(); i < len; ++i) for (size_t i = 0, len = _keyWordArray.size(); i < len; ++i)
{ {
_keyWords.append(_keyWordArray[i]); _keyWords.append(_keyWordArray[i]);
_keyWords.append(TEXT(" ")); _keyWords.append(L" ");
} }
} }
return _funcCompletionActive; return _funcCompletionActive;
} }
const TCHAR * AutoCompletion::getApiFileName() const wchar_t * AutoCompletion::getApiFileName()
{ {
if (_curLang == L_USER) if (_curLang == L_USER)
{ {

View File

@ -106,14 +106,14 @@ private:
bool _ignoreCase = true; bool _ignoreCase = true;
std::vector<generic_string> _keyWordArray; std::vector<std::wstring> _keyWordArray;
generic_string _keyWords; std::wstring _keyWords;
size_t _keyWordMaxLen = 0; size_t _keyWordMaxLen = 0;
FunctionCallTip _funcCalltip; FunctionCallTip _funcCalltip;
const TCHAR * getApiFileName(); const wchar_t * getApiFileName();
void getWordArray(std::vector<generic_string> & wordArray, TCHAR *beginChars, TCHAR *excludeChars); void getWordArray(std::vector<std::wstring> & wordArray, wchar_t *beginChars, wchar_t *excludeChars);
// Type of autocomplete function // Type of autocomplete function
enum AutocompleteType { enum AutocompleteType {

View File

@ -52,7 +52,7 @@ FunctionListPanel::~FunctionListPanel()
_iconListVector.clear(); _iconListVector.clear();
} }
void FunctionListPanel::addEntry(const TCHAR *nodeName, const TCHAR *displayText, size_t pos) void FunctionListPanel::addEntry(const wchar_t *nodeName, const wchar_t *displayText, size_t pos)
{ {
HTREEITEM itemParent = NULL; HTREEITEM itemParent = NULL;
std::wstring posStr = std::to_wstring(pos); std::wstring posStr = std::to_wstring(pos);
@ -64,7 +64,7 @@ void FunctionListPanel::addEntry(const TCHAR *nodeName, const TCHAR *displayText
itemParent = _treeView.searchSubItemByName(nodeName, root); itemParent = _treeView.searchSubItemByName(nodeName, root);
if (!itemParent) if (!itemParent)
{ {
generic_string* invalidValueStr = new generic_string(posStr); wstring* invalidValueStr = new wstring(posStr);
_posStrs.push_back(invalidValueStr); _posStrs.push_back(invalidValueStr);
LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr); LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr);
@ -74,7 +74,7 @@ void FunctionListPanel::addEntry(const TCHAR *nodeName, const TCHAR *displayText
else else
itemParent = root; itemParent = root;
generic_string* posString = new generic_string(posStr); wstring* posString = new wstring(posStr);
_posStrs.push_back(posString); _posStrs.push_back(posString);
LPARAM lParamPosStr = reinterpret_cast<LPARAM>(posString); LPARAM lParamPosStr = reinterpret_cast<LPARAM>(posString);
@ -87,7 +87,7 @@ void FunctionListPanel::removeAllEntries()
} }
// bodyOpenSybe mbol & bodyCloseSymbol should be RE // bodyOpenSybe mbol & bodyCloseSymbol should be RE
size_t FunctionListPanel::getBodyClosePos(size_t begin, const TCHAR *bodyOpenSymbol, const TCHAR *bodyCloseSymbol) size_t FunctionListPanel::getBodyClosePos(size_t begin, const wchar_t *bodyOpenSymbol, const wchar_t *bodyCloseSymbol)
{ {
size_t cntOpen = 1; size_t cntOpen = 1;
@ -96,11 +96,11 @@ size_t FunctionListPanel::getBodyClosePos(size_t begin, const TCHAR *bodyOpenSym
if (begin >= docLen) if (begin >= docLen)
return docLen; return docLen;
generic_string exprToSearch = TEXT("("); wstring exprToSearch = L"(";
exprToSearch += bodyOpenSymbol; exprToSearch += bodyOpenSymbol;
exprToSearch += TEXT("|"); exprToSearch += L"|";
exprToSearch += bodyCloseSymbol; exprToSearch += bodyCloseSymbol;
exprToSearch += TEXT(")"); exprToSearch += L")";
int flags = SCFIND_REGEXP | SCFIND_POSIX; int flags = SCFIND_REGEXP | SCFIND_POSIX;
@ -139,27 +139,27 @@ size_t FunctionListPanel::getBodyClosePos(size_t begin, const TCHAR *bodyOpenSym
return targetEnd; return targetEnd;
} }
generic_string FunctionListPanel::parseSubLevel(size_t begin, size_t end, std::vector< generic_string > dataToSearch, intptr_t& foundPos) wstring FunctionListPanel::parseSubLevel(size_t begin, size_t end, std::vector< wstring > dataToSearch, intptr_t& foundPos)
{ {
if (begin >= end) if (begin >= end)
{ {
foundPos = -1; foundPos = -1;
return TEXT(""); return L"";
} }
if (!dataToSearch.size()) if (!dataToSearch.size())
return TEXT(""); return L"";
int flags = SCFIND_REGEXP | SCFIND_POSIX; int flags = SCFIND_REGEXP | SCFIND_POSIX;
(*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags);
const TCHAR *regExpr2search = dataToSearch[0].c_str(); const wchar_t *regExpr2search = dataToSearch[0].c_str();
intptr_t targetStart = (*_ppEditView)->searchInTarget(regExpr2search, lstrlen(regExpr2search), begin, end); intptr_t targetStart = (*_ppEditView)->searchInTarget(regExpr2search, lstrlen(regExpr2search), begin, end);
if (targetStart < 0) if (targetStart < 0)
{ {
foundPos = -1; foundPos = -1;
return TEXT(""); return L"";
} }
intptr_t targetEnd = (*_ppEditView)->execute(SCI_GETTARGETEND); intptr_t targetEnd = (*_ppEditView)->execute(SCI_GETTARGETEND);
@ -170,7 +170,7 @@ generic_string FunctionListPanel::parseSubLevel(size_t begin, size_t end, std::v
} }
else // only one processed element, so we conclude the result else // only one processed element, so we conclude the result
{ {
TCHAR foundStr[1024]{}; wchar_t foundStr[1024]{};
(*_ppEditView)->getGenericText(foundStr, 1024, targetStart, targetEnd); (*_ppEditView)->getGenericText(foundStr, 1024, targetStart, targetEnd);
@ -179,7 +179,7 @@ generic_string FunctionListPanel::parseSubLevel(size_t begin, size_t end, std::v
} }
} }
void FunctionListPanel::addInStateArray(TreeStateNode tree2Update, const TCHAR *searchText, bool isSorted) void FunctionListPanel::addInStateArray(TreeStateNode tree2Update, const wchar_t *searchText, bool isSorted)
{ {
bool found = false; bool found = false;
for (size_t i = 0, len = _treeParams.size(); i < len; ++i) for (size_t i = 0, len = _treeParams.size(); i < len; ++i)
@ -202,7 +202,7 @@ void FunctionListPanel::addInStateArray(TreeStateNode tree2Update, const TCHAR *
} }
} }
TreeParams* FunctionListPanel::getFromStateArray(generic_string fullFilePath) TreeParams* FunctionListPanel::getFromStateArray(wstring fullFilePath)
{ {
for (size_t i = 0, len = _treeParams.size(); i < len; ++i) for (size_t i = 0, len = _treeParams.size(); i < len; ++i)
{ {
@ -219,7 +219,7 @@ void FunctionListPanel::sortOrUnsort()
_pTreeView->sort(_pTreeView->getRoot(), true); _pTreeView->sort(_pTreeView->getRoot(), true);
else else
{ {
TCHAR text2search[MAX_PATH] = { '\0' }; wchar_t text2search[MAX_PATH] = { '\0' };
::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2search)); ::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2search));
if (text2search[0] == '\0') // main view if (text2search[0] == '\0') // main view
@ -234,9 +234,9 @@ void FunctionListPanel::sortOrUnsort()
return; return;
_treeViewSearchResult.removeAllItems(); _treeViewSearchResult.removeAllItems();
const TCHAR *fn = ((*_ppEditView)->getCurrentBuffer())->getFileName(); const wchar_t *fn = ((*_ppEditView)->getCurrentBuffer())->getFileName();
generic_string* invalidValueStr = new generic_string(TEXT("-1")); wstring* invalidValueStr = new wstring(L"-1");
_posStrs.push_back(invalidValueStr); _posStrs.push_back(invalidValueStr);
LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr); LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr);
_treeViewSearchResult.addItem(fn, NULL, INDEX_ROOT, lParamInvalidPosStr); _treeViewSearchResult.addItem(fn, NULL, INDEX_ROOT, lParamInvalidPosStr);
@ -252,8 +252,8 @@ void FunctionListPanel::sortOrUnsort()
int CALLBACK FunctionListPanel::categorySortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM /*lParamSort*/) int CALLBACK FunctionListPanel::categorySortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM /*lParamSort*/)
{ {
generic_string* posString1 = reinterpret_cast<generic_string*>(lParam1); wstring* posString1 = reinterpret_cast<wstring*>(lParam1);
generic_string* posString2 = reinterpret_cast<generic_string*>(lParam2); wstring* posString2 = reinterpret_cast<wstring*>(lParam2);
size_t pos1 = _wtoi(posString1->c_str()); size_t pos1 = _wtoi(posString1->c_str());
size_t pos2 = _wtoi(posString2->c_str()); size_t pos2 = _wtoi(posString2->c_str());
@ -263,23 +263,23 @@ int CALLBACK FunctionListPanel::categorySortFunc(LPARAM lParam1, LPARAM lParam2,
return -1; return -1;
} }
bool FunctionListPanel::serialize(const generic_string & outputFilename) bool FunctionListPanel::serialize(const wstring & outputFilename)
{ {
Buffer* currentBuf = (*_ppEditView)->getCurrentBuffer(); Buffer* currentBuf = (*_ppEditView)->getCurrentBuffer();
const TCHAR* fileNameLabel = currentBuf->getFileName(); const wchar_t* fileNameLabel = currentBuf->getFileName();
generic_string fname2write; wstring fname2write;
if (outputFilename.empty()) // if outputFilename is not given, get the current file path by adding the file extension if (outputFilename.empty()) // if outputFilename is not given, get the current file path by adding the file extension
{ {
const TCHAR *fullFilePath = currentBuf->getFullPathName(); const wchar_t *fullFilePath = currentBuf->getFullPathName();
// Export function list from an existing file // Export function list from an existing file
bool exportFuncntionList = (NppParameters::getInstance()).doFunctionListExport(); bool exportFuncntionList = (NppParameters::getInstance()).doFunctionListExport();
if (exportFuncntionList && ::PathFileExists(fullFilePath)) if (exportFuncntionList && ::PathFileExists(fullFilePath))
{ {
fname2write = fullFilePath; fname2write = fullFilePath;
fname2write += TEXT(".result"); fname2write += L".result";
fname2write += TEXT(".json"); fname2write += L".json";
} }
else else
return false; return false;
@ -352,24 +352,24 @@ void FunctionListPanel::reload()
bool isOK = _treeView.retrieveFoldingStateTo(currentTree, _treeView.getRoot()); bool isOK = _treeView.retrieveFoldingStateTo(currentTree, _treeView.getRoot());
if (isOK) if (isOK)
{ {
TCHAR text2Search[MAX_PATH] = { '\0' }; wchar_t text2Search[MAX_PATH] = { '\0' };
::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2Search)); ::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2Search));
bool isSorted = shouldSort(); bool isSorted = shouldSort();
addInStateArray(currentTree, text2Search, isSorted); addInStateArray(currentTree, text2Search, isSorted);
} }
removeAllEntries(); removeAllEntries();
::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(TEXT(""))); ::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(L""));
setSort(false); setSort(false);
_foundFuncInfos.clear(); _foundFuncInfos.clear();
Buffer* currentBuf = (*_ppEditView)->getCurrentBuffer(); Buffer* currentBuf = (*_ppEditView)->getCurrentBuffer();
const TCHAR *fn = currentBuf->getFileName(); const wchar_t *fn = currentBuf->getFileName();
LangType langID = currentBuf->getLangType(); LangType langID = currentBuf->getLangType();
if (langID == L_JS) if (langID == L_JS)
langID = L_JAVASCRIPT; langID = L_JAVASCRIPT;
const TCHAR *udln = NULL; const wchar_t *udln = NULL;
if (langID == L_USER) if (langID == L_USER)
{ {
udln = currentBuf->getUserDefineLangName(); udln = currentBuf->getUserDefineLangName();
@ -380,7 +380,7 @@ void FunctionListPanel::reload()
bool parsedOK = _funcParserMgr.parse(_foundFuncInfos, AssociationInfo(-1, langID, ext, udln)); bool parsedOK = _funcParserMgr.parse(_foundFuncInfos, AssociationInfo(-1, langID, ext, udln));
if (parsedOK) if (parsedOK)
{ {
generic_string* invalidValueStr = new generic_string(TEXT("-1")); wstring* invalidValueStr = new wstring(L"-1");
_posStrs.push_back(invalidValueStr); _posStrs.push_back(invalidValueStr);
LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr); LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr);
@ -397,9 +397,9 @@ void FunctionListPanel::reload()
if (root) if (root)
{ {
currentBuf = (*_ppEditView)->getCurrentBuffer(); currentBuf = (*_ppEditView)->getCurrentBuffer();
const TCHAR *fullFilePath = currentBuf->getFullPathName(); const wchar_t *fullFilePath = currentBuf->getFullPathName();
generic_string* fullPathStr = new generic_string(fullFilePath); wstring* fullPathStr = new wstring(fullFilePath);
_posStrs.push_back(fullPathStr); _posStrs.push_back(fullPathStr);
LPARAM lParamFullPathStr = reinterpret_cast<LPARAM>(fullPathStr); LPARAM lParamFullPathStr = reinterpret_cast<LPARAM>(fullPathStr);
@ -407,7 +407,7 @@ void FunctionListPanel::reload()
TreeParams *previousParams = getFromStateArray(fullFilePath); TreeParams *previousParams = getFromStateArray(fullFilePath);
if (!previousParams) if (!previousParams)
{ {
::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(TEXT(""))); ::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(L""));
setSort(NppParameters::getInstance().getNppGUI()._shouldSortFunctionList); setSort(NppParameters::getInstance().getNppGUI()._shouldSortFunctionList);
sortOrUnsort(); sortOrUnsort();
_treeView.expand(root); _treeView.expand(root);
@ -440,7 +440,7 @@ void FunctionListPanel::initPreferencesMenu()
NativeLangSpeaker* pNativeSpeaker = NppParameters::getInstance().getNativeLangSpeaker(); NativeLangSpeaker* pNativeSpeaker = NppParameters::getInstance().getNativeLangSpeaker();
const NppGUI& nppGUI = NppParameters::getInstance().getNppGUI(); const NppGUI& nppGUI = NppParameters::getInstance().getNppGUI();
generic_string shouldSortFunctionListStr = pNativeSpeaker->getAttrNameStr(TEXT("Sort functions (A to Z) by default"), FL_FUCTIONLISTROOTNODE, FL_PREFERENCE_INITIALSORT); wstring shouldSortFunctionListStr = pNativeSpeaker->getAttrNameStr(L"Sort functions (A to Z) by default", FL_FUCTIONLISTROOTNODE, FL_PREFERENCE_INITIALSORT);
_hPreferencesMenu = ::CreatePopupMenu(); _hPreferencesMenu = ::CreatePopupMenu();
::InsertMenu(_hPreferencesMenu, 0, MF_BYCOMMAND, FL_PREFERENCES_INITIALSORT_ID, shouldSortFunctionListStr.c_str()); ::InsertMenu(_hPreferencesMenu, 0, MF_BYCOMMAND, FL_PREFERENCES_INITIALSORT_ID, shouldSortFunctionListStr.c_str());
@ -498,7 +498,7 @@ void FunctionListPanel::findMarkEntry(HTREEITEM htItem, LONG line)
tvItem.mask = TVIF_IMAGE | TVIF_PARAM; tvItem.mask = TVIF_IMAGE | TVIF_PARAM;
::SendMessage(_treeViewSearchResult.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem)); ::SendMessage(_treeViewSearchResult.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem));
generic_string *posStr = reinterpret_cast<generic_string *>(tvItem.lParam); wstring *posStr = reinterpret_cast<wstring *>(tvItem.lParam);
if (posStr) if (posStr)
{ {
int pos = _wtoi(posStr->c_str()); int pos = _wtoi(posStr->c_str());
@ -530,11 +530,11 @@ void FunctionListPanel::init(HINSTANCE hInst, HWND hPere, ScintillaEditView **pp
_ppEditView = ppEditView; _ppEditView = ppEditView;
NppParameters& nppParams = NppParameters::getInstance(); NppParameters& nppParams = NppParameters::getInstance();
generic_string funcListXmlPath = nppParams.getUserPath(); wstring funcListXmlPath = nppParams.getUserPath();
pathAppend(funcListXmlPath, TEXT("functionList")); pathAppend(funcListXmlPath, L"functionList");
generic_string funcListDefaultXmlPath = nppParams.getNppPath(); wstring funcListDefaultXmlPath = nppParams.getNppPath();
pathAppend(funcListDefaultXmlPath, TEXT("functionList")); pathAppend(funcListDefaultXmlPath, L"functionList");
bool doLocalConf = nppParams.isLocal(); bool doLocalConf = nppParams.isLocal();
@ -579,7 +579,7 @@ bool FunctionListPanel::openSelection(const TreeView & treeView)
return false; return false;
} }
generic_string *posStr = reinterpret_cast<generic_string *>(tvItem.lParam); wstring *posStr = reinterpret_cast<wstring *>(tvItem.lParam);
if (!posStr) if (!posStr)
return false; return false;
@ -651,7 +651,7 @@ void FunctionListPanel::notified(LPNMHDR notification)
} }
else if (ptvkd->wVKey == VK_ESCAPE) else if (ptvkd->wVKey == VK_ESCAPE)
{ {
::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(TEXT(""))); ::SendMessage(_hSearchEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(L""));
SetWindowLongPtr(_hSelf, DWLP_MSGRESULT, 1); // remove beep SetWindowLongPtr(_hSelf, DWLP_MSGRESULT, 1); // remove beep
PostMessage(_hParent, WM_COMMAND, SCEN_SETFOCUS << 16, reinterpret_cast<LPARAM>((*_ppEditView)->getHSelf())); PostMessage(_hParent, WM_COMMAND, SCEN_SETFOCUS << 16, reinterpret_cast<LPARAM>((*_ppEditView)->getHSelf()));
} }
@ -671,7 +671,7 @@ void FunctionListPanel::notified(LPNMHDR notification)
void FunctionListPanel::searchFuncAndSwitchView() void FunctionListPanel::searchFuncAndSwitchView()
{ {
TCHAR text2search[MAX_PATH] = { '\0' }; wchar_t text2search[MAX_PATH] = { '\0' };
::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2search)); ::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2search));
if (text2search[0] == '\0') if (text2search[0] == '\0')
@ -686,9 +686,9 @@ void FunctionListPanel::searchFuncAndSwitchView()
return; return;
_treeViewSearchResult.removeAllItems(); _treeViewSearchResult.removeAllItems();
const TCHAR *fn = ((*_ppEditView)->getCurrentBuffer())->getFileName(); const wchar_t *fn = ((*_ppEditView)->getCurrentBuffer())->getFileName();
generic_string* invalidValueStr = new generic_string(TEXT("-1")); wstring* invalidValueStr = new wstring(L"-1");
_posStrs.push_back(invalidValueStr); _posStrs.push_back(invalidValueStr);
LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr); LPARAM lParamInvalidPosStr = reinterpret_cast<LPARAM>(invalidValueStr);
_treeViewSearchResult.addItem(fn, NULL, INDEX_ROOT, lParamInvalidPosStr); _treeViewSearchResult.addItem(fn, NULL, INDEX_ROOT, lParamInvalidPosStr);
@ -732,7 +732,7 @@ static LRESULT CALLBACK funclstSearchEditProc(HWND hwnd, UINT message, WPARAM wP
{ {
if (wParam == VK_ESCAPE) if (wParam == VK_ESCAPE)
{ {
::SendMessage(hwnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(TEXT(""))); ::SendMessage(hwnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(L""));
return FALSE; return FALSE;
} }
else if (wParam == VK_TAB) else if (wParam == VK_TAB)
@ -772,7 +772,7 @@ intptr_t CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LP
// Make edit field red if not found // Make edit field red if not found
case WM_CTLCOLOREDIT : case WM_CTLCOLOREDIT :
{ {
TCHAR text2search[MAX_PATH] = { '\0' }; wchar_t text2search[MAX_PATH] = { '\0' };
::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2search)); ::SendMessage(_hSearchEdit, WM_GETTEXT, MAX_PATH, reinterpret_cast<LPARAM>(text2search));
bool textFound = false; bool textFound = false;
if (text2search[0] == '\0') if (text2search[0] == '\0')

View File

@ -21,7 +21,7 @@
#include "functionParser.h" #include "functionParser.h"
#include "TreeView.h" #include "TreeView.h"
#define FL_PANELTITLE TEXT("Function List") #define FL_PANELTITLE L"Function List"
#define FL_FUCTIONLISTROOTNODE "FunctionList" #define FL_FUCTIONLISTROOTNODE "FunctionList"
#define FL_SORTLOCALNODENAME "SortTip" #define FL_SORTLOCALNODENAME "SortTip"
@ -55,11 +55,11 @@ root
*/ */
struct SearchParameters { struct SearchParameters {
generic_string _text2Find; std::wstring _text2Find;
bool _doSort = false; bool _doSort = false;
bool hasParams()const{ bool hasParams()const{
return (_text2Find != TEXT("") || _doSort); return (_text2Find != L"" || _doSort);
}; };
}; };
@ -98,8 +98,8 @@ public:
void sortOrUnsort(); void sortOrUnsort();
void reload(); void reload();
void markEntry(); void markEntry();
bool serialize(const generic_string & outputFilename = TEXT("")); bool serialize(const std::wstring & outputFilename = L"");
void addEntry(const TCHAR *node, const TCHAR *displayText, size_t pos); void addEntry(const wchar_t *node, const wchar_t *displayText, size_t pos);
void removeAllEntries(); void removeAllEntries();
void searchFuncAndSwitchView(); void searchFuncAndSwitchView();
@ -122,24 +122,24 @@ private:
long _findEndLine = -1; long _findEndLine = -1;
HTREEITEM _findItem = nullptr; HTREEITEM _findItem = nullptr;
generic_string _sortTipStr = TEXT("Sort"); std::wstring _sortTipStr = L"Sort";
generic_string _reloadTipStr = TEXT("Reload"); std::wstring _reloadTipStr = L"Reload";
generic_string _preferenceTipStr = TEXT("Preferences"); std::wstring _preferenceTipStr = L"Preferences";
std::vector<foundInfo> _foundFuncInfos; std::vector<foundInfo> _foundFuncInfos;
std::vector<generic_string*> _posStrs; std::vector<std::wstring*> _posStrs;
ScintillaEditView **_ppEditView = nullptr; ScintillaEditView **_ppEditView = nullptr;
FunctionParsersManager _funcParserMgr; FunctionParsersManager _funcParserMgr;
std::vector< std::pair<int, int> > _skipZones; std::vector< std::pair<int, int> > _skipZones;
std::vector<TreeParams> _treeParams; std::vector<TreeParams> _treeParams;
generic_string parseSubLevel(size_t begin, size_t end, std::vector< generic_string > dataToSearch, intptr_t& foundPos); std::wstring parseSubLevel(size_t begin, size_t end, std::vector< std::wstring > dataToSearch, intptr_t& foundPos);
size_t getBodyClosePos(size_t begin, const TCHAR *bodyOpenSymbol, const TCHAR *bodyCloseSymbol); size_t getBodyClosePos(size_t begin, const wchar_t *bodyOpenSymbol, const wchar_t *bodyCloseSymbol);
void notified(LPNMHDR notification); void notified(LPNMHDR notification);
void addInStateArray(TreeStateNode tree2Update, const TCHAR *searchText, bool isSorted); void addInStateArray(TreeStateNode tree2Update, const wchar_t *searchText, bool isSorted);
TreeParams* getFromStateArray(generic_string fullFilePath); TreeParams* getFromStateArray(std::wstring fullFilePath);
bool openSelection(const TreeView &treeView); bool openSelection(const TreeView &treeView);
bool shouldSort(); bool shouldSort();
void setSort(bool isEnabled); void setSort(bool isEnabled);

View File

@ -65,28 +65,28 @@ void ShortcutMapper::getClientRect(RECT& rc) const
::InflateRect(&rc, -padding, 0); ::InflateRect(&rc, -padding, 0);
} }
generic_string ShortcutMapper::getTabString(size_t i) const wstring ShortcutMapper::getTabString(size_t i) const
{ {
if (i >= _nbTab) if (i >= _nbTab)
return TEXT(""); return L"";
NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance().getNativeLangSpeaker(); NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance().getNativeLangSpeaker();
switch (i) switch (i)
{ {
case 1: case 1:
return nativeLangSpeaker->getShortcutMapperLangStr("MacrosTab", TEXT("Macros")); return nativeLangSpeaker->getShortcutMapperLangStr("MacrosTab", L"Macros");
case 2: case 2:
return nativeLangSpeaker->getShortcutMapperLangStr("RunCommandsTab", TEXT("Run commands")); return nativeLangSpeaker->getShortcutMapperLangStr("RunCommandsTab", L"Run commands");
case 3: case 3:
return nativeLangSpeaker->getShortcutMapperLangStr("PluginCommandsTab", TEXT("Plugin commands")); return nativeLangSpeaker->getShortcutMapperLangStr("PluginCommandsTab", L"Plugin commands");
case 4: case 4:
return nativeLangSpeaker->getShortcutMapperLangStr("ScintillaCommandsTab", TEXT("Scintilla commands")); return nativeLangSpeaker->getShortcutMapperLangStr("ScintillaCommandsTab", L"Scintilla commands");
default: //0 default: //0
return nativeLangSpeaker->getShortcutMapperLangStr("MainMenuTab", TEXT("Main menu")); return nativeLangSpeaker->getShortcutMapperLangStr("MainMenuTab", L"Main menu");
} }
} }
@ -166,16 +166,16 @@ void ShortcutMapper::initBabyGrid()
NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance().getNativeLangSpeaker(); NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance().getNativeLangSpeaker();
nativeLangSpeaker->changeDlgLang(_hSelf, "ShortcutMapper"); nativeLangSpeaker->changeDlgLang(_hSelf, "ShortcutMapper");
_conflictInfoOk = nativeLangSpeaker->getShortcutMapperLangStr("ConflictInfoOk", TEXT("No shortcut conflicts for this item.")); _conflictInfoOk = nativeLangSpeaker->getShortcutMapperLangStr("ConflictInfoOk", L"No shortcut conflicts for this item.");
_conflictInfoEditing = nativeLangSpeaker->getShortcutMapperLangStr("ConflictInfoEditing", TEXT("No conflicts . . .")); _conflictInfoEditing = nativeLangSpeaker->getShortcutMapperLangStr("ConflictInfoEditing", L"No conflicts . . .");
} }
generic_string ShortcutMapper::getTextFromCombo(HWND hCombo) wstring ShortcutMapper::getTextFromCombo(HWND hCombo)
{ {
const int NB_MAX(128); const int NB_MAX(128);
TCHAR str[NB_MAX](TEXT("\0")); wchar_t str[NB_MAX](L"\0");
::SendMessage(hCombo, WM_GETTEXT, NB_MAX, reinterpret_cast<LPARAM>(str)); ::SendMessage(hCombo, WM_GETTEXT, NB_MAX, reinterpret_cast<LPARAM>(str));
generic_string res(str); wstring res(str);
return stringToLower(res); return stringToLower(res);
} }
@ -194,7 +194,7 @@ bool ShortcutMapper::isFilterValid(Shortcut sc)
for (size_t i = 0; i < filterSize; ++i) for (size_t i = 0; i < filterSize; ++i)
{ {
generic_string filterWord = _shortcutFilter.at(i); wstring filterWord = _shortcutFilter.at(i);
// every word must be matched by keycombo or name // every word must be matched by keycombo or name
if (shortcut_name.find(filterWord) == std::string::npos && if (shortcut_name.find(filterWord) == std::string::npos &&
shortcut_value.find(filterWord) == std::string::npos) shortcut_value.find(filterWord) == std::string::npos)
@ -219,7 +219,7 @@ bool ShortcutMapper::isFilterValid(PluginCmdShortcut sc)
for (size_t i = 0; i < filterSize; ++i) for (size_t i = 0; i < filterSize; ++i)
{ {
generic_string filterWord = _shortcutFilter.at(i); wstring filterWord = _shortcutFilter.at(i);
// every word must be matched by keycombo or name or plugin name // every word must be matched by keycombo or name or plugin name
if (shortcut_name.find(filterWord) == std::string::npos && if (shortcut_name.find(filterWord) == std::string::npos &&
shortcut_value.find(filterWord) == std::string::npos && shortcut_value.find(filterWord) == std::string::npos &&
@ -244,7 +244,7 @@ bool ShortcutMapper::isFilterValid(ScintillaKeyMap sc)
for (size_t i = 0; i < filterSize; ++i) for (size_t i = 0; i < filterSize; ++i)
{ {
generic_string filterWord = _shortcutFilter.at(i); wstring filterWord = _shortcutFilter.at(i);
// every word must be matched by keycombo or name // every word must be matched by keycombo or name
if (shortcut_name.find(filterWord) == std::string::npos && if (shortcut_name.find(filterWord) == std::string::npos &&
shortcut_value.find(filterWord) == std::string::npos) shortcut_value.find(filterWord) == std::string::npos)
@ -262,8 +262,8 @@ void ShortcutMapper::fillOutBabyGrid()
size_t nbItems = 0; size_t nbItems = 0;
NativeLangSpeaker* nativeLangSpeaker = nppParam.getNativeLangSpeaker(); NativeLangSpeaker* nativeLangSpeaker = nppParam.getNativeLangSpeaker();
generic_string nameStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnName", TEXT("Name")); wstring nameStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnName", L"Name");
generic_string shortcutStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnShortcut", TEXT("Shortcut")); wstring shortcutStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnShortcut", L"Shortcut");
_babygrid.setText(0, 1, nameStr.c_str()); _babygrid.setText(0, 1, nameStr.c_str());
_babygrid.setText(0, 2, shortcutStr.c_str()); _babygrid.setText(0, 2, shortcutStr.c_str());
@ -274,7 +274,7 @@ void ShortcutMapper::fillOutBabyGrid()
{ {
nbItems = nppParam.getUserShortcuts().size(); nbItems = nppParam.getUserShortcuts().size();
_babygrid.setLineColNumber(nbItems, 3); _babygrid.setLineColNumber(nbItems, 3);
generic_string categoryStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnCategory", TEXT("Category")); wstring categoryStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnCategory", L"Category");
_babygrid.setText(0, 3, categoryStr.c_str()); _babygrid.setText(0, 3, categoryStr.c_str());
} }
break; break;
@ -297,7 +297,7 @@ void ShortcutMapper::fillOutBabyGrid()
{ {
nbItems = nppParam.getPluginCommandList().size(); nbItems = nppParam.getPluginCommandList().size();
_babygrid.setLineColNumber(nbItems, 3); _babygrid.setLineColNumber(nbItems, 3);
generic_string pluginStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnPlugin", TEXT("Plugin")); wstring pluginStr = nativeLangSpeaker->getShortcutMapperLangStr("ColumnPlugin", L"Plugin");
_babygrid.setText(0, 3, pluginStr.c_str()); _babygrid.setText(0, 3, pluginStr.c_str());
} }
break; break;
@ -314,15 +314,15 @@ void ShortcutMapper::fillOutBabyGrid()
size_t cs_index = 0; size_t cs_index = 0;
// make _shortcutFilter a list of the words in IDC_BABYGRID_FILTER // make _shortcutFilter a list of the words in IDC_BABYGRID_FILTER
generic_string shortcutFilterStr = getTextFromCombo(::GetDlgItem(_hSelf, IDC_BABYGRID_FILTER)); wstring shortcutFilterStr = getTextFromCombo(::GetDlgItem(_hSelf, IDC_BABYGRID_FILTER));
const generic_string whitespace(TEXT(" ")); const wstring whitespace(L" ");
std::vector<generic_string> shortcutFilterWithEmpties; std::vector<wstring> shortcutFilterWithEmpties;
stringSplit(shortcutFilterStr, whitespace, shortcutFilterWithEmpties); stringSplit(shortcutFilterStr, whitespace, shortcutFilterWithEmpties);
// now add only the non-empty strings in the split list to _shortcutFilter // now add only the non-empty strings in the split list to _shortcutFilter
_shortcutFilter = std::vector<generic_string>(); _shortcutFilter = std::vector<wstring>();
for (size_t i = 0; i < shortcutFilterWithEmpties.size(); ++i) for (size_t i = 0; i < shortcutFilterWithEmpties.size(); ++i)
{ {
generic_string filterWord = shortcutFilterWithEmpties.at(i); wstring filterWord = shortcutFilterWithEmpties.at(i);
if (!filterWord.empty()) if (!filterWord.empty())
_shortcutFilter.push_back(filterWord); _shortcutFilter.push_back(filterWord);
} }
@ -712,7 +712,7 @@ intptr_t CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARA
if (!wParam || !lParam) if (!wParam || !lParam)
break; break;
generic_string conflictInfo; wstring conflictInfo;
// In case of using filter will make the filtered items change index, so here we get its real index // In case of using filter will make the filtered items change index, so here we get its real index
size_t realIndexOfSelectedItem = _shortcutIndex[_babygrid.getSelectedRow() - 1]; size_t realIndexOfSelectedItem = _shortcutIndex[_babygrid.getSelectedRow() - 1];
@ -1073,8 +1073,8 @@ intptr_t CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARA
NppParameters& nppParam = NppParameters::getInstance(); NppParameters& nppParam = NppParameters::getInstance();
int res = nppParam.getNativeLangSpeaker()->messageBox("SCMapperDoDeleteOrNot", int res = nppParam.getNativeLangSpeaker()->messageBox("SCMapperDoDeleteOrNot",
_hSelf, _hSelf,
TEXT("Are you sure you want to delete this shortcut?"), L"Are you sure you want to delete this shortcut?",
TEXT("Are you sure?"), L"Are you sure?",
MB_OKCANCEL); MB_OKCANCEL);
if (res == IDOK) if (res == IDOK)
@ -1226,9 +1226,9 @@ intptr_t CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARA
{ {
vector<MenuItemUnit> itemUnitArray; vector<MenuItemUnit> itemUnitArray;
NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance().getNativeLangSpeaker(); NativeLangSpeaker* nativeLangSpeaker = NppParameters::getInstance().getNativeLangSpeaker();
generic_string modifyStr = nativeLangSpeaker->getShortcutMapperLangStr("ModifyContextMenu", TEXT("Modify")); wstring modifyStr = nativeLangSpeaker->getShortcutMapperLangStr("ModifyContextMenu", L"Modify");
generic_string deleteStr = nativeLangSpeaker->getShortcutMapperLangStr("DeleteContextMenu", TEXT("Delete")); wstring deleteStr = nativeLangSpeaker->getShortcutMapperLangStr("DeleteContextMenu", L"Delete");
generic_string clearStr = nativeLangSpeaker->getShortcutMapperLangStr("ClearContextMenu", TEXT("Clear")); wstring clearStr = nativeLangSpeaker->getShortcutMapperLangStr("ClearContextMenu", L"Clear");
itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_MODIFY, modifyStr.c_str())); itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_MODIFY, modifyStr.c_str()));
itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_DELETE, deleteStr.c_str())); itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_DELETE, deleteStr.c_str()));
itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_CLEAR, clearStr.c_str())); itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_CLEAR, clearStr.c_str()));
@ -1301,7 +1301,7 @@ intptr_t CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARA
// In case of using filter will make the filtered items change index, so here we get its real index // In case of using filter will make the filtered items change index, so here we get its real index
size_t realIndexOfSelectedItem = _shortcutIndex[currentIndex]; size_t realIndexOfSelectedItem = _shortcutIndex[currentIndex];
generic_string conflictInfo; wstring conflictInfo;
switch (_currentState) switch (_currentState)
{ {
@ -1378,7 +1378,7 @@ intptr_t CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARA
return FALSE; return FALSE;
} }
bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConflictLocation, bool ShortcutMapper::findKeyConflicts(__inout_opt wstring * const keyConflictLocation,
const KeyCombo & itemKeyComboToTest, const size_t & itemIndexToTest) const const KeyCombo & itemKeyComboToTest, const size_t & itemIndexToTest) const
{ {
if (itemKeyComboToTest._key == 0) //no key assignment if (itemKeyComboToTest._key == 0) //no key assignment
@ -1411,15 +1411,15 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
else else
{ {
if (!keyConflictLocation->empty()) if (!keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += L"\r\n";
*keyConflictLocation += _tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += L" | ";
*keyConflictLocation += std::to_wstring(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += L" ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8);
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += L" ( ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8);
*keyConflictLocation += TEXT(" )"); *keyConflictLocation += L" )";
} }
} }
} }
@ -1445,15 +1445,15 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
else else
{ {
if (!keyConflictLocation->empty()) if (!keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += L"\r\n";
*keyConflictLocation += _tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += L" | ";
*keyConflictLocation += std::to_wstring(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += L" ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8);
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += L" ( ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8);
*keyConflictLocation += TEXT(" )"); *keyConflictLocation += L" )";
} }
} }
} }
@ -1479,15 +1479,15 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
else else
{ {
if (!keyConflictLocation->empty()) if (!keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += L"\r\n";
*keyConflictLocation += _tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += L" | ";
*keyConflictLocation += std::to_wstring(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += L" ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8);
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += L" ( ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8);
*keyConflictLocation += TEXT(" )"); *keyConflictLocation += L" )";
} }
} }
} }
@ -1513,15 +1513,15 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
else else
{ {
if (!keyConflictLocation->empty()) if (!keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += L"\r\n";
*keyConflictLocation += _tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += L" | ";
*keyConflictLocation += std::to_wstring(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
*keyConflictLocation += TEXT(" "); *keyConflictLocation += L" ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8);
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += L" ( ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(), CP_UTF8);
*keyConflictLocation += TEXT(" )"); *keyConflictLocation += L" )";
} }
} }
} }
@ -1550,18 +1550,18 @@ bool ShortcutMapper::findKeyConflicts(__inout_opt generic_string * const keyConf
else else
{ {
if (!keyConflictLocation->empty()) if (!keyConflictLocation->empty())
*keyConflictLocation += TEXT("\r\n"); *keyConflictLocation += L"\r\n";
*keyConflictLocation += _tabNames[gridState]; *keyConflictLocation += _tabNames[gridState];
*keyConflictLocation += TEXT(" | "); *keyConflictLocation += L" | ";
*keyConflictLocation += std::to_wstring(itemIndex + 1); *keyConflictLocation += std::to_wstring(itemIndex + 1);
if (sciIndex > 0) if (sciIndex > 0)
*keyConflictLocation += TEXT("* "); *keyConflictLocation += L"* ";
else else
*keyConflictLocation += TEXT(" "); *keyConflictLocation += L" ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].getName(), CP_UTF8);
*keyConflictLocation += TEXT(" ( "); *keyConflictLocation += L" ( ";
*keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(sciIndex), CP_UTF8); *keyConflictLocation += string2wstring(vShortcuts[itemIndex].toString(sciIndex), CP_UTF8);
*keyConflictLocation += TEXT(" )"); *keyConflictLocation += L" )";
} }
} }
} }

View File

@ -27,7 +27,7 @@ enum GridState {STATE_MENU, STATE_MACRO, STATE_USER, STATE_PLUGIN, STATE_SCINTIL
class ShortcutMapper : public StaticDialog { class ShortcutMapper : public StaticDialog {
public: public:
ShortcutMapper() : StaticDialog(), _currentState(STATE_MENU) { ShortcutMapper() : StaticDialog(), _currentState(STATE_MENU) {
_shortcutFilter = std::vector<generic_string>(); _shortcutFilter = std::vector<std::wstring>();
_dialogInitDone = false; _dialogInitDone = false;
}; };
~ShortcutMapper() = default; ~ShortcutMapper() = default;
@ -51,10 +51,10 @@ public:
}; };
void getClientRect(RECT & rc) const override; void getClientRect(RECT & rc) const override;
bool findKeyConflicts(__inout_opt generic_string * const keyConflictLocation, bool findKeyConflicts(__inout_opt std::wstring * const keyConflictLocation,
const KeyCombo & itemKeyCombo, const size_t & itemIndex) const; const KeyCombo & itemKeyCombo, const size_t & itemIndex) const;
generic_string getTextFromCombo(HWND hCombo); std::wstring getTextFromCombo(HWND hCombo);
bool isFilterValid(Shortcut sc); bool isFilterValid(Shortcut sc);
bool isFilterValid(PluginCmdShortcut sc); bool isFilterValid(PluginCmdShortcut sc);
bool isFilterValid(ScintillaKeyMap sc); bool isFilterValid(ScintillaKeyMap sc);
@ -71,16 +71,16 @@ private:
HWND _hTabCtrl = nullptr; HWND _hTabCtrl = nullptr;
const static int _nbTab = 5; const static int _nbTab = 5;
generic_string _tabNames[_nbTab]; std::wstring _tabNames[_nbTab];
std::vector<generic_string> _shortcutFilter; std::vector<std::wstring> _shortcutFilter;
std::vector<size_t> _shortcutIndex; std::vector<size_t> _shortcutIndex;
//save/restore the last view //save/restore the last view
std::vector<size_t> _lastHomeRow; std::vector<size_t> _lastHomeRow;
std::vector<size_t> _lastCursorRow; std::vector<size_t> _lastCursorRow;
generic_string _conflictInfoOk; std::wstring _conflictInfoOk;
generic_string _conflictInfoEditing; std::wstring _conflictInfoEditing;
std::vector<HFONT> _hGridFonts; std::vector<HFONT> _hGridFonts;
@ -98,7 +98,7 @@ private:
void initTabs(); void initTabs();
void initBabyGrid(); void initBabyGrid();
void fillOutBabyGrid(); void fillOutBabyGrid();
generic_string getTabString(size_t i) const; std::wstring getTabString(size_t i) const;
bool isConflict(const KeyCombo & lhs, const KeyCombo & rhs) const bool isConflict(const KeyCombo & lhs, const KeyCombo & rhs) const
{ {

View File

@ -26,6 +26,8 @@
#include "CustomFileDialog.h" #include "CustomFileDialog.h"
#include "Parameters.h" #include "Parameters.h"
using namespace std;
// Workaround for MinGW because its implementation of __uuidof is different. // Workaround for MinGW because its implementation of __uuidof is different.
template<class T> template<class T>
struct ComTraits struct ComTraits
@ -45,8 +47,8 @@ namespace // anonymous
struct Filter struct Filter
{ {
generic_string name; wstring name;
generic_string ext; wstring ext;
}; };
static const int IDC_FILE_CUSTOM_CHECKBOX = 4; static const int IDC_FILE_CUSTOM_CHECKBOX = 4;
@ -55,13 +57,13 @@ namespace // anonymous
// Returns a first extension from the extension specification string. // Returns a first extension from the extension specification string.
// Multiple extensions are separated with ';'. // Multiple extensions are separated with ';'.
// Example: input - ".c;.cpp;.h", output - ".c" // Example: input - ".c;.cpp;.h", output - ".c"
generic_string get1stExt(const generic_string& extSpec) wstring get1stExt(const wstring& extSpec)
{ {
size_t pos = extSpec.find('.'); size_t pos = extSpec.find('.');
if (pos != generic_string::npos) if (pos != wstring::npos)
{ {
size_t posEnd = extSpec.find(';', pos + 1); size_t posEnd = extSpec.find(';', pos + 1);
if (posEnd != generic_string::npos) if (posEnd != wstring::npos)
{ {
size_t extLen = posEnd - pos; size_t extLen = posEnd - pos;
return extSpec.substr(pos, extLen); return extSpec.substr(pos, extLen);
@ -71,13 +73,13 @@ namespace // anonymous
return {}; return {};
} }
bool replaceExt(generic_string& name, const generic_string& ext) bool replaceExt(wstring& name, const wstring& ext)
{ {
if (!name.empty() && !ext.empty()) if (!name.empty() && !ext.empty())
{ {
// Remove an existing extension from the name. // Remove an existing extension from the name.
size_t posNameExt = name.find_last_of('.'); size_t posNameExt = name.find_last_of('.');
if (posNameExt != generic_string::npos) if (posNameExt != wstring::npos)
name.erase(posNameExt); name.erase(posNameExt);
// Append a new extension. // Append a new extension.
name += ext; name += ext;
@ -86,14 +88,14 @@ namespace // anonymous
return false; return false;
} }
bool hasExt(const generic_string& name) bool hasExt(const wstring& name)
{ {
return name.find_last_of('.') != generic_string::npos; return name.find_last_of('.') != wstring::npos;
} }
void expandEnv(generic_string& s) void expandEnv(wstring& s)
{ {
TCHAR buffer[MAX_PATH] = { '\0' }; wchar_t buffer[MAX_PATH] = { '\0' };
// This returns the resulting string length or 0 in case of error. // This returns the resulting string length or 0 in case of error.
DWORD ret = ExpandEnvironmentStrings(s.c_str(), buffer, static_cast<DWORD>(std::size(buffer))); DWORD ret = ExpandEnvironmentStrings(s.c_str(), buffer, static_cast<DWORD>(std::size(buffer)));
if (ret != 0) if (ret != 0)
@ -105,7 +107,7 @@ namespace // anonymous
else else
{ {
// Buffer was too small, try with a bigger buffer of the required size. // Buffer was too small, try with a bigger buffer of the required size.
std::vector<TCHAR> buffer2(ret, 0); std::vector<wchar_t> buffer2(ret, 0);
ret = ExpandEnvironmentStrings(s.c_str(), buffer2.data(), static_cast<DWORD>(buffer2.size())); ret = ExpandEnvironmentStrings(s.c_str(), buffer2.data(), static_cast<DWORD>(buffer2.size()));
assert(ret == static_cast<DWORD>(lstrlen(buffer2.data()) + 1)); assert(ret == static_cast<DWORD>(lstrlen(buffer2.data()) + 1));
s = buffer2.data(); s = buffer2.data();
@ -113,9 +115,9 @@ namespace // anonymous
} }
} }
generic_string getFilename(IShellItem* psi) wstring getFilename(IShellItem* psi)
{ {
generic_string result; wstring result;
if (psi) if (psi)
{ {
PWSTR pszFilePath = nullptr; PWSTR pszFilePath = nullptr;
@ -129,7 +131,7 @@ namespace // anonymous
return result; return result;
} }
bool setDialogFolder(IFileDialog* dialog, const TCHAR* path) bool setDialogFolder(IFileDialog* dialog, const wchar_t* path)
{ {
com_ptr<IShellItem> shellItem; com_ptr<IShellItem> shellItem;
HRESULT hr = SHCreateItemFromParsingName(path, HRESULT hr = SHCreateItemFromParsingName(path,
@ -147,9 +149,9 @@ namespace // anonymous
return SUCCEEDED(hr); return SUCCEEDED(hr);
} }
generic_string getDialogFileName(IFileDialog* dialog) wstring getDialogFileName(IFileDialog* dialog)
{ {
generic_string fileName; wstring fileName;
if (dialog) if (dialog)
{ {
PWSTR pszFilePath = nullptr; PWSTR pszFilePath = nullptr;
@ -163,7 +165,7 @@ namespace // anonymous
return fileName; return fileName;
} }
generic_string getDialogFolder(IFileDialog* dialog) wstring getDialogFolder(IFileDialog* dialog)
{ {
com_ptr<IShellItem> psi; com_ptr<IShellItem> psi;
HRESULT hr = dialog->GetFolder(&psi); HRESULT hr = dialog->GetFolder(&psi);
@ -198,7 +200,7 @@ namespace // anonymous
::SetCurrentDirectory(_dir); ::SetCurrentDirectory(_dir);
} }
private: private:
TCHAR _dir[MAX_PATH]; wchar_t _dir[MAX_PATH];
}; };
} // anonymous namespace } // anonymous namespace
@ -300,7 +302,7 @@ public:
// Since GetFileTypeIndex() might return the old value in some cases. // Since GetFileTypeIndex() might return the old value in some cases.
// Specifically, when called after SetFileTypeIndex(). // Specifically, when called after SetFileTypeIndex().
_currentType = dialogIndex; _currentType = dialogIndex;
generic_string name = getDialogFileName(_dialog); wstring name = getDialogFileName(_dialog);
if (changeExt(name, dialogIndex - 1)) if (changeExt(name, dialogIndex - 1))
{ {
// Set the file name and clear the selection in the edit box. // Set the file name and clear the selection in the edit box.
@ -376,7 +378,7 @@ public:
removeHooks(); removeHooks();
} }
const generic_string& getLastUsedFolder() const { return _lastUsedFolder; } const wstring& getLastUsedFolder() const { return _lastUsedFolder; }
private: private:
FileDialogEventHandler(const FileDialogEventHandler&) = delete; FileDialogEventHandler(const FileDialogEventHandler&) = delete;
@ -444,23 +446,23 @@ private:
} }
} }
bool changeExt(generic_string& name, int extIndex) bool changeExt(wstring& name, int extIndex)
{ {
if (extIndex >= 0 && extIndex < static_cast<int>(_filterSpec.size())) if (extIndex >= 0 && extIndex < static_cast<int>(_filterSpec.size()))
{ {
const generic_string ext = get1stExt(_filterSpec[extIndex].ext); const wstring ext = get1stExt(_filterSpec[extIndex].ext);
if (!ext.ends_with(_T(".*"))) if (!ext.ends_with(_T(".*")))
return replaceExt(name, ext); return replaceExt(name, ext);
} }
return false; return false;
} }
generic_string getAbsPath(const generic_string& fileName) wstring getAbsPath(const wstring& fileName)
{ {
if (::PathIsRelative(fileName.c_str())) if (::PathIsRelative(fileName.c_str()))
{ {
TCHAR buffer[MAX_PATH] = { '\0' }; wchar_t buffer[MAX_PATH] = { '\0' };
const generic_string folder = getDialogFolder(_dialog); const wstring folder = getDialogFolder(_dialog);
LPTSTR ret = ::PathCombine(buffer, folder.c_str(), fileName.c_str()); LPTSTR ret = ::PathCombine(buffer, folder.c_str(), fileName.c_str());
if (ret) if (ret)
return buffer; return buffer;
@ -475,7 +477,7 @@ private:
if (!_dialog) if (!_dialog)
return; return;
// Get the entered name. // Get the entered name.
generic_string fileName = getDialogFileName(_dialog); wstring fileName = getDialogFileName(_dialog);
expandEnv(fileName); expandEnv(fileName);
bool nameChanged = transformPath(fileName); bool nameChanged = transformPath(fileName);
// Update the controls. // Update the controls.
@ -497,14 +499,14 @@ private:
} }
// Transforms a forward-slash path to a canonical Windows path. // Transforms a forward-slash path to a canonical Windows path.
static bool transformPath(generic_string& fileName) static bool transformPath(wstring& fileName)
{ {
if (fileName.empty()) if (fileName.empty())
return false; return false;
bool transformed = false; bool transformed = false;
// Replace a forward-slash with a backslash. // Replace a forward-slash with a backslash.
std::replace_if(fileName.begin(), fileName.end(), std::replace_if(fileName.begin(), fileName.end(),
[&transformed](generic_string::value_type c) [&transformed](wstring::value_type c)
{ {
const bool eq = (c == '/'); const bool eq = (c == '/');
transformed |= eq; transformed |= eq;
@ -519,7 +521,7 @@ private:
static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM param) static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM param)
{ {
const int bufferLen = MAX_PATH; const int bufferLen = MAX_PATH;
static TCHAR buffer[bufferLen]; static wchar_t buffer[bufferLen];
static bool isRTL = false; static bool isRTL = false;
auto* inst = reinterpret_cast<FileDialogEventHandler*>(param); auto* inst = reinterpret_cast<FileDialogEventHandler*>(param);
@ -629,7 +631,7 @@ private:
com_ptr<IFileDialog> _dialog; com_ptr<IFileDialog> _dialog;
com_ptr<IFileDialogCustomize> _customize; com_ptr<IFileDialogCustomize> _customize;
const std::vector<Filter> _filterSpec; const std::vector<Filter> _filterSpec;
generic_string _lastUsedFolder; wstring _lastUsedFolder;
HHOOK _prevKbdHook = nullptr; HHOOK _prevKbdHook = nullptr;
HHOOK _prevCallHook = nullptr; HHOOK _prevCallHook = nullptr;
HWND _hwndNameEdit = nullptr; HWND _hwndNameEdit = nullptr;
@ -693,12 +695,12 @@ public:
if (SUCCEEDED(hr) && _initialFileName) if (SUCCEEDED(hr) && _initialFileName)
{ {
generic_string newFileName = _initialFileName; wstring newFileName = _initialFileName;
if (_fileTypeIndex >= 0 && _fileTypeIndex < static_cast<int>(_filterSpec.size())) if (_fileTypeIndex >= 0 && _fileTypeIndex < static_cast<int>(_filterSpec.size()))
{ {
if (!hasExt(newFileName)) if (!hasExt(newFileName))
{ {
const generic_string ext = get1stExt(_filterSpec[_fileTypeIndex].ext); const wstring ext = get1stExt(_filterSpec[_fileTypeIndex].ext);
if (!ext.ends_with(_T(".*"))) if (!ext.ends_with(_T(".*")))
newFileName += ext; newFileName += ext;
} }
@ -760,7 +762,7 @@ public:
return true; return true;
} }
bool addCheckbox(int id, const TCHAR* label, bool value, bool enabled = true) bool addCheckbox(int id, const wchar_t* label, bool value, bool enabled = true)
{ {
if (!_customize) if (!_customize)
return false; return false;
@ -832,9 +834,9 @@ public:
return FALSE; return FALSE;
} }
generic_string getResultFilename() wstring getResultFilename()
{ {
generic_string fileName; wstring fileName;
com_ptr<IShellItem> psiResult; com_ptr<IShellItem> psiResult;
HRESULT hr = _dialog->GetResult(&psiResult); HRESULT hr = _dialog->GetResult(&psiResult);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
@ -854,9 +856,9 @@ public:
return false; return false;
} }
std::vector<generic_string> getFilenames() std::vector<wstring> getFilenames()
{ {
std::vector<generic_string> result; std::vector<wstring> result;
// Only the open dialog can have multiple results. // Only the open dialog can have multiple results.
com_ptr<IFileOpenDialog> pfd = _dialog; com_ptr<IFileOpenDialog> pfd = _dialog;
if (pfd) if (pfd)
@ -886,12 +888,12 @@ public:
} }
HWND _hwndOwner = nullptr; HWND _hwndOwner = nullptr;
const TCHAR* _title = nullptr; const wchar_t* _title = nullptr;
const TCHAR* _defExt = nullptr; const wchar_t* _defExt = nullptr;
generic_string _initialFolder; wstring _initialFolder;
generic_string _fallbackFolder; wstring _fallbackFolder;
const TCHAR* _checkboxLabel = nullptr; const wchar_t* _checkboxLabel = nullptr;
const TCHAR* _initialFileName = nullptr; const wchar_t* _initialFileName = nullptr;
bool _isCheckboxActive = true; bool _isCheckboxActive = true;
std::vector<Filter> _filterSpec; std::vector<Filter> _filterSpec;
int _fileTypeIndex = -1; // preferred file type index int _fileTypeIndex = -1; // preferred file type index
@ -899,7 +901,7 @@ public:
bool _hasReadonly = false; // set during the result handling bool _hasReadonly = false; // set during the result handling
bool _enableFileTypeCheckbox = false; bool _enableFileTypeCheckbox = false;
bool _fileTypeCheckboxValue = false; // initial value bool _fileTypeCheckboxValue = false; // initial value
generic_string _fileTypeCheckboxLabel; wstring _fileTypeCheckboxLabel;
private: private:
com_ptr<IFileDialog> _dialog; com_ptr<IFileDialog> _dialog;
@ -915,26 +917,26 @@ CustomFileDialog::CustomFileDialog(HWND hwnd) : _impl{ std::make_unique<Impl>()
NppParameters& params = NppParameters::getInstance(); NppParameters& params = NppParameters::getInstance();
NppGUI& nppGUI = params.getNppGUI(); NppGUI& nppGUI = params.getNppGUI();
const TCHAR* workDir = nppGUI._openSaveDir == dir_last ? nppGUI._lastUsedDir : params.getWorkingDir(); const wchar_t* workDir = nppGUI._openSaveDir == dir_last ? nppGUI._lastUsedDir : params.getWorkingDir();
if (workDir) if (workDir)
_impl->_fallbackFolder = workDir; _impl->_fallbackFolder = workDir;
} }
CustomFileDialog::~CustomFileDialog() = default; CustomFileDialog::~CustomFileDialog() = default;
void CustomFileDialog::setTitle(const TCHAR* title) void CustomFileDialog::setTitle(const wchar_t* title)
{ {
_impl->_title = title; _impl->_title = title;
} }
void CustomFileDialog::setExtFilter(const TCHAR *extText, const TCHAR *exts) void CustomFileDialog::setExtFilter(const wchar_t *extText, const wchar_t *exts)
{ {
// Add an asterisk before each dot in file patterns // Add an asterisk before each dot in file patterns
generic_string newExts{ exts ? exts : _T("") }; wstring newExts{ exts ? exts : _T("") };
for (size_t pos = 0; pos < newExts.size(); ++pos) for (size_t pos = 0; pos < newExts.size(); ++pos)
{ {
pos = newExts.find(_T('.'), pos); pos = newExts.find(_T('.'), pos);
if (pos == generic_string::npos) if (pos == wstring::npos)
break; break;
if (pos == 0 || newExts[pos - 1] != _T('*')) if (pos == 0 || newExts[pos - 1] != _T('*'))
{ {
@ -949,9 +951,9 @@ void CustomFileDialog::setExtFilter(const TCHAR *extText, const TCHAR *exts)
_impl->_filterSpec.push_back({ extText, newExts }); _impl->_filterSpec.push_back({ extText, newExts });
} }
void CustomFileDialog::setExtFilter(const TCHAR *extText, std::initializer_list<const TCHAR*> extList) void CustomFileDialog::setExtFilter(const wchar_t *extText, std::initializer_list<const wchar_t*> extList)
{ {
generic_string exts; wstring exts;
for (auto&& x : extList) for (auto&& x : extList)
{ {
exts += x; exts += x;
@ -961,22 +963,22 @@ void CustomFileDialog::setExtFilter(const TCHAR *extText, std::initializer_list<
setExtFilter(extText, exts.c_str()); setExtFilter(extText, exts.c_str());
} }
void CustomFileDialog::setDefExt(const TCHAR* ext) void CustomFileDialog::setDefExt(const wchar_t* ext)
{ {
_impl->_defExt = ext; _impl->_defExt = ext;
} }
void CustomFileDialog::setDefFileName(const TCHAR* fn) void CustomFileDialog::setDefFileName(const wchar_t* fn)
{ {
_impl->_initialFileName = fn; _impl->_initialFileName = fn;
} }
void CustomFileDialog::setFolder(const TCHAR* folder) void CustomFileDialog::setFolder(const wchar_t* folder)
{ {
_impl->_initialFolder = folder ? folder : _T(""); _impl->_initialFolder = folder ? folder : _T("");
} }
void CustomFileDialog::setCheckbox(const TCHAR* text, bool isActive) void CustomFileDialog::setCheckbox(const wchar_t* text, bool isActive)
{ {
_impl->_checkboxLabel = text; _impl->_checkboxLabel = text;
_impl->_isCheckboxActive = isActive; _impl->_isCheckboxActive = isActive;
@ -997,7 +999,7 @@ bool CustomFileDialog::isReadOnly() const
return _impl->_hasReadonly; return _impl->_hasReadonly;
} }
void CustomFileDialog::enableFileTypeCheckbox(const generic_string& text, bool value) void CustomFileDialog::enableFileTypeCheckbox(const wstring& text, bool value)
{ {
assert(!text.empty()); assert(!text.empty());
if (!text.empty()) if (!text.empty())
@ -1013,7 +1015,7 @@ bool CustomFileDialog::getFileTypeCheckboxValue() const
return _impl->getCheckboxState(IDC_FILE_TYPE_CHECKBOX); return _impl->getCheckboxState(IDC_FILE_TYPE_CHECKBOX);
} }
generic_string CustomFileDialog::doSaveDlg() wstring CustomFileDialog::doSaveDlg()
{ {
if (!_impl->initSave()) if (!_impl->initSave())
return {}; return {};
@ -1025,7 +1027,7 @@ generic_string CustomFileDialog::doSaveDlg()
return bOk ? _impl->getResultFilename() : _T(""); return bOk ? _impl->getResultFilename() : _T("");
} }
generic_string CustomFileDialog::doOpenSingleFileDlg() wstring CustomFileDialog::doOpenSingleFileDlg()
{ {
if (!_impl->initOpen()) if (!_impl->initOpen())
return {}; return {};
@ -1037,7 +1039,7 @@ generic_string CustomFileDialog::doOpenSingleFileDlg()
return bOk ? _impl->getResultFilename() : _T(""); return bOk ? _impl->getResultFilename() : _T("");
} }
std::vector<generic_string> CustomFileDialog::doOpenMultiFilesDlg() std::vector<wstring> CustomFileDialog::doOpenMultiFilesDlg()
{ {
if (!_impl->initOpen()) if (!_impl->initOpen())
return {}; return {};
@ -1051,7 +1053,7 @@ std::vector<generic_string> CustomFileDialog::doOpenMultiFilesDlg()
return {}; return {};
} }
generic_string CustomFileDialog::pickFolder() wstring CustomFileDialog::pickFolder()
{ {
if (!_impl->initOpen()) if (!_impl->initOpen())
return {}; return {};

View File

@ -29,23 +29,23 @@ class CustomFileDialog
public: public:
explicit CustomFileDialog(HWND hwnd); explicit CustomFileDialog(HWND hwnd);
~CustomFileDialog(); ~CustomFileDialog();
void setTitle(const TCHAR* title); void setTitle(const wchar_t* title);
void setExtFilter(const TCHAR* text, const TCHAR* ext); void setExtFilter(const wchar_t* text, const wchar_t* ext);
void setExtFilter(const TCHAR* text, std::initializer_list<const TCHAR*> exts); void setExtFilter(const wchar_t* text, std::initializer_list<const wchar_t*> exts);
void setDefExt(const TCHAR* ext); void setDefExt(const wchar_t* ext);
void setDefFileName(const TCHAR *fn); void setDefFileName(const wchar_t *fn);
void setFolder(const TCHAR* folder); void setFolder(const wchar_t* folder);
void setCheckbox(const TCHAR* text, bool isActive = true); void setCheckbox(const wchar_t* text, bool isActive = true);
void setExtIndex(int extTypeIndex); void setExtIndex(int extTypeIndex);
void enableFileTypeCheckbox(const generic_string& text, bool value); void enableFileTypeCheckbox(const std::wstring& text, bool value);
bool getFileTypeCheckboxValue() const; bool getFileTypeCheckboxValue() const;
// Empty string is not a valid file name and may signal that the dialog was canceled. // Empty string is not a valid file name and may signal that the dialog was canceled.
generic_string doSaveDlg(); std::wstring doSaveDlg();
generic_string pickFolder(); std::wstring pickFolder();
generic_string doOpenSingleFileDlg(); std::wstring doOpenSingleFileDlg();
std::vector<generic_string> doOpenMultiFilesDlg(); std::vector<std::wstring> doOpenMultiFilesDlg();
bool getCheckboxState() const; bool getCheckboxState() const;
bool isReadOnly() const; bool isReadOnly() const;

View File

@ -37,10 +37,10 @@ using nlohmann::json;
generic_string PluginUpdateInfo::describe() wstring PluginUpdateInfo::describe()
{ {
generic_string desc; wstring desc;
const TCHAR *EOL = TEXT("\r\n"); const wchar_t *EOL = L"\r\n";
if (!_description.empty()) if (!_description.empty())
{ {
desc = _description; desc = _description;
@ -49,14 +49,14 @@ generic_string PluginUpdateInfo::describe()
if (!_author.empty()) if (!_author.empty())
{ {
desc += TEXT("Author: "); desc += L"Author: ";
desc += _author; desc += _author;
desc += EOL; desc += EOL;
} }
if (!_homepage.empty()) if (!_homepage.empty())
{ {
desc += TEXT("Homepage: "); desc += L"Homepage: ";
desc += _homepage; desc += _homepage;
desc += EOL; desc += EOL;
} }
@ -65,7 +65,7 @@ generic_string PluginUpdateInfo::describe()
} }
/// Try to find in the Haystack the Needle - ignore case /// Try to find in the Haystack the Needle - ignore case
bool findStrNoCase(const generic_string & strHaystack, const generic_string & strNeedle) bool findStrNoCase(const wstring & strHaystack, const wstring & strNeedle)
{ {
auto it = std::search( auto it = std::search(
strHaystack.begin(), strHaystack.end(), strHaystack.begin(), strHaystack.end(),
@ -75,10 +75,10 @@ bool findStrNoCase(const generic_string & strHaystack, const generic_string & st
return (it != strHaystack.end()); return (it != strHaystack.end());
} }
bool PluginsAdminDlg::isFoundInListFromIndex(const PluginViewList& inWhichList, int index, const generic_string& str2search, bool inWhichPart) const bool PluginsAdminDlg::isFoundInListFromIndex(const PluginViewList& inWhichList, int index, const wstring& str2search, bool inWhichPart) const
{ {
const PluginUpdateInfo* pui = inWhichList.getPluginInfoFromUiIndex(index); const PluginUpdateInfo* pui = inWhichList.getPluginInfoFromUiIndex(index);
generic_string searchIn; wstring searchIn;
if (inWhichPart == _inNames) if (inWhichPart == _inNames)
searchIn = pui->_displayName; searchIn = pui->_displayName;
else //(inWhichPart == inDescs) else //(inWhichPart == inDescs)
@ -87,7 +87,7 @@ bool PluginsAdminDlg::isFoundInListFromIndex(const PluginViewList& inWhichList,
return (findStrNoCase(searchIn, str2search)); return (findStrNoCase(searchIn, str2search));
} }
long PluginsAdminDlg::searchFromCurrentSel(const PluginViewList& inWhichList, const generic_string& str2search, bool inWhichPart, bool isNextMode) const long PluginsAdminDlg::searchFromCurrentSel(const PluginViewList& inWhichList, const wstring& str2search, bool inWhichPart, bool isNextMode) const
{ {
// search from curent selected item or from the beginning // search from curent selected item or from the beginning
long currentIndex = inWhichList.getSelectedIndex(); long currentIndex = inWhichList.getSelectedIndex();
@ -132,10 +132,10 @@ void PluginsAdminDlg::create(int dialogID, bool isRTL, bool msgDestParent)
_tab.init(_hInst, _hSelf, false, true); _tab.init(_hInst, _hSelf, false, true);
NppDarkMode::subclassTabControl(_tab.getHSelf()); NppDarkMode::subclassTabControl(_tab.getHSelf());
const TCHAR *available = TEXT("Available"); const wchar_t *available = L"Available";
const TCHAR *updates = TEXT("Updates"); const wchar_t *updates = L"Updates";
const TCHAR *installed = TEXT("Installed"); const wchar_t *installed = L"Installed";
const TCHAR *incompatible = TEXT("Incompatible"); const wchar_t *incompatible = L"Incompatible";
_tab.insertAtEnd(available); _tab.insertAtEnd(available);
_tab.insertAtEnd(updates); _tab.insertAtEnd(updates);
@ -164,8 +164,8 @@ void PluginsAdminDlg::create(int dialogID, bool isRTL, bool msgDestParent)
NppParameters& nppParam = NppParameters::getInstance(); NppParameters& nppParam = NppParameters::getInstance();
NativeLangSpeaker *pNativeSpeaker = nppParam.getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = nppParam.getNativeLangSpeaker();
generic_string pluginStr = pNativeSpeaker->getAttrNameStr(TEXT("Plugin"), "PluginAdmin", "Plugin"); wstring pluginStr = pNativeSpeaker->getAttrNameStr(L"Plugin", "PluginAdmin", "Plugin");
generic_string vesionStr = pNativeSpeaker->getAttrNameStr(TEXT("Version"), "PluginAdmin", "Version"); wstring vesionStr = pNativeSpeaker->getAttrNameStr(L"Version", "PluginAdmin", "Version");
const COLORREF fgColor = nppParam.getCurrentDefaultFgColor(); const COLORREF fgColor = nppParam.getCurrentDefaultFgColor();
const COLORREF bgColor = nppParam.getCurrentDefaultBgColor(); const COLORREF bgColor = nppParam.getCurrentDefaultBgColor();
@ -202,7 +202,7 @@ void PluginsAdminDlg::create(int dialogID, bool isRTL, bool msgDestParent)
::SetWindowText(hPluginListVersionNumber, _pluginListVersion.c_str()); ::SetWindowText(hPluginListVersionNumber, _pluginListVersion.c_str());
_repoLink.init(_hInst, _hSelf); _repoLink.init(_hInst, _hSelf);
_repoLink.create(::GetDlgItem(_hSelf, IDC_PLUGINLIST_ADDR), TEXT("https://github.com/notepad-plus-plus/nppPluginList")); _repoLink.create(::GetDlgItem(_hSelf, IDC_PLUGINLIST_ADDR), L"https://github.com/notepad-plus-plus/nppPluginList");
goToCenter(SWP_SHOWWINDOW | SWP_NOSIZE); goToCenter(SWP_SHOWWINDOW | SWP_NOSIZE);
} }
@ -214,7 +214,7 @@ void PluginsAdminDlg::collectNppCurrentStatusInfos()
_nppCurrentStatus._isAppDataPluginsAllowed = ::SendMessage(_hParent, NPPM_GETAPPDATAPLUGINSALLOWED, 0, 0) == TRUE; _nppCurrentStatus._isAppDataPluginsAllowed = ::SendMessage(_hParent, NPPM_GETAPPDATAPLUGINSALLOWED, 0, 0) == TRUE;
_nppCurrentStatus._appdataPath = nppParam.getAppDataNppDir(); _nppCurrentStatus._appdataPath = nppParam.getAppDataNppDir();
generic_string programFilesPath = NppParameters::getSpecialFolderLocation(CSIDL_PROGRAM_FILES); wstring programFilesPath = NppParameters::getSpecialFolderLocation(CSIDL_PROGRAM_FILES);
_nppCurrentStatus._isInProgramFiles = (_nppCurrentStatus._nppInstallPath.find(programFilesPath) == 0); _nppCurrentStatus._isInProgramFiles = (_nppCurrentStatus._nppInstallPath.find(programFilesPath) == 0);
} }
@ -239,22 +239,22 @@ PluginsAdminDlg::PluginsAdminDlg()
// Get wingup path // Get wingup path
NppParameters& nppParameters = NppParameters::getInstance(); NppParameters& nppParameters = NppParameters::getInstance();
_updaterDir = nppParameters.getNppPath(); _updaterDir = nppParameters.getNppPath();
pathAppend(_updaterDir, TEXT("updater")); pathAppend(_updaterDir, L"updater");
_updaterFullPath = _updaterDir; _updaterFullPath = _updaterDir;
pathAppend(_updaterFullPath, TEXT("gup.exe")); pathAppend(_updaterFullPath, L"gup.exe");
// get plugin-list path // get plugin-list path
_pluginListFullPath = nppParameters.getPluginConfDir(); _pluginListFullPath = nppParameters.getPluginConfDir();
#ifdef DEBUG // if not debug, then it's release #ifdef DEBUG // if not debug, then it's release
// load from nppPluginList.json instead of nppPluginList.dll // load from nppPluginList.json instead of nppPluginList.dll
pathAppend(_pluginListFullPath, TEXT("nppPluginList.json")); pathAppend(_pluginListFullPath, L"nppPluginList.json");
#else //RELEASE #else //RELEASE
pathAppend(_pluginListFullPath, TEXT("nppPluginList.dll")); pathAppend(_pluginListFullPath, L"nppPluginList.dll");
#endif #endif
} }
generic_string PluginsAdminDlg::getPluginListVerStr() const wstring PluginsAdminDlg::getPluginListVerStr() const
{ {
Version v; Version v;
v.setVersionFrom(_pluginListFullPath); v.setVersionFrom(_pluginListFullPath);
@ -263,63 +263,63 @@ generic_string PluginsAdminDlg::getPluginListVerStr() const
bool PluginsAdminDlg::exitToInstallRemovePlugins(Operation op, const vector<PluginUpdateInfo*>& puis) bool PluginsAdminDlg::exitToInstallRemovePlugins(Operation op, const vector<PluginUpdateInfo*>& puis)
{ {
generic_string opStr; wstring opStr;
if (op == pa_install) if (op == pa_install)
opStr = TEXT("-unzipTo "); opStr = L"-unzipTo ";
else if (op == pa_update) else if (op == pa_update)
opStr = TEXT("-unzipTo -clean "); opStr = L"-unzipTo -clean ";
else if (op == pa_remove) else if (op == pa_remove)
opStr = TEXT("-clean "); opStr = L"-clean ";
else else
return false; return false;
NppParameters& nppParameters = NppParameters::getInstance(); NppParameters& nppParameters = NppParameters::getInstance();
generic_string updaterDir = nppParameters.getNppPath(); wstring updaterDir = nppParameters.getNppPath();
updaterDir += TEXT("\\updater\\"); updaterDir += L"\\updater\\";
generic_string updaterFullPath = updaterDir + TEXT("gup.exe"); wstring updaterFullPath = updaterDir + L"gup.exe";
generic_string updaterParams = opStr; wstring updaterParams = opStr;
TCHAR nppFullPath[MAX_PATH]{}; wchar_t nppFullPath[MAX_PATH]{};
::GetModuleFileName(NULL, nppFullPath, MAX_PATH); ::GetModuleFileName(NULL, nppFullPath, MAX_PATH);
updaterParams += TEXT("\""); updaterParams += L"\"";
updaterParams += nppFullPath; updaterParams += nppFullPath;
updaterParams += TEXT("\" "); updaterParams += L"\" ";
updaterParams += TEXT("\""); updaterParams += L"\"";
updaterParams += nppParameters.getPluginRootDir(); updaterParams += nppParameters.getPluginRootDir();
updaterParams += TEXT("\""); updaterParams += L"\"";
for (const auto &i : puis) for (const auto &i : puis)
{ {
if (op == pa_install || op == pa_update) if (op == pa_install || op == pa_update)
{ {
// add folder to operate // add folder to operate
updaterParams += TEXT(" \""); updaterParams += L" \"";
updaterParams += i->_folderName; updaterParams += i->_folderName;
updaterParams += TEXT(" "); updaterParams += L" ";
updaterParams += i->_repository; updaterParams += i->_repository;
updaterParams += TEXT(" "); updaterParams += L" ";
updaterParams += i->_id; updaterParams += i->_id;
updaterParams += TEXT("\""); updaterParams += L"\"";
} }
else // op == pa_remove else // op == pa_remove
{ {
// add folder to operate // add folder to operate
updaterParams += TEXT(" \""); updaterParams += L" \"";
generic_string folderName = i->_folderName; wstring folderName = i->_folderName;
if (folderName.empty()) if (folderName.empty())
{ {
auto lastindex = i->_displayName.find_last_of(TEXT(".")); auto lastindex = i->_displayName.find_last_of(L".");
if (lastindex != generic_string::npos) if (lastindex != wstring::npos)
folderName = i->_displayName.substr(0, lastindex); folderName = i->_displayName.substr(0, lastindex);
else else
folderName = i->_displayName; // This case will never occur, but in case if it occurs too folderName = i->_displayName; // This case will never occur, but in case if it occurs too
// just putting the plugin name, so that whole plugin system is not screewed. // just putting the plugin name, so that whole plugin system is not screewed.
} }
updaterParams += folderName; updaterParams += folderName;
updaterParams += TEXT("\""); updaterParams += L"\"";
} }
} }
@ -327,8 +327,8 @@ bool PluginsAdminDlg::exitToInstallRemovePlugins(Operation op, const vector<Plug
NativeLangSpeaker *pNativeSpeaker = nppParameters.getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = nppParameters.getNativeLangSpeaker();
auto res = pNativeSpeaker->messageBox("ExitToUpdatePlugins", auto res = pNativeSpeaker->messageBox("ExitToUpdatePlugins",
_hSelf, _hSelf,
TEXT("If you click YES, you will quit Notepad++ to continue the operations.\nNotepad++ will be restarted after all the operations are terminated.\nContinue?"), L"If you click YES, you will quit Notepad++ to continue the operations.\nNotepad++ will be restarted after all the operations are terminated.\nContinue?",
TEXT("Notepad++ is about to exit"), L"Notepad++ is about to exit",
MB_YESNO | MB_APPLMODAL); MB_YESNO | MB_APPLMODAL);
if (res == IDYES) if (res == IDYES)
@ -384,19 +384,19 @@ bool PluginsAdminDlg::removePlugins()
return exitToInstallRemovePlugins(pa_remove, puis); return exitToInstallRemovePlugins(pa_remove, puis);
} }
void PluginsAdminDlg::changeTabName(LIST_TYPE index, const TCHAR *name2change) void PluginsAdminDlg::changeTabName(LIST_TYPE index, const wchar_t *name2change)
{ {
TCITEM tie{}; TCITEM tie{};
tie.mask = TCIF_TEXT; tie.mask = TCIF_TEXT;
tie.pszText = (TCHAR *)name2change; tie.pszText = (wchar_t *)name2change;
TabCtrl_SetItem(_tab.getHSelf(), index, &tie); TabCtrl_SetItem(_tab.getHSelf(), index, &tie);
TCHAR label[MAX_PATH]{}; wchar_t label[MAX_PATH]{};
_tab.getCurrentTitle(label, MAX_PATH); _tab.getCurrentTitle(label, MAX_PATH);
::SetWindowText(_hSelf, label); ::SetWindowText(_hSelf, label);
} }
void PluginsAdminDlg::changeColumnName(COLUMN_TYPE index, const TCHAR *name2change) void PluginsAdminDlg::changeColumnName(COLUMN_TYPE index, const wchar_t *name2change)
{ {
_availableList.changeColumnName(index, name2change); _availableList.changeColumnName(index, name2change);
_updateList.changeColumnName(index, name2change); _updateList.changeColumnName(index, name2change);
@ -404,12 +404,12 @@ void PluginsAdminDlg::changeColumnName(COLUMN_TYPE index, const TCHAR *name2chan
_incompatibleList.changeColumnName(index, name2change); _incompatibleList.changeColumnName(index, name2change);
} }
void PluginViewList::changeColumnName(COLUMN_TYPE index, const TCHAR *name2change) void PluginViewList::changeColumnName(COLUMN_TYPE index, const wchar_t *name2change)
{ {
_ui.setColumnText(index, name2change); _ui.setColumnText(index, name2change);
} }
bool PluginViewList::removeFromFolderName(const generic_string& folderName) bool PluginViewList::removeFromFolderName(const wstring& folderName)
{ {
for (size_t i = 0; i < _ui.nbItem(); ++i) for (size_t i = 0; i < _ui.nbItem(); ++i)
@ -437,7 +437,7 @@ void PluginViewList::pushBack(PluginUpdateInfo* pi)
{ {
_list.push_back(pi); _list.push_back(pi);
vector<generic_string> values2Add; vector<wstring> values2Add;
values2Add.push_back(pi->_displayName); values2Add.push_back(pi->_displayName);
Version v = pi->_version; Version v = pi->_version;
values2Add.push_back(v.toString()); values2Add.push_back(v.toString());
@ -454,7 +454,7 @@ void PluginViewList::pushBack(PluginUpdateInfo* pi)
// "[8.3,]" : any version from 8.3 to the latest one // "[8.3,]" : any version from 8.3 to the latest one
// "[,8.2.1]" : 8.2.1 and any previous version // "[,8.2.1]" : 8.2.1 and any previous version
// //
std::pair<Version, Version> getIntervalVersions(generic_string intervalVerStr) std::pair<Version, Version> getIntervalVersions(wstring intervalVerStr)
{ {
std::pair<Version, Version> result; std::pair<Version, Version> result;
@ -464,8 +464,8 @@ std::pair<Version, Version> getIntervalVersions(generic_string intervalVerStr)
const size_t indexEnd = intervalVerStr.length() - 1; const size_t indexEnd = intervalVerStr.length() - 1;
if (intervalVerStr[0] == '[' && intervalVerStr[indexEnd] == ']') // interval versions format if (intervalVerStr[0] == '[' && intervalVerStr[indexEnd] == ']') // interval versions format
{ {
generic_string cleanIntervalVerStr = intervalVerStr.substr(1, indexEnd - 1); wstring cleanIntervalVerStr = intervalVerStr.substr(1, indexEnd - 1);
vector<generic_string> versionVect; vector<wstring> versionVect;
cutStringBy(cleanIntervalVerStr.c_str(), versionVect, ',', true); cutStringBy(cleanIntervalVerStr.c_str(), versionVect, ',', true);
if (versionVect.size() == 2) if (versionVect.size() == 2)
{ {
@ -501,16 +501,16 @@ std::pair<Version, Version> getIntervalVersions(generic_string intervalVerStr)
// "[4.2,6.6.6][6.4,8.9]" : The 1st interval from version 4.2 to 6.6.6 inclusive, the 2nd interval from version 6.4 to 8.9 // "[4.2,6.6.6][6.4,8.9]" : The 1st interval from version 4.2 to 6.6.6 inclusive, the 2nd interval from version 6.4 to 8.9
// "[8.3,][6.9,6.9]" : The 1st interval any version from 8.3 to the latest version, the 2nd interval present only version 6.9 // "[8.3,][6.9,6.9]" : The 1st interval any version from 8.3 to the latest version, the 2nd interval present only version 6.9
// "[,8.2.1][4.4,]" : The 1st interval 8.2.1 and any previous version, , the 2nd interval any version from 4.4 to the latest version // "[,8.2.1][4.4,]" : The 1st interval 8.2.1 and any previous version, , the 2nd interval any version from 4.4 to the latest version
std::pair<std::pair<Version, Version>, std::pair<Version, Version>> getTwoIntervalVersions(generic_string twoIntervalVerStr) std::pair<std::pair<Version, Version>, std::pair<Version, Version>> getTwoIntervalVersions(wstring twoIntervalVerStr)
{ {
std::pair<std::pair<Version, Version>, std::pair<Version, Version>> r; std::pair<std::pair<Version, Version>, std::pair<Version, Version>> r;
generic_string sep = TEXT("]["); wstring sep = L"][";
generic_string::size_type pos = twoIntervalVerStr.find(sep, 0); wstring::size_type pos = twoIntervalVerStr.find(sep, 0);
if (pos == string::npos) if (pos == string::npos)
return r; return r;
generic_string intervalStr1 = twoIntervalVerStr.substr(0, pos + 1); wstring intervalStr1 = twoIntervalVerStr.substr(0, pos + 1);
generic_string intervalStr2 = twoIntervalVerStr.substr(pos + 1, twoIntervalVerStr.length() - pos + 1); wstring intervalStr2 = twoIntervalVerStr.substr(pos + 1, twoIntervalVerStr.length() - pos + 1);
r.first = getIntervalVersions(intervalStr1); r.first = getIntervalVersions(intervalStr1);
r.second = getIntervalVersions(intervalStr2); r.second = getIntervalVersions(intervalStr2);
@ -558,7 +558,7 @@ bool loadFromJson(std::vector<PluginUpdateInfo*>& pl, wstring& verStr, const jso
try { try {
valStr = i.at("version").get<std::string>(); valStr = i.at("version").get<std::string>();
generic_string newValStr(valStr.begin(), valStr.end()); wstring newValStr(valStr.begin(), valStr.end());
pi->_version = Version(newValStr); pi->_version = Version(newValStr);
if (i.contains("npp-compatible-versions")) if (i.contains("npp-compatible-versions"))
@ -566,7 +566,7 @@ bool loadFromJson(std::vector<PluginUpdateInfo*>& pl, wstring& verStr, const jso
json jNppCompatibleVer = i["npp-compatible-versions"]; json jNppCompatibleVer = i["npp-compatible-versions"];
string versionsStr = jNppCompatibleVer.get<std::string>(); string versionsStr = jNppCompatibleVer.get<std::string>();
generic_string nppCompatibleVersionStr(versionsStr.begin(), versionsStr.end()); wstring nppCompatibleVersionStr(versionsStr.begin(), versionsStr.end());
pi->_nppCompatibleVersions = getIntervalVersions(nppCompatibleVersionStr); pi->_nppCompatibleVersions = getIntervalVersions(nppCompatibleVersionStr);
} }
@ -575,7 +575,7 @@ bool loadFromJson(std::vector<PluginUpdateInfo*>& pl, wstring& verStr, const jso
json jOldVerCompatibility = i["old-versions-compatibility"]; json jOldVerCompatibility = i["old-versions-compatibility"];
string versionsStr = jOldVerCompatibility.get<std::string>(); string versionsStr = jOldVerCompatibility.get<std::string>();
generic_string oldVerCompatibilityStr(versionsStr.begin(), versionsStr.end()); wstring oldVerCompatibilityStr(versionsStr.begin(), versionsStr.end());
pi->_oldVersionCompatibility = getTwoIntervalVersions(oldVerCompatibilityStr); pi->_oldVersionCompatibility = getTwoIntervalVersions(oldVerCompatibilityStr);
} }
} }
@ -596,7 +596,7 @@ bool loadFromJson(std::vector<PluginUpdateInfo*>& pl, wstring& verStr, const jso
#ifdef DEBUG #ifdef DEBUG
catch (const wstring& exceptionStr) catch (const wstring& exceptionStr)
{ {
::MessageBox(NULL, exceptionStr.c_str(), TEXT("Exception caught in: PluginsAdmin loadFromJson()"), MB_ICONERROR); ::MessageBox(NULL, exceptionStr.c_str(), L"Exception caught in: PluginsAdmin loadFromJson()", MB_ICONERROR);
continue; continue;
} }
@ -617,7 +617,7 @@ bool loadFromJson(std::vector<PluginUpdateInfo*>& pl, wstring& verStr, const jso
return true; return true;
} }
PluginUpdateInfo::PluginUpdateInfo(const generic_string& fullFilePath, const generic_string& filename) PluginUpdateInfo::PluginUpdateInfo(const wstring& fullFilePath, const wstring& filename)
{ {
if (!::PathFileExists(fullFilePath.c_str())) if (!::PathFileExists(fullFilePath.c_str()))
return; return;
@ -686,7 +686,7 @@ bool PluginsAdminDlg::initFromJson()
if (!hLib) if (!hLib)
{ {
// Error treatment // Error treatment
//printStr(TEXT("LoadLibrary PB!!!")); //printStr(L"LoadLibrary PB!!!");
return false; return false;
} }
@ -743,7 +743,7 @@ bool PluginsAdminDlg::updateList()
bool PluginsAdminDlg::initAvailablePluginsViewFromList() bool PluginsAdminDlg::initAvailablePluginsViewFromList()
{ {
TCHAR nppFullPathName[MAX_PATH]{}; wchar_t nppFullPathName[MAX_PATH]{};
GetModuleFileName(NULL, nppFullPathName, MAX_PATH); GetModuleFileName(NULL, nppFullPathName, MAX_PATH);
Version nppVer; Version nppVer;
@ -755,7 +755,7 @@ bool PluginsAdminDlg::initAvailablePluginsViewFromList()
if (isCompatible) if (isCompatible)
{ {
vector<generic_string> values2Add; vector<wstring> values2Add;
values2Add.push_back(i->_displayName); values2Add.push_back(i->_displayName);
Version v = i->_version; Version v = i->_version;
values2Add.push_back(v.toString()); values2Add.push_back(v.toString());
@ -772,7 +772,7 @@ bool PluginsAdminDlg::initAvailablePluginsViewFromList()
bool PluginsAdminDlg::initIncompatiblePluginList() bool PluginsAdminDlg::initIncompatiblePluginList()
{ {
TCHAR nppFullPathName[MAX_PATH]{}; wchar_t nppFullPathName[MAX_PATH]{};
GetModuleFileName(NULL, nppFullPathName, MAX_PATH); GetModuleFileName(NULL, nppFullPathName, MAX_PATH);
Version nppVer; Version nppVer;
@ -780,7 +780,7 @@ bool PluginsAdminDlg::initIncompatiblePluginList()
for (const auto& i : _incompatibleList._list) for (const auto& i : _incompatibleList._list)
{ {
vector<generic_string> values2Add; vector<wstring> values2Add;
values2Add.push_back(i->_displayName); values2Add.push_back(i->_displayName);
Version v = i->_version; Version v = i->_version;
values2Add.push_back(v.toString()); values2Add.push_back(v.toString());
@ -806,7 +806,7 @@ bool PluginsAdminDlg::loadFromPluginInfos()
continue; continue;
// user file name (without ext. to find whole info in available list // user file name (without ext. to find whole info in available list
TCHAR fnNoExt[MAX_PATH]{}; wchar_t fnNoExt[MAX_PATH]{};
wcscpy_s(fnNoExt, i._fileName.c_str()); wcscpy_s(fnNoExt, i._fileName.c_str());
::PathRemoveExtension(fnNoExt); ::PathRemoveExtension(fnNoExt);
@ -862,7 +862,7 @@ bool PluginsAdminDlg::loadFromPluginInfos()
return true; return true;
} }
PluginUpdateInfo* PluginViewList::findPluginInfoFromFolderName(const generic_string& folderName, int& index) const PluginUpdateInfo* PluginViewList::findPluginInfoFromFolderName(const wstring& folderName, int& index) const
{ {
index = 0; index = 0;
for (const auto& i : _list) for (const auto& i : _list)
@ -946,17 +946,17 @@ bool PluginViewList::hideFromPluginInfoPtr(PluginUpdateInfo* pluginInfo2hide)
return false; return false;
} }
bool PluginViewList::restore(const generic_string& folderName) bool PluginViewList::restore(const wstring& folderName)
{ {
for (const auto &i : _list) for (const auto &i : _list)
{ {
if (i->_folderName == folderName) if (i->_folderName == folderName)
{ {
vector<generic_string> values2Add; vector<wstring> values2Add;
values2Add.push_back(i->_displayName); values2Add.push_back(i->_displayName);
Version v = i->_version; Version v = i->_version;
values2Add.push_back(v.toString()); values2Add.push_back(v.toString());
values2Add.push_back(TEXT("Yes")); values2Add.push_back(L"Yes");
_ui.addLine(values2Add, reinterpret_cast<LPARAM>(i)); _ui.addLine(values2Add, reinterpret_cast<LPARAM>(i));
i->_isVisible = true; i->_isVisible = true;
@ -995,7 +995,7 @@ bool PluginsAdminDlg::checkUpdates()
bool PluginsAdminDlg::searchInPlugins(bool isNextMode) const bool PluginsAdminDlg::searchInPlugins(bool isNextMode) const
{ {
constexpr int maxLen = 256; constexpr int maxLen = 256;
TCHAR txt2search[maxLen]{}; wchar_t txt2search[maxLen]{};
::GetDlgItemText(_hSelf, IDC_PLUGINADM_SEARCH_EDIT, txt2search, maxLen); ::GetDlgItemText(_hSelf, IDC_PLUGINADM_SEARCH_EDIT, txt2search, maxLen);
if (lstrlen(txt2search) < 2) if (lstrlen(txt2search) < 2)
return false; return false;
@ -1036,7 +1036,7 @@ bool PluginsAdminDlg::searchInPlugins(bool isNextMode) const
void PluginsAdminDlg::switchDialog(int indexToSwitch) void PluginsAdminDlg::switchDialog(int indexToSwitch)
{ {
generic_string desc; wstring desc;
bool showAvailable, showUpdate, showInstalled, showIncompatibile; bool showAvailable, showUpdate, showInstalled, showIncompatibile;
switch (indexToSwitch) switch (indexToSwitch)
{ {
@ -1322,7 +1322,7 @@ intptr_t CALLBACK PluginsAdminDlg::run_dlgProc(UINT message, WPARAM wParam, LPAR
else if (pnmv->uNewState & LVIS_SELECTED) else if (pnmv->uNewState & LVIS_SELECTED)
{ {
PluginUpdateInfo* pui = pViewList->getPluginInfoFromUiIndex(pnmv->iItem); PluginUpdateInfo* pui = pViewList->getPluginInfoFromUiIndex(pnmv->iItem);
generic_string desc = buttonID ? pui->describe() : pui->_description; wstring desc = buttonID ? pui->describe() : pui->_description;
::SetDlgItemText(_hSelf, IDC_PLUGINADM_EDIT, desc.c_str()); ::SetDlgItemText(_hSelf, IDC_PLUGINADM_EDIT, desc.c_str());
} }
} }

View File

@ -29,10 +29,10 @@ class PluginsManager;
struct PluginUpdateInfo struct PluginUpdateInfo
{ {
generic_string _fullFilePath; // only for the installed Plugin std::wstring _fullFilePath; // only for the installed Plugin
generic_string _folderName; // plugin folder name - should be the same name with plugin and should be uniq among the plugins std::wstring _folderName; // plugin folder name - should be the same name with plugin and should be uniq among the plugins
generic_string _displayName; // plugin description name std::wstring _displayName; // plugin description name
Version _version; Version _version;
// Optional // Optional
std::pair<Version, Version> _nppCompatibleVersions; // compatible to Notepad++ interval versions: <from, to> example: std::pair<Version, Version> _nppCompatibleVersions; // compatible to Notepad++ interval versions: <from, to> example:
@ -48,17 +48,17 @@ struct PluginUpdateInfo
// The 2nd interval versions are for Notepad++ versions // The 2nd interval versions are for Notepad++ versions
// which are compatible with the old plugins' versions given in the 1st interval // which are compatible with the old plugins' versions given in the 1st interval
generic_string _homepage; std::wstring _homepage;
generic_string _sourceUrl; std::wstring _sourceUrl;
generic_string _description; std::wstring _description;
generic_string _author; std::wstring _author;
generic_string _id; // Plugin package ID: SHA-256 hash std::wstring _id; // Plugin package ID: SHA-256 hash
generic_string _repository; std::wstring _repository;
bool _isVisible = true; // if false then it should not be displayed bool _isVisible = true; // if false then it should not be displayed
generic_string describe(); std::wstring describe();
PluginUpdateInfo() = default; PluginUpdateInfo() = default;
PluginUpdateInfo(const generic_string& fullFilePath, const generic_string& fileName); PluginUpdateInfo(const std::wstring& fullFilePath, const std::wstring& fileName);
}; };
struct NppCurrentStatus struct NppCurrentStatus
@ -70,8 +70,8 @@ struct NppCurrentStatus
bool _isAppDataPluginsAllowed = false; // true: install on %APPDATA%, update / remove on %APPDATA% & "Program files" or NPP_INST bool _isAppDataPluginsAllowed = false; // true: install on %APPDATA%, update / remove on %APPDATA% & "Program files" or NPP_INST
generic_string _nppInstallPath; std::wstring _nppInstallPath;
generic_string _appdataPath; std::wstring _appdataPath;
// it should determinate : // it should determinate :
// 1. deployment location : %ProgramFile% %appdata% %other% // 1. deployment location : %ProgramFile% %appdata% %other%
@ -118,15 +118,15 @@ public:
void setViewStyleOption(int32_t extraStyle) { _ui.setStyleOption(extraStyle); }; void setViewStyleOption(int32_t extraStyle) { _ui.setStyleOption(extraStyle); };
size_t nbItem() const { return _ui.nbItem(); }; size_t nbItem() const { return _ui.nbItem(); };
PluginUpdateInfo* getPluginInfoFromUiIndex(size_t index) const { return reinterpret_cast<PluginUpdateInfo*>(_ui.getLParamFromIndex(static_cast<int>(index))); }; PluginUpdateInfo* getPluginInfoFromUiIndex(size_t index) const { return reinterpret_cast<PluginUpdateInfo*>(_ui.getLParamFromIndex(static_cast<int>(index))); };
PluginUpdateInfo* findPluginInfoFromFolderName(const generic_string& folderName, int& index) const; PluginUpdateInfo* findPluginInfoFromFolderName(const std::wstring& folderName, int& index) const;
bool removeFromListIndex(size_t index2remove); bool removeFromListIndex(size_t index2remove);
bool hideFromListIndex(size_t index2Hide); bool hideFromListIndex(size_t index2Hide);
bool removeFromFolderName(const generic_string& folderName); bool removeFromFolderName(const std::wstring& folderName);
bool removeFromUiIndex(size_t index2remove); bool removeFromUiIndex(size_t index2remove);
bool hideFromPluginInfoPtr(PluginUpdateInfo* pluginInfo2hide); bool hideFromPluginInfoPtr(PluginUpdateInfo* pluginInfo2hide);
bool restore(const generic_string& folderName); bool restore(const std::wstring& folderName);
bool removeFromPluginInfoPtr(PluginUpdateInfo* pluginInfo2hide); bool removeFromPluginInfoPtr(PluginUpdateInfo* pluginInfo2hide);
void changeColumnName(COLUMN_TYPE index, const TCHAR *name2change); void changeColumnName(COLUMN_TYPE index, const wchar_t *name2change);
private: private:
// _list & _ui should keep being synchronized // _list & _ui should keep being synchronized
@ -167,9 +167,9 @@ public :
bool updatePlugins(); bool updatePlugins();
bool removePlugins(); bool removePlugins();
void changeTabName(LIST_TYPE index, const TCHAR *name2change); void changeTabName(LIST_TYPE index, const wchar_t *name2change);
void changeColumnName(COLUMN_TYPE index, const TCHAR *name2change); void changeColumnName(COLUMN_TYPE index, const wchar_t *name2change);
generic_string getPluginListVerStr() const; std::wstring getPluginListVerStr() const;
const PluginViewList & getAvailablePluginUpdateInfoList() const { const PluginViewList & getAvailablePluginUpdateInfoList() const {
return _availableList; return _availableList;
}; };
@ -182,9 +182,9 @@ protected:
intptr_t CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) override; intptr_t CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) override;
private : private :
generic_string _updaterDir; std::wstring _updaterDir;
generic_string _updaterFullPath; std::wstring _updaterFullPath;
generic_string _pluginListFullPath; std::wstring _pluginListFullPath;
TabBar _tab; TabBar _tab;
@ -203,13 +203,13 @@ private :
bool searchInPlugins(bool isNextMode) const; bool searchInPlugins(bool isNextMode) const;
const bool _inNames = true; const bool _inNames = true;
const bool _inDescs = false; const bool _inDescs = false;
bool isFoundInListFromIndex(const PluginViewList& inWhichList,int index, const generic_string& str2search, bool inWhichPart) const; bool isFoundInListFromIndex(const PluginViewList& inWhichList,int index, const std::wstring& str2search, bool inWhichPart) const;
long searchFromCurrentSel(const PluginViewList& inWhichList, const generic_string& str2search, bool inWhichPart, bool isNextMode) const; long searchFromCurrentSel(const PluginViewList& inWhichList, const std::wstring& str2search, bool inWhichPart, bool isNextMode) const;
long searchInNamesFromCurrentSel(const PluginViewList& inWhichList, const generic_string& str2search, bool isNextMode) const { long searchInNamesFromCurrentSel(const PluginViewList& inWhichList, const std::wstring& str2search, bool isNextMode) const {
return searchFromCurrentSel(inWhichList, str2search, _inNames, isNextMode); return searchFromCurrentSel(inWhichList, str2search, _inNames, isNextMode);
}; };
long searchInDescsFromCurrentSel(const PluginViewList& inWhichList, const generic_string& str2search, bool isNextMode) const { long searchInDescsFromCurrentSel(const PluginViewList& inWhichList, const std::wstring& str2search, bool isNextMode) const {
return searchFromCurrentSel(inWhichList, str2search, _inDescs, isNextMode); return searchFromCurrentSel(inWhichList, str2search, _inDescs, isNextMode);
}; };

View File

@ -31,6 +31,8 @@
#define INDEX_LEAF 5 #define INDEX_LEAF 5
#define INDEX_LEAF_INVALID 6 #define INDEX_LEAF_INVALID 6
using namespace std;
ProjectPanel::~ProjectPanel() ProjectPanel::~ProjectPanel()
{ {
for (const auto& s : fullPathStrs) for (const auto& s : fullPathStrs)
@ -55,8 +57,8 @@ intptr_t CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM
TBBUTTON tbButtons[2]{}; TBBUTTON tbButtons[2]{};
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
generic_string workspace_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 0, PM_WORKSPACEMENUENTRY); wstring workspace_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 0, PM_WORKSPACEMENUENTRY);
generic_string edit_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 1, PM_EDITMENUENTRY); wstring edit_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 1, PM_EDITMENUENTRY);
tbButtons[0].idCommand = IDB_PROJECT_BTN; tbButtons[0].idCommand = IDB_PROJECT_BTN;
tbButtons[0].iBitmap = I_IMAGENONE; tbButtons[0].iBitmap = I_IMAGENONE;
@ -188,12 +190,12 @@ bool ProjectPanel::checkIfNeedSave()
{ {
if (_isDirty) if (_isDirty)
{ {
const TCHAR * title = _workSpaceFilePath.length() > 0 ? PathFindFileName (_workSpaceFilePath.c_str()) : _panelTitle.c_str(); const wchar_t * title = _workSpaceFilePath.length() > 0 ? PathFindFileName (_workSpaceFilePath.c_str()) : _panelTitle.c_str();
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
int res = pNativeSpeaker->messageBox("ProjectPanelChanged", int res = pNativeSpeaker->messageBox("ProjectPanelChanged",
_hSelf, _hSelf,
TEXT("The workspace was modified. Do you want to save it?"), L"The workspace was modified. Do you want to save it?",
TEXT("$STR_REPLACE$"), L"$STR_REPLACE$",
MB_YESNOCANCEL | MB_ICONQUESTION, MB_YESNOCANCEL | MB_ICONQUESTION,
0, 0,
title); title);
@ -222,14 +224,14 @@ void ProjectPanel::initMenus()
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
generic_string new_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_NEWWS, PM_NEWWORKSPACE); wstring new_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_NEWWS, PM_NEWWORKSPACE);
generic_string open_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_OPENWS, PM_OPENWORKSPACE); wstring open_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_OPENWS, PM_OPENWORKSPACE);
generic_string reload_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_RELOADWS, PM_RELOADWORKSPACE); wstring reload_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_RELOADWS, PM_RELOADWORKSPACE);
generic_string save_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_SAVEWS, PM_SAVEWORKSPACE); wstring save_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_SAVEWS, PM_SAVEWORKSPACE);
generic_string saveas_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_SAVEASWS, PM_SAVEASWORKSPACE); wstring saveas_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_SAVEASWS, PM_SAVEASWORKSPACE);
generic_string saveacopyas_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_SAVEACOPYASWS, PM_SAVEACOPYASWORKSPACE); wstring saveacopyas_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_SAVEACOPYASWS, PM_SAVEACOPYASWORKSPACE);
generic_string newproject_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_NEWPROJECT, PM_NEWPROJECTWORKSPACE); wstring newproject_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_NEWPROJECT, PM_NEWPROJECTWORKSPACE);
generic_string findinprojects_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_FINDINPROJECTSWS, PM_FINDINFILESWORKSPACE); wstring findinprojects_workspace = pNativeSpeaker->getProjectPanelLangMenuStr("WorkspaceMenu", IDM_PROJECT_FINDINPROJECTSWS, PM_FINDINFILESWORKSPACE);
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWWS, new_workspace.c_str()); ::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWWS, new_workspace.c_str());
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_OPENWS, open_workspace.c_str()); ::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_OPENWS, open_workspace.c_str());
@ -242,13 +244,13 @@ void ProjectPanel::initMenus()
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, static_cast<UINT>(-1), 0); ::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, static_cast<UINT>(-1), 0);
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_FINDINPROJECTSWS, findinprojects_workspace.c_str()); ::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_FINDINPROJECTSWS, findinprojects_workspace.c_str());
generic_string edit_moveup = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_MOVEUP, PM_MOVEUPENTRY); wstring edit_moveup = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_MOVEUP, PM_MOVEUPENTRY);
generic_string edit_movedown = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_MOVEDOWN, PM_MOVEDOWNENTRY); wstring edit_movedown = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_MOVEDOWN, PM_MOVEDOWNENTRY);
generic_string edit_rename = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_RENAME, PM_EDITRENAME); wstring edit_rename = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_RENAME, PM_EDITRENAME);
generic_string edit_addfolder = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_NEWFOLDER, PM_EDITNEWFOLDER); wstring edit_addfolder = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_NEWFOLDER, PM_EDITNEWFOLDER);
generic_string edit_addfiles = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_ADDFILES, PM_EDITADDFILES); wstring edit_addfiles = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_ADDFILES, PM_EDITADDFILES);
generic_string edit_addfilesRecursive = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_ADDFILESRECUSIVELY, PM_EDITADDFILESRECUSIVELY); wstring edit_addfilesRecursive = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_ADDFILESRECUSIVELY, PM_EDITADDFILESRECUSIVELY);
generic_string edit_remove = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_DELETEFOLDER, PM_EDITREMOVE); wstring edit_remove = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_DELETEFOLDER, PM_EDITREMOVE);
_hProjectMenu = ::CreatePopupMenu(); _hProjectMenu = ::CreatePopupMenu();
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEUP, edit_moveup.c_str()); ::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEUP, edit_moveup.c_str());
@ -282,7 +284,7 @@ void ProjectPanel::initMenus()
edit_movedown = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_MOVEDOWN, PM_MOVEDOWNENTRY); edit_movedown = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_MOVEDOWN, PM_MOVEDOWNENTRY);
edit_rename = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_RENAME, PM_EDITRENAME); edit_rename = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_RENAME, PM_EDITRENAME);
edit_remove = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_DELETEFILE, PM_EDITREMOVE); edit_remove = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_DELETEFILE, PM_EDITREMOVE);
generic_string edit_modifyfile = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_MODIFYFILEPATH, PM_EDITMODIFYFILE); wstring edit_modifyfile = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_MODIFYFILEPATH, PM_EDITMODIFYFILE);
_hFileMenu = ::CreatePopupMenu(); _hFileMenu = ::CreatePopupMenu();
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEUP, edit_moveup.c_str()); ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEUP, edit_moveup.c_str());
@ -301,11 +303,11 @@ void ProjectPanel::destroyMenus()
::DestroyMenu(_hFileMenu); ::DestroyMenu(_hFileMenu);
} }
bool ProjectPanel::openWorkSpace(const TCHAR *projectFileName, bool force) bool ProjectPanel::openWorkSpace(const wchar_t *projectFileName, bool force)
{ {
if ((!force) && (_workSpaceFilePath.length() > 0)) if ((!force) && (_workSpaceFilePath.length() > 0))
{ // Return if it is better to keep the current workspace tree { // Return if it is better to keep the current workspace tree
generic_string newWorkspace = projectFileName; wstring newWorkspace = projectFileName;
if (newWorkspace == _workSpaceFilePath) if (newWorkspace == _workSpaceFilePath)
return true; return true;
if (!saveWorkspaceRequest()) if (!saveWorkspaceRequest())
@ -320,7 +322,7 @@ bool ProjectPanel::openWorkSpace(const TCHAR *projectFileName, bool force)
return false; return false;
} }
TiXmlNode *root = pXmlDocProject->FirstChild(TEXT("NotepadPlus")); TiXmlNode *root = pXmlDocProject->FirstChild(L"NotepadPlus");
if (!root) if (!root)
{ {
delete pXmlDocProject; delete pXmlDocProject;
@ -328,7 +330,7 @@ bool ProjectPanel::openWorkSpace(const TCHAR *projectFileName, bool force)
} }
TiXmlNode *childNode = root->FirstChildElement(TEXT("Project")); TiXmlNode *childNode = root->FirstChildElement(L"Project");
if (!childNode) if (!childNode)
{ {
delete pXmlDocProject; delete pXmlDocProject;
@ -344,12 +346,12 @@ bool ProjectPanel::openWorkSpace(const TCHAR *projectFileName, bool force)
_treeView.removeAllItems(); _treeView.removeAllItems();
_workSpaceFilePath = projectFileName; _workSpaceFilePath = projectFileName;
TCHAR * fileName = PathFindFileName(projectFileName); wchar_t * fileName = PathFindFileName(projectFileName);
HTREEITEM rootItem = _treeView.addItem(fileName, TVI_ROOT, INDEX_CLEAN_ROOT); HTREEITEM rootItem = _treeView.addItem(fileName, TVI_ROOT, INDEX_CLEAN_ROOT);
for ( ; childNode ; childNode = childNode->NextSibling(TEXT("Project"))) for ( ; childNode ; childNode = childNode->NextSibling(L"Project"))
{ {
HTREEITEM projectItem = _treeView.addItem((childNode->ToElement())->Attribute(TEXT("name")), rootItem, INDEX_PROJECT); HTREEITEM projectItem = _treeView.addItem((childNode->ToElement())->Attribute(L"name"), rootItem, INDEX_PROJECT);
buildTreeFrom(childNode, projectItem); buildTreeFrom(childNode, projectItem);
} }
setWorkSpaceDirty(false); setWorkSpaceDirty(false);
@ -362,15 +364,15 @@ bool ProjectPanel::openWorkSpace(const TCHAR *projectFileName, bool force)
void ProjectPanel::newWorkSpace() void ProjectPanel::newWorkSpace()
{ {
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
generic_string workspace = pNativeSpeaker->getAttrNameStr(PM_WORKSPACEROOTNAME, "ProjectManager", "WorkspaceRootName"); wstring workspace = pNativeSpeaker->getAttrNameStr(PM_WORKSPACEROOTNAME, "ProjectManager", "WorkspaceRootName");
_treeView.addItem(workspace.c_str(), TVI_ROOT, INDEX_CLEAN_ROOT); _treeView.addItem(workspace.c_str(), TVI_ROOT, INDEX_CLEAN_ROOT);
setWorkSpaceDirty(false); setWorkSpaceDirty(false);
_workSpaceFilePath = TEXT(""); _workSpaceFilePath = L"";
} }
bool ProjectPanel::saveWorkSpace() bool ProjectPanel::saveWorkSpace()
{ {
if (_workSpaceFilePath == TEXT("")) if (_workSpaceFilePath == L"")
{ {
return saveWorkSpaceAs(false); return saveWorkSpaceAs(false);
} }
@ -384,14 +386,14 @@ bool ProjectPanel::saveWorkSpace()
} }
} }
bool ProjectPanel::writeWorkSpace(const TCHAR *projectFileName, bool doUpdateGUI) bool ProjectPanel::writeWorkSpace(const wchar_t *projectFileName, bool doUpdateGUI)
{ {
//write <NotepadPlus>: use the default file name if new file name is not given //write <NotepadPlus>: use the default file name if new file name is not given
const TCHAR * fn2write = projectFileName?projectFileName:_workSpaceFilePath.c_str(); const wchar_t * fn2write = projectFileName?projectFileName:_workSpaceFilePath.c_str();
TiXmlDocument projDoc(fn2write); TiXmlDocument projDoc(fn2write);
TiXmlNode *root = projDoc.InsertEndChild(TiXmlElement(TEXT("NotepadPlus"))); TiXmlNode *root = projDoc.InsertEndChild(TiXmlElement(L"NotepadPlus"));
TCHAR textBuffer[MAX_PATH] = { '\0' }; wchar_t textBuffer[MAX_PATH] = { '\0' };
TVITEM tvItem{}; TVITEM tvItem{};
tvItem.mask = TVIF_TEXT; tvItem.mask = TVIF_TEXT;
tvItem.pszText = textBuffer; tvItem.pszText = textBuffer;
@ -410,25 +412,25 @@ bool ProjectPanel::writeWorkSpace(const TCHAR *projectFileName, bool doUpdateGUI
SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem)); SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem));
//printStr(tvItem.pszText); //printStr(tvItem.pszText);
TiXmlNode *projRoot = root->InsertEndChild(TiXmlElement(TEXT("Project"))); TiXmlNode *projRoot = root->InsertEndChild(TiXmlElement(L"Project"));
projRoot->ToElement()->SetAttribute(TEXT("name"), tvItem.pszText); projRoot->ToElement()->SetAttribute(L"name", tvItem.pszText);
buildProjectXml(projRoot, tvProj, fn2write); buildProjectXml(projRoot, tvProj, fn2write);
} }
if (!projDoc.SaveFile()) if (!projDoc.SaveFile())
{ {
const TCHAR * title = _workSpaceFilePath.length() > 0 ? PathFindFileName (_workSpaceFilePath.c_str()) : _panelTitle.c_str(); const wchar_t * title = _workSpaceFilePath.length() > 0 ? PathFindFileName (_workSpaceFilePath.c_str()) : _panelTitle.c_str();
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
pNativeSpeaker->messageBox("ProjectPanelSaveError", pNativeSpeaker->messageBox("ProjectPanelSaveError",
_hSelf, _hSelf,
TEXT("An error occurred while writing your workspace file.\nYour workspace has not been saved."), L"An error occurred while writing your workspace file.\nYour workspace has not been saved.",
TEXT("$STR_REPLACE$"), L"$STR_REPLACE$",
MB_OK | MB_ICONERROR, MB_OK | MB_ICONERROR,
0, 0,
title); title);
return false; return false;
} }
TCHAR * fileName = PathFindFileName(fn2write); wchar_t * fileName = PathFindFileName(fn2write);
if (doUpdateGUI) if (doUpdateGUI)
{ {
_treeView.renameItem(tvRoot, fileName); _treeView.renameItem(tvRoot, fileName);
@ -436,9 +438,9 @@ bool ProjectPanel::writeWorkSpace(const TCHAR *projectFileName, bool doUpdateGUI
return true; return true;
} }
void ProjectPanel::buildProjectXml(TiXmlNode *node, HTREEITEM hItem, const TCHAR* fn2write) void ProjectPanel::buildProjectXml(TiXmlNode *node, HTREEITEM hItem, const wchar_t* fn2write)
{ {
TCHAR textBuffer[MAX_PATH] = { '\0' }; wchar_t textBuffer[MAX_PATH] = { '\0' };
TVITEM tvItem{}; TVITEM tvItem{};
tvItem.mask = TVIF_TEXT | TVIF_PARAM; tvItem.mask = TVIF_TEXT | TVIF_PARAM;
tvItem.pszText = textBuffer; tvItem.pszText = textBuffer;
@ -452,23 +454,23 @@ void ProjectPanel::buildProjectXml(TiXmlNode *node, HTREEITEM hItem, const TCHAR
SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem)); SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem));
if (tvItem.lParam) if (tvItem.lParam)
{ {
generic_string *fn = (generic_string *)tvItem.lParam; wstring *fn = (wstring *)tvItem.lParam;
generic_string newFn = getRelativePath(*fn, fn2write); wstring newFn = getRelativePath(*fn, fn2write);
TiXmlNode *fileLeaf = node->InsertEndChild(TiXmlElement(TEXT("File"))); TiXmlNode *fileLeaf = node->InsertEndChild(TiXmlElement(L"File"));
fileLeaf->ToElement()->SetAttribute(TEXT("name"), newFn.c_str()); fileLeaf->ToElement()->SetAttribute(L"name", newFn.c_str());
} }
else else
{ {
TiXmlNode *folderNode = node->InsertEndChild(TiXmlElement(TEXT("Folder"))); TiXmlNode *folderNode = node->InsertEndChild(TiXmlElement(L"Folder"));
folderNode->ToElement()->SetAttribute(TEXT("name"), tvItem.pszText); folderNode->ToElement()->SetAttribute(L"name", tvItem.pszText);
buildProjectXml(folderNode, hItemNode, fn2write); buildProjectXml(folderNode, hItemNode, fn2write);
} }
} }
} }
bool ProjectPanel::enumWorkSpaceFiles(HTREEITEM tvFrom, const std::vector<generic_string> & patterns, std::vector<generic_string> & fileNames) bool ProjectPanel::enumWorkSpaceFiles(HTREEITEM tvFrom, const std::vector<wstring> & patterns, std::vector<wstring> & fileNames)
{ {
TCHAR textBuffer[MAX_PATH] = { '\0' }; wchar_t textBuffer[MAX_PATH] = { '\0' };
TVITEM tvItem{}; TVITEM tvItem{};
tvItem.mask = TVIF_TEXT | TVIF_PARAM; tvItem.mask = TVIF_TEXT | TVIF_PARAM;
tvItem.pszText = textBuffer; tvItem.pszText = textBuffer;
@ -487,7 +489,7 @@ bool ProjectPanel::enumWorkSpaceFiles(HTREEITEM tvFrom, const std::vector<generi
{ {
if (matchInList(tvItem.pszText, patterns)) if (matchInList(tvItem.pszText, patterns))
{ {
generic_string *fn = (generic_string *)tvItem.lParam; wstring *fn = (wstring *)tvItem.lParam;
fileNames.push_back (*fn); fileNames.push_back (*fn);
} }
} }
@ -499,16 +501,16 @@ bool ProjectPanel::enumWorkSpaceFiles(HTREEITEM tvFrom, const std::vector<generi
return true; return true;
} }
generic_string ProjectPanel::getRelativePath(const generic_string & filePath, const TCHAR *workSpaceFileName) wstring ProjectPanel::getRelativePath(const wstring & filePath, const wchar_t *workSpaceFileName)
{ {
TCHAR wsfn[MAX_PATH] = { '\0' }; wchar_t wsfn[MAX_PATH] = { '\0' };
wcscpy_s(wsfn, workSpaceFileName); wcscpy_s(wsfn, workSpaceFileName);
::PathRemoveFileSpec(wsfn); ::PathRemoveFileSpec(wsfn);
size_t pos_found = filePath.find(wsfn); size_t pos_found = filePath.find(wsfn);
if (pos_found == generic_string::npos) if (pos_found == wstring::npos)
return filePath; return filePath;
const TCHAR *relativeFile = filePath.c_str() + lstrlen(wsfn); const wchar_t *relativeFile = filePath.c_str() + lstrlen(wsfn);
if (relativeFile[0] == '\\') if (relativeFile[0] == '\\')
++relativeFile; ++relativeFile;
return relativeFile; return relativeFile;
@ -520,10 +522,10 @@ bool ProjectPanel::buildTreeFrom(TiXmlNode *projectRoot, HTREEITEM hParentItem)
childNode ; childNode ;
childNode = childNode->NextSibling()) childNode = childNode->NextSibling())
{ {
const TCHAR *v = childNode->Value(); const wchar_t *v = childNode->Value();
if (lstrcmp(TEXT("Folder"), v) == 0) if (lstrcmp(L"Folder", v) == 0)
{ {
HTREEITEM addedItem = _treeView.addItem((childNode->ToElement())->Attribute(TEXT("name")), hParentItem, INDEX_CLOSED_NODE); HTREEITEM addedItem = _treeView.addItem((childNode->ToElement())->Attribute(L"name"), hParentItem, INDEX_CLOSED_NODE);
if (!childNode->NoChildren()) if (!childNode->NoChildren())
{ {
bool isOK = buildTreeFrom(childNode, addedItem); bool isOK = buildTreeFrom(childNode, addedItem);
@ -531,14 +533,14 @@ bool ProjectPanel::buildTreeFrom(TiXmlNode *projectRoot, HTREEITEM hParentItem)
return false; return false;
} }
} }
else if (lstrcmp(TEXT("File"), v) == 0) else if (lstrcmp(L"File", v) == 0)
{ {
const TCHAR *strValue = (childNode->ToElement())->Attribute(TEXT("name")); const wchar_t *strValue = (childNode->ToElement())->Attribute(L"name");
generic_string fullPath = getAbsoluteFilePath(strValue); wstring fullPath = getAbsoluteFilePath(strValue);
TCHAR *strValueLabel = ::PathFindFileName(strValue); wchar_t *strValueLabel = ::PathFindFileName(strValue);
int iImage = ::PathFileExists(fullPath.c_str())?INDEX_LEAF:INDEX_LEAF_INVALID; int iImage = ::PathFileExists(fullPath.c_str())?INDEX_LEAF:INDEX_LEAF_INVALID;
generic_string* fullPathStr = new generic_string(fullPath); wstring* fullPathStr = new wstring(fullPath);
fullPathStrs.push_back(fullPathStr); fullPathStrs.push_back(fullPathStr);
LPARAM lParamFullPathStr = reinterpret_cast<LPARAM>(fullPathStr); LPARAM lParamFullPathStr = reinterpret_cast<LPARAM>(fullPathStr);
@ -548,12 +550,12 @@ bool ProjectPanel::buildTreeFrom(TiXmlNode *projectRoot, HTREEITEM hParentItem)
return true; return true;
} }
generic_string ProjectPanel::getAbsoluteFilePath(const TCHAR * relativePath) wstring ProjectPanel::getAbsoluteFilePath(const wchar_t * relativePath)
{ {
if (!::PathIsRelative(relativePath)) if (!::PathIsRelative(relativePath))
return relativePath; return relativePath;
TCHAR absolutePath[MAX_PATH] = { '\0' }; wchar_t absolutePath[MAX_PATH] = { '\0' };
wcscpy_s(absolutePath, _workSpaceFilePath.c_str()); wcscpy_s(absolutePath, _workSpaceFilePath.c_str());
::PathRemoveFileSpec(absolutePath); ::PathRemoveFileSpec(absolutePath);
::PathAppend(absolutePath, relativePath); ::PathAppend(absolutePath, relativePath);
@ -568,7 +570,7 @@ void ProjectPanel::openSelectFile()
::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem)); ::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem));
NodeType nType = getNodeType(tvItem.hItem); NodeType nType = getNodeType(tvItem.hItem);
generic_string *fn = (generic_string *)tvItem.lParam; wstring *fn = (wstring *)tvItem.lParam;
if (nType == nodeType_file && fn) if (nType == nodeType_file && fn)
{ {
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
@ -597,7 +599,7 @@ void ProjectPanel::notified(LPNMHDR notification)
} }
else if (notification->hwndFrom == _treeView.getHSelf()) else if (notification->hwndFrom == _treeView.getHSelf())
{ {
TCHAR textBuffer[MAX_PATH] = { '\0' }; wchar_t textBuffer[MAX_PATH] = { '\0' };
TVITEM tvItem{}; TVITEM tvItem{};
tvItem.mask = TVIF_TEXT | TVIF_PARAM; tvItem.mask = TVIF_TEXT | TVIF_PARAM;
tvItem.pszText = textBuffer; tvItem.pszText = textBuffer;
@ -632,11 +634,11 @@ void ProjectPanel::notified(LPNMHDR notification)
size_t len = lstrlen(tvItem.pszText); size_t len = lstrlen(tvItem.pszText);
// Find the position of old label in File path // Find the position of old label in File path
generic_string *filePath = (generic_string *)tvnotif->item.lParam; wstring *filePath = (wstring *)tvnotif->item.lParam;
size_t found = filePath->rfind(tvItem.pszText); size_t found = filePath->rfind(tvItem.pszText);
// If found the old label, replace it with the modified one // If found the old label, replace it with the modified one
if (found != generic_string::npos) if (found != wstring::npos)
filePath->replace(found, len, tvnotif->item.pszText); filePath->replace(found, len, tvnotif->item.pszText);
// Check the validity of modified file path // Check the validity of modified file path
@ -663,7 +665,7 @@ void ProjectPanel::notified(LPNMHDR notification)
case TVN_GETINFOTIP: case TVN_GETINFOTIP:
{ {
LPNMTVGETINFOTIP lpGetInfoTip = (LPNMTVGETINFOTIP)notification; LPNMTVGETINFOTIP lpGetInfoTip = (LPNMTVGETINFOTIP)notification;
generic_string *str = NULL ; wstring *str = NULL ;
if (_treeView.getRoot() == lpGetInfoTip->hItem) if (_treeView.getRoot() == lpGetInfoTip->hItem)
{ {
@ -671,7 +673,7 @@ void ProjectPanel::notified(LPNMHDR notification)
} }
else else
{ {
str = (generic_string *)lpGetInfoTip->lParam; str = (wstring *)lpGetInfoTip->lParam;
if (!str) if (!str)
return; return;
} }
@ -856,7 +858,7 @@ POINT ProjectPanel::getMenuDisplayPoint(int iButton)
return p; return p;
} }
HTREEITEM ProjectPanel::addFolder(HTREEITEM hTreeItem, const TCHAR *folderName) HTREEITEM ProjectPanel::addFolder(HTREEITEM hTreeItem, const wchar_t *folderName)
{ {
HTREEITEM addedItem = _treeView.addItem(folderName, hTreeItem, INDEX_CLOSED_NODE); HTREEITEM addedItem = _treeView.addItem(folderName, hTreeItem, INDEX_CLOSED_NODE);
@ -875,8 +877,8 @@ bool ProjectPanel::saveWorkspaceRequest()
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
int res = pNativeSpeaker->messageBox("ProjectPanelOpenDoSaveDirtyWsOrNot", int res = pNativeSpeaker->messageBox("ProjectPanelOpenDoSaveDirtyWsOrNot",
_hSelf, _hSelf,
TEXT("The current workspace was modified. Do you want to save the current project?"), L"The current workspace was modified. Do you want to save the current project?",
TEXT("Open Workspace"), L"Open Workspace",
MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL); MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL);
if (res == IDYES) if (res == IDYES)
@ -944,7 +946,7 @@ void ProjectPanel::popupMenuCmd(int cmdID)
HTREEITEM root = _treeView.getRoot(); HTREEITEM root = _treeView.getRoot();
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
generic_string newProjectLabel = pNativeSpeaker->getAttrNameStr(PM_NEWPROJECTNAME, "ProjectManager", "NewProjectName"); wstring newProjectLabel = pNativeSpeaker->getAttrNameStr(PM_NEWPROJECTNAME, "ProjectManager", "NewProjectName");
HTREEITEM addedItem = _treeView.addItem(newProjectLabel.c_str(), root, INDEX_PROJECT); HTREEITEM addedItem = _treeView.addItem(newProjectLabel.c_str(), root, INDEX_PROJECT);
setWorkSpaceDirty(true); setWorkSpaceDirty(true);
_treeView.expand(hTreeItem); _treeView.expand(hTreeItem);
@ -959,8 +961,8 @@ void ProjectPanel::popupMenuCmd(int cmdID)
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
int res = pNativeSpeaker->messageBox("ProjectPanelNewDoSaveDirtyWsOrNot", int res = pNativeSpeaker->messageBox("ProjectPanelNewDoSaveDirtyWsOrNot",
_hSelf, _hSelf,
TEXT("The current workspace was modified. Do you want to save the current project?"), L"The current workspace was modified. Do you want to save the current project?",
TEXT("New Workspace"), L"New Workspace",
MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL); MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL);
if (res == IDYES) if (res == IDYES)
{ {
@ -989,7 +991,7 @@ void ProjectPanel::popupMenuCmd(int cmdID)
case IDM_PROJECT_NEWFOLDER : case IDM_PROJECT_NEWFOLDER :
{ {
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
generic_string newFolderLabel = pNativeSpeaker->getAttrNameStr(PM_NEWFOLDERNAME, "ProjectManager", "NewFolderName"); wstring newFolderLabel = pNativeSpeaker->getAttrNameStr(PM_NEWFOLDERNAME, "ProjectManager", "NewFolderName");
addFolder(hTreeItem, newFolderLabel.c_str()); addFolder(hTreeItem, newFolderLabel.c_str());
setWorkSpaceDirty(true); setWorkSpaceDirty(true);
} }
@ -1032,7 +1034,7 @@ void ProjectPanel::popupMenuCmd(int cmdID)
CustomFileDialog fDlg(_hSelf); CustomFileDialog fDlg(_hSelf);
setFileExtFilter(fDlg); setFileExtFilter(fDlg);
const generic_string fn = fDlg.doOpenSingleFileDlg(); const wstring fn = fDlg.doOpenSingleFileDlg();
if (!fn.empty()) if (!fn.empty())
{ {
if (!openWorkSpace(fn.c_str(), true)) if (!openWorkSpace(fn.c_str(), true))
@ -1040,8 +1042,8 @@ void ProjectPanel::popupMenuCmd(int cmdID)
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
pNativeSpeaker->messageBox("ProjectPanelOpenFailed", pNativeSpeaker->messageBox("ProjectPanelOpenFailed",
_hSelf, _hSelf,
TEXT("The workspace could not be opened.\rIt seems the file to open is not a valid project file."), L"The workspace could not be opened.\rIt seems the file to open is not a valid project file.",
TEXT("Open Workspace"), L"Open Workspace",
MB_OK); MB_OK);
return; return;
} }
@ -1057,8 +1059,8 @@ void ProjectPanel::popupMenuCmd(int cmdID)
{ {
int res = pNativeSpeaker->messageBox("ProjectPanelReloadDirty", int res = pNativeSpeaker->messageBox("ProjectPanelReloadDirty",
_hSelf, _hSelf,
TEXT("The current workspace was modified. Reloading will discard all modifications.\rDo you want to continue?"), L"The current workspace was modified. Reloading will discard all modifications.\rDo you want to continue?",
TEXT("Reload Workspace"), L"Reload Workspace",
MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL); MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
if (res == IDYES) if (res == IDYES)
@ -1079,8 +1081,8 @@ void ProjectPanel::popupMenuCmd(int cmdID)
{ {
pNativeSpeaker->messageBox("ProjectPanelReloadError", pNativeSpeaker->messageBox("ProjectPanelReloadError",
_hSelf, _hSelf,
TEXT("Cannot find the file to reload."), L"Cannot find the file to reload.",
TEXT("Reload Workspace"), L"Reload Workspace",
MB_OK); MB_OK);
} }
} }
@ -1112,8 +1114,8 @@ void ProjectPanel::popupMenuCmd(int cmdID)
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
int res = pNativeSpeaker->messageBox("ProjectPanelRemoveFolderFromProject", int res = pNativeSpeaker->messageBox("ProjectPanelRemoveFolderFromProject",
_hSelf, _hSelf,
TEXT("All the sub-items will be removed.\rAre you sure you want to remove this folder from the project?"), L"All the sub-items will be removed.\rAre you sure you want to remove this folder from the project?",
TEXT("Remove folder from project"), L"Remove folder from project",
MB_YESNO); MB_YESNO);
if (res == IDYES) if (res == IDYES)
{ {
@ -1138,8 +1140,8 @@ void ProjectPanel::popupMenuCmd(int cmdID)
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker();
int res = pNativeSpeaker->messageBox("ProjectPanelRemoveFileFromProject", int res = pNativeSpeaker->messageBox("ProjectPanelRemoveFileFromProject",
_hSelf, _hSelf,
TEXT("Are you sure you want to remove this file from the project?"), L"Are you sure you want to remove this file from the project?",
TEXT("Remove file from project"), L"Remove file from project",
MB_YESNO); MB_YESNO);
if (res == IDYES) if (res == IDYES)
{ {
@ -1156,7 +1158,7 @@ void ProjectPanel::popupMenuCmd(int cmdID)
FileRelocalizerDlg fileRelocalizerDlg; FileRelocalizerDlg fileRelocalizerDlg;
fileRelocalizerDlg.init(_hInst, _hParent); fileRelocalizerDlg.init(_hInst, _hParent);
TCHAR textBuffer[MAX_PATH] = { '\0' }; wchar_t textBuffer[MAX_PATH] = { '\0' };
TVITEM tvItem{}; TVITEM tvItem{};
tvItem.hItem = hTreeItem; tvItem.hItem = hTreeItem;
tvItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
@ -1166,16 +1168,16 @@ void ProjectPanel::popupMenuCmd(int cmdID)
SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem)); SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0, reinterpret_cast<LPARAM>(&tvItem));
if (!tvItem.lParam) if (!tvItem.lParam)
return; return;
generic_string * fn = (generic_string *)tvItem.lParam; wstring * fn = (wstring *)tvItem.lParam;
if (fileRelocalizerDlg.doDialog(fn->c_str()) == 0) if (fileRelocalizerDlg.doDialog(fn->c_str()) == 0)
{ {
generic_string newValue = fileRelocalizerDlg.getFullFilePath(); wstring newValue = fileRelocalizerDlg.getFullFilePath();
if (*fn == newValue) if (*fn == newValue)
return; return;
*fn = newValue; *fn = newValue;
TCHAR *strValueLabel = ::PathFindFileName(fn->c_str()); wchar_t *strValueLabel = ::PathFindFileName(fn->c_str());
wcscpy_s(textBuffer, strValueLabel); wcscpy_s(textBuffer, strValueLabel);
int iImage = ::PathFileExists(fn->c_str())?INDEX_LEAF:INDEX_LEAF_INVALID; int iImage = ::PathFileExists(fn->c_str())?INDEX_LEAF:INDEX_LEAF_INVALID;
tvItem.iImage = tvItem.iSelectedImage = iImage; tvItem.iImage = tvItem.iSelectedImage = iImage;
@ -1194,7 +1196,7 @@ bool ProjectPanel::saveWorkSpaceAs(bool saveCopyAs)
fDlg.setExtIndex(0); // 0 index for "custom extention" type if any else for "All types *.*" fDlg.setExtIndex(0); // 0 index for "custom extention" type if any else for "All types *.*"
fDlg.setFolder(getWorkSpaceFilePath()); fDlg.setFolder(getWorkSpaceFilePath());
const generic_string fn = fDlg.doSaveDlg(); const wstring fn = fDlg.doSaveDlg();
if (fn.empty()) if (fn.empty())
return false; return false;
@ -1211,23 +1213,23 @@ bool ProjectPanel::saveWorkSpaceAs(bool saveCopyAs)
void ProjectPanel::setFileExtFilter(CustomFileDialog & fDlg) void ProjectPanel::setFileExtFilter(CustomFileDialog & fDlg)
{ {
const TCHAR *ext = NppParameters::getInstance().getNppGUI()._definedWorkspaceExt.c_str(); const wchar_t *ext = NppParameters::getInstance().getNppGUI()._definedWorkspaceExt.c_str();
generic_string workspaceExt = TEXT(""); wstring workspaceExt = L"";
if (*ext != '\0') if (*ext != '\0')
{ {
if (*ext != '.') if (*ext != '.')
workspaceExt += TEXT("."); workspaceExt += L".";
workspaceExt += ext; workspaceExt += ext;
fDlg.setExtFilter(TEXT("Workspace file"), workspaceExt.c_str()); fDlg.setExtFilter(L"Workspace file", workspaceExt.c_str());
fDlg.setDefExt(ext); fDlg.setDefExt(ext);
} }
fDlg.setExtFilter(TEXT("All types"), TEXT(".*")); fDlg.setExtFilter(L"All types", L".*");
} }
void ProjectPanel::addFiles(HTREEITEM hTreeItem) void ProjectPanel::addFiles(HTREEITEM hTreeItem)
{ {
CustomFileDialog fDlg(_hSelf); CustomFileDialog fDlg(_hSelf);
fDlg.setExtFilter(TEXT("All types"), TEXT(".*")); fDlg.setExtFilter(L"All types", L".*");
const auto& fns = fDlg.doOpenMultiFilesDlg(); const auto& fns = fDlg.doOpenMultiFilesDlg();
if (!fns.empty()) if (!fns.empty())
@ -1235,9 +1237,9 @@ void ProjectPanel::addFiles(HTREEITEM hTreeItem)
size_t sz = fns.size(); size_t sz = fns.size();
for (size_t i = 0 ; i < sz ; ++i) for (size_t i = 0 ; i < sz ; ++i)
{ {
TCHAR *strValueLabel = ::PathFindFileName(fns.at(i).c_str()); wchar_t *strValueLabel = ::PathFindFileName(fns.at(i).c_str());
generic_string* pathFileStr = new generic_string(fns.at(i)); wstring* pathFileStr = new wstring(fns.at(i));
fullPathStrs.push_back(pathFileStr); fullPathStrs.push_back(pathFileStr);
LPARAM lParamPathFileStr = reinterpret_cast<LPARAM>(pathFileStr); LPARAM lParamPathFileStr = reinterpret_cast<LPARAM>(pathFileStr);
@ -1248,15 +1250,15 @@ void ProjectPanel::addFiles(HTREEITEM hTreeItem)
} }
} }
void ProjectPanel::recursiveAddFilesFrom(const TCHAR *folderPath, HTREEITEM hTreeItem) void ProjectPanel::recursiveAddFilesFrom(const wchar_t *folderPath, HTREEITEM hTreeItem)
{ {
generic_string dirFilter(folderPath); wstring dirFilter(folderPath);
if (folderPath[lstrlen(folderPath)-1] != '\\') if (folderPath[lstrlen(folderPath)-1] != '\\')
dirFilter += TEXT("\\"); dirFilter += L"\\";
dirFilter += TEXT("*.*"); dirFilter += L"*.*";
WIN32_FIND_DATA foundData; WIN32_FIND_DATA foundData;
std::vector<generic_string> files; std::vector<wstring> files;
HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData); HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData);
@ -1272,13 +1274,13 @@ void ProjectPanel::recursiveAddFilesFrom(const TCHAR *folderPath, HTREEITEM hTre
} }
else // Always recursive else // Always recursive
{ {
if ((wcscmp(foundData.cFileName, TEXT(".")) != 0) && (wcscmp(foundData.cFileName, TEXT("..")) != 0)) if ((wcscmp(foundData.cFileName, L".") != 0) && (wcscmp(foundData.cFileName, L"..") != 0))
{ {
generic_string pathDir(folderPath); wstring pathDir(folderPath);
if (folderPath[lstrlen(folderPath)-1] != '\\') if (folderPath[lstrlen(folderPath)-1] != '\\')
pathDir += TEXT("\\"); pathDir += L"\\";
pathDir += foundData.cFileName; pathDir += foundData.cFileName;
pathDir += TEXT("\\"); pathDir += L"\\";
HTREEITEM addedItem = addFolder(hTreeItem, foundData.cFileName); HTREEITEM addedItem = addFolder(hTreeItem, foundData.cFileName);
recursiveAddFilesFrom(pathDir.c_str(), addedItem); recursiveAddFilesFrom(pathDir.c_str(), addedItem);
} }
@ -1292,12 +1294,12 @@ void ProjectPanel::recursiveAddFilesFrom(const TCHAR *folderPath, HTREEITEM hTre
for (size_t i = 0, len = files.size() ; i < len ; ++i) for (size_t i = 0, len = files.size() ; i < len ; ++i)
{ {
generic_string pathFile(folderPath); wstring pathFile(folderPath);
if (folderPath[lstrlen(folderPath)-1] != '\\') if (folderPath[lstrlen(folderPath)-1] != '\\')
pathFile += TEXT("\\"); pathFile += L"\\";
pathFile += files[i]; pathFile += files[i];
generic_string* pathFileStr = new generic_string(pathFile); wstring* pathFileStr = new wstring(pathFile);
fullPathStrs.push_back(pathFileStr); fullPathStrs.push_back(pathFileStr);
LPARAM lParamPathFileStr = reinterpret_cast<LPARAM>(pathFileStr); LPARAM lParamPathFileStr = reinterpret_cast<LPARAM>(pathFileStr);
_treeView.addItem(files[i].c_str(), hTreeItem, INDEX_LEAF, lParamPathFileStr); _treeView.addItem(files[i].c_str(), hTreeItem, INDEX_LEAF, lParamPathFileStr);
@ -1308,20 +1310,20 @@ void ProjectPanel::recursiveAddFilesFrom(const TCHAR *folderPath, HTREEITEM hTre
void ProjectPanel::addFilesFromDirectory(HTREEITEM hTreeItem) void ProjectPanel::addFilesFromDirectory(HTREEITEM hTreeItem)
{ {
if (_selDirOfFilesFromDirDlg == TEXT("") && _workSpaceFilePath != TEXT("")) if (_selDirOfFilesFromDirDlg == L"" && _workSpaceFilePath != L"")
{ {
TCHAR dir[MAX_PATH] = { '\0' }; wchar_t dir[MAX_PATH] = { '\0' };
wcscpy_s(dir, _workSpaceFilePath.c_str()); wcscpy_s(dir, _workSpaceFilePath.c_str());
::PathRemoveFileSpec(dir); ::PathRemoveFileSpec(dir);
_selDirOfFilesFromDirDlg = dir; _selDirOfFilesFromDirDlg = dir;
} }
generic_string dirPath; wstring dirPath;
if (_selDirOfFilesFromDirDlg != TEXT("")) if (_selDirOfFilesFromDirDlg != L"")
dirPath = getFolderName(_hSelf, _selDirOfFilesFromDirDlg.c_str()); dirPath = getFolderName(_hSelf, _selDirOfFilesFromDirDlg.c_str());
else else
dirPath = getFolderName(_hSelf); dirPath = getFolderName(_hSelf);
if (dirPath != TEXT("")) if (dirPath != L"")
{ {
recursiveAddFilesFrom(dirPath.c_str(), hTreeItem); recursiveAddFilesFrom(dirPath.c_str(), hTreeItem);
_treeView.expand(hTreeItem); _treeView.expand(hTreeItem);
@ -1384,7 +1386,7 @@ intptr_t CALLBACK FileRelocalizerDlg::run_dlgProc(UINT Message, WPARAM wParam, L
{ {
case IDOK : case IDOK :
{ {
TCHAR textBuf[MAX_PATH] = { '\0' }; wchar_t textBuf[MAX_PATH] = { '\0' };
::GetDlgItemText(_hSelf, IDC_EDIT_FILEFULLPATHNAME, textBuf, MAX_PATH); ::GetDlgItemText(_hSelf, IDC_EDIT_FILEFULLPATHNAME, textBuf, MAX_PATH);
_fullFilePath = textBuf; _fullFilePath = textBuf;
::EndDialog(_hSelf, 0); ::EndDialog(_hSelf, 0);
@ -1405,7 +1407,7 @@ intptr_t CALLBACK FileRelocalizerDlg::run_dlgProc(UINT Message, WPARAM wParam, L
return FALSE; return FALSE;
} }
int FileRelocalizerDlg::doDialog(const TCHAR *fn, bool isRTL) int FileRelocalizerDlg::doDialog(const wchar_t *fn, bool isRTL)
{ {
_fullFilePath = fn; _fullFilePath = fn;

View File

@ -21,32 +21,32 @@
#include "TreeView.h" #include "TreeView.h"
#include "ProjectPanel_rc.h" #include "ProjectPanel_rc.h"
#define PM_PROJECTPANELTITLE TEXT("Project Panel") #define PM_PROJECTPANELTITLE L"Project Panel"
#define PM_WORKSPACEROOTNAME TEXT("Workspace") #define PM_WORKSPACEROOTNAME L"Workspace"
#define PM_NEWFOLDERNAME TEXT("Folder Name") #define PM_NEWFOLDERNAME L"Folder Name"
#define PM_NEWPROJECTNAME TEXT("Project Name") #define PM_NEWPROJECTNAME L"Project Name"
#define PM_NEWWORKSPACE TEXT("New Workspace") #define PM_NEWWORKSPACE L"New Workspace"
#define PM_OPENWORKSPACE TEXT("Open Workspace") #define PM_OPENWORKSPACE L"Open Workspace"
#define PM_RELOADWORKSPACE TEXT("Reload Workspace") #define PM_RELOADWORKSPACE L"Reload Workspace"
#define PM_SAVEWORKSPACE TEXT("Save") #define PM_SAVEWORKSPACE L"Save"
#define PM_SAVEASWORKSPACE TEXT("Save As...") #define PM_SAVEASWORKSPACE L"Save As..."
#define PM_SAVEACOPYASWORKSPACE TEXT("Save a Copy As...") #define PM_SAVEACOPYASWORKSPACE L"Save a Copy As..."
#define PM_NEWPROJECTWORKSPACE TEXT("Add New Project") #define PM_NEWPROJECTWORKSPACE L"Add New Project"
#define PM_FINDINFILESWORKSPACE TEXT("Find in Projects...") #define PM_FINDINFILESWORKSPACE L"Find in Projects..."
#define PM_EDITRENAME TEXT("Rename") #define PM_EDITRENAME L"Rename"
#define PM_EDITNEWFOLDER TEXT("Add Folder") #define PM_EDITNEWFOLDER L"Add Folder"
#define PM_EDITADDFILES TEXT("Add Files...") #define PM_EDITADDFILES L"Add Files..."
#define PM_EDITADDFILESRECUSIVELY TEXT("Add Files from Directory...") #define PM_EDITADDFILESRECUSIVELY L"Add Files from Directory..."
#define PM_EDITREMOVE TEXT("Remove\tDEL") #define PM_EDITREMOVE L"Remove\tDEL"
#define PM_EDITMODIFYFILE TEXT("Modify File Path") #define PM_EDITMODIFYFILE L"Modify File Path"
#define PM_WORKSPACEMENUENTRY TEXT("Workspace") #define PM_WORKSPACEMENUENTRY L"Workspace"
#define PM_EDITMENUENTRY TEXT("Edit") #define PM_EDITMENUENTRY L"Edit"
#define PM_MOVEUPENTRY TEXT("Move Up\tCtrl+Up") #define PM_MOVEUPENTRY L"Move Up\tCtrl+Up"
#define PM_MOVEDOWNENTRY TEXT("Move Down\tCtrl+Down") #define PM_MOVEDOWNENTRY L"Move Down\tCtrl+Down"
enum NodeType { enum NodeType {
nodeType_root = 0, nodeType_project = 1, nodeType_folder = 2, nodeType_file = 3 nodeType_root = 0, nodeType_project = 1, nodeType_folder = 2, nodeType_file = 3
@ -69,7 +69,7 @@ public:
_hParent = parent2set; _hParent = parent2set;
}; };
void setPanelTitle(generic_string title) { void setPanelTitle(std::wstring title) {
_panelTitle = title; _panelTitle = title;
}; };
const TCHAR * getPanelTitle() const { const TCHAR * getPanelTitle() const {
@ -98,7 +98,7 @@ public:
void setForegroundColor(COLORREF fgColour) override { void setForegroundColor(COLORREF fgColour) override {
TreeView_SetTextColor(_treeView.getHSelf(), fgColour); TreeView_SetTextColor(_treeView.getHSelf(), fgColour);
}; };
bool enumWorkSpaceFiles(HTREEITEM tvFrom, const std::vector<generic_string> & patterns, std::vector<generic_string> & fileNames); bool enumWorkSpaceFiles(HTREEITEM tvFrom, const std::vector<std::wstring> & patterns, std::vector<std::wstring> & fileNames);
protected: protected:
TreeView _treeView; TreeView _treeView;
@ -108,9 +108,9 @@ protected:
HMENU _hProjectMenu = nullptr; HMENU _hProjectMenu = nullptr;
HMENU _hFolderMenu = nullptr; HMENU _hFolderMenu = nullptr;
HMENU _hFileMenu = nullptr; HMENU _hFileMenu = nullptr;
generic_string _panelTitle; std::wstring _panelTitle;
generic_string _workSpaceFilePath; std::wstring _workSpaceFilePath;
generic_string _selDirOfFilesFromDirDlg; std::wstring _selDirOfFilesFromDirDlg;
bool _isDirty = false; bool _isDirty = false;
int _panelID = 0; int _panelID = 0;
@ -122,7 +122,7 @@ protected:
HTREEITEM addFolder(HTREEITEM hTreeItem, const TCHAR *folderName); HTREEITEM addFolder(HTREEITEM hTreeItem, const TCHAR *folderName);
bool writeWorkSpace(const TCHAR *projectFileName = NULL, bool doUpdateGUI = true); bool writeWorkSpace(const TCHAR *projectFileName = NULL, bool doUpdateGUI = true);
generic_string getRelativePath(const generic_string & fn, const TCHAR *workSpaceFileName); std::wstring getRelativePath(const std::wstring & fn, const TCHAR *workSpaceFileName);
void buildProjectXml(TiXmlNode *root, HTREEITEM hItem, const TCHAR* fn2write); void buildProjectXml(TiXmlNode *root, HTREEITEM hItem, const TCHAR* fn2write);
NodeType getNodeType(HTREEITEM hItem); NodeType getNodeType(HTREEITEM hItem);
void setWorkSpaceDirty(bool isDirty); void setWorkSpaceDirty(bool isDirty);
@ -134,10 +134,10 @@ protected:
void showContextMenu(int x, int y); void showContextMenu(int x, int y);
void showContextMenuFromMenuKey(HTREEITEM selectedItem, int x, int y); void showContextMenuFromMenuKey(HTREEITEM selectedItem, int x, int y);
HMENU getMenuHandler(HTREEITEM selectedItem); HMENU getMenuHandler(HTREEITEM selectedItem);
generic_string getAbsoluteFilePath(const TCHAR * relativePath); std::wstring getAbsoluteFilePath(const TCHAR * relativePath);
void openSelectFile(); void openSelectFile();
void setFileExtFilter(CustomFileDialog & fDlg); void setFileExtFilter(CustomFileDialog & fDlg);
std::vector<generic_string*> fullPathStrs; std::vector<std::wstring*> fullPathStrs;
}; };
class FileRelocalizerDlg : public StaticDialog class FileRelocalizerDlg : public StaticDialog
@ -149,7 +149,7 @@ public :
void destroy() override {}; void destroy() override {};
generic_string getFullFilePath() { std::wstring getFullFilePath() {
return _fullFilePath; return _fullFilePath;
}; };
@ -157,6 +157,6 @@ protected :
intptr_t CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) override; intptr_t CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) override;
private : private :
generic_string _fullFilePath; std::wstring _fullFilePath;
}; };