[NEW_FEATURE] Unicode path is supported.
git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@305 f5eea248-9336-0410-98b8-ebc06183d4e3pull/343/head^2
parent
85db072c3e
commit
aa1f014acb
|
@ -4,6 +4,28 @@
|
|||
//By Bennett
|
||||
//Formatting Slightly modified for N++
|
||||
|
||||
/*
|
||||
this file is part of Notepad++
|
||||
Copyright (C)2003 Don HO <donho@altern.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef WIN32EXCEPTION_H
|
||||
#define WIN32EXCEPTION_H
|
||||
|
||||
#include "windows.h"
|
||||
#include <exception>
|
||||
|
||||
|
@ -41,3 +63,5 @@ private:
|
|||
|
||||
friend void Win32Exception::translate(unsigned code, EXCEPTION_POINTERS* info);
|
||||
};
|
||||
|
||||
#endif //WIN32EXCEPTION_H
|
||||
|
|
|
@ -18,19 +18,19 @@
|
|||
#ifndef FILENAME_STRING_SPLITTER_H
|
||||
#define FILENAME_STRING_SPLITTER_H
|
||||
|
||||
typedef std::vector<std::string> stringVector;
|
||||
typedef std::vector<std::wstring> stringVectorW;
|
||||
|
||||
class FileNameStringSplitter
|
||||
{
|
||||
public :
|
||||
FileNameStringSplitter(const char *fileNameStr) {
|
||||
FileNameStringSplitter(const wchar_t *fileNameStr) {
|
||||
//if (!fileNameStr) return;
|
||||
char *pStr = NULL;
|
||||
wchar_t *pStr = NULL;
|
||||
bool isInsideQuotes = false;
|
||||
char str[256];
|
||||
wchar_t str[256];
|
||||
int i = 0;
|
||||
bool fini = false;
|
||||
for (pStr = (char *)fileNameStr ; !fini ; )
|
||||
for (pStr = (wchar_t *)fileNameStr ; !fini ; )
|
||||
{
|
||||
switch (*pStr)
|
||||
{
|
||||
|
@ -39,7 +39,7 @@ public :
|
|||
{
|
||||
str[i] = '\0';
|
||||
if (str[0])
|
||||
_fileNames.push_back(std::string(str));
|
||||
_fileNames.push_back(std::wstring(str));
|
||||
i = 0;
|
||||
}
|
||||
isInsideQuotes = !isInsideQuotes;
|
||||
|
@ -56,7 +56,7 @@ public :
|
|||
{
|
||||
str[i] = '\0';
|
||||
if (str[0])
|
||||
_fileNames.push_back(std::string(str));
|
||||
_fileNames.push_back(std::wstring(str));
|
||||
i = 0;
|
||||
}
|
||||
pStr++;
|
||||
|
@ -65,7 +65,7 @@ public :
|
|||
case '\0' :
|
||||
str[i] = *pStr;
|
||||
if (str[0])
|
||||
_fileNames.push_back(std::string(str));
|
||||
_fileNames.push_back(std::wstring(str));
|
||||
fini = true;
|
||||
break;
|
||||
|
||||
|
@ -77,7 +77,7 @@ public :
|
|||
}
|
||||
};
|
||||
|
||||
const char * getFileName(int index) const {
|
||||
const wchar_t * getFileName(int index) const {
|
||||
return _fileNames[index].c_str();
|
||||
};
|
||||
|
||||
|
@ -86,7 +86,7 @@ public :
|
|||
};
|
||||
|
||||
private :
|
||||
stringVector _fileNames;
|
||||
stringVectorW _fileNames;
|
||||
};
|
||||
|
||||
#endif //FILENAME_STRING_SPLITTER_H
|
||||
|
|
|
@ -40,9 +40,11 @@
|
|||
#include <time.h>
|
||||
#include <algorithm>
|
||||
#include "xmlMatchedTagsHighlighter.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
const char Notepad_plus::_className[32] = NOTEPAD_PP_CLASS_NAME;
|
||||
const char *urlHttpRegExpr = "http://[a-z0-9_\\-\\+.:?&@=/%#]*";
|
||||
const wchar_t Notepad_plus::_classNameW[32] = NOTEPAD_PP_CLASS_NAME_W;
|
||||
const char *urlHttpRE = "http://[a-z0-9_\\-\\+.:?&@=/%#]*";
|
||||
|
||||
int docTabIconIDs[] = {IDI_SAVED_ICON, IDI_UNSAVED_ICON, IDI_READONLY_ICON};
|
||||
enum tb_stat {tb_saved, tb_unsaved, tb_ro};
|
||||
|
@ -182,10 +184,10 @@ Notepad_plus::~Notepad_plus()
|
|||
delete _pTrayIco;
|
||||
}
|
||||
|
||||
void Notepad_plus::init(HINSTANCE hInst, HWND parent, const char *cmdLine, CmdLineParams *cmdLineParams)
|
||||
void Notepad_plus::init(HINSTANCE hInst, HWND parent, const wchar_t *cmdLine, CmdLineParams *cmdLineParams)
|
||||
{
|
||||
Window::init(hInst, parent);
|
||||
WNDCLASS nppClass;
|
||||
WNDCLASSW nppClass;
|
||||
|
||||
nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS;//CS_HREDRAW | CS_VREDRAW;
|
||||
nppClass.lpfnWndProc = Notepad_plus_Proc;
|
||||
|
@ -195,10 +197,10 @@ void Notepad_plus::init(HINSTANCE hInst, HWND parent, const char *cmdLine, CmdLi
|
|||
nppClass.hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON));
|
||||
nppClass.hCursor = ::LoadCursor(NULL, IDC_ARROW);
|
||||
nppClass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_MENU));
|
||||
nppClass.lpszMenuName = MAKEINTRESOURCE(IDR_M30_MENU);
|
||||
nppClass.lpszClassName = _className;
|
||||
nppClass.lpszMenuName = MAKEINTRESOURCEW(IDR_M30_MENU);
|
||||
nppClass.lpszClassName = _classNameW;
|
||||
|
||||
if (!::RegisterClass(&nppClass))
|
||||
if (!::RegisterClassW(&nppClass))
|
||||
{
|
||||
systemMessage("System Err");
|
||||
throw int(98);
|
||||
|
@ -212,10 +214,10 @@ void Notepad_plus::init(HINSTANCE hInst, HWND parent, const char *cmdLine, CmdLi
|
|||
if (cmdLineParams->_isNoPlugin)
|
||||
_pluginsManager.disable();
|
||||
|
||||
_hSelf = ::CreateWindowEx(
|
||||
_hSelf = ::CreateWindowExW(
|
||||
WS_EX_ACCEPTFILES | (_isRTL?WS_EX_LAYOUTRTL:0),\
|
||||
_className,\
|
||||
"Notepad++",\
|
||||
_classNameW,\
|
||||
L"Notepad++",\
|
||||
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,\
|
||||
// CreateWindowEx bug : set all 0 to walk arround the pb
|
||||
0, 0, 0, 0,\
|
||||
|
@ -478,7 +480,11 @@ bool Notepad_plus::loadSession(Session & session)
|
|||
session._mainViewFiles.erase(posIt);
|
||||
continue; //skip session files, not supporting recursive sessions
|
||||
}
|
||||
if (PathFileExists(pFn)) {
|
||||
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(pFn, fnW);
|
||||
|
||||
if (PathFileExistsW(fnW)) {
|
||||
lastOpened = doOpen(pFn);
|
||||
} else {
|
||||
lastOpened = BUFFER_INVALID;
|
||||
|
@ -525,7 +531,11 @@ bool Notepad_plus::loadSession(Session & session)
|
|||
session._subViewFiles.erase(posIt);
|
||||
continue; //skip session files, not supporting recursive sessions
|
||||
}
|
||||
if (PathFileExists(pFn)) {
|
||||
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(pFn, fnW);
|
||||
|
||||
if (PathFileExistsW(fnW)) {
|
||||
lastOpened = doOpen(pFn);
|
||||
//check if already open in main. If so, clone
|
||||
if (_mainDocTab.getIndexByBuffer(lastOpened) != -1) {
|
||||
|
@ -620,29 +630,32 @@ BufferID Notepad_plus::doOpen(const char *fileName, bool isReadOnly)
|
|||
return test;
|
||||
}
|
||||
|
||||
if (isFileSession(longFileName) && PathFileExists(longFileName)) {
|
||||
WCHAR longFileNameW[MAX_PATH];
|
||||
char2wchar(longFileName, longFileNameW);
|
||||
|
||||
if (isFileSession(longFileName) && PathFileExistsW(longFileNameW)) {
|
||||
fileLoadSession(longFileName);
|
||||
return BUFFER_INVALID;
|
||||
}
|
||||
|
||||
if (!PathFileExists(longFileName))
|
||||
if (!PathFileExistsW(longFileNameW))
|
||||
{
|
||||
char str2display[MAX_PATH*2];
|
||||
char longFileDir[MAX_PATH];
|
||||
wchar_t str2display[MAX_PATH*2];
|
||||
WCHAR longFileDir[MAX_PATH];
|
||||
|
||||
strcpy(longFileDir, longFileName);
|
||||
PathRemoveFileSpec(longFileDir);
|
||||
wcscpy(longFileDir, longFileNameW);
|
||||
PathRemoveFileSpecW(longFileDir);
|
||||
|
||||
if (PathFileExists(longFileDir))
|
||||
if (PathFileExistsW(longFileDir))
|
||||
{
|
||||
sprintf(str2display, "%s doesn't exist. Create it?", longFileName);
|
||||
swprintf(str2display, L"%s doesn't exist. Create it?", longFileNameW);
|
||||
|
||||
if (::MessageBox(_hSelf, str2display, "Create new file", MB_YESNO) == IDYES)
|
||||
if (::MessageBoxW(_hSelf, str2display, L"Create new file", MB_YESNO) == IDYES)
|
||||
{
|
||||
bool res = MainFileManager->createEmptyFile(longFileName);
|
||||
if (!res) {
|
||||
sprintf(str2display, "Cannot create the file \"%s\"", longFileName);
|
||||
::MessageBox(_hSelf, str2display, "Create new file", MB_OK);
|
||||
swprintf(str2display, L"Cannot create the file \"%s\"", longFileNameW);
|
||||
::MessageBoxW(_hSelf, str2display, L"Create new file", MB_OK);
|
||||
return BUFFER_INVALID;
|
||||
}
|
||||
}
|
||||
|
@ -707,7 +720,6 @@ BufferID Notepad_plus::doOpen(const char *fileName, bool isReadOnly)
|
|||
}
|
||||
bool Notepad_plus::doReload(BufferID id, bool alert)
|
||||
{
|
||||
|
||||
/*
|
||||
//No activation when reloading, defer untill document is actually visible
|
||||
if (alert) {
|
||||
|
@ -787,7 +799,7 @@ void Notepad_plus::doClose(BufferID id, int whichOne) {
|
|||
_pluginsManager.notify(&scnN);
|
||||
|
||||
//add to recent files if its an existing file
|
||||
if (!buf->isUntitled() && PathFileExists(buf->getFilePath()))
|
||||
if (!buf->isUntitled() && PathFileExistsW(buf->getFilePathW()))
|
||||
{
|
||||
_lastRecentFileList.add(buf->getFilePath());
|
||||
}
|
||||
|
@ -1460,9 +1472,10 @@ void Notepad_plus::getMatchedFileNames(const char *dir, const vector<string> & p
|
|||
{
|
||||
string dirFilter(dir);
|
||||
dirFilter += "*.*";
|
||||
WIN32_FIND_DATA foundData;
|
||||
WIN32_FIND_DATAW foundData;
|
||||
|
||||
HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData);
|
||||
wstring dirFilterW = string2wstring(dirFilter);
|
||||
HANDLE hFile = ::FindFirstFileW(dirFilterW.c_str(), &foundData);
|
||||
|
||||
if (hFile != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
|
@ -1475,26 +1488,30 @@ void Notepad_plus::getMatchedFileNames(const char *dir, const vector<string> & p
|
|||
}
|
||||
else if (isRecursive)
|
||||
{
|
||||
if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, "..")))
|
||||
if ((wcscmp(foundData.cFileName, L".")) && (wcscmp(foundData.cFileName, L"..")))
|
||||
{
|
||||
string pathDir(dir);
|
||||
pathDir += foundData.cFileName;
|
||||
pathDir += "\\";
|
||||
wstring pathDirW = string2wstring(pathDir);
|
||||
pathDirW += foundData.cFileName;
|
||||
pathDirW += L"\\";
|
||||
pathDir = wstring2string(pathDirW);
|
||||
getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive, isInHiddenDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (matchInList(foundData.cFileName, patterns))
|
||||
char filename[MAX_PATH];
|
||||
wchar2char(foundData.cFileName, filename);
|
||||
if (matchInList(filename, patterns))
|
||||
{
|
||||
string pathFile(dir);
|
||||
pathFile += foundData.cFileName;
|
||||
pathFile += filename;
|
||||
fileNames.push_back(pathFile.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
while (::FindNextFile(hFile, &foundData))
|
||||
while (::FindNextFileW(hFile, &foundData))
|
||||
{
|
||||
if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
|
@ -1504,21 +1521,25 @@ void Notepad_plus::getMatchedFileNames(const char *dir, const vector<string> & p
|
|||
}
|
||||
else if (isRecursive)
|
||||
{
|
||||
if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, "..")))
|
||||
if ((wcscmp(foundData.cFileName, L".")) && (wcscmp(foundData.cFileName, L"..")))
|
||||
{
|
||||
string pathDir(dir);
|
||||
pathDir += foundData.cFileName;
|
||||
pathDir += "\\";
|
||||
wstring pathDirW = string2wstring(pathDir);
|
||||
pathDirW += foundData.cFileName;
|
||||
pathDirW += L"\\";
|
||||
pathDir = wstring2string(pathDirW);
|
||||
getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive, isInHiddenDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (matchInList(foundData.cFileName, patterns))
|
||||
char filename[MAX_PATH];
|
||||
wchar2char(foundData.cFileName, filename);
|
||||
if (matchInList(filename, patterns))
|
||||
{
|
||||
string pathFile(dir);
|
||||
pathFile += foundData.cFileName;
|
||||
pathFile += filename;
|
||||
fileNames.push_back(pathFile.c_str());
|
||||
}
|
||||
}
|
||||
|
@ -1537,8 +1558,10 @@ bool Notepad_plus::findInFiles(bool isRecursive, bool isInHiddenDir)
|
|||
_findReplaceDlg.clearFinder();
|
||||
|
||||
const char *dir2Search = _findReplaceDlg.getDir2Search();
|
||||
wchar_t dir2SearchW[MAX_PATH];
|
||||
char2wchar(dir2Search, dir2SearchW);
|
||||
|
||||
if (!dir2Search[0] || !::PathFileExists(dir2Search))
|
||||
if (!dir2SearchW[0] || !::PathFileExistsW(dir2SearchW))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -1576,6 +1599,7 @@ bool Notepad_plus::findInFiles(bool isRecursive, bool isInHiddenDir)
|
|||
}
|
||||
|
||||
bool Notepad_plus::findInOpenedFiles() {
|
||||
|
||||
int nbTotal = 0;
|
||||
ScintillaEditView *pOldView = _pEditView;
|
||||
_pEditView = &_invisibleEditView;
|
||||
|
@ -2161,11 +2185,12 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
_tabPopupMenu.enableItem(IDM_EDIT_SETREADONLY, !isSysReadOnly);
|
||||
_tabPopupMenu.enableItem(IDM_EDIT_CLEARREADONLY, isSysReadOnly);
|
||||
|
||||
bool isFileExisting = PathFileExists(buf->getFilePath()) != FALSE;
|
||||
bool isFileExisting = PathFileExistsW(buf->getFilePathW()) != FALSE;
|
||||
_tabPopupMenu.enableItem(IDM_FILE_DELETE, isFileExisting);
|
||||
_tabPopupMenu.enableItem(IDM_FILE_RENAME, isFileExisting);
|
||||
|
||||
_tabPopupMenu.display(p);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -2227,6 +2252,16 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
xmlTagMatchHiliter.tagMatch(nppGUI._enableTagAttrsHilite);
|
||||
}
|
||||
_smartHighlighter.highlightView(notifyView);
|
||||
|
||||
if (_linkTriggered)
|
||||
{
|
||||
int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL;
|
||||
if ((urlAction == 1) || (urlAction == 2))
|
||||
addHotSpot(_isDocModifing);
|
||||
_linkTriggered = false;
|
||||
_isDocModifing = false;
|
||||
}
|
||||
|
||||
updateStatusBar();
|
||||
AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub;
|
||||
autoC->update(0);
|
||||
|
@ -2236,14 +2271,15 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
case SCN_SCROLLED:
|
||||
{
|
||||
_smartHighlighter.highlightView(notifyView);
|
||||
////_urlHighlighter.highlightView(notifyView);
|
||||
break;
|
||||
}
|
||||
|
||||
case TTN_GETDISPINFO:
|
||||
case TTN_GETDISPINFOW:
|
||||
{
|
||||
LPTOOLTIPTEXT lpttt;
|
||||
LPTOOLTIPTEXTW lpttt;
|
||||
|
||||
lpttt = (LPTOOLTIPTEXT)notification;
|
||||
lpttt = (LPTOOLTIPTEXTW)notification;
|
||||
lpttt->hinst = _hInst;
|
||||
|
||||
POINT p;
|
||||
|
@ -2273,7 +2309,9 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
else
|
||||
break;
|
||||
|
||||
lpttt->lpszText = (LPSTR)tip.c_str();
|
||||
static wchar_t tipW[MAX_PATH];
|
||||
char2wchar(tip.c_str(), tipW);
|
||||
lpttt->lpszText = tipW;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -2290,6 +2328,12 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
if (_syncInfo.doSync())
|
||||
doSynScorll(HWND(notification->nmhdr.hwndFrom));
|
||||
|
||||
////if (_linkTriggered)
|
||||
{
|
||||
////_urlHighlighter.highlightView(notifyView);
|
||||
////_linkTriggered = false;
|
||||
}
|
||||
|
||||
if (_linkTriggered)
|
||||
{
|
||||
int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL;
|
||||
|
@ -2298,11 +2342,33 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
_linkTriggered = false;
|
||||
_isDocModifing = false;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case SCN_HOTSPOTDOUBLECLICK :
|
||||
{
|
||||
/*
|
||||
notifyView->execute(SCI_SETWORDCHARS, 0, (LPARAM)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+.:?&@=/%#");
|
||||
|
||||
int pos = notifyView->execute(SCI_GETCURRENTPOS);
|
||||
int startPos = static_cast<int>(notifyView->execute(SCI_WORDSTARTPOSITION, pos, false));
|
||||
int endPos = static_cast<int>(notifyView->execute(SCI_WORDENDPOSITION, pos, false));
|
||||
|
||||
notifyView->execute(SCI_SETTARGETSTART, startPos);
|
||||
notifyView->execute(SCI_SETTARGETEND, endPos);
|
||||
|
||||
int length = endPos-startPos+1;
|
||||
char * currentWord = new char[length];
|
||||
notifyView->getText(currentWord, startPos, endPos);
|
||||
|
||||
::ShellExecute(_hSelf, "open", currentWord, NULL, NULL, SW_SHOW);
|
||||
//Disabled: This message comes after SCN_DOUBLECLICK, so this method fails and prevents the next doubleclick from working
|
||||
//_isHotspotDblClicked = true;
|
||||
notifyView->execute(SCI_SETCHARSDEFAULT);
|
||||
delete [] currentWord;
|
||||
break;
|
||||
*/
|
||||
notifyView->execute(SCI_SETWORDCHARS, 0, (LPARAM)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+.:?&@=/%#");
|
||||
|
||||
int pos = notifyView->execute(SCI_GETCURRENTPOS);
|
||||
|
@ -2312,7 +2378,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
notifyView->execute(SCI_SETTARGETSTART, startPos);
|
||||
notifyView->execute(SCI_SETTARGETEND, endPos);
|
||||
|
||||
int posFound = notifyView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr);
|
||||
int posFound = notifyView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRE), (LPARAM)urlHttpRE);
|
||||
if (posFound != -1)
|
||||
{
|
||||
startPos = int(notifyView->execute(SCI_GETTARGETSTART));
|
||||
|
@ -2384,7 +2450,6 @@ BOOL Notepad_plus::notify(SCNotification *notification)
|
|||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void Notepad_plus::findMatchingBracePos(int & braceAtCaret, int & braceOpposite)
|
||||
{
|
||||
int caretPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
|
||||
|
@ -2453,6 +2518,7 @@ void Notepad_plus::charAdded(char chAdded)
|
|||
|
||||
void Notepad_plus::addHotSpot(bool docIsModifing)
|
||||
{
|
||||
//printStr("addHotSpot begin");
|
||||
//bool docIsModifing = true;
|
||||
int posBegin2style = 0;
|
||||
if (docIsModifing)
|
||||
|
@ -2483,7 +2549,7 @@ void Notepad_plus::addHotSpot(bool docIsModifing)
|
|||
ch = (unsigned char)_pEditView->execute(SCI_GETCHARAT, posBegin2style--);
|
||||
}
|
||||
}
|
||||
int style_hotspot = 30;
|
||||
|
||||
|
||||
int startPos = 0;
|
||||
int endPos = _pEditView->execute(SCI_GETTEXTLENGTH);
|
||||
|
@ -2493,9 +2559,10 @@ void Notepad_plus::addHotSpot(bool docIsModifing)
|
|||
_pEditView->execute(SCI_SETTARGETSTART, startPos);
|
||||
_pEditView->execute(SCI_SETTARGETEND, endPos);
|
||||
|
||||
vector<pair<int, int> > hotspotStylers;
|
||||
|
||||
int posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr);
|
||||
vector< pair<Style, int> > & hotspotStylers = (_pEditView->getCurrentBuffer())->getClickableStyles();
|
||||
int style_hotspot = hotspotStylers.size()==0?30:hotspotStylers[hotspotStylers.size() - 1].second - 1;
|
||||
|
||||
int posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRE), (LPARAM)urlHttpRE);
|
||||
|
||||
while (posFound != -1)
|
||||
{
|
||||
|
@ -2503,7 +2570,8 @@ void Notepad_plus::addHotSpot(bool docIsModifing)
|
|||
int end = int(_pEditView->execute(SCI_GETTARGETEND));
|
||||
int foundTextLen = end - start;
|
||||
int idStyle = _pEditView->execute(SCI_GETSTYLEAT, posFound);
|
||||
|
||||
//if (_pEditView->execute(SCI_STYLEGETHOTSPOT, idStyle) == FALSE)
|
||||
{
|
||||
if (end < posBegin2style - 1)
|
||||
{
|
||||
if (style_hotspot > 1)
|
||||
|
@ -2512,11 +2580,12 @@ void Notepad_plus::addHotSpot(bool docIsModifing)
|
|||
else
|
||||
{
|
||||
int fs = -1;
|
||||
for (size_t i = 0 ; i < hotspotStylers.size() ; i++)
|
||||
size_t i = 0;
|
||||
for ( ; i < hotspotStylers.size() ; i++)
|
||||
{
|
||||
if (hotspotStylers[i].second == idStyle)
|
||||
if (hotspotStylers[i].first._styleID == idStyle)
|
||||
{
|
||||
fs = hotspotStylers[i].first;
|
||||
fs = hotspotStylers[i].second;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2526,33 +2595,57 @@ void Notepad_plus::addHotSpot(bool docIsModifing)
|
|||
_pEditView->execute(SCI_STARTSTYLING, start, 0xFF);
|
||||
_pEditView->execute(SCI_SETSTYLING, foundTextLen, fs);
|
||||
|
||||
Style styleToSet = hotspotStylers[i].first;
|
||||
|
||||
if ( styleToSet._colorStyle & COLORSTYLE_FOREGROUND )
|
||||
_pEditView->execute(SCI_STYLESETFORE, fs, styleToSet._fgColor);
|
||||
|
||||
if ( styleToSet._colorStyle & COLORSTYLE_BACKGROUND )
|
||||
_pEditView->execute(SCI_STYLESETBACK, fs, styleToSet._bgColor);
|
||||
|
||||
if ((!styleToSet._fontName)||(strcmp(styleToSet._fontName, "")))
|
||||
_pEditView->execute(SCI_STYLESETFONT, (WPARAM)fs, (LPARAM)styleToSet._fontName);
|
||||
|
||||
int fontStyle = styleToSet._fontStyle;
|
||||
if (fontStyle != -1)
|
||||
{
|
||||
_pEditView->execute(SCI_STYLESETBOLD, (WPARAM)fs, fontStyle & FONTSTYLE_BOLD);
|
||||
_pEditView->execute(SCI_STYLESETITALIC, (WPARAM)fs, fontStyle & FONTSTYLE_ITALIC);
|
||||
_pEditView->execute(SCI_STYLESETUNDERLINE, (WPARAM)fs, fontStyle & FONTSTYLE_UNDERLINE);
|
||||
}
|
||||
|
||||
if (styleToSet._fontSize > 0)
|
||||
_pEditView->execute(SCI_STYLESETSIZE, fs, styleToSet._fontSize);
|
||||
|
||||
_pEditView->execute(SCI_STYLESETHOTSPOT, fs, TRUE);
|
||||
_pEditView->execute(SCI_SETHOTSPOTACTIVEFORE, TRUE, blue);
|
||||
_pEditView->execute(SCI_SETHOTSPOTSINGLELINE, fs, 0);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
pair<int, int> p(style_hotspot, idStyle);
|
||||
hotspotStylers.push_back(p);
|
||||
int activeFG = 0xFF0000;
|
||||
|
||||
char fontName[256];
|
||||
Style hotspotStyle;
|
||||
Style associatedHotspotStyle;
|
||||
|
||||
hotspotStyle._styleID = style_hotspot;
|
||||
associatedHotspotStyle._styleID = style_hotspot;
|
||||
_pEditView->execute(SCI_STYLEGETFONT, idStyle, (LPARAM)fontName);
|
||||
hotspotStyle._fgColor = _pEditView->execute(SCI_STYLEGETFORE, idStyle);
|
||||
hotspotStyle._bgColor = _pEditView->execute(SCI_STYLEGETBACK, idStyle);
|
||||
hotspotStyle._fontSize = _pEditView->execute(SCI_STYLEGETSIZE, idStyle);
|
||||
associatedHotspotStyle._fgColor = _pEditView->execute(SCI_STYLEGETFORE, idStyle);
|
||||
associatedHotspotStyle._bgColor = _pEditView->execute(SCI_STYLEGETBACK, idStyle);
|
||||
associatedHotspotStyle._fontSize = _pEditView->execute(SCI_STYLEGETSIZE, idStyle);
|
||||
|
||||
int isBold = _pEditView->execute(SCI_STYLEGETBOLD, idStyle);
|
||||
int isItalic = _pEditView->execute(SCI_STYLEGETITALIC, idStyle);
|
||||
int isUnderline = _pEditView->execute(SCI_STYLEGETUNDERLINE, idStyle);
|
||||
hotspotStyle._fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0);
|
||||
associatedHotspotStyle._fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0);
|
||||
|
||||
int fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0);
|
||||
int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL;
|
||||
if (urlAction == 2)
|
||||
hotspotStyle._fontStyle |= FONTSTYLE_UNDERLINE;
|
||||
associatedHotspotStyle._fontStyle |= FONTSTYLE_UNDERLINE;
|
||||
|
||||
_pEditView->setStyle(hotspotStyle);
|
||||
_pEditView->setStyle(associatedHotspotStyle);
|
||||
|
||||
_pEditView->execute(SCI_STYLESETHOTSPOT, style_hotspot, TRUE);
|
||||
_pEditView->execute(SCI_SETHOTSPOTACTIVEFORE, TRUE, activeFG);
|
||||
|
@ -2560,20 +2653,27 @@ void Notepad_plus::addHotSpot(bool docIsModifing)
|
|||
_pEditView->execute(SCI_STARTSTYLING, start, 0x1F);
|
||||
_pEditView->execute(SCI_SETSTYLING, foundTextLen, style_hotspot);
|
||||
if (style_hotspot > 1)
|
||||
style_hotspot--;
|
||||
style_hotspot--;
|
||||
|
||||
associatedHotspotStyle._styleID = idStyle;
|
||||
pair<Style, int> p(associatedHotspotStyle, style_hotspot);
|
||||
hotspotStylers.push_back(p);
|
||||
}
|
||||
}
|
||||
|
||||
_pEditView->execute(SCI_SETTARGETSTART, posFound + foundTextLen);
|
||||
_pEditView->execute(SCI_SETTARGETEND, endPos);
|
||||
posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRE), (LPARAM)urlHttpRE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr);
|
||||
}
|
||||
|
||||
|
||||
_pEditView->execute(SCI_STARTSTYLING, endStyle, 0xFF);
|
||||
_pEditView->execute(SCI_SETSTYLING, 0, 0);
|
||||
|
||||
//printStr("addHotSpot end");
|
||||
}
|
||||
|
||||
|
||||
|
@ -2884,14 +2984,14 @@ void Notepad_plus::command(int id)
|
|||
{
|
||||
Buffer * buf = _pEditView->getCurrentBuffer();
|
||||
if (id == IDM_EDIT_FULLPATHTOCLIP) {
|
||||
str2Cliboard(buf->getFilePath());
|
||||
str2CliboardW(buf->getFilePathW());
|
||||
} else if (id == IDM_EDIT_CURRENTDIRTOCLIP) {
|
||||
char dir[MAX_PATH];
|
||||
strcpy(dir, buf->getFilePath());
|
||||
PathRemoveFileSpec((LPSTR)dir);
|
||||
str2Cliboard(dir);
|
||||
wchar_t dir[MAX_PATH];
|
||||
wcscpy(dir, buf->getFilePathW());
|
||||
PathRemoveFileSpecW((LPWSTR)dir);
|
||||
str2CliboardW(dir);
|
||||
} else if (id == IDM_EDIT_FILENAMETOCLIP) {
|
||||
str2Cliboard(buf->getFileName());
|
||||
str2CliboardW(buf->getFileNameW());
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -3188,10 +3288,10 @@ void Notepad_plus::command(int id)
|
|||
{
|
||||
Buffer * buf = _pEditView->getCurrentBuffer();
|
||||
|
||||
DWORD dwFileAttribs = ::GetFileAttributes(buf->getFileName());
|
||||
DWORD dwFileAttribs = ::GetFileAttributesW(buf->getFileNameW());
|
||||
dwFileAttribs ^= FILE_ATTRIBUTE_READONLY;
|
||||
|
||||
::SetFileAttributes(buf->getFileName(), dwFileAttribs);
|
||||
::SetFileAttributesW(buf->getFileNameW(), dwFileAttribs);
|
||||
|
||||
buf->setFileReadOnly(false);
|
||||
}
|
||||
|
@ -4311,14 +4411,14 @@ void Notepad_plus::setTitle()
|
|||
//Get the buffer
|
||||
Buffer * buf = _pEditView->getCurrentBuffer();
|
||||
|
||||
string result = "";
|
||||
wstring result = L"";
|
||||
if (buf->isDirty()) {
|
||||
result += "*";
|
||||
result += L"*";
|
||||
}
|
||||
result += buf->getFilePath();
|
||||
result += " - ";
|
||||
result += _className;
|
||||
::SetWindowText(_hSelf, result.c_str());
|
||||
result += buf->getFilePathW();
|
||||
result += L" - ";
|
||||
result += _classNameW;
|
||||
::SetWindowTextW(_hSelf, result.c_str());
|
||||
}
|
||||
|
||||
void Notepad_plus::activateNextDoc(bool direction)
|
||||
|
@ -4407,8 +4507,10 @@ void Notepad_plus::dropFiles(HDROP hdrop)
|
|||
BufferID lastOpened = BUFFER_INVALID;
|
||||
for (int i = 0 ; i < filesDropped ; ++i)
|
||||
{
|
||||
wchar_t pathDroppedW[MAX_PATH];
|
||||
::DragQueryFileW(hdrop, i, pathDroppedW, sizeof(pathDroppedW));
|
||||
char pathDropped[MAX_PATH];
|
||||
::DragQueryFile(hdrop, i, pathDropped, sizeof(pathDropped));
|
||||
wchar2char(pathDroppedW, pathDropped);
|
||||
BufferID test = doOpen(pathDropped);
|
||||
if (test != BUFFER_INVALID)
|
||||
lastOpened = test;
|
||||
|
@ -4728,6 +4830,7 @@ bool Notepad_plus::activateBuffer(BufferID id, int whichOne) {
|
|||
MainFileManager->reloadBuffer(id);
|
||||
pBuf->setNeedReload(false);
|
||||
}
|
||||
|
||||
if (whichOne == MAIN_VIEW) {
|
||||
if (_mainDocTab.activateBuffer(id)) //only activate if possible
|
||||
_mainEditView.activateBuffer(id);
|
||||
|
@ -5760,7 +5863,6 @@ void Notepad_plus::getTaskListInfo(TaskListInfo *tli)
|
|||
LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT result = FALSE;
|
||||
|
||||
NppParameters *pNppParam = NppParameters::getInstance();
|
||||
switch (Message)
|
||||
{
|
||||
|
@ -5768,7 +5870,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
{
|
||||
// Note: lParam is -1 to prevent endless loops of calls
|
||||
::SendMessage(_dockingManager.getHSelf(), WM_NCACTIVATE, wParam, (LPARAM)-1);
|
||||
return ::DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
return ::DefWindowProcW(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
case WM_CREATE:
|
||||
{
|
||||
|
@ -6296,7 +6398,9 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
dir = (const char *)wParam;
|
||||
else
|
||||
{
|
||||
::GetCurrentDirectory(MAX_PATH, currentDir);
|
||||
wchar_t currentDirW[MAX_PATH];
|
||||
::GetCurrentDirectoryW(MAX_PATH, currentDirW);
|
||||
wchar2char(currentDirW, currentDir);
|
||||
dir = currentDir;
|
||||
}
|
||||
|
||||
|
@ -6423,7 +6527,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
case COPYDATA_FILENAMES :
|
||||
{
|
||||
CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams();
|
||||
loadCommandlineParams((const char *)pCopyData->lpData, &cmdLineParams);
|
||||
loadCommandlineParams((const wchar_t *)pCopyData->lpData, &cmdLineParams);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -6457,34 +6561,34 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
case NPPM_GETNAMEPART :
|
||||
case NPPM_GETEXTPART :
|
||||
{
|
||||
char str[MAX_PATH];
|
||||
wchar_t str[MAX_PATH];
|
||||
// par defaut : NPPM_GETCURRENTDIRECTORY
|
||||
char *fileStr = strcpy(str, _pEditView->getCurrentBuffer()->getFilePath());
|
||||
wchar_t *fileStr = wcscpy(str, _pEditView->getCurrentBuffer()->getFilePathW());
|
||||
|
||||
if (Message == NPPM_GETCURRENTDIRECTORY)
|
||||
PathRemoveFileSpec(str);
|
||||
PathRemoveFileSpecW(str);
|
||||
else if (Message == NPPM_GETFILENAME)
|
||||
fileStr = PathFindFileName(str);
|
||||
fileStr = PathFindFileNameW(str);
|
||||
else if (Message == NPPM_GETNAMEPART)
|
||||
{
|
||||
fileStr = PathFindFileName(str);
|
||||
PathRemoveExtension(fileStr);
|
||||
fileStr = PathFindFileNameW(str);
|
||||
PathRemoveExtensionW(fileStr);
|
||||
}
|
||||
else if (Message == NPPM_GETEXTPART)
|
||||
fileStr = PathFindExtension(str);
|
||||
fileStr = PathFindExtensionW(str);
|
||||
|
||||
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
|
||||
// otherwise we check if the string buffer size is enough for the string to copy.
|
||||
if (wParam != 0)
|
||||
{
|
||||
if (strlen(fileStr) >= wParam)
|
||||
if (wcslen(fileStr) >= wParam)
|
||||
{
|
||||
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM error", MB_OK);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
strcpy((char *)lParam, fileStr);
|
||||
wcscpy((wchar_t *)lParam, fileStr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -6505,35 +6609,39 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
}
|
||||
else //buffer large enough, perform safe copy
|
||||
{
|
||||
lstrcpyn((char *)lParam, str, wParam);
|
||||
wchar_t strW[strSize];
|
||||
char2wchar(str, strW);
|
||||
lstrcpynW((wchar_t *)lParam, strW, wParam);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
strcpy((char *)lParam, str);
|
||||
wchar_t strW[strSize];
|
||||
char2wchar(str, strW);
|
||||
wcscpy((wchar_t *)lParam, strW);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
case NPPM_GETNPPDIRECTORY :
|
||||
{
|
||||
const int strSize = MAX_PATH;
|
||||
char str[strSize];
|
||||
wchar_t str[strSize];
|
||||
|
||||
::GetModuleFileName(NULL, str, strSize);
|
||||
PathRemoveFileSpec(str);
|
||||
::GetModuleFileNameW(NULL, str, strSize);
|
||||
PathRemoveFileSpecW(str);
|
||||
|
||||
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
|
||||
// otherwise we check if the string buffer size is enough for the string to copy.
|
||||
if (wParam != 0)
|
||||
{
|
||||
if (strlen(str) >= wParam)
|
||||
if (wcslen(str) >= wParam)
|
||||
{
|
||||
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM_GETNPPDIRECTORY error", MB_OK);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
strcpy((char *)lParam, str);
|
||||
wcscpy((wchar_t *)lParam, str);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -6657,7 +6765,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
activateNextDoc((GET_APPCOMMAND_LPARAM(lParam) == APPCOMMAND_BROWSER_FORWARD)?dirDown:dirUp);
|
||||
_linkTriggered = true;
|
||||
}
|
||||
return ::DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
return ::DefWindowProcW(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
|
||||
case NPPM_GETNBSESSIONFILES :
|
||||
|
@ -7131,7 +7239,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
}
|
||||
}
|
||||
|
||||
return ::DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
return ::DefWindowProcW(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
|
||||
case WM_NOTIFY:
|
||||
|
@ -7302,7 +7410,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
_sysMenuEntering = true;
|
||||
}
|
||||
|
||||
return ::DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
return ::DefWindowProcW(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
|
||||
case WM_LBUTTONDBLCLK:
|
||||
|
@ -7600,7 +7708,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
return ::DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
return ::DefWindowProcW(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7627,7 +7735,7 @@ LRESULT CALLBACK Notepad_plus::Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM
|
|||
|
||||
default :
|
||||
{
|
||||
return ((Notepad_plus *)::GetWindowLongPtr(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam);
|
||||
return ((Notepad_plus *)::GetWindowLongPtrW(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7830,7 +7938,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session)
|
|||
{
|
||||
BufferID bufID = _mainDocTab.getBufferByIndex(i);
|
||||
Buffer * buf = MainFileManager->getBufferByID(bufID);
|
||||
if (!buf->isUntitled() && PathFileExists(buf->getFilePath()))
|
||||
if (!buf->isUntitled() && PathFileExistsW(buf->getFilePathW()))
|
||||
{
|
||||
string languageName = getLangFromMenu( buf );
|
||||
const char *langName = languageName.c_str();
|
||||
|
@ -7855,7 +7963,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session)
|
|||
{
|
||||
BufferID bufID = _subDocTab.getBufferByIndex(i);
|
||||
Buffer * buf = MainFileManager->getBufferByID(bufID);
|
||||
if (!buf->isUntitled() && PathFileExists(buf->getFilePath()))
|
||||
if (!buf->isUntitled() && PathFileExistsW(buf->getFilePathW()))
|
||||
{
|
||||
string languageName = getLangFromMenu( buf );
|
||||
const char *langName = languageName.c_str();
|
||||
|
@ -7906,7 +8014,9 @@ bool Notepad_plus::fileLoadSession(const char *fn)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (PathFileExists(fn))
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(fn, fnW);
|
||||
if (PathFileExistsW(fnW))
|
||||
sessionFileName = fn;
|
||||
}
|
||||
|
||||
|
@ -7934,7 +8044,6 @@ const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames, con
|
|||
Session currentSession;
|
||||
if ((nbFile) && (!fileNames))
|
||||
{
|
||||
|
||||
for (size_t i = 0 ; i < nbFile ; i++)
|
||||
{
|
||||
if (PathFileExists(fileNames[i]))
|
||||
|
@ -8001,6 +8110,37 @@ bool Notepad_plus::str2Cliboard(const char *str2cpy)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool Notepad_plus::str2CliboardW(const wchar_t *str2cpy)
|
||||
{
|
||||
if (!str2cpy)
|
||||
return false;
|
||||
|
||||
if (!::OpenClipboard(_hSelf))
|
||||
return false;
|
||||
|
||||
::EmptyClipboard();
|
||||
|
||||
int size = sizeof(wchar_t);
|
||||
HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, wcslen(str2cpy) * size + size);
|
||||
|
||||
if (hglbCopy == NULL)
|
||||
{
|
||||
::CloseClipboard();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Lock the handle and copy the text to the buffer.
|
||||
wchar_t *pStr = (wchar_t *)::GlobalLock(hglbCopy);
|
||||
wcscpy(pStr, str2cpy);
|
||||
::GlobalUnlock(hglbCopy);
|
||||
|
||||
// Place the handle on the clipboard.
|
||||
::SetClipboardData(CF_UNICODETEXT, hglbCopy);
|
||||
::CloseClipboard();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//ONLY CALL IN CASE OF EMERGENCY: EXCEPTION
|
||||
//This function is destructive
|
||||
bool Notepad_plus::emergency() {
|
||||
|
@ -8153,9 +8293,9 @@ void Notepad_plus::notifyBufferChanged(Buffer * buffer, int mask) {
|
|||
if (mask & (BufferChangeDirty|BufferChangeFilename)) {
|
||||
checkDocState();
|
||||
setTitle();
|
||||
char dir[MAX_PATH];
|
||||
strcpy(dir, buffer->getFilePath());
|
||||
PathRemoveFileSpec(dir);
|
||||
wchar_t dir[MAX_PATH];
|
||||
wcscpy(dir, buffer->getFilePathW());
|
||||
PathRemoveFileSpecW(dir);
|
||||
setWorkingDir(dir);
|
||||
}
|
||||
if (mask & (BufferChangeLanguage)) {
|
||||
|
@ -8198,9 +8338,9 @@ void Notepad_plus::notifyBufferActivated(BufferID bufid, int view) {
|
|||
setUniModeText(buf->getUnicodeMode());
|
||||
setDisplayFormat(buf->getFormat());
|
||||
enableConvertMenuItems(buf->getFormat());
|
||||
char dir[MAX_PATH];
|
||||
strcpy(dir, buf->getFilePath());
|
||||
PathRemoveFileSpec(dir);
|
||||
wchar_t dir[MAX_PATH];
|
||||
wcscpy(dir, buf->getFilePathW());
|
||||
PathRemoveFileSpecW(dir);
|
||||
setWorkingDir(dir);
|
||||
setTitle();
|
||||
//Make sure the colors of the tab controls match
|
||||
|
@ -8210,12 +8350,12 @@ void Notepad_plus::notifyBufferActivated(BufferID bufid, int view) {
|
|||
_linkTriggered = true;
|
||||
}
|
||||
|
||||
void Notepad_plus::loadCommandlineParams(const char * commandLine, CmdLineParams * pCmdParams) {
|
||||
void Notepad_plus::loadCommandlineParams(const wchar_t * commandLine, CmdLineParams * pCmdParams) {
|
||||
if (!commandLine || ! pCmdParams)
|
||||
return;
|
||||
|
||||
FileNameStringSplitter fnss(commandLine);
|
||||
const char *pFn = NULL;
|
||||
const wchar_t *pFn = NULL;
|
||||
|
||||
LangType lt = pCmdParams->_langType;//LangType(pCopyData->dwData & LASTBYTEMASK);
|
||||
int ln = pCmdParams->_line2go;
|
||||
|
@ -8225,7 +8365,9 @@ void Notepad_plus::loadCommandlineParams(const char * commandLine, CmdLineParams
|
|||
for (int i = 0 ; i < fnss.size() ; i++)
|
||||
{
|
||||
pFn = fnss.getFileName(i);
|
||||
BufferID bufID = doOpen(pFn, readOnly);
|
||||
char fn[MAX_PATH];
|
||||
wchar2char(pFn, fn);
|
||||
BufferID bufID = doOpen(fn, readOnly);
|
||||
if (bufID == BUFFER_INVALID) //cannot open file
|
||||
continue;
|
||||
|
||||
|
|
|
@ -49,8 +49,11 @@
|
|||
#include "AutoCompletion.h"
|
||||
#include "Buffer.h"
|
||||
#include "SmartHighlighter.h"
|
||||
#include "UniConversion.h"
|
||||
#include "UrlHighlighter.h"
|
||||
|
||||
#define NOTEPAD_PP_CLASS_NAME "Notepad++"
|
||||
#define NOTEPAD_PP_CLASS_NAME_W L"Notepad++"
|
||||
|
||||
#define MENU 0x01
|
||||
#define TOOLBAR 0x02
|
||||
|
@ -95,7 +98,7 @@ class Notepad_plus : public Window {
|
|||
public:
|
||||
Notepad_plus();
|
||||
virtual inline ~Notepad_plus();
|
||||
void init(HINSTANCE, HWND, const char *cmdLine, CmdLineParams *cmdLineParams);
|
||||
void init(HINSTANCE, HWND, const wchar_t *cmdLine, CmdLineParams *cmdLineParams);
|
||||
inline void killAllChildren();
|
||||
virtual inline void destroy();
|
||||
|
||||
|
@ -113,6 +116,7 @@ public:
|
|||
if (unicodeSupported?(::IsDialogMessageW(_hModelessDlgs[i], msg)):(::IsDialogMessageA(_hModelessDlgs[i], msg)))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
|
@ -190,7 +194,9 @@ public:
|
|||
|
||||
void notifyBufferChanged(Buffer * buffer, int mask);
|
||||
private:
|
||||
void loadCommandlineParams(const wchar_t * commandLine, CmdLineParams * pCmdParams);
|
||||
static const char _className[32];
|
||||
static const wchar_t _classNameW[32];
|
||||
char _nppPath[MAX_PATH];
|
||||
Window *_pMainWindow;
|
||||
DockingManager _dockingManager;
|
||||
|
@ -199,6 +205,7 @@ private:
|
|||
AutoCompletion _autoCompleteSub; //each Scintilla has its own autoComplete
|
||||
|
||||
SmartHighlighter _smartHighlighter;
|
||||
UrlHighlighter _urlHighlighter;
|
||||
|
||||
TiXmlNode *_nativeLang, *_toolIcons;
|
||||
|
||||
|
@ -386,36 +393,44 @@ private:
|
|||
//END: Document management
|
||||
|
||||
int doSaveOrNot(const char *fn) {
|
||||
char pattern[64] = "Save file \"%s\" ?";
|
||||
char phrase[512];
|
||||
sprintf(phrase, pattern, fn);
|
||||
return doActionOrNot("Save", phrase, MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(fn, fnW);
|
||||
wchar_t pattern[64] = L"Save file \"%s\" ?";
|
||||
wchar_t phrase[512];
|
||||
swprintf(phrase, pattern, fnW);
|
||||
return doActionOrNot(L"Save", phrase, MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
};
|
||||
|
||||
int doReloadOrNot(const char *fn) {
|
||||
char pattern[128] = "The file \"%s\" is modified by another program.\rReload this file?";
|
||||
char phrase[512];
|
||||
sprintf(phrase, pattern, fn);
|
||||
return doActionOrNot("Reload", phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(fn, fnW);
|
||||
wchar_t pattern[128] = L"The file \"%s\" is modified by another program.\rReload this file?";
|
||||
wchar_t phrase[512];
|
||||
swprintf(phrase, pattern, fnW);
|
||||
return doActionOrNot(L"Reload", phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
};
|
||||
|
||||
int doCloseOrNot(const char *fn) {
|
||||
char pattern[128] = "The file \"%s\" doesn't exist anymore.\rKeep this file in editor?";
|
||||
char phrase[512];
|
||||
sprintf(phrase, pattern, fn);
|
||||
return doActionOrNot("Keep non existing file", phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(fn, fnW);
|
||||
wchar_t pattern[128] = L"The file \"%s\" doesn't exist anymore.\rKeep this file in editor?";
|
||||
wchar_t phrase[512];
|
||||
swprintf(phrase, pattern, fnW);
|
||||
return doActionOrNot(L"Keep non existing file", phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
};
|
||||
|
||||
int doDeleteOrNot(const char *fn) {
|
||||
char pattern[128] = "The file \"%s\"\rwill be deleted from your disk and this document will be closed.\rContinue?";
|
||||
char phrase[512];
|
||||
sprintf(phrase, pattern, fn);
|
||||
return doActionOrNot("Delete file", phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(fn, fnW);
|
||||
wchar_t pattern[128] = L"The file \"%s\"\rwill be deleted from your disk and this document will be closed.\rContinue?";
|
||||
wchar_t phrase[512];
|
||||
swprintf(phrase, pattern, fnW);
|
||||
return doActionOrNot(L"Delete file", phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL);
|
||||
};
|
||||
|
||||
int doActionOrNot(const char *title, const char *displayText, int type) {
|
||||
return ::MessageBox(_hSelf, displayText, title, type);
|
||||
int doActionOrNot(const wchar_t *title, const wchar_t *displayText, int type) {
|
||||
return ::MessageBoxW(_hSelf, displayText, title, type);
|
||||
};
|
||||
|
||||
void enableMenu(int cmdID, bool doEnable) const {
|
||||
int flag = doEnable?MF_ENABLED | MF_BYCOMMAND:MF_DISABLED | MF_GRAYED | MF_BYCOMMAND;
|
||||
::EnableMenuItem(_mainMenuHandle, cmdID, flag);
|
||||
|
@ -685,25 +700,26 @@ private:
|
|||
void getMatchedFileNames(const char *dir, const vector<string> & patterns, vector<string> & fileNames, bool isRecursive, bool isInHiddenDir);
|
||||
|
||||
void doSynScorll(HWND hW);
|
||||
void setWorkingDir(char *dir) {
|
||||
void setWorkingDir(wchar_t *dir) {
|
||||
if (NppParameters::getInstance()->getNppGUI()._saveOpenKeepInSameDir)
|
||||
return;
|
||||
|
||||
if (!dir || !PathIsDirectory(dir))
|
||||
if (!dir || !PathIsDirectoryW(dir))
|
||||
{
|
||||
//Non existing path, usually occurs when a new 1 file is open.
|
||||
//Set working dir to Notepad++' directory to prevent directory lock.
|
||||
char nppDir[MAX_PATH];
|
||||
wchar_t nppDir[MAX_PATH];
|
||||
|
||||
//wParam set to max_path in case boundary checks will ever be made.
|
||||
SendMessage(_hSelf, NPPM_GETNPPDIRECTORY, (WPARAM)MAX_PATH, (LPARAM)nppDir);
|
||||
::SetCurrentDirectory(nppDir);
|
||||
::SendMessage(_hSelf, NPPM_GETNPPDIRECTORY, (WPARAM)MAX_PATH, (LPARAM)nppDir);
|
||||
::SetCurrentDirectoryW(nppDir);
|
||||
return;
|
||||
}
|
||||
else
|
||||
::SetCurrentDirectory(dir);
|
||||
::SetCurrentDirectoryW(dir);
|
||||
}
|
||||
bool str2Cliboard(const char *str2cpy);
|
||||
bool str2CliboardW(const wchar_t *str2cpy);
|
||||
bool bin2Cliboard(const unsigned char *uchar2cpy, size_t length);
|
||||
|
||||
bool getIntegralDockingData(tTbData & dockData, int & iCont, bool & isVisible);
|
||||
|
@ -771,8 +787,6 @@ private:
|
|||
|
||||
bool dumpFiles(const char * outdir, const char * fileprefix = ""); //helper func
|
||||
void drawTabbarColoursFromStylerArray();
|
||||
|
||||
void loadCommandlineParams(const char * commandLine, CmdLineParams * pCmdParams);
|
||||
};
|
||||
|
||||
#endif //NOTEPAD_PLUS_H
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include "Notepad_plus.h"
|
||||
#include "ScintillaEditView.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
FileManager * FileManager::_pSelf = new FileManager();
|
||||
|
||||
|
@ -82,7 +83,7 @@ long Buffer::_recentTagCtr = 0;
|
|||
|
||||
void Buffer::updateTimeStamp() {
|
||||
struct _stat buf;
|
||||
time_t timeStamp = (_stat(_fullPathName, &buf)==0)?buf.st_mtime:0;
|
||||
time_t timeStamp = (_wstat(_fullPathNameW, &buf)==0)?buf.st_mtime:0;
|
||||
|
||||
if (timeStamp != _timeStamp) {
|
||||
_timeStamp = timeStamp;
|
||||
|
@ -102,6 +103,8 @@ void Buffer::setFileName(const char *fn, LangType defaultLang)
|
|||
return;
|
||||
}
|
||||
strcpy(_fullPathName, fn);
|
||||
char2wchar(_fullPathName, _fullPathNameW);
|
||||
_fileNameW = PathFindFileNameW(_fullPathNameW);
|
||||
_fileName = PathFindFileName(_fullPathName);
|
||||
|
||||
// for _lang
|
||||
|
@ -148,19 +151,19 @@ bool Buffer::checkFileState() { //returns true if the status has been changed (i
|
|||
if (_currentStatus == DOC_UNNAMED) //unsaved document cannot change by environment
|
||||
return false;
|
||||
|
||||
if (_currentStatus != DOC_DELETED && !PathFileExists(_fullPathName)) //document has been deleted
|
||||
if (_currentStatus != DOC_DELETED && !PathFileExistsW(_fullPathNameW)) //document has been deleted
|
||||
{
|
||||
_currentStatus = DOC_DELETED;
|
||||
_isFileReadOnly = false;
|
||||
_isDirty = true; //dirty sicne no match with filesystem
|
||||
_isDirty = true; //dirty since no match with filesystem
|
||||
_timeStamp = 0;
|
||||
doNotify(BufferChangeStatus | BufferChangeReadonly | BufferChangeTimestamp);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_currentStatus == DOC_DELETED && PathFileExists(_fullPathName))
|
||||
if (_currentStatus == DOC_DELETED && PathFileExistsW(_fullPathNameW))
|
||||
{ //document has returned from its grave
|
||||
if (!_stat(_fullPathName, &buf))
|
||||
if (!_wstat(_fullPathNameW, &buf))
|
||||
{
|
||||
_isFileReadOnly = (bool)(!(buf.st_mode & _S_IWRITE));
|
||||
|
||||
|
@ -171,7 +174,7 @@ bool Buffer::checkFileState() { //returns true if the status has been changed (i
|
|||
}
|
||||
}
|
||||
|
||||
if (!_stat(_fullPathName, &buf))
|
||||
if (!_wstat(_fullPathNameW, &buf))
|
||||
{
|
||||
int mask = 0; //status always 'changes', even if from modified to modified
|
||||
bool isFileReadOnly = (bool)(!(buf.st_mode & _S_IWRITE));
|
||||
|
@ -443,20 +446,22 @@ bool FileManager::reloadBufferDeferred(BufferID id) {
|
|||
bool FileManager::deleteFile(BufferID id)
|
||||
{
|
||||
Buffer * buf = getBufferByID(id);
|
||||
const char *fileNamePath = buf->getFilePath();
|
||||
if (!PathFileExists(fileNamePath))
|
||||
const wchar_t *fileNamePath = buf->getFilePathW();
|
||||
if (!PathFileExistsW(fileNamePath))
|
||||
return false;
|
||||
return ::DeleteFile(fileNamePath) != 0;
|
||||
return ::DeleteFileW(fileNamePath) != 0;
|
||||
}
|
||||
|
||||
bool FileManager::moveFile(BufferID id, const char * newFileName)
|
||||
{
|
||||
Buffer * buf = getBufferByID(id);
|
||||
const char *fileNamePath = buf->getFilePath();
|
||||
if (!PathFileExists(fileNamePath))
|
||||
const wchar_t *fileNamePath = buf->getFilePathW();
|
||||
if (!PathFileExistsW(fileNamePath))
|
||||
return false;
|
||||
|
||||
if (::MoveFile(fileNamePath, newFileName) == 0)
|
||||
wchar_t newFileNameW[MAX_PATH];
|
||||
char2wchar(newFileName, newFileNameW);
|
||||
if (::MoveFileW(fileNamePath, newFileNameW) == 0)
|
||||
return false;
|
||||
|
||||
buf->setFileName(newFileName);
|
||||
|
@ -472,19 +477,21 @@ bool FileManager::saveBuffer(BufferID id, const char * filename, bool isCopy) {
|
|||
char fullpath[MAX_PATH];
|
||||
::GetFullPathName(filename, MAX_PATH, fullpath, NULL);
|
||||
::GetLongPathName(fullpath, fullpath, MAX_PATH);
|
||||
if (PathFileExists(fullpath))
|
||||
wchar_t fullpathW[MAX_PATH];
|
||||
char2wchar(fullpath, fullpathW);
|
||||
if (PathFileExistsW(fullpathW))
|
||||
{
|
||||
attrib = ::GetFileAttributes(fullpath);
|
||||
attrib = ::GetFileAttributesW(fullpathW);
|
||||
|
||||
if (attrib != INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
isHidden = (attrib & FILE_ATTRIBUTE_HIDDEN) != 0;
|
||||
if (isHidden)
|
||||
::SetFileAttributes(filename, attrib & ~FILE_ATTRIBUTE_HIDDEN);
|
||||
::SetFileAttributesW(fullpathW, attrib & ~FILE_ATTRIBUTE_HIDDEN);
|
||||
|
||||
isSys = (attrib & FILE_ATTRIBUTE_SYSTEM) != 0;
|
||||
if (isSys)
|
||||
::SetFileAttributes(filename, attrib & ~FILE_ATTRIBUTE_SYSTEM);
|
||||
::SetFileAttributesW(fullpathW, attrib & ~FILE_ATTRIBUTE_SYSTEM);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -495,11 +502,12 @@ bool FileManager::saveBuffer(BufferID id, const char * filename, bool isCopy) {
|
|||
Utf8_16_Write UnicodeConvertor;
|
||||
UnicodeConvertor.setEncoding(mode);
|
||||
|
||||
FILE *fp = UnicodeConvertor.fopen(fullpath, "wb");
|
||||
FILE *fp = UnicodeConvertor.fopenW(fullpathW, L"wb");
|
||||
if (fp)
|
||||
{
|
||||
_pscratchTilla->execute(SCI_SETDOCPOINTER, 0, buffer->_doc); //generate new document
|
||||
|
||||
|
||||
char data[blockSize + 1];
|
||||
int lengthDoc = _pscratchTilla->getCurrentDocLen();
|
||||
for (int i = 0; i < lengthDoc; i += blockSize)
|
||||
|
@ -514,10 +522,10 @@ bool FileManager::saveBuffer(BufferID id, const char * filename, bool isCopy) {
|
|||
UnicodeConvertor.fclose();
|
||||
|
||||
if (isHidden)
|
||||
::SetFileAttributes(fullpath, attrib | FILE_ATTRIBUTE_HIDDEN);
|
||||
::SetFileAttributesW(fullpathW, attrib | FILE_ATTRIBUTE_HIDDEN);
|
||||
|
||||
if (isSys)
|
||||
::SetFileAttributes(fullpath, attrib | FILE_ATTRIBUTE_SYSTEM);
|
||||
::SetFileAttributesW(fullpathW, attrib | FILE_ATTRIBUTE_SYSTEM);
|
||||
|
||||
if (isCopy) {
|
||||
_pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault);
|
||||
|
@ -571,17 +579,20 @@ bool FileManager::loadFileData(Document doc, const char * filename, Utf8_16_Read
|
|||
const int blockSize = 128 * 1024; //128 kB
|
||||
char data[blockSize];
|
||||
|
||||
__try {
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
WCHAR filenameW[MAX_PATH];
|
||||
char2wchar(filename, filenameW);
|
||||
|
||||
FILE *fp = _wfopen(filenameW, L"rb");
|
||||
if (!fp)
|
||||
return false;
|
||||
|
||||
__try {
|
||||
//Setup scratchtilla for new filedata
|
||||
_pscratchTilla->execute(SCI_SETDOCPOINTER, 0, doc);
|
||||
bool ro = _pscratchTilla->execute(SCI_GETREADONLY) != 0;
|
||||
if (ro) {
|
||||
if (ro) {
|
||||
_pscratchTilla->execute(SCI_SETREADONLY, false);
|
||||
}
|
||||
}
|
||||
_pscratchTilla->execute(SCI_CLEARALL);
|
||||
if (language < L_EXTERNAL) {
|
||||
_pscratchTilla->execute(SCI_SETLEXER, ScintillaEditView::langNames[language].lexerID);
|
||||
|
@ -610,6 +621,7 @@ bool FileManager::loadFileData(Document doc, const char * filename, Utf8_16_Read
|
|||
return true;
|
||||
|
||||
}__except(filter(GetExceptionCode(), GetExceptionInformation())) {
|
||||
|
||||
printStr("File is too big to be opened by Notepad++");
|
||||
return false;
|
||||
}
|
||||
|
@ -634,7 +646,10 @@ BufferID FileManager::getBufferFromDocument(Document doc) {
|
|||
}
|
||||
|
||||
bool FileManager::createEmptyFile(const char * path) {
|
||||
FILE * file = fopen(path, "wb");
|
||||
WCHAR pathW[MAX_PATH];
|
||||
char2wchar(path, pathW);
|
||||
|
||||
FILE * file = _wfopen(pathW, L"wb");
|
||||
if (!file)
|
||||
return false;
|
||||
fclose(file);
|
||||
|
|
|
@ -163,8 +163,12 @@ public :
|
|||
const char * getFilePath() const {
|
||||
return _fullPathName;
|
||||
};
|
||||
const wchar_t * getFilePathW() const {
|
||||
return _fullPathNameW;
|
||||
};
|
||||
|
||||
const char * getFileName() const { return _fileName; };
|
||||
const wchar_t * getFileNameW() const { return _fileNameW; };
|
||||
|
||||
BufferID getID() const {
|
||||
return _id;
|
||||
|
@ -248,6 +252,10 @@ public :
|
|||
return _currentStatus;
|
||||
};
|
||||
|
||||
time_t getTimeStamp() const {
|
||||
return _timeStamp;
|
||||
};
|
||||
|
||||
Document getDocument() {
|
||||
return _doc;
|
||||
};
|
||||
|
@ -319,6 +327,13 @@ public :
|
|||
void setNeedReload(bool reload) {
|
||||
_needReloading = reload;
|
||||
}
|
||||
|
||||
vector < pair<Style, int> > & getClickableStyles() {
|
||||
return _clickableStyles;
|
||||
};
|
||||
|
||||
|
||||
|
||||
private :
|
||||
FileManager * _pManager;
|
||||
bool _canNotify;
|
||||
|
@ -345,11 +360,14 @@ private :
|
|||
time_t _timeStamp; // 0 if it's a new doc
|
||||
bool _isFileReadOnly;
|
||||
char _fullPathName[MAX_PATH];
|
||||
wchar_t _fullPathNameW[MAX_PATH];
|
||||
char * _fileName; //points to filename part in _fullPathName
|
||||
wchar_t * _fileNameW;
|
||||
bool _needReloading; //True if Buffer needs to be reloaded on activation
|
||||
|
||||
long _recentTag;
|
||||
static long _recentTagCtr;
|
||||
vector < pair<Style, int> > _clickableStyles;
|
||||
|
||||
void updateTimeStamp();
|
||||
Lang * getCurrentLang() const;
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
#include <commctrl.h>
|
||||
#include <shlwapi.h>
|
||||
#include "UniConversion.h"
|
||||
|
||||
bool DocTabView::_hideTabBarStatus = false;
|
||||
|
||||
|
@ -32,16 +33,18 @@ void DocTabView::addBuffer(BufferID buffer) {
|
|||
if (this->getIndexByBuffer(buffer) != -1) //no duplicates
|
||||
return;
|
||||
Buffer * buf = MainFileManager->getBufferByID(buffer);
|
||||
TCITEM tie;
|
||||
TCITEMW tie;
|
||||
tie.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;
|
||||
|
||||
int index = -1;
|
||||
if (_hasImgLst)
|
||||
index = 0;
|
||||
tie.iImage = index;
|
||||
tie.pszText = (LPSTR)buf->getFileName();
|
||||
tie.pszText = (LPWSTR)buf->getFileNameW();
|
||||
tie.cchTextMax = lstrlenW(tie.pszText);
|
||||
tie.lParam = (LPARAM)buffer;
|
||||
::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast<LPARAM>(&tie));
|
||||
|
||||
::SendMessage(_hSelf, TCM_INSERTITEMW, _nbItem++, reinterpret_cast<LPARAM>(&tie));
|
||||
bufferUpdated(buf, BufferChangeMask);
|
||||
|
||||
::SendMessage(_hParent, WM_SIZE, 0, 0);
|
||||
|
@ -108,7 +111,7 @@ void DocTabView::bufferUpdated(Buffer * buffer, int mask) {
|
|||
if (index == -1)
|
||||
return;
|
||||
|
||||
TCITEM tie;
|
||||
TCITEMW tie;
|
||||
tie.lParam = -1;
|
||||
tie.mask = 0;
|
||||
|
||||
|
@ -123,10 +126,10 @@ void DocTabView::bufferUpdated(Buffer * buffer, int mask) {
|
|||
|
||||
if (mask & BufferChangeFilename) {
|
||||
tie.mask |= TCIF_TEXT;
|
||||
tie.pszText = (LPSTR)buffer->getFileName();
|
||||
tie.pszText = (LPWSTR)buffer->getFileNameW();
|
||||
}
|
||||
|
||||
::SendMessage(_hSelf, TCM_SETITEM, index, reinterpret_cast<LPARAM>(&tie));
|
||||
::SendMessage(_hSelf, TCM_SETITEMW, index, reinterpret_cast<LPARAM>(&tie));
|
||||
|
||||
::SendMessage(_hParent, WM_SIZE, 0, 0);
|
||||
}
|
||||
|
|
|
@ -460,8 +460,11 @@ BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP
|
|||
doDialog((DIALOG_TYPE)indexClicked);
|
||||
if ((DIALOG_TYPE)indexClicked == FINDINFILES_DLG)
|
||||
{
|
||||
wchar_t currentDirW[MAX_PATH];
|
||||
::GetCurrentDirectoryW(MAX_PATH, currentDirW);
|
||||
char currentDir[MAX_PATH];
|
||||
::GetCurrentDirectory(MAX_PATH, currentDir);
|
||||
wchar2char(currentDirW, currentDir);
|
||||
|
||||
setFindInFilesDirFilter(currentDir, NULL);
|
||||
}
|
||||
}
|
||||
|
@ -564,13 +567,17 @@ BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP
|
|||
if (_currentStatus == FINDINFILES_DLG)
|
||||
{
|
||||
char filters[256];
|
||||
char directory[MAX_PATH];
|
||||
::GetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters, sizeof(filters));
|
||||
addText2Combo(filters, ::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO));
|
||||
wchar_t filtersW[256];
|
||||
::GetDlgItemTextW(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filtersW, sizeof(filtersW));
|
||||
wchar2char(filtersW, filters);
|
||||
addText2Combo(filters, ::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO), true);
|
||||
_filters = filters;
|
||||
|
||||
::GetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, directory, sizeof(directory));
|
||||
addText2Combo(directory, ::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO));
|
||||
char directory[MAX_PATH];
|
||||
wchar_t directoryW[MAX_PATH];
|
||||
::GetDlgItemTextW(_hSelf, IDD_FINDINFILES_DIR_COMBO, directoryW, sizeof(directoryW));
|
||||
wchar2char(directoryW, directory);
|
||||
addText2Combo(directory, ::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO), true);
|
||||
_directory = directory;
|
||||
|
||||
if ((strlen(directory) > 0) && (directory[strlen(directory)-1] != '\\'))
|
||||
|
@ -877,13 +884,16 @@ bool FindReplaceDlg::processFindNext(const char *txt2find, FindOption *options)
|
|||
if (!pOptions->_isIncremental) { //incremental search doesnt trigger messages
|
||||
const char stringMaxSize = 64;
|
||||
char message[30 + stringMaxSize + 4]; //message, string, dots
|
||||
wchar_t messageW[30 + stringMaxSize + 4]; //message, string, dots
|
||||
strcpy(message, "Can't find the text:\r\n\"");
|
||||
strncat(message, pText, stringMaxSize);
|
||||
strcat(message, "\"");
|
||||
if (strlen(pText) > stringMaxSize) {
|
||||
strcat(message, "...");
|
||||
}
|
||||
::MessageBox(_hSelf, message, "Find", MB_OK);
|
||||
|
||||
char2wchar(message, messageW);
|
||||
::MessageBoxW(_hSelf, messageW, L"Find", MB_OK);
|
||||
// if the dialog is not shown, pass the focus to his parent(ie. Notepad++)
|
||||
if (!::IsWindowVisible(_hSelf))
|
||||
::SetFocus((*_ppEditView)->getHSelf());
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "ScintillaEditView.h"
|
||||
#include "StatusBar.h"
|
||||
#include "DockingDlgInterface.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
|
||||
#define FIND_RECURSIVE 1
|
||||
|
@ -295,12 +296,18 @@ public :
|
|||
if (dir)
|
||||
{
|
||||
_directory = dir;
|
||||
::SetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, dir);
|
||||
|
||||
wchar_t dirW[MAX_PATH];
|
||||
char2wchar(dir, dirW);
|
||||
::SetDlgItemTextW(_hSelf, IDD_FINDINFILES_DIR_COMBO, dirW);
|
||||
}
|
||||
if (filters)
|
||||
{
|
||||
_filters = filters;
|
||||
::SetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters);
|
||||
|
||||
wchar_t filtersW[MAX_PATH];
|
||||
char2wchar(filters, filtersW);
|
||||
::SetDlgItemTextW(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filtersW);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -14,10 +14,10 @@
|
|||
//You should have received a copy of the GNU General Public License
|
||||
//along with this program; if not, write to the Free Software
|
||||
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
#include "Printer.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
void replaceStr(string & str, string str2BeReplaced, string replacement)
|
||||
void replaceStr(wstring & str, wstring str2BeReplaced, wstring replacement)
|
||||
{
|
||||
size_t pos = str.find(str2BeReplaced);
|
||||
|
||||
|
@ -127,61 +127,65 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
// Convert page size to logical units and we're done!
|
||||
DPtoLP(_pdlg.hDC, &ptPage, 1);
|
||||
|
||||
TEXTMETRIC tm;
|
||||
TEXTMETRICW tm;
|
||||
|
||||
int fontSize = nppGUI._printSettings._headerFontSize?nppGUI._printSettings._headerFontSize:9;
|
||||
int fontWeight = nppGUI._printSettings._headerFontStyle & FONTSTYLE_BOLD?FW_BOLD:FW_NORMAL;
|
||||
int isFontItalic = nppGUI._printSettings._headerFontStyle & FONTSTYLE_ITALIC?TRUE:FALSE;
|
||||
const char *fontFace = (nppGUI._printSettings._headerFontName != "")?nppGUI._printSettings._headerFontName.c_str():"Arial";
|
||||
|
||||
wchar_t fontFaceW[LF_FACESIZE];
|
||||
char2wchar(fontFace, fontFaceW);
|
||||
|
||||
int headerLineHeight = ::MulDiv(fontSize, ptDpi.y, 72);
|
||||
//char toto[10];
|
||||
//::MessageBox(NULL, itoa(nppGUI._printSettings._headerFontStyle, toto, 10), "header", MB_OK);
|
||||
//::MessageBox(NULL, itoa(nppGUI._printSettings._headerFontStyle, toto, 10), L"header", MB_OK);
|
||||
|
||||
HFONT fontHeader = ::CreateFont(headerLineHeight,
|
||||
HFONT fontHeader = ::CreateFontW(headerLineHeight,
|
||||
0, 0, 0,
|
||||
fontWeight,
|
||||
isFontItalic,
|
||||
FALSE,
|
||||
0, 0, 0,
|
||||
0, 0, 0,
|
||||
fontFace);
|
||||
fontFaceW);
|
||||
|
||||
::SelectObject(_pdlg.hDC, fontHeader);
|
||||
::GetTextMetrics(_pdlg.hDC, &tm);
|
||||
::GetTextMetricsW(_pdlg.hDC, &tm);
|
||||
headerLineHeight = tm.tmHeight + tm.tmExternalLeading;
|
||||
|
||||
fontSize = nppGUI._printSettings._footerFontSize?nppGUI._printSettings._footerFontSize:9;
|
||||
fontWeight = nppGUI._printSettings._footerFontStyle & FONTSTYLE_BOLD?FW_BOLD:FW_NORMAL;
|
||||
isFontItalic = nppGUI._printSettings._footerFontStyle & FONTSTYLE_ITALIC?TRUE:FALSE;
|
||||
fontFace = (nppGUI._printSettings._footerFontName != "")?nppGUI._printSettings._footerFontName.c_str():"Arial";
|
||||
//::MessageBox(NULL, itoa(nppGUI._printSettings._footerFontStyle, , 10), "footer", MB_OK);
|
||||
//::MessageBox(NULL, itoa(nppGUI._printSettings._footerFontStyle, , 10), L"footer", MB_OK);
|
||||
char2wchar(fontFace, fontFaceW);
|
||||
|
||||
int footerLineHeight = ::MulDiv(fontSize, ptDpi.y, 72);
|
||||
HFONT fontFooter = ::CreateFont(footerLineHeight,
|
||||
HFONT fontFooter = ::CreateFontW(footerLineHeight,
|
||||
0, 0, 0,
|
||||
fontWeight,
|
||||
isFontItalic,
|
||||
FALSE,
|
||||
0, 0, 0,
|
||||
0, 0, 0,
|
||||
fontFace);
|
||||
fontFaceW);
|
||||
|
||||
::SelectObject(_pdlg.hDC, fontFooter);
|
||||
::GetTextMetrics(_pdlg.hDC, &tm);
|
||||
::GetTextMetricsW(_pdlg.hDC, &tm);
|
||||
footerLineHeight = tm.tmHeight + tm.tmExternalLeading;
|
||||
|
||||
|
||||
::GetTextMetrics(_pdlg.hDC, &tm);
|
||||
::GetTextMetricsW(_pdlg.hDC, &tm);
|
||||
int printMarge = tm.tmHeight + tm.tmExternalLeading;
|
||||
printMarge = printMarge + printMarge / 2;
|
||||
|
||||
DOCINFO docInfo;
|
||||
DOCINFOW docInfo;
|
||||
docInfo.cbSize = sizeof(DOCINFO);
|
||||
docInfo.lpszDocName = _pSEView->getCurrentBuffer()->getFilePath();
|
||||
docInfo.lpszDocName = _pSEView->getCurrentBuffer()->getFilePathW();
|
||||
docInfo.lpszOutput = NULL;
|
||||
|
||||
if (::StartDoc(_pdlg.hDC, &docInfo) < 0)
|
||||
if (::StartDocW(_pdlg.hDC, &docInfo) < 0)
|
||||
{
|
||||
MessageBox(NULL, "Can not start printer document.", 0, MB_OK);
|
||||
return 0;
|
||||
|
@ -230,34 +234,33 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
frPrint.rc.left += printMarge;
|
||||
frPrint.rc.right -= printMarge;
|
||||
|
||||
char headerL[256] = "";
|
||||
char headerM[256] = "";
|
||||
char headerR[256] = "";
|
||||
char footerL[256] = "";
|
||||
char footerM[256] = "";
|
||||
char footerR[256] = "";
|
||||
wchar_t headerL[256] = L"";
|
||||
wchar_t headerM[256] = L"";
|
||||
wchar_t headerR[256] = L"";
|
||||
wchar_t footerL[256] = L"";
|
||||
wchar_t footerM[256] = L"";
|
||||
wchar_t footerR[256] = L"";
|
||||
|
||||
const wchar_t shortDateVar[] = L"$(SHORT_DATE)";
|
||||
const wchar_t longDateVar[] = L"$(LONG_DATE)";
|
||||
const wchar_t timeVar[] = L"$(TIME)";
|
||||
|
||||
const char shortDateVar[] = "$(SHORT_DATE)";
|
||||
const char longDateVar[] = "$(LONG_DATE)";
|
||||
const char timeVar[] = "$(TIME)";
|
||||
|
||||
char shortDate[64];
|
||||
char longDate[64];
|
||||
char time[64];
|
||||
wchar_t shortDate[64];
|
||||
wchar_t longDate[64];
|
||||
wchar_t time[64];
|
||||
|
||||
SYSTEMTIME st;
|
||||
::GetLocalTime(&st);
|
||||
::GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, shortDate, sizeof(shortDate));
|
||||
::GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, longDate, sizeof(longDate));
|
||||
::GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, time, sizeof(time));
|
||||
::GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, shortDate, sizeof(shortDate));
|
||||
::GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, longDate, sizeof(longDate));
|
||||
::GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, time, sizeof(time));
|
||||
|
||||
if (nppGUI._printSettings.isHeaderPresent())
|
||||
{
|
||||
frPrint.rc.top += headerLineHeight + headerLineHeight / 2;
|
||||
|
||||
string headerLeftPart = nppGUI._printSettings._headerLeft;
|
||||
if (headerLeftPart != "")
|
||||
wstring headerLeftPart = string2wstring(nppGUI._printSettings._headerLeft);
|
||||
if (headerLeftPart != L"")
|
||||
{
|
||||
replaceStr(headerLeftPart, shortDateVar, shortDate);
|
||||
replaceStr(headerLeftPart, longDateVar, longDate);
|
||||
|
@ -265,8 +268,8 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
expandNppEnvironmentStrs(headerLeftPart.c_str(), headerL, sizeof(headerL), _pdlg.hwndOwner);
|
||||
}
|
||||
|
||||
string headerMiddlePart = nppGUI._printSettings._headerMiddle;
|
||||
if (headerMiddlePart != "")
|
||||
wstring headerMiddlePart = string2wstring(nppGUI._printSettings._headerMiddle);
|
||||
if (headerMiddlePart != L"")
|
||||
{
|
||||
replaceStr(headerMiddlePart, shortDateVar, shortDate);
|
||||
replaceStr(headerMiddlePart, longDateVar, longDate);
|
||||
|
@ -274,8 +277,8 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
expandNppEnvironmentStrs(headerMiddlePart.c_str(), headerM, sizeof(headerM), _pdlg.hwndOwner);
|
||||
}
|
||||
|
||||
string headerRightPart = nppGUI._printSettings._headerRight;
|
||||
if (headerRightPart != "")
|
||||
wstring headerRightPart = string2wstring(nppGUI._printSettings._headerRight);
|
||||
if (headerRightPart != L"")
|
||||
{
|
||||
replaceStr(headerRightPart, shortDateVar, shortDate);
|
||||
replaceStr(headerRightPart, longDateVar, longDate);
|
||||
|
@ -289,8 +292,8 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
{
|
||||
frPrint.rc.bottom -= footerLineHeight + footerLineHeight / 2;
|
||||
|
||||
string footerLeftPart = nppGUI._printSettings._footerLeft;
|
||||
if (footerLeftPart != "")
|
||||
wstring footerLeftPart = string2wstring(nppGUI._printSettings._footerLeft);
|
||||
if (footerLeftPart != L"")
|
||||
{
|
||||
replaceStr(footerLeftPart, shortDateVar, shortDate);
|
||||
replaceStr(footerLeftPart, longDateVar, longDate);
|
||||
|
@ -298,8 +301,8 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
expandNppEnvironmentStrs(footerLeftPart.c_str(), footerL, sizeof(footerL), _pdlg.hwndOwner);
|
||||
}
|
||||
|
||||
string footerMiddlePart = nppGUI._printSettings._footerMiddle;
|
||||
if (footerMiddlePart != "")
|
||||
wstring footerMiddlePart = string2wstring(nppGUI._printSettings._footerMiddle);
|
||||
if (footerMiddlePart != L"")
|
||||
{
|
||||
replaceStr(footerMiddlePart, shortDateVar, shortDate);
|
||||
replaceStr(footerMiddlePart, longDateVar, longDate);
|
||||
|
@ -307,8 +310,8 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
expandNppEnvironmentStrs(footerMiddlePart.c_str(), footerM, sizeof(footerM), _pdlg.hwndOwner);
|
||||
}
|
||||
|
||||
string footerRightPart = nppGUI._printSettings._footerRight;
|
||||
if (footerRightPart != "")
|
||||
wstring footerRightPart = string2wstring(nppGUI._printSettings._footerRight);
|
||||
if (footerRightPart != L"")
|
||||
{
|
||||
replaceStr(footerRightPart, shortDateVar, shortDate);
|
||||
replaceStr(footerRightPart, longDateVar, longDate);
|
||||
|
@ -324,7 +327,7 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
|
||||
size_t pageNum = 1;
|
||||
bool printPage;
|
||||
const char pageVar[] = "$(CURRENT_PRINTING_PAGE)";
|
||||
const wchar_t pageVar[] = L"$(CURRENT_PRINTING_PAGE)";
|
||||
|
||||
while (lengthPrinted < lengthDoc)
|
||||
{
|
||||
|
@ -334,8 +337,8 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
if (!justDoIt)
|
||||
printPage = false;
|
||||
|
||||
char pageString[32];
|
||||
sprintf(pageString, "%0d", pageNum);
|
||||
wchar_t pageString[32];
|
||||
wsprintfW(pageString, L"%0d", pageNum);
|
||||
|
||||
if (printPage)
|
||||
{
|
||||
|
@ -359,38 +362,38 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
// Left part
|
||||
if (headerL[0] != '\0')
|
||||
{
|
||||
string headerLeft(headerL);
|
||||
wstring headerLeft(headerL);
|
||||
size_t pos = headerLeft.find(pageVar);
|
||||
|
||||
if (pos != headerLeft.npos)
|
||||
headerLeft.replace(pos, strlen(pageVar), pageString);
|
||||
headerLeft.replace(pos, wcslen(pageVar), pageString);
|
||||
|
||||
::ExtTextOut(_pdlg.hDC, frPrint.rc.left + 5, frPrint.rc.top - headerLineHeight / 2,
|
||||
::ExtTextOutW(_pdlg.hDC, frPrint.rc.left + 5, frPrint.rc.top - headerLineHeight / 2,
|
||||
ETO_OPAQUE, &rcw, headerLeft.c_str(), static_cast<int>(headerLeft.length()), NULL);
|
||||
}
|
||||
|
||||
// Middle part
|
||||
if (headerM != '\0')
|
||||
{
|
||||
string headerMiddle(headerM);
|
||||
wstring headerMiddle(headerM);
|
||||
size_t pos = headerMiddle.find(pageVar);
|
||||
if (pos != headerMiddle.npos)
|
||||
headerMiddle.replace(pos, strlen(pageVar), pageString);
|
||||
headerMiddle.replace(pos, wcslen(pageVar), pageString);
|
||||
|
||||
::GetTextExtentPoint32(_pdlg.hDC, headerMiddle.c_str(), static_cast<int>(headerMiddle.length()), &size);
|
||||
::ExtTextOut(_pdlg.hDC, ((frPrint.rc.right - frPrint.rc.left)/2 + frPrint.rc.left) - (size.cx/2), frPrint.rc.top - headerLineHeight / 2,
|
||||
::GetTextExtentPoint32W(_pdlg.hDC, headerMiddle.c_str(), static_cast<int>(headerMiddle.length()), &size);
|
||||
::ExtTextOutW(_pdlg.hDC, ((frPrint.rc.right - frPrint.rc.left)/2 + frPrint.rc.left) - (size.cx/2), frPrint.rc.top - headerLineHeight / 2,
|
||||
ETO_CLIPPED, &rcw, headerMiddle.c_str(), static_cast<int>(headerMiddle.length()), NULL);
|
||||
}
|
||||
// Right part
|
||||
if (headerR != '\0')
|
||||
{
|
||||
string headerRight(headerR);
|
||||
wstring headerRight(headerR);
|
||||
size_t pos = headerRight.find(pageVar);
|
||||
if (pos != headerRight.npos)
|
||||
headerRight.replace(pos, strlen(pageVar), pageString);
|
||||
headerRight.replace(pos, wcslen(pageVar), pageString);
|
||||
|
||||
::GetTextExtentPoint32(_pdlg.hDC, headerRight.c_str(), static_cast<int>(headerRight.length()), &size);
|
||||
::ExtTextOut(_pdlg.hDC, frPrint.rc.right - size.cx, frPrint.rc.top - headerLineHeight / 2,
|
||||
::GetTextExtentPoint32W(_pdlg.hDC, headerRight.c_str(), static_cast<int>(headerRight.length()), &size);
|
||||
::ExtTextOutW(_pdlg.hDC, frPrint.rc.right - size.cx, frPrint.rc.top - headerLineHeight / 2,
|
||||
ETO_CLIPPED, &rcw, headerRight.c_str(), static_cast<int>(headerRight.length()), NULL);
|
||||
}
|
||||
|
||||
|
@ -427,36 +430,37 @@ size_t Printer::doPrint(bool justDoIt)
|
|||
// Left part
|
||||
if (footerL[0] != '\0')
|
||||
{
|
||||
string footerLeft(footerL);
|
||||
wstring footerLeft(footerL);
|
||||
size_t pos = footerLeft.find(pageVar);
|
||||
if (pos != footerLeft.npos)
|
||||
footerLeft.replace(pos, strlen(pageVar), pageString);
|
||||
footerLeft.replace(pos, wcslen(pageVar), pageString);
|
||||
|
||||
::ExtTextOut(_pdlg.hDC, frPrint.rc.left + 5, frPrint.rc.bottom + footerLineHeight / 2,
|
||||
::ExtTextOutW(_pdlg.hDC, frPrint.rc.left + 5, frPrint.rc.bottom + footerLineHeight / 2,
|
||||
ETO_OPAQUE, &rcw, footerLeft.c_str(), static_cast<int>(footerLeft.length()), NULL);
|
||||
}
|
||||
|
||||
// Middle part
|
||||
if (footerM[0] != '\0')
|
||||
{
|
||||
string footerMiddle(footerM);
|
||||
wstring footerMiddle(footerM);
|
||||
size_t pos = footerMiddle.find(pageVar);
|
||||
if (pos != footerMiddle.npos)
|
||||
footerMiddle.replace(pos, strlen(pageVar), pageString);
|
||||
footerMiddle.replace(pos, wcslen(pageVar), pageString);
|
||||
|
||||
::GetTextExtentPoint32(_pdlg.hDC, footerMiddle.c_str(), static_cast<int>(footerMiddle.length()), &size);
|
||||
::ExtTextOut(_pdlg.hDC, ((frPrint.rc.right - frPrint.rc.left)/2 + frPrint.rc.left) - (size.cx/2), frPrint.rc.bottom + footerLineHeight / 2,
|
||||
::GetTextExtentPoint32W(_pdlg.hDC, footerMiddle.c_str(), static_cast<int>(footerMiddle.length()), &size);
|
||||
::ExtTextOutW(_pdlg.hDC, ((frPrint.rc.right - frPrint.rc.left)/2 + frPrint.rc.left) - (size.cx/2), frPrint.rc.bottom + footerLineHeight / 2,
|
||||
ETO_CLIPPED, &rcw, footerMiddle.c_str(), static_cast<int>(footerMiddle.length()), NULL);
|
||||
}
|
||||
// Right part
|
||||
if (footerR[0] != '\0')
|
||||
{
|
||||
string footerRight(footerR);
|
||||
wstring footerRight(footerR);
|
||||
size_t pos = footerRight.find(pageVar);
|
||||
if (pos != footerRight.npos)
|
||||
footerRight.replace(pos, strlen(pageVar), pageString);
|
||||
::GetTextExtentPoint32(_pdlg.hDC, footerRight.c_str(), static_cast<int>(footerRight.length()), &size);
|
||||
::ExtTextOut(_pdlg.hDC, frPrint.rc.right - size.cx, frPrint.rc.bottom + footerLineHeight / 2,
|
||||
footerRight.replace(pos, wcslen(pageVar), pageString);
|
||||
|
||||
::GetTextExtentPoint32W(_pdlg.hDC, footerRight.c_str(), static_cast<int>(footerRight.length()), &size);
|
||||
::ExtTextOutW(_pdlg.hDC, frPrint.rc.right - size.cx, frPrint.rc.bottom + footerLineHeight / 2,
|
||||
ETO_CLIPPED, &rcw, footerRight.c_str(), static_cast<int>(footerRight.length()), NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ public :
|
|||
Printer(){};
|
||||
void init(HINSTANCE hInst, HWND hwnd, ScintillaEditView *pSEView, bool showDialog, int startPos, int endPos);
|
||||
size_t Printer::doPrint() {
|
||||
if (!::PrintDlg(&_pdlg))
|
||||
if (!::PrintDlgW(&_pdlg))
|
||||
return 0;
|
||||
|
||||
return doPrint(true);
|
||||
|
@ -45,7 +45,7 @@ public :
|
|||
size_t doPrint(bool justDoIt);
|
||||
|
||||
private :
|
||||
PRINTDLG _pdlg;
|
||||
PRINTDLGW _pdlg;
|
||||
ScintillaEditView *_pSEView;
|
||||
size_t _startPos;
|
||||
size_t _endPos;
|
||||
|
|
|
@ -187,6 +187,11 @@ void ScintillaEditView::init(HINSTANCE hInst, HWND hPere)
|
|||
execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_TAGMATCH, true);
|
||||
execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_TAGATTR, true);
|
||||
|
||||
// URL highlighting
|
||||
int activeFG = 0xFF0000;
|
||||
execute(SCI_SETHOTSPOTACTIVEFORE, TRUE, activeFG);
|
||||
execute(SCI_SETHOTSPOTSINGLELINE, FALSE);
|
||||
|
||||
_pParameter = NppParameters::getInstance();
|
||||
|
||||
_codepage = ::GetACP();
|
||||
|
@ -266,6 +271,47 @@ void ScintillaEditView::setSpecialIndicator(Style & styleToSet)
|
|||
execute(SCI_INDICSETFORE, styleToSet._styleID, styleToSet._bgColor);
|
||||
}
|
||||
|
||||
void ScintillaEditView::setHotspotStyle()
|
||||
{
|
||||
vector< pair<Style, int> > clickableStyles = _currentBuffer->getClickableStyles();
|
||||
//printStr("getin");
|
||||
for (size_t i = 0 ; i < clickableStyles.size() ; i++)
|
||||
{
|
||||
|
||||
int styleID = clickableStyles[i].second;
|
||||
|
||||
//if (execute(SCI_STYLEGETHOTSPOT, styleID) == FALSE)
|
||||
{
|
||||
Style styleToSet = clickableStyles[i].first;
|
||||
//char toto[512];
|
||||
//sprintf(toto, start, end);
|
||||
//writeLog("c:\npp.log", toto);
|
||||
if ( styleToSet._colorStyle & COLORSTYLE_FOREGROUND )
|
||||
execute(SCI_STYLESETFORE, styleID, styleToSet._fgColor);
|
||||
|
||||
if ( styleToSet._colorStyle & COLORSTYLE_BACKGROUND )
|
||||
execute(SCI_STYLESETBACK, styleID, styleToSet._bgColor);
|
||||
|
||||
if ((!styleToSet._fontName)||(strcmp(styleToSet._fontName, "")))
|
||||
execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)styleToSet._fontName);
|
||||
|
||||
int fontStyle = styleToSet._fontStyle;
|
||||
if (fontStyle != -1)
|
||||
{
|
||||
execute(SCI_STYLESETBOLD, (WPARAM)styleID, fontStyle & FONTSTYLE_BOLD);
|
||||
execute(SCI_STYLESETITALIC, (WPARAM)styleID, fontStyle & FONTSTYLE_ITALIC);
|
||||
execute(SCI_STYLESETUNDERLINE, (WPARAM)styleID, fontStyle & FONTSTYLE_UNDERLINE);
|
||||
}
|
||||
|
||||
if (styleToSet._fontSize > 0)
|
||||
execute(SCI_STYLESETSIZE, styleID, styleToSet._fontSize);
|
||||
|
||||
execute(SCI_STYLESETHOTSPOT, styleID, TRUE);
|
||||
execute(SCI_SETHOTSPOTACTIVEFORE, TRUE, blue);
|
||||
execute(SCI_SETHOTSPOTSINGLELINE, styleID, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ScintillaEditView::setSpecialStyle(Style & styleToSet)
|
||||
{
|
||||
|
@ -702,6 +748,7 @@ void ScintillaEditView::makeStyle(LangType language, const char **keywordArray)
|
|||
|
||||
void ScintillaEditView::defineDocType(LangType typeDoc)
|
||||
{
|
||||
//setHotspotStyle();
|
||||
//setStyle(STYLE_DEFAULT, black, white, "Verdana", 0, 9);
|
||||
StyleArray & stylers = _pParameter->getMiscStylerArray();
|
||||
int iStyleDefault = stylers.getStylerIndexByID(STYLE_DEFAULT);
|
||||
|
@ -726,7 +773,6 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
|
|||
if (iFind != -1)
|
||||
{
|
||||
Style & styleFind = stylers.getStyler(iFind);
|
||||
//setSpecialStyle(styleFind);
|
||||
setSpecialIndicator(styleFind);
|
||||
}
|
||||
|
||||
|
@ -734,7 +780,6 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
|
|||
if (iFind != -1)
|
||||
{
|
||||
Style & styleFind = stylers.getStyler(iFind);
|
||||
//setSpecialStyle(styleFind);
|
||||
setSpecialIndicator(styleFind);
|
||||
}
|
||||
|
||||
|
@ -742,7 +787,6 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
|
|||
if (iFind != -1)
|
||||
{
|
||||
Style & styleFind = stylers.getStyler(iFind);
|
||||
//setSpecialStyle(styleFind);
|
||||
setSpecialIndicator(styleFind);
|
||||
}
|
||||
|
||||
|
@ -750,7 +794,6 @@ void ScintillaEditView::defineDocType(LangType typeDoc)
|
|||
if (iFind != -1)
|
||||
{
|
||||
Style & styleFind = stylers.getStyler(iFind);
|
||||
//setSpecialStyle(styleFind);
|
||||
setSpecialIndicator(styleFind);
|
||||
}
|
||||
|
||||
|
|
|
@ -563,6 +563,7 @@ protected:
|
|||
inline void makeStyle(LangType langType, const char **keywordArray = NULL);
|
||||
void setStyle(Style styleToSet); //NOT by reference (style edited)
|
||||
void setSpecialStyle(Style & styleToSet); //by reference
|
||||
void setHotspotStyle();
|
||||
void setSpecialIndicator(Style & styleToSet);
|
||||
//Complex lexers (same lexer, different language)
|
||||
void setXmlLexer(LangType type);
|
||||
|
|
|
@ -18,7 +18,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||
*/
|
||||
|
||||
#ifndef USER_DEFINE_LANG_REFERENCE_H
|
||||
|
||||
#define USER_DEFINE_LANG_REFERENCE_H
|
||||
|
||||
const int langNameLenMax = 16;
|
||||
|
@ -32,5 +31,3 @@ const int nbPrefixListAllowed = 4;
|
|||
|
||||
|
||||
#endif //USER_DEFINE_LANG_REFERENCE_H
|
||||
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ distribution.
|
|||
|
||||
#include <ctype.h>
|
||||
#include "tinyxml.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
#ifdef TIXML_USE_STL
|
||||
#include <sstream>
|
||||
|
@ -713,7 +714,9 @@ bool TiXmlDocument::LoadFile( const char* filename )
|
|||
// Fixed with the StringToBuffer class.
|
||||
value = filename;
|
||||
|
||||
FILE* file = fopen( value.c_str (), "r" );
|
||||
wchar_t filenameW[MAX_PATH];
|
||||
char2wchar(filename, filenameW);
|
||||
FILE* file = _wfopen( filenameW, L"r" );
|
||||
|
||||
if ( file )
|
||||
{
|
||||
|
@ -758,7 +761,9 @@ bool TiXmlDocument::LoadFile( const char* filename )
|
|||
bool TiXmlDocument::SaveFile( const char * filename ) const
|
||||
{
|
||||
// The old c stuff lives on...
|
||||
FILE* fp = fopen( filename, "w" );
|
||||
wchar_t filenameW[MAX_PATH];
|
||||
char2wchar(filename, filenameW);
|
||||
FILE* fp = _wfopen( filenameW, L"w" );
|
||||
if ( fp )
|
||||
{
|
||||
Print( fp, 0 );
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
#include <vector>
|
||||
#include "UniConversion.h"
|
||||
|
||||
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen) {
|
||||
|
@ -133,3 +134,46 @@ int utf8_to_ascii(const char* pszUTF8, unsigned int lenUTF8, char* pszASCII)
|
|||
return nbByte;
|
||||
}
|
||||
|
||||
void char2wchar(const char* pszCHAR, wchar_t* pszWCHAR, UINT codepage)
|
||||
{
|
||||
int len = MultiByteToWideChar(codepage, 0, pszCHAR, -1, pszWCHAR, 0);
|
||||
if(len > 0)
|
||||
MultiByteToWideChar(codepage, 0, pszCHAR, -1, pszWCHAR, len);
|
||||
else
|
||||
pszWCHAR[0] = 0;
|
||||
}
|
||||
|
||||
void wchar2char(const wchar_t* pszWCHAR, char* pszCHAR, UINT codepage)
|
||||
{
|
||||
int len = WideCharToMultiByte(codepage, 0, pszWCHAR, -1, pszCHAR, 0, NULL, NULL);
|
||||
if(len > 0)
|
||||
WideCharToMultiByte(codepage, 0, pszWCHAR, -1, pszCHAR, len, NULL, NULL);
|
||||
else
|
||||
pszCHAR[0] = 0;
|
||||
}
|
||||
|
||||
std::wstring string2wstring(const std::string& rString, UINT codepage)
|
||||
{
|
||||
int len = MultiByteToWideChar(codepage, 0, rString.c_str(), -1, NULL, 0);
|
||||
if(len > 0)
|
||||
{
|
||||
std::vector<wchar_t> vw(len);
|
||||
MultiByteToWideChar(codepage, 0, rString.c_str(), -1, &vw[0], len);
|
||||
return &vw[0];
|
||||
}
|
||||
else
|
||||
return L"";
|
||||
}
|
||||
|
||||
std::string wstring2string(const std::wstring& rwString, UINT codepage)
|
||||
{
|
||||
int len = WideCharToMultiByte(codepage, 0, rwString.c_str(), -1, NULL, 0, NULL, NULL);
|
||||
if(len > 0)
|
||||
{
|
||||
std::vector<char> vw(len);
|
||||
WideCharToMultiByte(codepage, 0, rwString.c_str(), -1, &vw[0], len, NULL, NULL);
|
||||
return &vw[0];
|
||||
}
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
|
|
@ -5,9 +5,23 @@
|
|||
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
|
||||
// The License.txt file describes the conditions under which this software may be distributed.
|
||||
|
||||
#ifndef UNICONVERSION_H
|
||||
#define UNICONVERSION_H
|
||||
|
||||
#include <Windows.h>
|
||||
#include <TCHAR.H>
|
||||
#include <string>
|
||||
|
||||
unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen);
|
||||
void UTF8FromUCS2(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len);
|
||||
unsigned int UCS2Length(const char *s, unsigned int len);
|
||||
unsigned int UCS2FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen);
|
||||
unsigned int ascii_to_utf8(const char* pszASCII, unsigned int lenASCII, char* pszUTF8);
|
||||
int utf8_to_ascii(const char* pszUTF8, unsigned int lenUTF8, char* pszASCII);
|
||||
|
||||
void char2wchar(const char* pszCHAR, wchar_t* pszWCHAR, UINT codepage = CP_UTF8);
|
||||
void wchar2char(const wchar_t* pszWCHAR, char* pszCHAR, UINT codepage = CP_UTF8);
|
||||
std::wstring string2wstring(const std::string& rString, UINT codepage = CP_UTF8);
|
||||
std::string wstring2string(const std::wstring& rwString, UINT codepage = CP_UTF8);
|
||||
|
||||
#endif //UNICONVERSION_H
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
#include "PluginInterface.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
const Utf8_16::utf8 Utf8_16::k_Boms[][3] = {
|
||||
{0x00, 0x00, 0x00}, // Unknown
|
||||
|
@ -222,6 +223,15 @@ FILE * Utf8_16_Write::fopen(const char *_name, const char *_type)
|
|||
return m_pFile;
|
||||
}
|
||||
|
||||
FILE * Utf8_16_Write::fopenW(const wchar_t *_name, const wchar_t *_type)
|
||||
{
|
||||
m_pFile = ::_wfopen(_name, _type);
|
||||
|
||||
m_bFirstWrite = true;
|
||||
|
||||
return m_pFile;
|
||||
}
|
||||
|
||||
size_t Utf8_16_Write::fwrite(const void* p, size_t _size)
|
||||
{
|
||||
// no file open
|
||||
|
|
|
@ -18,6 +18,10 @@
|
|||
// - Removing UCS-Bug in Utf8_Iter
|
||||
// - Add convert function in Utf8_16_Write
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef UTF8_16_H
|
||||
#define UTF8_16_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -135,6 +139,7 @@ public:
|
|||
void setEncoding(UniMode eType);
|
||||
|
||||
FILE * fopen(const char *_name, const char *_type);
|
||||
FILE * fopenW(const wchar_t *_name, const wchar_t *_type);
|
||||
size_t fwrite(const void* p, size_t _size);
|
||||
void fclose();
|
||||
|
||||
|
@ -150,3 +155,5 @@ protected:
|
|||
size_t m_nBufSize;
|
||||
bool m_bFirstWrite;
|
||||
};
|
||||
|
||||
#endif //UTF8_16_H
|
||||
|
|
|
@ -62,14 +62,14 @@ BOOL CALLBACK ColourPopup::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARA
|
|||
{
|
||||
ColourPopup *pColourPopup = (ColourPopup *)(lParam);
|
||||
pColourPopup->_hSelf = hwnd;
|
||||
::SetWindowLongPtr(hwnd, GWL_USERDATA, (long)lParam);
|
||||
::SetWindowLong(hwnd, GWL_USERDATA, (long)lParam);
|
||||
pColourPopup->run_dlgProc(message, wParam, lParam);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
default :
|
||||
{
|
||||
ColourPopup *pColourPopup = reinterpret_cast<ColourPopup *>(::GetWindowLongPtr(hwnd, GWL_USERDATA));
|
||||
ColourPopup *pColourPopup = reinterpret_cast<ColourPopup *>(::GetWindowLong(hwnd, GWL_USERDATA));
|
||||
if (!pColourPopup)
|
||||
return FALSE;
|
||||
return pColourPopup->run_dlgProc(message, wParam, lParam);
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#define DOCKINGCONT
|
||||
|
||||
#include "StaticDialog.h"
|
||||
#include "Resource.h"
|
||||
#include "resource.h"
|
||||
#include "Docking.h"
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "common_func.h"
|
||||
#include <string>
|
||||
#include "UniConversion.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -52,22 +53,22 @@ void folderBrowser(HWND parent, int outputCtrlID)
|
|||
{
|
||||
// If we were able to get the shell malloc object,
|
||||
// then proceed by initializing the BROWSEINFO stuct
|
||||
BROWSEINFO info;
|
||||
BROWSEINFOW info;
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.hwndOwner = parent;
|
||||
info.pidlRoot = NULL;
|
||||
char szDisplayName[MAX_PATH];
|
||||
wchar_t szDisplayName[MAX_PATH];
|
||||
info.pszDisplayName = szDisplayName;
|
||||
string title = "Select a folder to search from";
|
||||
wstring title = L"Select a folder to search from";
|
||||
info.lpszTitle = title.c_str();
|
||||
info.ulFlags = 0;
|
||||
info.lpfn = BrowseCallbackProc;
|
||||
char directory[MAX_PATH];
|
||||
::GetDlgItemText(parent, outputCtrlID, directory, sizeof(directory));
|
||||
wchar_t directory[MAX_PATH];
|
||||
::GetDlgItemTextW(parent, outputCtrlID, directory, sizeof(directory));
|
||||
info.lParam = reinterpret_cast<LPARAM>(directory);
|
||||
|
||||
// Execute the browsing dialog.
|
||||
LPITEMIDLIST pidl = ::SHBrowseForFolder(&info);
|
||||
LPITEMIDLIST pidl = ::SHBrowseForFolderW(&info);
|
||||
|
||||
// pidl will be null if they cancel the browse dialog.
|
||||
// pidl will be not null when they select a folder.
|
||||
|
@ -75,10 +76,10 @@ void folderBrowser(HWND parent, int outputCtrlID)
|
|||
{
|
||||
// Try to convert the pidl to a display string.
|
||||
// Return is true if success.
|
||||
char szDir[MAX_PATH];
|
||||
if (::SHGetPathFromIDList(pidl, szDir))
|
||||
wchar_t szDirW[MAX_PATH];
|
||||
if (::SHGetPathFromIDListW(pidl, szDirW))
|
||||
// Set edit control to the directory path.
|
||||
::SetDlgItemText(parent, outputCtrlID, szDir);
|
||||
::SetDlgItemTextW(parent, outputCtrlID, szDirW);
|
||||
pShellMalloc->Free(pidl);
|
||||
}
|
||||
pShellMalloc->Release();
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
//Printed BABYGRID message reference and tutorial available.
|
||||
//email: mudcat@mis.net for more information.
|
||||
|
||||
|
||||
#ifndef BABYGRID_H
|
||||
#define BABYGRID_H
|
||||
#include <windows.h>
|
||||
#include "resource.h"
|
||||
|
||||
|
@ -104,6 +105,4 @@ void SetCell(_BGCELL *cell,int row, int col);
|
|||
//global variables
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif //BABYGRID_H
|
||||
|
|
|
@ -17,8 +17,8 @@ along with this program; if not, write to the Free Software
|
|||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef SHORTCUTMAPPER
|
||||
#define SHORTCUTMAPPER
|
||||
#ifndef SHORTCUTMAPPER_H
|
||||
#define SHORTCUTMAPPER_H
|
||||
|
||||
#include "BabyGridWrapper.h"
|
||||
#include "ShortcutMapper_rc.h"
|
||||
|
@ -77,4 +77,4 @@ private:
|
|||
void fillOutBabyGrid();
|
||||
};
|
||||
|
||||
#endif //SHORTCUTMAPPER
|
||||
#endif //SHORTCUTMAPPER_H
|
||||
|
|
|
@ -16,9 +16,13 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#ifndef SHORTCUTMAPPERRC_H
|
||||
#define SHORTCUTMAPPERRC_H
|
||||
|
||||
#define IDD_SHORTCUTMAPPER_DLG 2600
|
||||
#define IDD_BABYGRID_ID1 (IDD_SHORTCUTMAPPER_DLG + 1)
|
||||
#define IDM_BABYGRID_MODIFY (IDD_SHORTCUTMAPPER_DLG + 2)
|
||||
#define IDM_BABYGRID_DELETE (IDD_SHORTCUTMAPPER_DLG + 3)
|
||||
#define IDC_BABYGRID_TABBAR (IDD_SHORTCUTMAPPER_DLG + 4)
|
||||
|
||||
#endif //SHORTCUTMAPPERRC_H
|
||||
|
|
|
@ -28,22 +28,24 @@ FileDialog::FileDialog(HWND hwnd, HINSTANCE hInst)
|
|||
for (int i = 0 ; i < nbExtMax ; i++)
|
||||
_extArray[i][0] = '\0';
|
||||
|
||||
memset(_fileExt, 0x00, sizeof(_fileExt));
|
||||
memset(_fileExtW, 0x00, sizeof(_fileExtW));
|
||||
_fileName[0] = '\0';
|
||||
_fileNameW[0] = '\0';
|
||||
_fileNameW[1] = '\0';
|
||||
|
||||
_winVersion = (NppParameters::getInstance())->getWinVersion();
|
||||
|
||||
_ofn.lStructSize = sizeof(_ofn);
|
||||
if (_winVersion < WV_W2K)
|
||||
_ofn.lStructSize = sizeof(OPENFILENAME);
|
||||
_ofn.lStructSize = sizeof(OPENFILENAMEW);
|
||||
_ofn.hwndOwner = hwnd;
|
||||
_ofn.hInstance = hInst;
|
||||
_ofn.lpstrFilter = _fileExt;
|
||||
_ofn.lpstrCustomFilter = (LPTSTR) NULL;
|
||||
_ofn.lpstrFilter = _fileExtW;
|
||||
_ofn.lpstrCustomFilter = (LPWSTR) NULL;
|
||||
_ofn.nMaxCustFilter = 0L;
|
||||
_ofn.nFilterIndex = 1L;
|
||||
_ofn.lpstrFile = _fileName;
|
||||
_ofn.nMaxFile = sizeof(_fileName);
|
||||
_ofn.lpstrFile = _fileNameW;
|
||||
_ofn.nMaxFile = sizeof(_fileNameW);
|
||||
_ofn.lpstrFileTitle = NULL;
|
||||
_ofn.nMaxFileTitle = 0;
|
||||
_ofn.lpstrInitialDir = NULL;
|
||||
|
@ -101,13 +103,15 @@ void FileDialog::setExtFilter(const char *extText, const char *ext, ...)
|
|||
extFilter += " (";
|
||||
extFilter += exts + ")";
|
||||
|
||||
char *pFileExt = _fileExt + _nbCharFileExt;
|
||||
memcpy(pFileExt, extFilter.c_str(), extFilter.length() + 1);
|
||||
_nbCharFileExt += extFilter.length() + 1;
|
||||
wchar_t *pFileExt = _fileExtW + _nbCharFileExt;
|
||||
wstring extFilterW = string2wstring(extFilter);
|
||||
wmemcpy(pFileExt, extFilterW.c_str(), extFilterW.length() + 1);
|
||||
_nbCharFileExt += extFilterW.length() + 1;
|
||||
|
||||
pFileExt = _fileExt + _nbCharFileExt;
|
||||
memcpy(pFileExt, exts.c_str(), exts.length() + 1);
|
||||
_nbCharFileExt += exts.length() + 1;
|
||||
pFileExt = _fileExtW + _nbCharFileExt;
|
||||
wstring extsW = string2wstring(exts);
|
||||
wmemcpy(pFileExt, extsW.c_str(), extsW.length() + 1);
|
||||
_nbCharFileExt += extsW.length() + 1;
|
||||
}
|
||||
|
||||
int FileDialog::setExtsFilter(const char *extText, const char *exts)
|
||||
|
@ -122,63 +126,72 @@ int FileDialog::setExtsFilter(const char *extText, const char *exts)
|
|||
extFilter += exts;
|
||||
extFilter += ")";
|
||||
|
||||
char *pFileExt = _fileExt + _nbCharFileExt;
|
||||
memcpy(pFileExt, extFilter.c_str(), extFilter.length() + 1);
|
||||
_nbCharFileExt += extFilter.length() + 1;
|
||||
wchar_t *pFileExt = _fileExtW + _nbCharFileExt;
|
||||
wstring extFilterW = string2wstring(extFilter);
|
||||
wmemcpy(pFileExt, extFilterW.c_str(), extFilterW.length() + 1);
|
||||
_nbCharFileExt += extFilterW.length() + 1;
|
||||
|
||||
pFileExt = _fileExt + _nbCharFileExt;
|
||||
memcpy(pFileExt, exts, strlen(exts) + 1);
|
||||
_nbCharFileExt += strlen(exts) + 1;
|
||||
pFileExt = _fileExtW + _nbCharFileExt;
|
||||
wchar_t extsW[MAX_PATH];
|
||||
char2wchar(exts, extsW);
|
||||
wmemcpy(pFileExt, extsW, wcslen(extsW) + 1);
|
||||
_nbCharFileExt += wcslen(extsW) + 1;
|
||||
|
||||
return _nbExt;
|
||||
}
|
||||
|
||||
char * FileDialog::doOpenSingleFileDlg()
|
||||
{
|
||||
char dir[MAX_PATH];
|
||||
::GetCurrentDirectory(sizeof(dir), dir);
|
||||
WCHAR dir[MAX_PATH];
|
||||
::GetCurrentDirectoryW(sizeof(dir), dir);
|
||||
_ofn.lpstrInitialDir = dir;
|
||||
|
||||
_ofn.Flags |= OFN_FILEMUSTEXIST;
|
||||
|
||||
char *fn = NULL;
|
||||
WCHAR *fnW = NULL;
|
||||
try {
|
||||
fn = ::GetOpenFileName((OPENFILENAME*)&_ofn)?_fileName:NULL;
|
||||
fnW = ::GetOpenFileNameW((OPENFILENAMEW*)&_ofn)?_fileNameW:NULL;
|
||||
wchar2char(_fileNameW, _fileName);
|
||||
}
|
||||
catch(...) {
|
||||
::MessageBox(NULL, "GetSaveFileName crashes!!!", "", MB_OK);
|
||||
}
|
||||
return (fn);
|
||||
return fnW?(_fileName):NULL;
|
||||
}
|
||||
|
||||
stringVector * FileDialog::doOpenMultiFilesDlg()
|
||||
{
|
||||
char dir[MAX_PATH];
|
||||
::GetCurrentDirectory(sizeof(dir), dir);
|
||||
WCHAR dir[MAX_PATH];
|
||||
::GetCurrentDirectoryW(sizeof(dir), dir);
|
||||
_ofn.lpstrInitialDir = dir;
|
||||
|
||||
_ofn.Flags |= OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT;
|
||||
|
||||
if (::GetOpenFileName((OPENFILENAME*)&_ofn))
|
||||
if (::GetOpenFileNameW((OPENFILENAMEW*)&_ofn))
|
||||
{
|
||||
char fn[MAX_PATH];
|
||||
char *pFn = _fileName + strlen(_fileName) + 1;
|
||||
if (!(*pFn))
|
||||
WCHAR fnW[MAX_PATH];
|
||||
WCHAR *pFnW = _fileNameW + wcslen(_fileNameW) + 1;
|
||||
if (!(*pFnW))
|
||||
{
|
||||
wchar2char(_fileNameW, _fileName);
|
||||
_fileNames.push_back(std::string(_fileName));
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(fn, _fileName);
|
||||
if (fn[strlen(fn)-1] != '\\')
|
||||
strcat(fn, "\\");
|
||||
wcscpy(fnW, _fileNameW);
|
||||
if (fnW[wcslen(fnW)-1] != '\\')
|
||||
wcscat(fnW, L"\\");
|
||||
}
|
||||
int term = int(strlen(fn));
|
||||
int term = int(wcslen(fnW));
|
||||
|
||||
while (*pFn)
|
||||
while (*pFnW)
|
||||
{
|
||||
fn[term] = '\0';
|
||||
strcat(fn, pFn);
|
||||
fnW[term] = '\0';
|
||||
wcscat(fnW, pFnW);
|
||||
wchar2char(fnW, fn);
|
||||
_fileNames.push_back(std::string(fn));
|
||||
pFn += strlen(pFn) + 1;
|
||||
pFnW += wcslen(pFnW) + 1;
|
||||
}
|
||||
|
||||
return &_fileNames;
|
||||
|
@ -189,10 +202,10 @@ stringVector * FileDialog::doOpenMultiFilesDlg()
|
|||
|
||||
char * FileDialog::doSaveDlg()
|
||||
{
|
||||
char dir[MAX_PATH];
|
||||
::GetCurrentDirectory(sizeof(dir), dir);
|
||||
WCHAR dirW[MAX_PATH];
|
||||
::GetCurrentDirectoryW(sizeof(dirW), dirW);
|
||||
|
||||
_ofn.lpstrInitialDir = dir;
|
||||
_ofn.lpstrInitialDir = dirW;
|
||||
|
||||
_ofn.Flags |= OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_ENABLESIZING;
|
||||
|
||||
|
@ -200,13 +213,15 @@ char * FileDialog::doSaveDlg()
|
|||
_ofn.lpfnHook = OFNHookProc;
|
||||
|
||||
char *fn = NULL;
|
||||
WCHAR *fnW = NULL;
|
||||
try {
|
||||
fn = ::GetSaveFileName((OPENFILENAME*)&_ofn)?_fileName:NULL;
|
||||
fnW = ::GetSaveFileNameW((OPENFILENAMEW*)&_ofn)?_fileNameW:NULL;
|
||||
wchar2char(_fileNameW, _fileName);
|
||||
}
|
||||
catch(...) {
|
||||
::MessageBox(NULL, "GetSaveFileName crashes!!!", "", MB_OK);
|
||||
}
|
||||
return (fn);
|
||||
return fnW?(_fileName):NULL;
|
||||
}
|
||||
|
||||
static HWND hFileDlg = NULL;
|
||||
|
@ -301,7 +316,7 @@ UINT_PTR CALLBACK FileDialog::OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, L
|
|||
|
||||
default :
|
||||
{
|
||||
FileDialog *pFileDialog = reinterpret_cast<FileDialog *>(::GetWindowLongPtr(hWnd, GWL_USERDATA));
|
||||
FileDialog *pFileDialog = reinterpret_cast<FileDialog *>(::GetWindowLong(hWnd, GWL_USERDATA));
|
||||
if (!pFileDialog)
|
||||
{
|
||||
return FALSE;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <string>
|
||||
#include "SysMsg.h"
|
||||
#include "Parameters.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
const int nbExtMax = 256;
|
||||
const int extLenMax = 64;
|
||||
|
@ -40,29 +41,28 @@ struct OPENFILENAMENPP {
|
|||
DWORD lStructSize;
|
||||
HWND hwndOwner;
|
||||
HINSTANCE hInstance;
|
||||
LPCTSTR lpstrFilter;
|
||||
LPTSTR lpstrCustomFilter;
|
||||
LPCWSTR lpstrFilter;
|
||||
LPWSTR lpstrCustomFilter;
|
||||
DWORD nMaxCustFilter;
|
||||
DWORD nFilterIndex;
|
||||
LPTSTR lpstrFile;
|
||||
LPWSTR lpstrFile;
|
||||
DWORD nMaxFile;
|
||||
LPTSTR lpstrFileTitle;
|
||||
LPWSTR lpstrFileTitle;
|
||||
DWORD nMaxFileTitle;
|
||||
LPCTSTR lpstrInitialDir;
|
||||
LPCTSTR lpstrTitle;
|
||||
LPCWSTR lpstrInitialDir;
|
||||
LPCWSTR lpstrTitle;
|
||||
DWORD Flags;
|
||||
WORD nFileOffset;
|
||||
WORD nFileExtension;
|
||||
LPCTSTR lpstrDefExt;
|
||||
LPCWSTR lpstrDefExt;
|
||||
LPARAM lCustData;
|
||||
LPOFNHOOKPROC lpfnHook;
|
||||
LPCTSTR lpTemplateName;
|
||||
LPCWSTR lpTemplateName;
|
||||
void * pvReserved;
|
||||
DWORD dwReserved;
|
||||
DWORD FlagsEx;
|
||||
};
|
||||
|
||||
|
||||
static string changeExt(string fn, string ext)
|
||||
{
|
||||
if (ext == "")
|
||||
|
@ -119,7 +119,7 @@ public:
|
|||
void setExtFilter(const char *, const char *, ...);
|
||||
|
||||
int setExtsFilter(const char *extText, const char *exts);
|
||||
void setDefFileName(const char *fn){strcpy(_fileName, fn);}
|
||||
void setDefFileName(const char *fn){strcpy(_fileName, fn); char2wchar(fn, _fileNameW); }
|
||||
|
||||
char * doSaveDlg();
|
||||
stringVector * doOpenMultiFilesDlg();
|
||||
|
@ -133,8 +133,9 @@ protected :
|
|||
|
||||
private:
|
||||
char _fileName[MAX_PATH*8];
|
||||
WCHAR _fileNameW[MAX_PATH*8];
|
||||
|
||||
char _fileExt[MAX_PATH*10];
|
||||
WCHAR _fileExtW[MAX_PATH*10];
|
||||
int _nbCharFileExt;
|
||||
|
||||
stringVector _fileNames;
|
||||
|
|
|
@ -24,11 +24,11 @@
|
|||
#include "Notepad_plus.h"
|
||||
|
||||
|
||||
void Command::extractArgs(char *cmd2Exec, char *args, const char *cmdEntier)
|
||||
void Command::extractArgs(wchar_t *cmd2Exec, wchar_t *args, const wchar_t *cmdEntier)
|
||||
{
|
||||
int i = 0;
|
||||
bool quoted = false;
|
||||
for ( ; i < int(strlen(cmdEntier)) ; i++)
|
||||
for ( ; i < int(wcslen(cmdEntier)) ; i++)
|
||||
{
|
||||
if ((cmdEntier[i] == ' ') && (!quoted))
|
||||
break;
|
||||
|
@ -39,18 +39,18 @@ void Command::extractArgs(char *cmd2Exec, char *args, const char *cmdEntier)
|
|||
}
|
||||
cmd2Exec[i] = '\0';
|
||||
|
||||
if (i < int(strlen(cmdEntier)))
|
||||
if (i < int(wcslen(cmdEntier)))
|
||||
{
|
||||
for ( ; (i < int(strlen(cmdEntier))) && (cmdEntier[i] == ' ') ; i++);
|
||||
if (i < int(strlen(cmdEntier)))
|
||||
for ( ; (i < int(wcslen(cmdEntier))) && (cmdEntier[i] == ' ') ; i++);
|
||||
if (i < int(wcslen(cmdEntier)))
|
||||
{
|
||||
for (int k = 0 ; i <= int(strlen(cmdEntier)) ; i++, k++)
|
||||
for (int k = 0 ; i <= int(wcslen(cmdEntier)) ; i++, k++)
|
||||
{
|
||||
args[k] = cmdEntier[i];
|
||||
}
|
||||
}
|
||||
|
||||
int l = strlen(args);
|
||||
int l = wcslen(args);
|
||||
if (args[l-1] == ' ')
|
||||
{
|
||||
for (l -= 2 ; (l > 0) && (args[l] == ' ') ; l--);
|
||||
|
@ -63,42 +63,42 @@ void Command::extractArgs(char *cmd2Exec, char *args, const char *cmdEntier)
|
|||
}
|
||||
|
||||
|
||||
int whichVar(char *str)
|
||||
int whichVar(wchar_t *str)
|
||||
{
|
||||
if (!strcmp(fullCurrentPath, str))
|
||||
if (!wcscmp(fullCurrentPath, str))
|
||||
return FULL_CURRENT_PATH;
|
||||
else if (!strcmp(currentDirectory, str))
|
||||
else if (!wcscmp(currentDirectory, str))
|
||||
return CURRENT_DIRECTORY;
|
||||
else if (!strcmp(onlyFileName, str))
|
||||
else if (!wcscmp(onlyFileName, str))
|
||||
return FILE_NAME;
|
||||
else if (!strcmp(fileNamePart, str))
|
||||
else if (!wcscmp(fileNamePart, str))
|
||||
return NAME_PART;
|
||||
else if (!strcmp(fileExtPart, str))
|
||||
else if (!wcscmp(fileExtPart, str))
|
||||
return EXT_PART;
|
||||
else if (!strcmp(currentWord, str))
|
||||
else if (!wcscmp(currentWord, str))
|
||||
return CURRENT_WORD;
|
||||
else if (!strcmp(nppDir, str))
|
||||
else if (!wcscmp(nppDir, str))
|
||||
return NPP_DIRECTORY;
|
||||
else if (!strcmp(currentLine, str))
|
||||
else if (!wcscmp(currentLine, str))
|
||||
return CURRENT_LINE;
|
||||
else if (!strcmp(currentColumn, str))
|
||||
else if (!wcscmp(currentColumn, str))
|
||||
return CURRENT_COLUMN;
|
||||
|
||||
return VAR_NOT_RECOGNIZED;
|
||||
}
|
||||
|
||||
// Since I'm sure the length will be 256, I won't check the strlen : watch out!
|
||||
void expandNppEnvironmentStrs(const char *strSrc, char *stringDest, size_t strDestLen, HWND hWnd)
|
||||
void expandNppEnvironmentStrs(const wchar_t *strSrc, wchar_t *stringDest, size_t strDestLen, HWND hWnd)
|
||||
{
|
||||
size_t j = 0;
|
||||
for (size_t i = 0 ; i < strlen(strSrc) ; i++)
|
||||
for (size_t i = 0 ; i < wcslen(strSrc) ; i++)
|
||||
{
|
||||
int iBegin = -1;
|
||||
int iEnd = -1;
|
||||
if ((strSrc[i] == '$') && (strSrc[i+1] == '('))
|
||||
{
|
||||
iBegin = i += 2;
|
||||
for ( ; i < strlen(strSrc) ; i++)
|
||||
for ( ; i < wcslen(strSrc) ; i++)
|
||||
{
|
||||
if (strSrc[i] == ')')
|
||||
{
|
||||
|
@ -111,7 +111,7 @@ void expandNppEnvironmentStrs(const char *strSrc, char *stringDest, size_t strDe
|
|||
{
|
||||
if (iEnd != -1)
|
||||
{
|
||||
char str[256];
|
||||
wchar_t str[256];
|
||||
int m = 0;
|
||||
for (int k = iBegin ; k <= iEnd ; k++)
|
||||
str[m++] = strSrc[k];
|
||||
|
@ -125,16 +125,16 @@ void expandNppEnvironmentStrs(const char *strSrc, char *stringDest, size_t strDe
|
|||
}
|
||||
else
|
||||
{
|
||||
char expandedStr[256];
|
||||
wchar_t expandedStr[256];
|
||||
if (internalVar == CURRENT_LINE || internalVar == CURRENT_COLUMN)
|
||||
{
|
||||
int lineNumber = ::SendMessage(hWnd, RUNCOMMAND_USER + internalVar, 0, 0);
|
||||
sprintf(expandedStr, "%d", lineNumber);
|
||||
wsprintfW(expandedStr, L"%d", lineNumber);
|
||||
}
|
||||
else
|
||||
::SendMessage(hWnd, RUNCOMMAND_USER + internalVar, MAX_PATH, (LPARAM)expandedStr);
|
||||
|
||||
for (size_t p = 0 ; p < strlen(expandedStr) ; p++)
|
||||
for (size_t p = 0 ; p < wcslen(expandedStr) ; p++)
|
||||
stringDest[j++] = expandedStr[p];
|
||||
}
|
||||
}
|
||||
|
@ -152,20 +152,26 @@ void expandNppEnvironmentStrs(const char *strSrc, char *stringDest, size_t strDe
|
|||
|
||||
HINSTANCE Command::run(HWND hWnd)
|
||||
{
|
||||
char cmdPure[MAX_PATH];
|
||||
char cmdIntermediate[MAX_PATH];
|
||||
char cmd2Exec[MAX_PATH];
|
||||
char args[MAX_PATH];
|
||||
char argsIntermediate[MAX_PATH];
|
||||
char args2Exec[MAX_PATH];
|
||||
wchar_t cmdPure[MAX_PATH];
|
||||
wchar_t cmdIntermediate[MAX_PATH];
|
||||
wchar_t cmd2Exec[MAX_PATH];
|
||||
wchar_t args[MAX_PATH];
|
||||
wchar_t argsIntermediate[MAX_PATH];
|
||||
wchar_t args2Exec[MAX_PATH];
|
||||
|
||||
extractArgs(cmdPure, args, _cmdLine.c_str());
|
||||
::ExpandEnvironmentStrings(cmdPure, cmdIntermediate, sizeof(cmd2Exec));
|
||||
::ExpandEnvironmentStrings(args, argsIntermediate, sizeof(args));
|
||||
wstring cmdLineW = string2wstring(_cmdLine);
|
||||
extractArgs(cmdPure, args, cmdLineW.c_str());
|
||||
::ExpandEnvironmentStringsW(cmdPure, cmdIntermediate, sizeof(cmd2Exec));
|
||||
::ExpandEnvironmentStringsW(args, argsIntermediate, sizeof(args));
|
||||
expandNppEnvironmentStrs(cmdIntermediate, cmd2Exec, sizeof(cmd2Exec), hWnd);
|
||||
expandNppEnvironmentStrs(argsIntermediate, args2Exec, sizeof(args2Exec), hWnd);
|
||||
|
||||
return ::ShellExecute(hWnd, "open", cmd2Exec, args2Exec, ".", SW_SHOW);
|
||||
// cmd2Exec needs to be in UTF8 format for searches to work.
|
||||
char temp[MAX_PATH];
|
||||
wchar2char(cmd2Exec, temp);
|
||||
char2wchar(temp, cmd2Exec);
|
||||
|
||||
return ::ShellExecuteW(hWnd, L"open", cmd2Exec, args2Exec, L".", SW_SHOW);
|
||||
}
|
||||
|
||||
BOOL CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
@ -190,18 +196,21 @@ BOOL CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|||
case IDOK :
|
||||
{
|
||||
char cmd[MAX_PATH];
|
||||
::GetDlgItemText(_hSelf, IDC_COMBO_RUN_PATH, cmd, MAX_PATH);
|
||||
wchar_t cmdW[MAX_PATH];
|
||||
::GetDlgItemTextW(_hSelf, IDC_COMBO_RUN_PATH, cmdW, MAX_PATH);
|
||||
wchar2char(cmdW, cmd);
|
||||
_cmdLine = cmd;
|
||||
wstring cmdLineW = string2wstring(_cmdLine);
|
||||
|
||||
HINSTANCE hInst = run(_hParent);
|
||||
if (int(hInst) > 32)
|
||||
{
|
||||
addTextToCombo(_cmdLine.c_str());
|
||||
addTextToCombo(cmdLineW.c_str());
|
||||
display(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
removeTextFromCombo(_cmdLine.c_str());
|
||||
removeTextFromCombo(cmdLineW.c_str());
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -213,7 +222,9 @@ BOOL CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|||
|
||||
int cmdID = ID_USER_CMD + nbCmd;
|
||||
char cmd[MAX_PATH];
|
||||
::GetDlgItemText(_hSelf, IDC_COMBO_RUN_PATH, cmd, MAX_PATH);
|
||||
wchar_t cmdW[MAX_PATH];
|
||||
::GetDlgItemTextW(_hSelf, IDC_COMBO_RUN_PATH, cmdW, MAX_PATH);
|
||||
wchar2char(cmdW, cmd);
|
||||
UserCommand uc(Shortcut(), cmd, cmdID);
|
||||
uc.init(_hInst, _hSelf);
|
||||
|
||||
|
@ -238,7 +249,11 @@ BOOL CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|||
fd.setExtFilter("All files : ", ".*", NULL);
|
||||
|
||||
if (const char *fn = fd.doOpenSingleFileDlg())
|
||||
addTextToCombo(fn);
|
||||
{
|
||||
wchar_t fnW[MAX_PATH];
|
||||
char2wchar(fn, fnW);
|
||||
addTextToCombo(fnW);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -250,18 +265,18 @@ BOOL CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
void RunDlg::addTextToCombo(const char *txt2Add) const
|
||||
void RunDlg::addTextToCombo(const wchar_t *txt2Add) const
|
||||
{
|
||||
HWND handle = ::GetDlgItem(_hSelf, IDC_COMBO_RUN_PATH);
|
||||
int i = ::SendMessage(handle, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)txt2Add);
|
||||
int i = ::SendMessageW(handle, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)txt2Add);
|
||||
if (i == CB_ERR)
|
||||
i = ::SendMessage(handle, CB_ADDSTRING, 0, (LPARAM)txt2Add);
|
||||
i = ::SendMessageW(handle, CB_ADDSTRING, 0, (LPARAM)txt2Add);
|
||||
::SendMessage(handle, CB_SETCURSEL, i, 0);
|
||||
}
|
||||
void RunDlg::removeTextFromCombo(const char *txt2Remove) const
|
||||
void RunDlg::removeTextFromCombo(const wchar_t *txt2Remove) const
|
||||
{
|
||||
HWND handle = ::GetDlgItem(_hSelf, IDC_COMBO_RUN_PATH);
|
||||
int i = ::SendMessage(handle, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)txt2Remove);
|
||||
int i = ::SendMessageW(handle, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)txt2Remove);
|
||||
if (i == CB_ERR)
|
||||
return;
|
||||
::SendMessage(handle, CB_DELETESTRING, i, 0);
|
||||
|
|
|
@ -26,18 +26,18 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
const char fullCurrentPath[] = "FULL_CURRENT_PATH";
|
||||
const char currentDirectory[] = "CURRENT_DIRECTORY";
|
||||
const char onlyFileName[] = "FILE_NAME";
|
||||
const char fileNamePart[] = "NAME_PART";
|
||||
const char fileExtPart[] = "EXT_PART";
|
||||
const char currentWord[] = "CURRENT_WORD";
|
||||
const char nppDir[] = "NPP_DIRECTORY";
|
||||
const char currentLine[] = "CURRENT_LINE";
|
||||
const char currentColumn[] = "CURRENT_COLUMN";
|
||||
const wchar_t fullCurrentPath[] = L"FULL_CURRENT_PATH";
|
||||
const wchar_t currentDirectory[] = L"CURRENT_DIRECTORY";
|
||||
const wchar_t onlyFileName[] = L"FILE_NAME";
|
||||
const wchar_t fileNamePart[] = L"NAME_PART";
|
||||
const wchar_t fileExtPart[] = L"EXT_PART";
|
||||
const wchar_t currentWord[] = L"CURRENT_WORD";
|
||||
const wchar_t nppDir[] = L"NPP_DIRECTORY";
|
||||
const wchar_t currentLine[] = L"CURRENT_LINE";
|
||||
const wchar_t currentColumn[] = L"CURRENT_COLUMN";
|
||||
|
||||
int whichVar(char *str);
|
||||
void expandNppEnvironmentStrs(const char *strSrc, char *stringDest, size_t strDestLen, HWND hWnd);
|
||||
int whichVar(wchar_t *str);
|
||||
void expandNppEnvironmentStrs(const wchar_t *strSrc, wchar_t *stringDest, size_t strDestLen, HWND hWnd);
|
||||
|
||||
class Command {
|
||||
public :
|
||||
|
@ -49,7 +49,7 @@ public :
|
|||
protected :
|
||||
string _cmdLine;
|
||||
private :
|
||||
void extractArgs(char *cmd2Exec, char *args, const char *cmdEntier);
|
||||
void extractArgs(wchar_t *cmd2Exec, wchar_t *args, const wchar_t *cmdEntier);
|
||||
};
|
||||
|
||||
class RunDlg : public Command, public StaticDialog
|
||||
|
@ -67,8 +67,8 @@ protected :
|
|||
virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
private :
|
||||
void addTextToCombo(const char *txt2Add) const;
|
||||
void removeTextFromCombo(const char *txt2Remove) const;
|
||||
void addTextToCombo(const wchar_t *txt2Add) const;
|
||||
void removeTextFromCombo(const wchar_t *txt2Remove) const;
|
||||
};
|
||||
|
||||
#endif //RUN_DLG_H
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#ifndef STATUS_BAR_H
|
||||
#define STATUS_BAR_H
|
||||
|
||||
#include "Window.h"
|
||||
|
||||
#ifndef _WIN32_IE
|
||||
|
|
|
@ -474,13 +474,13 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct)
|
|||
}
|
||||
bool isSelected = (nTab == ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0));
|
||||
|
||||
char label[MAX_PATH];
|
||||
TCITEM tci;
|
||||
wchar_t label[MAX_PATH];
|
||||
TCITEMW tci;
|
||||
tci.mask = TCIF_TEXT|TCIF_IMAGE;
|
||||
tci.pszText = label;
|
||||
tci.cchTextMax = MAX_PATH-1;
|
||||
|
||||
if (!::SendMessage(_hSelf, TCM_GETITEM, nTab, reinterpret_cast<LPARAM>(&tci)))
|
||||
if (!::SendMessage(_hSelf, TCM_GETITEMW, nTab, reinterpret_cast<LPARAM>(&tci)))
|
||||
{
|
||||
::MessageBox(NULL, "! TCM_GETITEM", "", MB_OK);
|
||||
//return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam);
|
||||
|
@ -693,7 +693,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct)
|
|||
else
|
||||
Flags |= DT_BOTTOM;
|
||||
}
|
||||
::DrawText(hDC, label, strlen(label), &rect, Flags);
|
||||
::DrawTextW(hDC, label, wcslen(label), &rect, Flags);
|
||||
::RestoreDC(hDC, nSavedDC);
|
||||
}
|
||||
|
||||
|
@ -736,37 +736,37 @@ void TabBarPlus::exchangeItemData(POINT point)
|
|||
::SendMessage(_hSelf, TCM_SETCURSEL, nTab, 0);
|
||||
|
||||
//2. shift their data, and insert the source
|
||||
TCITEM itemData_nDraggedTab, itemData_shift;
|
||||
TCITEMW itemData_nDraggedTab, itemData_shift;
|
||||
itemData_nDraggedTab.mask = itemData_shift.mask = TCIF_IMAGE | TCIF_TEXT | TCIF_PARAM;
|
||||
char str1[256];
|
||||
char str2[256];
|
||||
wchar_t str1[MAX_PATH];
|
||||
wchar_t str2[MAX_PATH];
|
||||
|
||||
itemData_nDraggedTab.pszText = str1;
|
||||
itemData_nDraggedTab.cchTextMax = (sizeof(str1));
|
||||
itemData_nDraggedTab.cchTextMax = (MAX_PATH-1);
|
||||
|
||||
itemData_shift.pszText = str2;
|
||||
itemData_shift.cchTextMax = (sizeof(str2));
|
||||
itemData_shift.cchTextMax = (MAX_PATH-1);
|
||||
|
||||
::SendMessage(_hSelf, TCM_GETITEM, _nTabDragged, reinterpret_cast<LPARAM>(&itemData_nDraggedTab));
|
||||
::SendMessage(_hSelf, TCM_GETITEMW, _nTabDragged, reinterpret_cast<LPARAM>(&itemData_nDraggedTab));
|
||||
|
||||
if (_nTabDragged > nTab)
|
||||
{
|
||||
for (int i = _nTabDragged ; i > nTab ; i--)
|
||||
{
|
||||
::SendMessage(_hSelf, TCM_GETITEM, i-1, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
::SendMessage(_hSelf, TCM_SETITEM, i, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
::SendMessage(_hSelf, TCM_GETITEMW, i-1, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
::SendMessage(_hSelf, TCM_SETITEMW, i, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = _nTabDragged ; i < nTab ; i++)
|
||||
{
|
||||
::SendMessage(_hSelf, TCM_GETITEM, i+1, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
::SendMessage(_hSelf, TCM_SETITEM, i, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
::SendMessage(_hSelf, TCM_GETITEMW, i+1, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
::SendMessage(_hSelf, TCM_SETITEMW, i, reinterpret_cast<LPARAM>(&itemData_shift));
|
||||
}
|
||||
}
|
||||
//
|
||||
::SendMessage(_hSelf, TCM_SETITEM, nTab, reinterpret_cast<LPARAM>(&itemData_nDraggedTab));
|
||||
::SendMessage(_hSelf, TCM_SETITEMW, nTab, reinterpret_cast<LPARAM>(&itemData_nDraggedTab));
|
||||
|
||||
//3. update the current index
|
||||
_nTabDragged = nTab;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
#ifndef SIZABLEDLG_H
|
||||
#define SIZABLEDLG_H
|
||||
|
||||
#include "StaticDialog.h"
|
||||
#include "WindowsDlgRc.h"
|
||||
|
@ -18,3 +19,5 @@ protected:
|
|||
virtual void onGetMinMaxInfo(MINMAXINFO* lpMMI);
|
||||
virtual LRESULT onWinMgr(WPARAM wp, LPARAM lp);
|
||||
};
|
||||
|
||||
#endif //SIZABLEDLG_H
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#include "UniConversion.h"
|
||||
|
||||
#ifndef _countof
|
||||
#define _countof(x) (sizeof(x)/sizeof((x)[0]))
|
||||
|
@ -14,7 +15,7 @@
|
|||
#define LVS_EX_DOUBLEBUFFER 0x00010000
|
||||
#endif
|
||||
|
||||
static const char *readonlyString = " [Read Only]";
|
||||
static const wchar_t *readonlyString = L" [Read Only]";
|
||||
const UINT WDN_NOTIFY = RegisterWindowMessage("WDN_NOTIFY");
|
||||
|
||||
inline static DWORD GetStyle(HWND hWnd) {
|
||||
|
@ -230,9 +231,9 @@ BOOL CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam
|
|||
if (wParam == IDC_WINDOWS_LIST)
|
||||
{
|
||||
NMHDR* pNMHDR = (NMHDR*)lParam;
|
||||
if (pNMHDR->code == LVN_GETDISPINFO)
|
||||
if (pNMHDR->code == LVN_GETDISPINFOW)
|
||||
{
|
||||
NMLVDISPINFO *pLvdi = (NMLVDISPINFO *)pNMHDR;
|
||||
NMLVDISPINFOW *pLvdi = (NMLVDISPINFOW *)pNMHDR;
|
||||
//if(pLvdi->item.mask & LVIF_IMAGE)
|
||||
// ;
|
||||
if(pLvdi->item.mask & LVIF_TEXT)
|
||||
|
@ -249,10 +250,10 @@ BOOL CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam
|
|||
if (pLvdi->item.iSubItem == 0) // file name
|
||||
{
|
||||
int len = pLvdi->item.cchTextMax;
|
||||
const char *fileName = buf->getFileName();
|
||||
strncpy(pLvdi->item.pszText, fileName, len-1);
|
||||
const wchar_t *fileName = buf->getFileNameW();
|
||||
wcsncpy(pLvdi->item.pszText, fileName, len-1);
|
||||
pLvdi->item.pszText[len-1] = 0;
|
||||
len = strlen(pLvdi->item.pszText);
|
||||
len = wcslen(pLvdi->item.pszText);
|
||||
if (buf->isDirty())
|
||||
{
|
||||
if (len < pLvdi->item.cchTextMax)
|
||||
|
@ -263,23 +264,23 @@ BOOL CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam
|
|||
}
|
||||
else if (buf->isReadOnly())
|
||||
{
|
||||
len += strlen(readonlyString);
|
||||
len += wcslen(readonlyString);
|
||||
if (len <= pLvdi->item.cchTextMax)
|
||||
strcat(pLvdi->item.pszText, readonlyString);
|
||||
wcscat(pLvdi->item.pszText, readonlyString);
|
||||
}
|
||||
}
|
||||
else if (pLvdi->item.iSubItem == 1) // directory
|
||||
{
|
||||
const char *fullName = buf->getFilePath();
|
||||
const char *fileName = buf->getFileName();
|
||||
int len = strlen(fullName)-strlen(fileName);
|
||||
const wchar_t *fullName = buf->getFilePathW();
|
||||
const wchar_t *fileName = buf->getFileNameW();
|
||||
int len = wcslen(fullName)-wcslen(fileName);
|
||||
if (!len) {
|
||||
len = 1;
|
||||
fullName = "";
|
||||
fullName = L"";
|
||||
}
|
||||
if (pLvdi->item.cchTextMax < len)
|
||||
len = pLvdi->item.cchTextMax;
|
||||
strncpy(pLvdi->item.pszText, fullName, len-1);
|
||||
wcsncpy(pLvdi->item.pszText, fullName, len-1);
|
||||
pLvdi->item.pszText[len-1] = 0;
|
||||
}
|
||||
else if (pLvdi->item.iSubItem == 2) // Type
|
||||
|
@ -289,7 +290,9 @@ BOOL CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam
|
|||
Lang *lang = pNppParameters->getLangFromID(buf->getLangType());
|
||||
if (NULL != lang)
|
||||
{
|
||||
strncpy(pLvdi->item.pszText, lang->getLangName(), len-1);
|
||||
wchar_t langName[LANG_NAME_LEN];
|
||||
char2wchar(lang->getLangName(), langName);
|
||||
wcsncpy(pLvdi->item.pszText, langName, len-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -381,7 +384,7 @@ void WindowsDlg::updateButtonState()
|
|||
int WindowsDlg::doDialog(TiXmlNode *dlgNode)
|
||||
{
|
||||
_dlgNode = dlgNode;
|
||||
return ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_WINDOWS), _hParent, (DLGPROC)dlgProc, (LPARAM)this);
|
||||
return ::DialogBoxParamW(_hInst, MAKEINTRESOURCEW(IDD_WINDOWS), _hParent, (DLGPROC)dlgProc, (LPARAM)this);
|
||||
};
|
||||
|
||||
bool WindowsDlg::changeDlgLang()
|
||||
|
@ -435,22 +438,22 @@ BOOL WindowsDlg::onInitDialog()
|
|||
GetClientRect(_hList, &rc);
|
||||
LONG width = rc.right - rc.left;
|
||||
|
||||
LVCOLUMN lvColumn;
|
||||
LVCOLUMNW lvColumn;
|
||||
memset(&lvColumn, 0, sizeof(lvColumn));
|
||||
lvColumn.mask = LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM|LVCF_FMT;
|
||||
lvColumn.fmt = LVCFMT_LEFT;
|
||||
lvColumn.pszText = "Name";
|
||||
lvColumn.pszText = L"Name";
|
||||
lvColumn.cx = width/4;
|
||||
SendMessage(_hList, LVM_INSERTCOLUMN, 0, LPARAM(&lvColumn));
|
||||
SendMessage(_hList, LVM_INSERTCOLUMNW, 0, LPARAM(&lvColumn));
|
||||
|
||||
lvColumn.pszText = "Path";
|
||||
lvColumn.pszText = L"Path";
|
||||
lvColumn.cx = 300;
|
||||
SendMessage(_hList, LVM_INSERTCOLUMN, 1, LPARAM(&lvColumn));
|
||||
SendMessage(_hList, LVM_INSERTCOLUMNW, 1, LPARAM(&lvColumn));
|
||||
|
||||
lvColumn.fmt = LVCFMT_CENTER;
|
||||
lvColumn.pszText = "Type";
|
||||
lvColumn.pszText = L"Type";
|
||||
lvColumn.cx = 40;
|
||||
SendMessage(_hList, LVM_INSERTCOLUMN, 2, LPARAM(&lvColumn));
|
||||
SendMessage(_hList, LVM_INSERTCOLUMNW, 2, LPARAM(&lvColumn));
|
||||
|
||||
fitColumnsToSize();
|
||||
|
||||
|
@ -749,15 +752,15 @@ void WindowsMenu::initPopupMenu(HMENU hMenu, DocTabView *pTab)
|
|||
int id, pos;
|
||||
for (id=IDM_WINDOW_MRU_FIRST, pos=0; id<IDM_WINDOW_MRU_FIRST + nDoc; ++id, ++pos)
|
||||
{
|
||||
char buffer[MAX_PATH];
|
||||
wchar_t buffer[MAX_PATH];
|
||||
BufferID bufID = pTab->getBufferByIndex(pos);
|
||||
Buffer * buf = MainFileManager->getBufferByID(bufID);
|
||||
|
||||
MENUITEMINFO mii;
|
||||
MENUITEMINFOW mii;
|
||||
memset(&mii, 0, sizeof(mii));
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_STRING|MIIM_STATE|MIIM_ID;
|
||||
mii.dwTypeData = buildFileName(buffer, 60, pos, buf->getFileName());
|
||||
mii.dwTypeData = buildFileName(buffer, 60, pos, buf->getFileNameW());
|
||||
mii.fState &= ~(MF_GRAYED|MF_DISABLED|MF_CHECKED);
|
||||
if (pos == curDoc)
|
||||
mii.fState |= MF_CHECKED;
|
||||
|
@ -765,9 +768,9 @@ void WindowsMenu::initPopupMenu(HMENU hMenu, DocTabView *pTab)
|
|||
|
||||
UINT state = GetMenuState(hMenu, id, MF_BYCOMMAND);
|
||||
if (state == -1)
|
||||
InsertMenuItem(hMenu, IDM_WINDOW_WINDOWS, FALSE, &mii);
|
||||
InsertMenuItemW(hMenu, IDM_WINDOW_WINDOWS, FALSE, &mii);
|
||||
else
|
||||
SetMenuItemInfo(hMenu, id, FALSE, &mii);
|
||||
SetMenuItemInfoW(hMenu, id, FALSE, &mii);
|
||||
}
|
||||
for ( ; id<=IDM_WINDOW_MRU_LIMIT; ++id)
|
||||
{
|
||||
|
@ -784,10 +787,10 @@ void WindowsMenu::uninitPopupMenu(HMENU hMenu, ScintillaEditView *pView)
|
|||
}
|
||||
}
|
||||
*/
|
||||
static char* convertFileName(char *buffer, const char *filename)
|
||||
static wchar_t* convertFileName(wchar_t *buffer, const wchar_t *filename)
|
||||
{
|
||||
char *b = buffer;
|
||||
const char *p = filename;
|
||||
wchar_t *b = buffer;
|
||||
const wchar_t *p = filename;
|
||||
while (*p)
|
||||
{
|
||||
if (*p == '&') *b++ = '&';
|
||||
|
@ -797,15 +800,15 @@ static char* convertFileName(char *buffer, const char *filename)
|
|||
return buffer;
|
||||
}
|
||||
|
||||
char *WindowsMenu::buildFileName(char *buffer, int len, int pos, const char *filename)
|
||||
wchar_t *WindowsMenu::buildFileName(wchar_t *buffer, int len, int pos, const wchar_t *filename)
|
||||
{
|
||||
char cwd[MAX_PATH];
|
||||
wchar_t cwd[MAX_PATH];
|
||||
buffer[0] = 0;
|
||||
GetCurrentDirectory(_countof(cwd), cwd);
|
||||
strcat(cwd, "\\");
|
||||
GetCurrentDirectoryW(_countof(cwd), cwd);
|
||||
wcscat(cwd, L"\\");
|
||||
|
||||
char *itr = buffer;
|
||||
char *end = buffer + len - 1;
|
||||
wchar_t *itr = buffer;
|
||||
wchar_t *end = buffer + len - 1;
|
||||
if (pos < 9)
|
||||
{
|
||||
*itr++ = '&';
|
||||
|
@ -819,33 +822,33 @@ char *WindowsMenu::buildFileName(char *buffer, int len, int pos, const char *fil
|
|||
}
|
||||
else
|
||||
{
|
||||
itr = itoa(pos+1, itr, 10) + strlen(itr);
|
||||
itr = _itow(pos+1, itr, 10) + wcslen(itr);
|
||||
}
|
||||
*itr++ = ':';
|
||||
*itr++ = ' ';
|
||||
if (0 == strnicmp(filename, cwd, strlen(cwd)))
|
||||
if (0 == wcsnicmp(filename, cwd, wcslen(cwd)))
|
||||
{
|
||||
char cnvName[MAX_PATH];
|
||||
const char *s1 = PathFindFileName(filename);
|
||||
int len = strlen(s1);
|
||||
wchar_t cnvName[MAX_PATH];
|
||||
const wchar_t *s1 = PathFindFileNameW(filename);
|
||||
int len = wcslen(s1);
|
||||
if (len < (end-itr))
|
||||
{
|
||||
strcpy(cnvName, s1);
|
||||
wcscpy(cnvName, s1);
|
||||
}
|
||||
else
|
||||
{
|
||||
int n = (len-3-(itr-buffer))/2;
|
||||
strncpy(cnvName, s1, n);
|
||||
strcpy(cnvName+n, "...");
|
||||
strcat(cnvName, s1 + strlen(s1) - n);
|
||||
wcsncpy(cnvName, s1, n);
|
||||
wcscpy(cnvName+n, L"...");
|
||||
wcscat(cnvName, s1 + wcslen(s1) - n);
|
||||
}
|
||||
convertFileName(itr, cnvName);
|
||||
}
|
||||
else
|
||||
{
|
||||
char cnvName[MAX_PATH*2];
|
||||
const char *s1 = convertFileName(cnvName, filename);
|
||||
PathCompactPathEx(itr, filename, len - (itr-buffer), 0);
|
||||
wchar_t cnvName[MAX_PATH*2];
|
||||
const wchar_t *s1 = convertFileName(cnvName, filename);
|
||||
PathCompactPathExW(itr, filename, len - (itr-buffer), 0);
|
||||
}
|
||||
return buffer;
|
||||
}
|
|
@ -106,7 +106,7 @@ public:
|
|||
void initPopupMenu(HMENU hMenu, DocTabView *pTab);
|
||||
//void uninitPopupMenu(HMENU hMenu, ScintillaEditView *pView);
|
||||
private:
|
||||
char *buildFileName(char *buffer, int len, int pos, const char *filename);
|
||||
wchar_t *buildFileName(wchar_t *buffer, int len, int pos, const wchar_t *filename);
|
||||
HMENU _hMenu;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,3 +1,23 @@
|
|||
//this file is part of notepad++
|
||||
//Copyright (C)2003 Don HO <donho@altern.org>
|
||||
//
|
||||
//This program is free software; you can redistribute it and/or
|
||||
//modify it under the terms of the GNU General Public License
|
||||
//as published by the Free Software Foundation; either
|
||||
//version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
//This program is distributed in the hope that it will be useful,
|
||||
//but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
//GNU General Public License for more details.
|
||||
//
|
||||
//You should have received a copy of the GNU General Public License
|
||||
//along with this program; if not, write to the Free Software
|
||||
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
#ifndef WINDOWSDLG_RC_H
|
||||
#define WINDOWSDLG_RC_H
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define _WIN32_IE 0x0600
|
||||
|
||||
|
@ -17,3 +37,5 @@
|
|||
#define IDM_WINDOW_WINDOWS (IDR_WINDOWS_MENU + 1)
|
||||
#define IDM_WINDOW_MRU_FIRST (IDR_WINDOWS_MENU + 20)
|
||||
#define IDM_WINDOW_MRU_LIMIT (IDR_WINDOWS_MENU + 29)
|
||||
|
||||
#endif //WINDOWSDLG_RC_H
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "lastRecentFileList.h"
|
||||
#include "menuCmdID.h"
|
||||
#include "UniConversion.h"
|
||||
|
||||
|
||||
void LastRecentFileList::initMenu(HMENU hMenu, int idBase, int posBase) {
|
||||
|
@ -65,7 +66,8 @@ void LastRecentFileList::updateMenu() {
|
|||
menuString += indexBuffer;
|
||||
menuString += " ";
|
||||
menuString += _lrfl.at(j)._name;
|
||||
::InsertMenu(_hMenu, _posBase + j, MF_BYPOSITION, _lrfl.at(j)._id, menuString.c_str());
|
||||
std::wstring menuStringW = string2wstring(menuString);
|
||||
::InsertMenuW(_hMenu, _posBase + j, MF_BYPOSITION, _lrfl.at(j)._id, menuStringW.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,19 +22,19 @@
|
|||
#include <exception> //default C++ exception
|
||||
#include "Win32Exception.h" //Win32 exception
|
||||
|
||||
typedef std::vector<const char*> ParamVector;
|
||||
typedef std::vector<const wchar_t*> ParamVector;
|
||||
|
||||
bool checkSingleFile(const char * commandLine) {
|
||||
char fullpath[MAX_PATH];
|
||||
::GetFullPathName(commandLine, MAX_PATH, fullpath, NULL);
|
||||
if (::PathFileExists(fullpath)) {
|
||||
bool checkSingleFile(const wchar_t * commandLine) {
|
||||
wchar_t fullpath[MAX_PATH];
|
||||
::GetFullPathNameW(commandLine, MAX_PATH, fullpath, NULL);
|
||||
if (::PathFileExistsW(fullpath)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void parseCommandLine(char * commandLine, ParamVector & paramVector) {
|
||||
void parseCommandLine(wchar_t * commandLine, ParamVector & paramVector) {
|
||||
bool isFile = checkSingleFile(commandLine); //if the commandline specifies only a file, open it as such
|
||||
if (isFile) {
|
||||
paramVector.push_back(commandLine);
|
||||
|
@ -43,7 +43,7 @@ void parseCommandLine(char * commandLine, ParamVector & paramVector) {
|
|||
bool isInFile = false;
|
||||
bool isInWhiteSpace = true;
|
||||
paramVector.clear();
|
||||
size_t commandLength = strlen(commandLine);
|
||||
size_t commandLength = wcslen(commandLine);
|
||||
for(size_t i = 0; i < commandLength; i++) {
|
||||
switch(commandLine[i]) {
|
||||
case '\"': { //quoted filename, ignore any following whitespace
|
||||
|
@ -72,12 +72,12 @@ void parseCommandLine(char * commandLine, ParamVector & paramVector) {
|
|||
//the commandline string is now a list of zero terminated strings concatenated, and the vector contains all the substrings
|
||||
}
|
||||
|
||||
bool isInList(const char *token2Find, ParamVector & params) {
|
||||
bool isInList(const wchar_t *token2Find, ParamVector & params) {
|
||||
int nrItems = params.size();
|
||||
|
||||
for (int i = 0; i < nrItems; i++)
|
||||
{
|
||||
if (!strcmp(token2Find, params.at(i))) {
|
||||
if (!wcscmp(token2Find, params.at(i))) {
|
||||
params.erase(params.begin() + i);
|
||||
return true;
|
||||
}
|
||||
|
@ -85,14 +85,14 @@ bool isInList(const char *token2Find, ParamVector & params) {
|
|||
return false;
|
||||
};
|
||||
|
||||
bool getParamVal(char c, ParamVector & params, string & value) {
|
||||
value = "";
|
||||
bool getParamVal(wchar_t c, ParamVector & params, wstring & value) {
|
||||
value = L"";
|
||||
int nrItems = params.size();
|
||||
|
||||
for (int i = 0; i < nrItems; i++)
|
||||
{
|
||||
const char * token = params.at(i);
|
||||
if (token[0] == '-' && strlen(token) >= 2 && token[1] == c) { //dash, and enough chars
|
||||
const wchar_t * token = params.at(i);
|
||||
if (token[0] == '-' && wcslen(token) >= 2 && token[1] == c) { //dash, and enough chars
|
||||
value = (token+2);
|
||||
params.erase(params.begin() + i);
|
||||
return true;
|
||||
|
@ -102,28 +102,30 @@ bool getParamVal(char c, ParamVector & params, string & value) {
|
|||
}
|
||||
|
||||
LangType getLangTypeFromParam(ParamVector & params) {
|
||||
string langStr;
|
||||
wstring langStr;
|
||||
if (!getParamVal('l', params, langStr))
|
||||
return L_EXTERNAL;
|
||||
return NppParameters::getLangIDFromStr(langStr.c_str());
|
||||
char lang[MAX_PATH];
|
||||
wchar2char(langStr.c_str(), lang);
|
||||
return NppParameters::getLangIDFromStr(lang);
|
||||
};
|
||||
|
||||
int getLn2GoFromParam(ParamVector & params) {
|
||||
string lineNumStr;
|
||||
wstring lineNumStr;
|
||||
if (!getParamVal('n', params, lineNumStr))
|
||||
return -1;
|
||||
return atoi(lineNumStr.c_str());
|
||||
return _wtoi(lineNumStr.c_str());
|
||||
};
|
||||
|
||||
const char FLAG_MULTI_INSTANCE[] = "-multiInst";
|
||||
const char FLAG_NO_PLUGIN[] = "-noPlugin";
|
||||
const char FLAG_READONLY[] = "-ro";
|
||||
const char FLAG_NOSESSION[] = "-nosession";
|
||||
const char FLAG_NOTABBAR[] = "-notabbar";
|
||||
const wchar_t FLAG_MULTI_INSTANCE[] = L"-multiInst";
|
||||
const wchar_t FLAG_NO_PLUGIN[] = L"-noPlugin";
|
||||
const wchar_t FLAG_READONLY[] = L"-ro";
|
||||
const wchar_t FLAG_NOSESSION[] = L"-nosession";
|
||||
const wchar_t FLAG_NOTABBAR[] = L"-notabbar";
|
||||
|
||||
void doException(Notepad_plus & notepad_plus_plus);
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdShow)
|
||||
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR lpszCmdLine, int nCmdShow)
|
||||
{
|
||||
bool TheFirstOne = true;
|
||||
::SetLastError(NO_ERROR);
|
||||
|
@ -152,24 +154,24 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdSh
|
|||
cmdLineParams._isNoSession = true;
|
||||
}
|
||||
|
||||
string quotFileName = "";
|
||||
wstring quotFileName = L"";
|
||||
// tell the running instance the FULL path to the new files to load
|
||||
size_t nrFilesToOpen = params.size();
|
||||
const char * currentFile;
|
||||
char fullFileName[MAX_PATH];
|
||||
const wchar_t * currentFile;
|
||||
wchar_t fullFileName[MAX_PATH];
|
||||
//TODO: try merging the flenames and see if it exists, user may have typed a single spaced filename without quotes
|
||||
for(size_t i = 0; i < nrFilesToOpen; i++) {
|
||||
currentFile = params.at(i);
|
||||
//check if relative or full path. Relative paths dont have a colon for driveletter
|
||||
BOOL isRelative = ::PathIsRelative(currentFile);
|
||||
quotFileName += "\"";
|
||||
BOOL isRelative = ::PathIsRelativeW(currentFile);
|
||||
quotFileName += L"\"";
|
||||
if (isRelative) {
|
||||
::GetFullPathName(currentFile, MAX_PATH, fullFileName, NULL);
|
||||
::GetFullPathNameW(currentFile, MAX_PATH, fullFileName, NULL);
|
||||
quotFileName += fullFileName;
|
||||
} else {
|
||||
quotFileName += currentFile;
|
||||
}
|
||||
quotFileName += "\" ";
|
||||
quotFileName += L"\" ";
|
||||
}
|
||||
if ((!isMultiInst) && (!TheFirstOne))
|
||||
{
|
||||
|
@ -206,10 +208,10 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdSh
|
|||
COPYDATASTRUCT fileNamesData;
|
||||
fileNamesData.dwData = COPYDATA_FILENAMES;
|
||||
fileNamesData.lpData = (void *)quotFileName.c_str();
|
||||
fileNamesData.cbData = long(quotFileName.length() + 1);
|
||||
fileNamesData.cbData = long((quotFileName.length() + 1) * sizeof(wchar_t));
|
||||
|
||||
::SendMessage(hNotepad_plus, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)¶mData);
|
||||
::SendMessage(hNotepad_plus, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)&fileNamesData);
|
||||
::SendMessageW(hNotepad_plus, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)¶mData);
|
||||
::SendMessageW(hNotepad_plus, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)&fileNamesData);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,9 @@
|
|||
//along with this program; if not, write to the Free Software
|
||||
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
#ifndef XPMICONS_H
|
||||
#define XPMICONS_H
|
||||
|
||||
static char * acTop_xpm[] = {
|
||||
"12 12 56 1",
|
||||
" c #FFFFFF",
|
||||
|
@ -238,3 +241,5 @@ static char * bookmark_xpm[] = {
|
|||
" r*@s(tut(s@*r ",
|
||||
" v*w{x&x{w*v ",
|
||||
" l*yyy*l "};
|
||||
|
||||
#endif //XPMICONS_H
|
||||
|
|
|
@ -6,6 +6,6 @@
|
|||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="__STDC_WANT_SECURE_LIB__=0;_CRT_NONSTDC_NO_DEPRECATE"
|
||||
PreprocessorDefinitions="__STDC_WANT_SECURE_LIB__=0;_CRT_NONSTDC_NO_DEPRECATE;_CRT_NON_CONFORMING_SWPRINTFS=1"
|
||||
/>
|
||||
</VisualStudioPropertySheet>
|
||||
|
|
|
@ -157,7 +157,8 @@
|
|||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="comctl32.lib shlwapi.lib shell32.lib Oleacc.lib"
|
||||
AdditionalOptions="/nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib"
|
||||
AdditionalDependencies="UnicoWS.lib comctl32.lib shlwapi.lib shell32.lib Oleacc.lib"
|
||||
ShowProgress="2"
|
||||
OutputFile="$(OutDir)/notepad++.exe"
|
||||
Version="1.0"
|
||||
|
@ -409,6 +410,10 @@
|
|||
RelativePath="..\src\WinControls\AboutDlg\URLCtrl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\ScitillaComponent\UrlHighlighter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\ScitillaComponent\UserDefineDialog.cpp"
|
||||
>
|
||||
|
@ -614,10 +619,6 @@
|
|||
RelativePath="..\src\resource.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\WinControls\Preference\resource.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\WinControls\StaticDialog\RunDlg\RunDlg.h"
|
||||
>
|
||||
|
@ -718,6 +719,10 @@
|
|||
RelativePath="..\src\WinControls\AboutDlg\URLCtrl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\ScitillaComponent\UrlHighlighter.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\ScitillaComponent\UserDefineDialog.h"
|
||||
>
|
||||
|
|
Loading…
Reference in New Issue