Enhance 'Open File' command - open file without selecting whole path.

Closes #2878
This commit is contained in:
Dan Gibson 2017-02-07 22:11:11 +11:00 committed by Don Ho
parent 389524d230
commit 7ad86ad688
3 changed files with 65 additions and 1 deletions

View File

@ -427,6 +427,7 @@ enum winVer{ WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, W
#define NPPM_GETEXTPART (RUNCOMMAND_USER + EXT_PART)
#define NPPM_GETCURRENTWORD (RUNCOMMAND_USER + CURRENT_WORD)
#define NPPM_GETNPPDIRECTORY (RUNCOMMAND_USER + NPP_DIRECTORY)
#define NPPM_GETFILENAMEATCURSOR (RUNCOMMAND_USER + GETFILENAMEATCURSOR)
// BOOL NPPM_GETXXXXXXXXXXXXXXXX(size_t strLen, TCHAR *str)
// where str is the allocated TCHAR array,
// strLen is the allocated array size
@ -453,6 +454,7 @@ enum winVer{ WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, W
#define CURRENT_LINE 8
#define CURRENT_COLUMN 9
#define NPP_FULL_FILE_PATH 10
#define GETFILENAMEATCURSOR 11
// Notification code

View File

@ -123,6 +123,16 @@ LRESULT Notepad_plus_Window::runProc(HWND hwnd, UINT message, WPARAM wParam, LPA
return FALSE;
}
// Used by NPPM_GETFILENAMEATCURSOR
int CharacterIs(TCHAR c, TCHAR *any)
{
int i;
for (i = 0; any[i] != 0; i++)
{
if (any[i] == c) return TRUE;
}
return FALSE;
}
LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
@ -699,6 +709,58 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
return TRUE;
}
case NPPM_GETFILENAMEATCURSOR: // wParam = buffer length, lParam = (TCHAR*)buffer
{
const int strSize = CURRENTWORD_MAXLENGTH;
TCHAR str[strSize];
TCHAR strLine[strSize];
size_t lineNumber;
int col;
int i;
int hasSlash;
TCHAR *pTchar = reinterpret_cast<TCHAR *>(lParam);
_pEditView->getGenericSelectedText(str, strSize); // this is either the selected text, or the word under the cursor if there is no selection
hasSlash = FALSE;
for (i = 0; str[i] != 0; i++) if (CharacterIs(str[i], TEXT("\\/"))) hasSlash = TRUE;
if (hasSlash == FALSE)
{
// it's not a full file name so try to find the beginning and ending of it
int start;
int end;
TCHAR *delimiters;
lineNumber = _pEditView->getCurrentLineNumber();
col = _pEditView->getCurrentColumnNumber();
_pEditView->getLine(lineNumber, strLine, strSize);
// find the start
start = col;
delimiters = TEXT(" \t[(\"<>");
while ((start > 0) && (CharacterIs(strLine[start], delimiters) == FALSE)) start--;
if (CharacterIs(strLine[start], delimiters)) start++;
// find the end
end = col;
delimiters = TEXT(" \t:()[]<>\"\r\n");
while ((strLine[end] != 0) && (CharacterIs(strLine[end], delimiters) == FALSE)) end++;
lstrcpyn(str, &strLine[start], end - start + 1);
}
if (lstrlen(str) >= int(wParam)) //buffer too small
{
::MessageBox(hwnd, TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETFILENAMEATCURSOR error"), MB_OK);
return FALSE;
}
else //buffer large enough, perform safe copy
{
lstrcpyn(pTchar, str, static_cast<int32_t>(wParam));
return TRUE;
}
}
case NPPM_GETNPPFULLFILEPATH:
case NPPM_GETNPPDIRECTORY:
{

View File

@ -379,7 +379,7 @@ void Notepad_plus::command(int id)
HWND hwnd = _pPublicInterface->getHSelf();
TCHAR curentWord[CURRENTWORD_MAXLENGTH];
::SendMessage(hwnd, NPPM_GETCURRENTWORD, CURRENTWORD_MAXLENGTH, reinterpret_cast<LPARAM>(curentWord));
::SendMessage(hwnd, NPPM_GETFILENAMEATCURSOR, CURRENTWORD_MAXLENGTH, reinterpret_cast<LPARAM>(curentWord));
TCHAR cmd2Exec[CURRENTWORD_MAXLENGTH];
if (id == IDM_EDIT_OPENINFOLDER)