//this file is part of notepad++ //Copyright (C)2010 Don HO // //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. #include "precompiledHeaders.h" #include "Notepad_plus_Window.h" #include "TaskListDlg.h" #include "ImageListSet.h" #include "ShortcutMapper.h" struct SortTaskListPred { DocTabView *_views[2]; SortTaskListPred(DocTabView &p, DocTabView &s) { _views[MAIN_VIEW] = &p; _views[SUB_VIEW] = &s; } bool operator()(const TaskLstFnStatus &l, const TaskLstFnStatus &r) const { BufferID lID = _views[l._iView]->getBufferByIndex(l._docIndex); BufferID rID = _views[r._iView]->getBufferByIndex(r._docIndex); Buffer * bufL = MainFileManager->getBufferByID(lID); Buffer * bufR = MainFileManager->getBufferByID(rID); return bufL->getRecentTag() > bufR->getRecentTag(); } }; LRESULT CALLBACK Notepad_plus_Window::Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_NCCREATE : // First message we get the ptr of instantiated object // then stock it into GWL_USERDATA index in order to retrieve afterward { Notepad_plus_Window *pM30ide = (Notepad_plus_Window *)(((LPCREATESTRUCT)lParam)->lpCreateParams); pM30ide->_hSelf = hwnd; ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pM30ide); return TRUE; } default : { return ((Notepad_plus_Window *)::GetWindowLongPtr(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); } } } LRESULT Notepad_plus_Window::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { LRESULT result = FALSE; switch (Message) { case WM_CREATE: { _notepad_plus_plus_core._pPublicInterface = this; result = _notepad_plus_plus_core.init(hwnd); } break; default: if (this) return _notepad_plus_plus_core.process(hwnd, Message, wParam, lParam); } return result; } LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { LRESULT result = FALSE; NppParameters *pNppParam = NppParameters::getInstance(); switch (Message) { case WM_NCACTIVATE: { // Note: lParam is -1 to prevent endless loops of calls ::SendMessage(_dockingManager.getHSelf(), WM_NCACTIVATE, wParam, (LPARAM)-1); return ::DefWindowProc(hwnd, Message, wParam, lParam); } case WM_DRAWITEM : { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; if (dis->CtlType == ODT_TAB) { return ::SendMessage(dis->hwndItem, WM_DRAWITEM, wParam, lParam); } } case WM_DOCK_USERDEFINE_DLG: { dockUserDlg(); return TRUE; } case WM_UNDOCK_USERDEFINE_DLG: { undockUserDlg(); return TRUE; } case WM_REMOVE_USERLANG: { TCHAR *userLangName = (TCHAR *)lParam; if (!userLangName || !userLangName[0]) return FALSE; generic_string name(userLangName); //loop through buffers and reset the language (L_USER, TEXT("")) if (L_USER, name) Buffer * buf; for(int i = 0; i < MainFileManager->getNrBuffers(); i++) { buf = MainFileManager->getBufferByIndex(i); if (buf->getLangType() == L_USER && name == buf->getUserDefineLangName()) buf->setLangType(L_USER, TEXT("")); } return TRUE; } case WM_RENAME_USERLANG: { if (!lParam || !(((TCHAR *)lParam)[0]) || !wParam || !(((TCHAR *)wParam)[0])) return FALSE; generic_string oldName((TCHAR *)lParam); generic_string newName((TCHAR *)wParam); //loop through buffers and reset the language (L_USER, newName) if (L_USER, oldName) Buffer * buf; for(int i = 0; i < MainFileManager->getNrBuffers(); i++) { buf = MainFileManager->getBufferByIndex(i); if (buf->getLangType() == L_USER && oldName == buf->getUserDefineLangName()) buf->setLangType(L_USER, newName.c_str()); } return TRUE; } case WM_CLOSE_USERDEFINE_DLG : { checkMenuItem(IDM_VIEW_USER_DLG, false); _toolBar.setCheck(IDM_VIEW_USER_DLG, false); return TRUE; } case WM_REPLACEALL_INOPENEDDOC : { replaceAllFiles(); return TRUE; } case WM_FINDALL_INOPENEDDOC : { findInOpenedFiles(); return TRUE; } case WM_FINDALL_INCURRENTDOC : { findInCurrentFile(); return TRUE; } case WM_FINDINFILES : { return findInFiles(); } case WM_REPLACEINFILES : { replaceInFiles(); return TRUE; } case NPPM_LAUNCHFINDINFILESDLG : { const int strSize = FINDREPLACE_MAXLENGTH; TCHAR str[strSize]; bool isFirstTime = !_findReplaceDlg.isCreated(); _findReplaceDlg.doDialog(FIND_DLG, _nativeLangSpeaker.isRTL()); _pEditView->getGenericSelectedText(str, strSize); _findReplaceDlg.setSearchText(str); if (isFirstTime) _nativeLangSpeaker.changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); _findReplaceDlg.launchFindInFilesDlg(); setFindReplaceFolderFilter((const TCHAR*) wParam, (const TCHAR*) lParam); return TRUE; } case NPPM_DOOPEN: case WM_DOOPEN: { BufferID id = doOpen((const TCHAR *)lParam); if (id != BUFFER_INVALID) { return switchToFile(id); } } break; case NPPM_INTERNAL_SETFILENAME: { if (!lParam && !wParam) return FALSE; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); if (b && b->getStatus() == DOC_UNNAMED) { b->setFileName((const TCHAR*)lParam); return TRUE; } return FALSE; } break; case NPPM_GETBUFFERLANGTYPE: { if (!wParam) return -1; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); return b->getLangType(); } break; case NPPM_SETBUFFERLANGTYPE: { if (!wParam) return FALSE; if (lParam < L_TEXT || lParam >= L_EXTERNAL || lParam == L_USER) return FALSE; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); b->setLangType((LangType)lParam); return TRUE; } break; case NPPM_GETBUFFERENCODING: { if (!wParam) return -1; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); return b->getUnicodeMode(); } break; case NPPM_SETBUFFERENCODING: { if (!wParam) return FALSE; if (lParam < uni8Bit || lParam >= uniEnd) return FALSE; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); if (b->getStatus() != DOC_UNNAMED || b->isDirty()) //do not allow to change the encoding if the file has any content return FALSE; b->setUnicodeMode((UniMode)lParam); return TRUE; } break; case NPPM_GETBUFFERFORMAT: { if (!wParam) return -1; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); return b->getFormat(); } break; case NPPM_SETBUFFERFORMAT: { if (!wParam) return FALSE; if (lParam < WIN_FORMAT || lParam >= UNIX_FORMAT) return FALSE; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); b->setFormat((formatType)lParam); return TRUE; } break; case NPPM_GETBUFFERIDFROMPOS: { DocTabView * pView = NULL; if (lParam == MAIN_VIEW) { pView = &_mainDocTab; } else if (lParam == SUB_VIEW) { pView = &_subDocTab; } else { return (LRESULT)BUFFER_INVALID; } if ((int)wParam < pView->nbItem()) { return (LRESULT)(pView->getBufferByIndex((int)wParam)); } return (LRESULT)BUFFER_INVALID; } break; case NPPM_GETCURRENTBUFFERID: { return (LRESULT)(_pEditView->getCurrentBufferID()); } break; case NPPM_RELOADBUFFERID: { if (!wParam) return FALSE; return doReload((BufferID)wParam, lParam != 0); } break; case NPPM_RELOADFILE: { BufferID id = MainFileManager->getBufferFromName((const TCHAR *)lParam); if (id != BUFFER_INVALID) doReload(id, wParam != 0); } break; case NPPM_SWITCHTOFILE : { BufferID id = MainFileManager->getBufferFromName((const TCHAR *)lParam); if (id != BUFFER_INVALID) return switchToFile(id); return false; } case NPPM_SAVECURRENTFILE: { return fileSave(); } break; case NPPM_SAVECURRENTFILEAS: { BufferID currentBufferID = _pEditView->getCurrentBufferID(); bool asCopy = wParam == TRUE; const TCHAR *filename = (const TCHAR *)lParam; if (!filename) return FALSE; return doSave(currentBufferID, filename, asCopy); } break; case NPPM_SAVEALLFILES: { return fileSaveAll(); } break; case NPPM_GETCURRENTNATIVELANGENCODING: { return _nativeLangSpeaker.getLangEncoding(); } break; case NPPM_INTERNAL_DOCORDERCHANGED : { BufferID id = _pEditView->getCurrentBufferID(); // Notify plugins that current file is about to be closed SCNotification scnN; scnN.nmhdr.code = NPPN_DOCORDERCHANGED; scnN.nmhdr.hwndFrom = (void *)lParam; scnN.nmhdr.idFrom = (uptr_t)id; _pluginsManager.notify(&scnN); return TRUE; } break; case WM_SIZE: { RECT rc; _pPublicInterface->getClientRect(rc); if (lParam == 0) { lParam = MAKELPARAM(rc.right - rc.left, rc.bottom - rc.top); } ::MoveWindow(_rebarTop.getHSelf(), 0, 0, rc.right, _rebarTop.getHeight(), TRUE); _statusBar.adjustParts(rc.right); ::SendMessage(_statusBar.getHSelf(), WM_SIZE, wParam, lParam); int rebarBottomHeight = _rebarBottom.getHeight(); int statusBarHeight = _statusBar.getHeight(); ::MoveWindow(_rebarBottom.getHSelf(), 0, rc.bottom - rebarBottomHeight - statusBarHeight, rc.right, rebarBottomHeight, TRUE); getMainClientRect(rc); _dockingManager.reSizeTo(rc); result = TRUE; } break; case WM_MOVE: { result = TRUE; } break; case WM_MOVING: { result = FALSE; } break; case WM_SIZING: { result = FALSE; } break; case WM_COPYDATA : { COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam; switch (pCopyData->dwData) { case COPYDATA_PARAMS : { CmdLineParams *cmdLineParam = (CmdLineParams *)pCopyData->lpData; pNppParam->setCmdlineParam(*cmdLineParam); _rememberThisSession = !cmdLineParam->_isNoSession; break; } case COPYDATA_FILENAMESA : { char *fileNamesA = (char *)pCopyData->lpData; CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams(); #ifdef UNICODE WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); const wchar_t *fileNamesW = wmc->char2wchar(fileNamesA, CP_ACP); loadCommandlineParams(fileNamesW, &cmdLineParams); #else loadCommandlineParams(fileNamesA, &cmdLineParams); #endif break; } case COPYDATA_FILENAMESW : { wchar_t *fileNamesW = (wchar_t *)pCopyData->lpData; CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams(); #ifdef UNICODE loadCommandlineParams(fileNamesW, &cmdLineParams); #else WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); const char *fileNamesA = wmc->wchar2char(fileNamesW, CP_ACP); loadCommandlineParams(fileNamesA, &cmdLineParams); #endif break; } } return TRUE; } case WM_COMMAND: if (HIWORD(wParam) == SCEN_SETFOCUS) { HWND hMain = _mainEditView.getHSelf(), hSec = _subEditView.getHSelf(); HWND hFocus = (HWND)lParam; if (hMain == hFocus) switchEditViewTo(MAIN_VIEW); else if (hSec == hFocus) switchEditViewTo(SUB_VIEW); else { //Other Scintilla, ignore } return TRUE; } else { if ((lParam == 1) || (lParam == 2)) { specialCmd(LOWORD(wParam)); } else command(LOWORD(wParam)); } return TRUE; case NPPM_INTERNAL_RELOADNATIVELANG: { reloadLang(); } return TRUE; case NPPM_INTERNAL_RELOADSTYLERS: { loadStyles(); } return TRUE; case NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED: { SCNotification scnN; scnN.nmhdr.code = NPPN_SHORTCUTREMAPPED; scnN.nmhdr.hwndFrom = (void *)lParam; // ShortcutKey structure scnN.nmhdr.idFrom = (uptr_t)wParam; // cmdID _pluginsManager.notify(&scnN); } return TRUE; case NPPM_GETSHORTCUTBYCMDID: { int cmdID = wParam; // cmdID ShortcutKey *sk = (ShortcutKey *)lParam; // ShortcutKey structure return _pluginsManager.getShortcutByCmdID(cmdID, sk); } case NPPM_MENUCOMMAND : command(lParam); return TRUE; case NPPM_GETFULLCURRENTPATH : case NPPM_GETCURRENTDIRECTORY : case NPPM_GETFILENAME : case NPPM_GETNAMEPART : case NPPM_GETEXTPART : { TCHAR str[MAX_PATH]; // par defaut : NPPM_GETCURRENTDIRECTORY TCHAR *fileStr = lstrcpy(str, _pEditView->getCurrentBuffer()->getFullPathName()); if (Message == NPPM_GETCURRENTDIRECTORY) PathRemoveFileSpec(str); else if (Message == NPPM_GETFILENAME) fileStr = PathFindFileName(str); else if (Message == NPPM_GETNAMEPART) { fileStr = PathFindFileName(str); PathRemoveExtension(fileStr); } else if (Message == NPPM_GETEXTPART) fileStr = PathFindExtension(str); // For the compability reason, if wParam is 0, then we assume the size of generic_string buffer (lParam) is large enough. // otherwise we check if the generic_string buffer size is enough for the generic_string to copy. if (wParam != 0) { if (lstrlen(fileStr) >= int(wParam)) { ::MessageBox(_pPublicInterface->getHSelf(), TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM error"), MB_OK); return FALSE; } } lstrcpy((TCHAR *)lParam, fileStr); return TRUE; } case NPPM_GETCURRENTWORD : { const int strSize = CURRENTWORD_MAXLENGTH; TCHAR str[strSize]; _pEditView->getGenericSelectedText((TCHAR *)str, strSize); // For the compability reason, if wParam is 0, then we assume the size of generic_string buffer (lParam) is large enough. // otherwise we check if the generic_string buffer size is enough for the generic_string to copy. if (wParam != 0) { if (lstrlen(str) >= int(wParam)) //buffer too small { ::MessageBox(_pPublicInterface->getHSelf(), TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETCURRENTWORD error"), MB_OK); return FALSE; } else //buffer large enough, perform safe copy { lstrcpyn((TCHAR *)lParam, str, wParam); return TRUE; } } lstrcpy((TCHAR *)lParam, str); return TRUE; } case NPPM_GETNPPDIRECTORY : { const int strSize = MAX_PATH; TCHAR str[strSize]; ::GetModuleFileName(NULL, str, strSize); PathRemoveFileSpec(str); // For the compability reason, if wParam is 0, then we assume the size of generic_string buffer (lParam) is large enough. // otherwise we check if the generic_string buffer size is enough for the generic_string to copy. if (wParam != 0) { if (lstrlen(str) >= int(wParam)) { ::MessageBox(_pPublicInterface->getHSelf(), TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETNPPDIRECTORY error"), MB_OK); return FALSE; } } lstrcpy((TCHAR *)lParam, str); return TRUE; } case NPPM_GETCURRENTLINE : { return _pEditView->getCurrentLineNumber(); } case NPPM_GETCURRENTCOLUMN : { return _pEditView->getCurrentColumnNumber(); } case NPPM_GETCURRENTSCINTILLA : { if (_pEditView == &_mainEditView) *((int *)lParam) = MAIN_VIEW; else if (_pEditView == &_subEditView) *((int *)lParam) = SUB_VIEW; else *((int *)lParam) = -1; return TRUE; } case NPPM_GETCURRENTLANGTYPE : { *((LangType *)lParam) = _pEditView->getCurrentBuffer()->getLangType(); return TRUE; } case NPPM_SETCURRENTLANGTYPE : { _pEditView->getCurrentBuffer()->setLangType((LangType)lParam); return TRUE; } case NPPM_GETNBOPENFILES : { int nbDocPrimary = _mainDocTab.nbItem(); int nbDocSecond = _subDocTab.nbItem(); if (lParam == ALL_OPEN_FILES) return nbDocPrimary + nbDocSecond; else if (lParam == PRIMARY_VIEW) return nbDocPrimary; else if (lParam == SECOND_VIEW) return nbDocSecond; } case NPPM_GETOPENFILENAMESPRIMARY : case NPPM_GETOPENFILENAMESSECOND : case NPPM_GETOPENFILENAMES : { if (!wParam) return 0; TCHAR **fileNames = (TCHAR **)wParam; int nbFileNames = lParam; int j = 0; if (Message != NPPM_GETOPENFILENAMESSECOND) { for (int i = 0 ; i < _mainDocTab.nbItem() && j < nbFileNames ; i++) { BufferID id = _mainDocTab.getBufferByIndex(i); Buffer * buf = MainFileManager->getBufferByID(id); lstrcpy(fileNames[j++], buf->getFullPathName()); } } if (Message != NPPM_GETOPENFILENAMESPRIMARY) { for (int i = 0 ; i < _subDocTab.nbItem() && j < nbFileNames ; i++) { BufferID id = _subDocTab.getBufferByIndex(i); Buffer * buf = MainFileManager->getBufferByID(id); lstrcpy(fileNames[j++], buf->getFullPathName()); } } return j; } case WM_GETTASKLISTINFO : { if (!wParam) return 0; TaskListInfo * tli = (TaskListInfo *)wParam; getTaskListInfo(tli); if (NppParameters::getInstance()->getNppGUI()._styleMRU) { tli->_currentIndex = 0; std::sort(tli->_tlfsLst.begin(),tli->_tlfsLst.end(),SortTaskListPred(_mainDocTab,_subDocTab)); } else { for(int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx) { if(tli->_tlfsLst[idx]._iView == currentView() && tli->_tlfsLst[idx]._docIndex == _pDocTab->getCurrentTabIndex()) { tli->_currentIndex = idx; break; } } } return TRUE; } case WM_MOUSEWHEEL : { if (LOWORD(wParam) & MK_RBUTTON) { // redirect to the IDC_PREV_DOC or IDC_NEXT_DOC so that we have the unified process pNppParam->_isTaskListRBUTTONUP_Active = true; short zDelta = (short) HIWORD(wParam); return ::SendMessage(_pPublicInterface->getHSelf(), WM_COMMAND, zDelta>0?IDC_PREV_DOC:IDC_NEXT_DOC, 0); } return TRUE; } case WM_APPCOMMAND : { switch(GET_APPCOMMAND_LPARAM(lParam)) { case APPCOMMAND_BROWSER_BACKWARD : case APPCOMMAND_BROWSER_FORWARD : int nbDoc = viewVisible(MAIN_VIEW)?_mainDocTab.nbItem():0; nbDoc += viewVisible(SUB_VIEW)?_subDocTab.nbItem():0; if (nbDoc > 1) activateNextDoc((GET_APPCOMMAND_LPARAM(lParam) == APPCOMMAND_BROWSER_FORWARD)?dirDown:dirUp); _linkTriggered = true; } return ::DefWindowProc(hwnd, Message, wParam, lParam); } case NPPM_GETNBSESSIONFILES : { const TCHAR *sessionFileName = (const TCHAR *)lParam; if ((!sessionFileName) || (sessionFileName[0] == '\0')) return 0; Session session2Load; if (pNppParam->loadSession(session2Load, sessionFileName)) { return session2Load.nbMainFiles() + session2Load.nbSubFiles(); } return 0; } case NPPM_GETSESSIONFILES : { const TCHAR *sessionFileName = (const TCHAR *)lParam; TCHAR **sessionFileArray = (TCHAR **)wParam; if ((!sessionFileName) || (sessionFileName[0] == '\0')) return FALSE; Session session2Load; if (pNppParam->loadSession(session2Load, sessionFileName)) { size_t i = 0; for ( ; i < session2Load.nbMainFiles() ; ) { const TCHAR *pFn = session2Load._mainViewFiles[i]._fileName.c_str(); lstrcpy(sessionFileArray[i++], pFn); } for (size_t j = 0 ; j < session2Load.nbSubFiles() ; j++) { const TCHAR *pFn = session2Load._subViewFiles[j]._fileName.c_str(); lstrcpy(sessionFileArray[i++], pFn); } return TRUE; } return FALSE; } case NPPM_DECODESCI: { // convert to ASCII Utf8_16_Write UnicodeConvertor; UINT length = 0; char* buffer = NULL; ScintillaEditView *pSci; if (wParam == MAIN_VIEW) pSci = &_mainEditView; else if (wParam == SUB_VIEW) pSci = &_subEditView; else return -1; // get text of current scintilla length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1; buffer = new char[length]; pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); // convert here UniMode unicodeMode = pSci->getCurrentBuffer()->getUnicodeMode(); UnicodeConvertor.setEncoding(unicodeMode); length = UnicodeConvertor.convert(buffer, length-1); // set text in target pSci->execute(SCI_CLEARALL); pSci->addText(length, UnicodeConvertor.getNewBuf()); pSci->execute(SCI_EMPTYUNDOBUFFER); pSci->execute(SCI_SETCODEPAGE); // set cursor position pSci->execute(SCI_GOTOPOS); // clean buffer delete [] buffer; return unicodeMode; } case NPPM_ENCODESCI: { // convert Utf8_16_Read UnicodeConvertor; UINT length = 0; char* buffer = NULL; ScintillaEditView *pSci; if (wParam == MAIN_VIEW) pSci = &_mainEditView; else if (wParam == SUB_VIEW) pSci = &_subEditView; else return -1; // get text of current scintilla length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1; buffer = new char[length]; pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); length = UnicodeConvertor.convert(buffer, length-1); // set text in target pSci->execute(SCI_CLEARALL); pSci->addText(length, UnicodeConvertor.getNewBuf()); pSci->execute(SCI_EMPTYUNDOBUFFER); // set cursor position pSci->execute(SCI_GOTOPOS); // clean buffer delete [] buffer; // set new encoding if BOM was changed by other programms UniMode um = UnicodeConvertor.getEncoding(); (pSci->getCurrentBuffer())->setUnicodeMode(um); (pSci->getCurrentBuffer())->setDirty(true); return um; } case NPPM_ACTIVATEDOC : case NPPM_TRIGGERTABBARCONTEXTMENU: { // similar to NPPM_ACTIVEDOC int whichView = ((wParam != MAIN_VIEW) && (wParam != SUB_VIEW))?currentView():wParam; int index = lParam; switchEditViewTo(whichView); activateDoc(index); if (Message == NPPM_TRIGGERTABBARCONTEXTMENU) { // open here tab menu NMHDR nmhdr; nmhdr.code = NM_RCLICK; nmhdr.hwndFrom = (whichView == MAIN_VIEW)?_mainDocTab.getHSelf():_subDocTab.getHSelf(); nmhdr.idFrom = ::GetDlgCtrlID(nmhdr.hwndFrom); ::SendMessage(_pPublicInterface->getHSelf(), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); } return TRUE; } case NPPM_GETNPPVERSION: { const TCHAR * verStr = VERSION_VALUE; TCHAR mainVerStr[16]; TCHAR auxVerStr[16]; bool isDot = false; int j =0; int k = 0; for (int i = 0 ; verStr[i] ; i++) { if (verStr[i] == '.') isDot = true; else { if (!isDot) mainVerStr[j++] = verStr[i]; else auxVerStr[k++] = verStr[i]; } } mainVerStr[j] = '\0'; auxVerStr[k] = '\0'; int mainVer = 0, auxVer = 0; if (mainVerStr) mainVer = generic_atoi(mainVerStr); if (auxVerStr) auxVer = generic_atoi(auxVerStr); return MAKELONG(auxVer, mainVer); } case WM_GETCURRENTMACROSTATUS : if (_recordingMacro) return MACRO_RECORDING_IN_PROGRESS; return (_macro.empty())?0:MACRO_RECORDING_HAS_STOPPED; case WM_FRSAVE_INT: _macro.push_back(recordedMacroStep(wParam, 0, lParam, NULL)); break; case WM_FRSAVE_STR: _macro.push_back(recordedMacroStep(wParam, 0, 0, (const TCHAR *)lParam)); break; case WM_MACRODLGRUNMACRO: { if (!_recordingMacro) // if we're not currently recording, then playback the recorded keystrokes { int times = 1; if (_runMacroDlg.getMode() == RM_RUN_MULTI) { times = _runMacroDlg.getTimes(); } else if (_runMacroDlg.getMode() == RM_RUN_EOF) { times = -1; } else { break; } int counter = 0; int lastLine = int(_pEditView->execute(SCI_GETLINECOUNT)) - 1; int currLine = _pEditView->getCurrentLineNumber(); int indexMacro = _runMacroDlg.getMacro2Exec(); int deltaLastLine = 0; int deltaCurrLine = 0; Macro m = _macro; if (indexMacro != -1) { vector & ms = pNppParam->getMacroList(); m = ms[indexMacro].getMacro(); } _pEditView->execute(SCI_BEGINUNDOACTION); for(;;) { for (Macro::iterator step = m.begin(); step != m.end(); step++) step->PlayBack(this->_pPublicInterface, _pEditView); counter++; if ( times >= 0 ) { if ( counter >= times ) break; } else // run until eof { bool cursorMovedUp = deltaCurrLine < 0; deltaLastLine = int(_pEditView->execute(SCI_GETLINECOUNT)) - 1 - lastLine; deltaCurrLine = _pEditView->getCurrentLineNumber() - currLine; if (( deltaCurrLine == 0 ) // line no. not changed? && (deltaLastLine >= 0)) // and no lines removed? break; // exit // Update the line count, but only if the number of lines remaining is shrinking. // Otherwise, the macro playback may never end. if (deltaLastLine < deltaCurrLine) lastLine += deltaLastLine; // save current line currLine += deltaCurrLine; // eof? if ((currLine >= lastLine) || (currLine < 0) || ((deltaCurrLine == 0) && (currLine == 0) && ((deltaLastLine >= 0) || cursorMovedUp))) break; } } _pEditView->execute(SCI_ENDUNDOACTION); } } break; case NPPM_CREATESCINTILLAHANDLE : { return (LRESULT)_scintillaCtrls4Plugins.createSintilla((lParam == NULL?_pPublicInterface->getHSelf():(HWND)lParam)); } case NPPM_DESTROYSCINTILLAHANDLE : { return _scintillaCtrls4Plugins.destroyScintilla((HWND)lParam); } case NPPM_GETNBUSERLANG : { if (lParam) *((int *)lParam) = IDM_LANG_USER; return pNppParam->getNbUserLang(); } case NPPM_GETCURRENTDOCINDEX : { if (lParam == SUB_VIEW) { if (!viewVisible(SUB_VIEW)) return -1; return _subDocTab.getCurrentTabIndex(); } else //MAIN_VIEW { if (!viewVisible(MAIN_VIEW)) return -1; return _mainDocTab.getCurrentTabIndex(); } } case NPPM_SETSTATUSBAR : { TCHAR *str2set = (TCHAR *)lParam; if (!str2set || !str2set[0]) return FALSE; switch (wParam) { case STATUSBAR_DOC_TYPE : case STATUSBAR_DOC_SIZE : case STATUSBAR_CUR_POS : case STATUSBAR_EOF_FORMAT : case STATUSBAR_UNICODE_TYPE : case STATUSBAR_TYPING_MODE : _statusBar.setText(str2set, wParam); return TRUE; default : return FALSE; } } case NPPM_GETMENUHANDLE : { if (wParam == NPPPLUGINMENU) return (LRESULT)_pluginsManager.getMenuHandle(); else return NULL; } case NPPM_LOADSESSION : { fileLoadSession((const TCHAR *)lParam); return TRUE; } case NPPM_SAVECURRENTSESSION : { return (LRESULT)fileSaveSession(0, NULL, (const TCHAR *)lParam); } case NPPM_SAVESESSION : { sessionInfo *pSi = (sessionInfo *)lParam; return (LRESULT)fileSaveSession(pSi->nbFile, pSi->files, pSi->sessionFilePathName); } case NPPM_INTERNAL_CLEARSCINTILLAKEY : { _mainEditView.execute(SCI_CLEARCMDKEY, wParam); _subEditView.execute(SCI_CLEARCMDKEY, wParam); return TRUE; } case NPPM_INTERNAL_BINDSCINTILLAKEY : { _mainEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); _subEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); return TRUE; } case NPPM_INTERNAL_CMDLIST_MODIFIED : { //changeMenuShortcut(lParam, (const TCHAR *)wParam); ::DrawMenuBar(_pPublicInterface->getHSelf()); return TRUE; } case NPPM_INTERNAL_MACROLIST_MODIFIED : { return TRUE; } case NPPM_INTERNAL_USERCMDLIST_MODIFIED : { return TRUE; } case NPPM_INTERNAL_SETCARETWIDTH : { NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); if (nppGUI._caretWidth < 4) { _mainEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_LINE); _subEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_LINE); _mainEditView.execute(SCI_SETCARETWIDTH, nppGUI._caretWidth); _subEditView.execute(SCI_SETCARETWIDTH, nppGUI._caretWidth); } else { _mainEditView.execute(SCI_SETCARETWIDTH, 1); _subEditView.execute(SCI_SETCARETWIDTH, 1); _mainEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK); _subEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK); } return TRUE; } case NPPM_INTERNAL_SETMULTISELCTION : { NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); _mainEditView.execute(SCI_SETMULTIPLESELECTION, nppGUI._enableMultiSelection); _subEditView.execute(SCI_SETMULTIPLESELECTION, nppGUI._enableMultiSelection); return TRUE; } case NPPM_INTERNAL_SETCARETBLINKRATE : { NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); _mainEditView.execute(SCI_SETCARETPERIOD, nppGUI._caretBlinkRate); _subEditView.execute(SCI_SETCARETPERIOD, nppGUI._caretBlinkRate); return TRUE; } case NPPM_INTERNAL_ISTABBARREDUCED : { return _toReduceTabBar?TRUE:FALSE; } // ADD: success->hwnd; failure->NULL // REMOVE: success->NULL; failure->hwnd case NPPM_MODELESSDIALOG : { if (wParam == MODELESSDIALOGADD) { for (size_t i = 0 ; i < _hModelessDlgs.size() ; i++) if (_hModelessDlgs[i] == (HWND)lParam) return NULL; _hModelessDlgs.push_back((HWND)lParam); return lParam; } else if (wParam == MODELESSDIALOGREMOVE) { for (size_t i = 0 ; i < _hModelessDlgs.size() ; i++) if (_hModelessDlgs[i] == (HWND)lParam) { vector::iterator hDlg = _hModelessDlgs.begin() + i; _hModelessDlgs.erase(hDlg); return NULL; } return lParam; } return TRUE; } case WM_CONTEXTMENU : { if (pNppParam->_isTaskListRBUTTONUP_Active) { pNppParam->_isTaskListRBUTTONUP_Active = false; } else { if ((HWND(wParam) == _mainEditView.getHSelf()) || (HWND(wParam) == _subEditView.getHSelf())) { if ((HWND(wParam) == _mainEditView.getHSelf())) { switchEditViewTo(MAIN_VIEW); } else { switchEditViewTo(SUB_VIEW); } POINT p; ::GetCursorPos(&p); ContextMenu scintillaContextmenu; vector & tmp = pNppParam->getContextMenuItems(); vector isEnable; for (size_t i = 0 ; i < tmp.size() ; i++) { isEnable.push_back((::GetMenuState(_mainMenuHandle, tmp[i]._cmdID, MF_BYCOMMAND)&MF_DISABLED) == 0); } scintillaContextmenu.create(_pPublicInterface->getHSelf(), tmp); for (size_t i = 0 ; i < isEnable.size() ; i++) scintillaContextmenu.enableItem(tmp[i]._cmdID, isEnable[i]); scintillaContextmenu.display(p); return TRUE; } } return ::DefWindowProc(hwnd, Message, wParam, lParam); } case WM_NOTIFY: { checkClipboard(); checkUndoState(); checkMacroState(); _pluginsManager.notify(reinterpret_cast(lParam)); return notify(reinterpret_cast(lParam)); } case NPPM_INTERNAL_CHECKDOCSTATUS : case WM_ACTIVATEAPP : { if (wParam == TRUE) // if npp is about to be activated { const NppGUI & nppgui = pNppParam->getNppGUI(); if (LOWORD(wParam) && (nppgui._fileAutoDetection != cdDisabled)) { _activeAppInf._isActivated = true; checkModifiedDocument(); return FALSE; } } break; } case NPPM_INTERNAL_GETCHECKDOCOPT : { return (LRESULT)((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection; } case NPPM_INTERNAL_SETCHECKDOCOPT : { // If nothing is changed by user, then we allow to set this value if (((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection == ((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetectionOriginalValue) ((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection = (ChangeDetect)wParam; return TRUE; } case NPPM_GETPOSFROMBUFFERID : { int i; if ((i = _mainDocTab.getIndexByBuffer((BufferID)wParam)) != -1) { long view = MAIN_VIEW; view <<= 30; return view|i; } if ((i = _subDocTab.getIndexByBuffer((BufferID)wParam)) != -1) { long view = SUB_VIEW; view <<= 30; return view|i; } return -1; } case NPPM_GETFULLPATHFROMBUFFERID : { return MainFileManager->getFileNameFromBuffer((BufferID)wParam, (TCHAR *)lParam); } case NPPM_INTERNAL_ENABLECHECKDOCOPT: { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if (wParam == CHECKDOCOPT_NONE) nppgui._fileAutoDetection = cdDisabled; else if (wParam == CHECKDOCOPT_UPDATESILENTLY) nppgui._fileAutoDetection = cdAutoUpdate; else if (wParam == CHECKDOCOPT_UPDATEGO2END) nppgui._fileAutoDetection = cdGo2end; else if (wParam == (CHECKDOCOPT_UPDATESILENTLY | CHECKDOCOPT_UPDATEGO2END)) nppgui._fileAutoDetection = cdAutoUpdateGo2end; return TRUE; } case WM_ACTIVATE : _pEditView->getFocus(); return TRUE; case WM_DROPFILES: { dropFiles(reinterpret_cast(wParam)); return TRUE; } case WM_UPDATESCINTILLAS: { //reset styler for change in Stylers.xml _mainEditView.defineDocType(_mainEditView.getCurrentBuffer()->getLangType()); _subEditView.defineDocType(_subEditView.getCurrentBuffer()->getLangType()); _mainEditView.performGlobalStyles(); _subEditView.performGlobalStyles(); _findReplaceDlg.updateFinderScintilla(); drawTabbarColoursFromStylerArray(); // Notify plugins of update to styles xml SCNotification scnN; scnN.nmhdr.code = NPPN_WORDSTYLESUPDATED; scnN.nmhdr.hwndFrom = _pPublicInterface->getHSelf(); scnN.nmhdr.idFrom = (uptr_t) _pEditView->getCurrentBufferID(); _pluginsManager.notify(&scnN); return TRUE; } case WM_QUERYENDSESSION: case WM_CLOSE: { if (_pPublicInterface->isPrelaunch()) { SendMessage(_pPublicInterface->getHSelf(), WM_SYSCOMMAND, SC_MINIMIZE, 0); } else { if (_pTrayIco) _pTrayIco->doTrayIcon(REMOVE); const NppGUI & nppgui = pNppParam->getNppGUI(); Session currentSession; if (nppgui._rememberLastSession) { getCurrentOpenedFiles(currentSession); //Lock the recent file list so it isnt populated with opened files //Causing them to show on restart even though they are loaded by session _lastRecentFileList.setLock(true); //only lock when the session is remembered } bool allClosed = fileCloseAll(); //try closing files before doing anything else if (nppgui._rememberLastSession) { _lastRecentFileList.setLock(false); //only lock when the session is remembered } if (!allClosed) { //User cancelled the shutdown return FALSE; } if (_beforeSpecialView.isFullScreen) //closing, return to windowed mode fullScreenToggle(); if (_beforeSpecialView.isPostIt) //closing, return to windowed mode postItToggle(); if (_configStyleDlg.isCreated() && ::IsWindowVisible(_configStyleDlg.getHSelf())) _configStyleDlg.restoreGlobalOverrideValues(); SCNotification scnN; scnN.nmhdr.code = NPPN_SHUTDOWN; scnN.nmhdr.hwndFrom = _pPublicInterface->getHSelf(); scnN.nmhdr.idFrom = 0; _pluginsManager.notify(&scnN); saveFindHistory(); _lastRecentFileList.saveLRFL(); saveScintillaParams(); saveGUIParams(); saveUserDefineLangs(); saveShortcuts(); if (nppgui._rememberLastSession && _rememberThisSession) saveSession(currentSession); //Sends WM_DESTROY, Notepad++ will end ::DestroyWindow(hwnd); } return TRUE; } case WM_DESTROY: { killAllChildren(); ::PostQuitMessage(0); _pPublicInterface->gNppHWND = NULL; return TRUE; } case WM_SYSCOMMAND: { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if ((nppgui._isMinimizedToTray || _pPublicInterface->isPrelaunch()) && (wParam == SC_MINIMIZE)) { if (!_pTrayIco) _pTrayIco = new trayIconControler(_pPublicInterface->getHSelf(), IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); _pTrayIco->doTrayIcon(ADD); ::ShowWindow(hwnd, SW_HIDE); return TRUE; } if (wParam == SC_KEYMENU && lParam == VK_SPACE) { _sysMenuEntering = true; } else if (wParam == 0xF093) //it should be SC_MOUSEMENU. A bug? { _sysMenuEntering = true; } return ::DefWindowProc(hwnd, Message, wParam, lParam); } case WM_LBUTTONDBLCLK: { ::SendMessage(_pPublicInterface->getHSelf(), WM_COMMAND, IDM_FILE_NEW, 0); return TRUE; } case IDC_MINIMIZED_TRAY: { switch (lParam) { //case WM_LBUTTONDBLCLK: case WM_LBUTTONUP : _pEditView->getFocus(); ::ShowWindow(_pPublicInterface->getHSelf(), SW_SHOW); if (!_pPublicInterface->isPrelaunch()) _pTrayIco->doTrayIcon(REMOVE); ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); return TRUE; case WM_MBUTTONUP: command(IDM_SYSTRAYPOPUP_NEW_AND_PASTE); return TRUE; case WM_RBUTTONUP: { POINT p; GetCursorPos(&p); HMENU hmenu; // menu template HMENU hTrayIconMenu; // shortcut menu hmenu = ::LoadMenu(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDR_SYSTRAYPOPUP_MENU)); hTrayIconMenu = ::GetSubMenu(hmenu, 0); SetForegroundWindow(_pPublicInterface->getHSelf()); TrackPopupMenu(hTrayIconMenu, TPM_LEFTALIGN, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); PostMessage(_pPublicInterface->getHSelf(), WM_NULL, 0, 0); DestroyMenu(hmenu); return TRUE; } } return TRUE; } case NPPM_DMMSHOW: { _dockingManager.showDockableDlg((HWND)lParam, SW_SHOW); return TRUE; } case NPPM_DMMHIDE: { _dockingManager.showDockableDlg((HWND)lParam, SW_HIDE); return TRUE; } case NPPM_DMMUPDATEDISPINFO: { if (::IsWindowVisible((HWND)lParam)) _dockingManager.updateContainerInfo((HWND)lParam); return TRUE; } case NPPM_DMMREGASDCKDLG: { tTbData *pData = (tTbData *)lParam; int iCont = -1; bool isVisible = false; getIntegralDockingData(*pData, iCont, isVisible); _dockingManager.createDockableDlg(*pData, iCont, isVisible); return TRUE; } case NPPM_DMMVIEWOTHERTAB: { _dockingManager.showDockableDlg((TCHAR*)lParam, SW_SHOW); return TRUE; } case NPPM_DMMGETPLUGINHWNDBYNAME : //(const TCHAR *windowName, const TCHAR *moduleName) { if (!lParam) return NULL; TCHAR *moduleName = (TCHAR *)lParam; TCHAR *windowName = (TCHAR *)wParam; vector dockContainer = _dockingManager.getContainerInfo(); for (size_t i = 0 ; i < dockContainer.size() ; i++) { vector tbData = dockContainer[i]->getDataOfAllTb(); for (size_t j = 0 ; j < tbData.size() ; j++) { if (generic_stricmp(moduleName, tbData[j]->pszModuleName) == 0) { if (!windowName) return (LRESULT)tbData[j]->hClient; else if (generic_stricmp(windowName, tbData[j]->pszName) == 0) return (LRESULT)tbData[j]->hClient; } } } return NULL; } case NPPM_ADDTOOLBARICON: { _toolBar.registerDynBtn((UINT)wParam, (toolbarIcons*)lParam); return TRUE; } case NPPM_SETMENUITEMCHECK: { ::CheckMenuItem(_mainMenuHandle, (UINT)wParam, MF_BYCOMMAND | ((BOOL)lParam ? MF_CHECKED : MF_UNCHECKED)); _toolBar.setCheck((int)wParam, bool(lParam != 0)); return TRUE; } case NPPM_GETWINDOWSVERSION: { return (NppParameters::getInstance())->getWinVersion(); } case NPPM_MAKECURRENTBUFFERDIRTY : { _pEditView->getCurrentBuffer()->setDirty(true); return TRUE; } case NPPM_GETENABLETHEMETEXTUREFUNC : { return (LRESULT)pNppParam->getEnableThemeDlgTexture(); } case NPPM_GETPLUGINSCONFIGDIR : { if (!lParam || !wParam) return FALSE; generic_string pluginsConfigDirPrefix = pNppParam->getAppDataNppDir(); if (pluginsConfigDirPrefix == TEXT("")) pluginsConfigDirPrefix = pNppParam->getNppPath(); const TCHAR *secondPart = TEXT("plugins\\Config"); size_t len = wParam; if (len < pluginsConfigDirPrefix.length() + lstrlen(secondPart)) return FALSE; TCHAR *pluginsConfigDir = (TCHAR *)lParam; lstrcpy(pluginsConfigDir, pluginsConfigDirPrefix.c_str()); ::PathAppend(pluginsConfigDir, secondPart); return TRUE; } case NPPM_MSGTOPLUGIN : { return _pluginsManager.relayPluginMessages(Message, wParam, lParam); } case NPPM_ALLOCATESUPPORTED: return TRUE; case NPPM_ALLOCATECMDID: return _pluginsManager.allocateCmdID(wParam, reinterpret_cast(lParam)); case NPPM_ALLOCATEMARKER: return _pluginsManager.allocateMarker(wParam, reinterpret_cast(lParam)); case NPPM_HIDETABBAR : { bool hide = (lParam != 0); bool oldVal = DocTabView::getHideTabBarStatus(); if (hide == oldVal) return oldVal; DocTabView::setHideTabBarStatus(hide); ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); if (hide) nppGUI._tabStatus |= TAB_HIDE; else nppGUI._tabStatus &= ~TAB_HIDE; return oldVal; } case NPPM_ISTABBARHIDDEN : { return _mainDocTab.getHideTabBarStatus(); } case NPPM_HIDETOOLBAR : { bool show = (lParam != TRUE); bool currentStatus = _rebarTop.getIDVisible(REBAR_BAR_TOOLBAR); if (show != currentStatus) _rebarTop.setIDVisible(REBAR_BAR_TOOLBAR, show); return currentStatus; } case NPPM_ISTOOLBARHIDDEN : { return !_rebarTop.getIDVisible(REBAR_BAR_TOOLBAR); } case NPPM_HIDEMENU : { bool hide = (lParam == TRUE); bool isHidden = ::GetMenu(_pPublicInterface->getHSelf()) == NULL; if (hide == isHidden) return isHidden; NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); nppGUI._menuBarShow = !hide; if (nppGUI._menuBarShow) ::SetMenu(_pPublicInterface->getHSelf(), _mainMenuHandle); else ::SetMenu(_pPublicInterface->getHSelf(), NULL); return isHidden; } case NPPM_ISMENUHIDDEN : { return (::GetMenu(_pPublicInterface->getHSelf()) == NULL); } case NPPM_HIDESTATUSBAR: { bool show = (lParam != TRUE); NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); bool oldVal = nppGUI._statusBarShow; if (show == oldVal) { return oldVal; } RECT rc; _pPublicInterface->getClientRect(rc); nppGUI._statusBarShow = show; _statusBar.display(nppGUI._statusBarShow); ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); return oldVal; } case NPPM_ISSTATUSBARHIDDEN : { NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); return !nppGUI._statusBarShow; } /* case NPPM_ADDREBAR : { if (!lParam) return FALSE; _rebarTop.addBand((REBARBANDINFO*)lParam, false); return TRUE; } case NPPM_UPDATEREBAR : { if (!lParam || wParam < REBAR_BAR_EXTERNAL) return FALSE; _rebarTop.reNew((int)wParam, (REBARBANDINFO*)lParam); return TRUE; } case NPPM_REMOVEREBAR : { if (wParam < REBAR_BAR_EXTERNAL) return FALSE; _rebarTop.removeBand((int)wParam); return TRUE; } */ case NPPM_INTERNAL_ISFOCUSEDTAB : { HWND hTabToTest = (currentView() == MAIN_VIEW)?_mainDocTab.getHSelf():_subDocTab.getHSelf(); return (HWND)lParam == hTabToTest; } case NPPM_INTERNAL_GETMENU : { return (LRESULT)_mainMenuHandle; } case NPPM_INTERNAL_CLEARINDICATOR : { _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART); return TRUE; } case NPPM_INTERNAL_CLEARINDICATORTAGMATCH : { _pEditView->clearIndicator(SCE_UNIVERSAL_TAGMATCH); _pEditView->clearIndicator(SCE_UNIVERSAL_TAGATTR); return TRUE; } case NPPM_INTERNAL_CLEARINDICATORTAGATTR : { _pEditView->clearIndicator(SCE_UNIVERSAL_TAGATTR); return TRUE; } case NPPM_INTERNAL_SWITCHVIEWFROMHWND : { HWND handle = (HWND)lParam; if (_mainEditView.getHSelf() == handle || _mainDocTab.getHSelf() == handle) { switchEditViewTo(MAIN_VIEW); } else if (_subEditView.getHSelf() == handle || _subDocTab.getHSelf() == handle) { switchEditViewTo(SUB_VIEW); } return TRUE; } case NPPM_INTERNAL_UPDATETITLEBAR : { setTitle(); return TRUE; } case NPPM_INTERNAL_DISABLEAUTOUPDATE : { //printStr(TEXT("you've got me")); NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); nppGUI._autoUpdateOpt._doAutoUpdate = false; return TRUE; } case WM_INITMENUPOPUP: { _windowsMenu.initPopupMenu((HMENU)wParam, _pDocTab); return TRUE; } case WM_ENTERMENULOOP: { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering) ::SetMenu(_pPublicInterface->getHSelf(), _mainMenuHandle); return TRUE; } case WM_EXITMENULOOP: { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering) ::SetMenu(_pPublicInterface->getHSelf(), NULL); _sysMenuEntering = false; return FALSE; } default: { if (Message == WDN_NOTIFY) { NMWINDLG* nmdlg = (NMWINDLG*)lParam; switch (nmdlg->type) { case WDT_ACTIVATE: activateDoc(nmdlg->curSel); nmdlg->processed = TRUE; break; case WDT_SAVE: { //loop through nmdlg->nItems, get index and save it for (int i = 0; i < (int)nmdlg->nItems; i++) { fileSave(_pDocTab->getBufferByIndex(i)); } nmdlg->processed = TRUE; } break; case WDT_CLOSE: { bool closed; //loop through nmdlg->nItems, get index and close it for (int i = 0; i < (int)nmdlg->nItems; i++) { closed = fileClose(_pDocTab->getBufferByIndex(nmdlg->Items[i]), currentView()); UINT pos = nmdlg->Items[i]; // The window list only needs to be rearranged when the file was actually closed if (closed) { nmdlg->Items[i] = 0xFFFFFFFF; // indicate file was closed // Shift the remaining items downward to fill the gap for (int j = i + 1; j < (int)nmdlg->nItems; j++) { if (nmdlg->Items[j] > pos) { nmdlg->Items[j]--; } } } } nmdlg->processed = TRUE; } break; case WDT_SORT: if (nmdlg->nItems != (unsigned int)_pDocTab->nbItem()) //sanity check, if mismatch just abort break; //Collect all buffers std::vector tempBufs; for(int i = 0; i < (int)nmdlg->nItems; i++) { tempBufs.push_back(_pDocTab->getBufferByIndex(i)); } //Reset buffers for(int i = 0; i < (int)nmdlg->nItems; i++) { _pDocTab->setBuffer(i, tempBufs[nmdlg->Items[i]]); } activateBuffer(_pDocTab->getBufferByIndex(_pDocTab->getCurrentTabIndex()), currentView()); break; } return TRUE; } return ::DefWindowProc(hwnd, Message, wParam, lParam); } } _pluginsManager.relayNppMessages(Message, wParam, lParam); return result; }