diff --git a/doc/泛读报告.docx b/doc/泛读报告.docx index 2f3f22c..042fd34 100644 Binary files a/doc/泛读报告.docx and b/doc/泛读报告.docx differ diff --git a/src/PowerEditor/src/MISC/Exception/MiniDumper.cpp b/src/PowerEditor/src/MISC/Exception/MiniDumper.cpp index f073d76..f5d03e8 100644 --- a/src/PowerEditor/src/MISC/Exception/MiniDumper.cpp +++ b/src/PowerEditor/src/MISC/Exception/MiniDumper.cpp @@ -16,31 +16,31 @@ // // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +//¸ÃcppÎļþʵÏÖÁË´¦Àí±ÀÀ£µÄÀàMiniDumper.h #include #include "MiniDumper.h" - +//ÏûÏ¢±êÌâ LPCTSTR msgTitle = TEXT("Notepad++ crash analysis"); MiniDumper::MiniDumper() { } - +//дÈë±ÀÀ£×ª´¢µÄº¯Êý bool MiniDumper::writeDump(EXCEPTION_POINTERS * pExceptionInfo) { TCHAR szDumpPath[MAX_PATH]; TCHAR szScratch[MAX_PATH]; LPCTSTR szResult = NULL; bool retval = false; - + //¼ÓÔØ¶¯Ì¬Á´½Ó¿â HMODULE hDll = ::LoadLibraryEx(TEXT("DBGHELP.DLL"), nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); //that wont work on older windows version than XP, #care :) if (hDll) { MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress( hDll, "MiniDumpWriteDump" ); if (pDump) - { + {//»ñÈ¡µ±Ç°Ä£¿éµÄÎļþ·¾¶ ::GetModuleFileName(NULL, szDumpPath, MAX_PATH); ::PathRemoveFileSpec(szDumpPath); wcscat_s(szDumpPath, TEXT("\\NppDump.dmp")); @@ -93,7 +93,7 @@ bool MiniDumper::writeDump(EXCEPTION_POINTERS * pExceptionInfo) { szResult = TEXT("Unable to load the debugging DLL,\r\nfind a recent copy of dbghelp.dll and install it."); } - + //µ¯³öÏûÏ¢¿òÏÔʾ½á¹û if (szResult) ::MessageBox(NULL, szResult, msgTitle, MB_OK); diff --git a/src/PowerEditor/src/ScintillaComponent/DocTabView.cpp b/src/PowerEditor/src/ScintillaComponent/DocTabView.cpp index 5fbc09e..371460e 100644 --- a/src/PowerEditor/src/ScintillaComponent/DocTabView.cpp +++ b/src/PowerEditor/src/ScintillaComponent/DocTabView.cpp @@ -25,7 +25,7 @@ bool DocTabView::_hideTabBarStatus = false; - +//Ïò±êÇ©ÊÓͼÌí¼ÓÐµĻº³åÇø£¬Ê×Ïȼì²é»º³åÇøÊÇ·ñÓÐЧ£¨²»ÊÇÎÞЧµÄ»º³åÇø£©£¬È»ºó¼ì²éÊÇ·ñÒѾ­´æÔÚÏàͬµÄ»º³åÇø¡£Èç¹û»º³åÇøÓÐЧÇÒÉÐδ´æÔÚ£¬Ôò½«ÆäÌí¼Óµ½±êǩҳÊÓͼÖУ¬²¢¸üи¸´°¿ÚµÄ´óС¡£ void DocTabView::addBuffer(BufferID buffer) { if (buffer == BUFFER_INVALID) //valid only @@ -48,25 +48,25 @@ void DocTabView::addBuffer(BufferID buffer) ::SendMessage(_hParent, WM_SIZE, 0, 0); } - +//¹Ø±ÕÖ¸¶¨µÄ»º³åÇø£¬µ½Òª¹Ø±ÕµÄ»º³åÇøµÄË÷Òý£¬È»ºó´Ó±êǩҳÊÓͼÖÐɾ³ýËü£¬²¢Í¨Öª¸¸´°¿Ú½øÐе÷Õû¡£ void DocTabView::closeBuffer(BufferID buffer) { int indexToClose = getIndexByBuffer(buffer); deletItemAt((size_t)indexToClose); ::SendMessage(_hParent, WM_SIZE, 0, 0); } - +//ÎªÌØ¶¨µÄ±êÇ©ÉèÖÃÑÕÉ«¡£¸ù¾ÝÌṩµÄ»º³åÇøID£¬ÉèÖøûº³åÇøÔÚ±êǩҳÖеÄÑÕÉ«¡£ void DocTabView::setIndividualTabColour(BufferID bufferId, int colorId) { bufferId->setDocColorId(colorId); } - +//»ñÈ¡ÌØ¶¨±êÇ©µÄÑÕÉ«£¬¸ù¾ÝÌṩµÄ±êÇ©Ë÷Òý£¬·µ»Ø¸Ã±êÇ©µÄÑÕÉ«¡£ int DocTabView::getIndividualTabColour(int tabIndex) { BufferID bufferId = getBufferByIndex(tabIndex); return bufferId->getDocColorId(); } - +//¼¤»îÌØ¶¨µÄ»º³åÇø£¬Í¨¹ý»º³åÇøµÄIDÕÒµ½ÆäË÷ÒýλÖò¢³¢ÊÔ¼¤»î¸Ã»º³åÇø£¬Èç¹û³É¹¦Ôò·µ»Øtrue£¬·ñÔò·µ»Øfalse¡£ bool DocTabView::activateBuffer(BufferID buffer) { int indexToActivate = getIndexByBuffer(buffer); @@ -77,14 +77,14 @@ bool DocTabView::activateBuffer(BufferID buffer) return true; } - +//»ñÈ¡µ±Ç°¼¤»îµÄ»º³åÇø¡£ BufferID DocTabView::activeBuffer() { int index = getCurrentTabIndex(); return getBufferByIndex(index); } - +//±éÀúËùÓбêǩҳ£¬¸ù¾ÝÎļþÃû²éÕÒÆ¥ÅäµÄ»º³åÇø£¬ÕÒµ½Ôò·µ»ØÆäID£¬·ñÔò·µ»ØBUFFER_INVALID¡£ BufferID DocTabView::findBufferByName(const TCHAR * fullfilename) //-1 if not found, something else otherwise { TCITEM tie{}; @@ -103,7 +103,7 @@ BufferID DocTabView::findBufferByName(const TCHAR * fullfilename) //-1 if not fo return BUFFER_INVALID; } - +//ͨ¹ý»º³åÇøIDÕÒµ½ÆäÔÚ±êÇ©ÖеÄË÷ÒýλÖã¬Èç¹û²»´æÔÚÔò·µ»Ø - 1¡£ int DocTabView::getIndexByBuffer(BufferID id) { TCITEM tie{}; @@ -118,7 +118,7 @@ int DocTabView::getIndexByBuffer(BufferID id) return -1; } - +//ͨ¹ý»º³åÇøIDÕÒµ½ÆäÔÚ±êÇ©ÖеÄË÷ÒýλÖã¬Èç¹û²»´æÔÚÔò·µ»Ø-1¡£ BufferID DocTabView::getBufferByIndex(size_t index) { TCITEM tie{}; @@ -129,7 +129,7 @@ BufferID DocTabView::getBufferByIndex(size_t index) return reinterpret_cast(tie.lParam); } - +//¸ù¾ÝmaskÖеıê־룬¸üÐÂÓ뻺³åÇøÏà¹ØµÄÐÅÏ¢£¬ÀýÈçÎļþÃû±ä»¯¡¢Ö»¶Á״̬±ä»¯µÈ¡£ void DocTabView::bufferUpdated(Buffer * buffer, int mask) { int index = getIndexByBuffer(buffer->getID()); @@ -183,7 +183,7 @@ void DocTabView::bufferUpdated(Buffer * buffer, int mask) *out = '\0'; } } - + ::SendMessage(_hSelf, TCM_SETITEM, index, reinterpret_cast(&tie)); // send WM_SIZE only when change tab @@ -192,7 +192,7 @@ void DocTabView::bufferUpdated(Buffer * buffer, int mask) ::SendMessage(_hParent, WM_SIZE, 0, 0); } - +//¸ù¾Ý¸ø¶¨µÄË÷ÒýÉèÖÃÏàÓ¦µÄ»º³åÇøID£¬²¢¸üбêÇ©ÏÔʾµÄÏà¹ØÐÅÏ¢¡£ void DocTabView::setBuffer(size_t index, BufferID id) { if (index >= _nbItem) @@ -208,7 +208,7 @@ void DocTabView::setBuffer(size_t index, BufferID id) ::SendMessage(_hParent, WM_SIZE, 0, 0); } - +//¸ù¾ÝÒþ²Ø/ÏÔʾ±êÇ©À¸×´Ì¬£¬µ÷Õû±êǩҳÊÓͼºÍÎı¾±à¼­Æ÷ÊÓͼµÄ´óС£¬²¢¸ù¾ÝÐèÒª·¢ËÍÏûÏ¢ÒÔ¸üпɵã»÷Á´½Ó¡£ void DocTabView::reSizeTo(RECT & rc) { int borderWidth = ((NppParameters::getInstance()).getSVP())._borderWidth; diff --git a/src/PowerEditor/src/ScintillaComponent/DocTabView.h b/src/PowerEditor/src/ScintillaComponent/DocTabView.h index 2f8f78c..a0b9894 100644 --- a/src/PowerEditor/src/ScintillaComponent/DocTabView.h +++ b/src/PowerEditor/src/ScintillaComponent/DocTabView.h @@ -14,11 +14,15 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + + + +//¸ÃÀà¼Ì³Ð×ÔTabBarPlusÀà¡£¸ÃÀฺÔð¹ÜÀíÎĵµÑ¡ÏÊÓͼ£¬²¢ÌṩһϵÁз½·¨ÓÃÓÚÌí¼Ó¡¢¹Ø±Õ¡¢¼¤»î»º³åÇøÒÔ¼°ÉèÖÃÑ¡ÏµÄ¸öÐÔ»¯Ñ¡ÏîµÈ¹¦ÄÜ¡£ #pragma once #include "TabBar.h" #include "Buffer.h" - +// ¶¨ÒåһЩ³£Á¿ÓÃ×÷ͼƬË÷Òý const int SAVED_IMG_INDEX = 0; const int UNSAVED_IMG_INDEX = 1; const int REDONLY_IMG_INDEX = 2; @@ -33,7 +37,7 @@ public : void destroy() override { TabBarPlus::destroy(); }; - + //³õʼ»¯º¯Êý£¬´«ÈëʵÀý¾ä±ú¡¢¸¸´°¿Ú¾ä±ú¡¢ScintillaEditViewÖ¸Õë¡¢ÒÔ¼°Í¼Æ¬ÁбíºÍÑ¡ÔñµÄͼƬË÷Òý void init(HINSTANCE hInst, HWND parent, ScintillaEditView * pView, std::vector pIconListVector, unsigned char indexChoice) { TabBarPlus::init(hInst, parent); _pView = pView; @@ -52,45 +56,50 @@ public : TabBar::setImageList(_pIconListVector[_iconListIndexChoice]->getHandle()); return; }; - + // ¸Ä±äÑ¡ÖеÄͼƬÁбí void changeIcons(unsigned char choice) { if (choice >= _pIconListVector.size()) return; _iconListIndexChoice = choice; TabBar::setImageList(_pIconListVector[_iconListIndexChoice]->getHandle()); }; - + // Ìí¼Ó»º³åÇø void addBuffer(BufferID buffer); + // ¹Ø±Õ»º³åÇø void closeBuffer(BufferID buffer); + // »º³åÇø¸üРvoid bufferUpdated(Buffer * buffer, int mask); - + // ¼¤»î»º³åÇø bool activateBuffer(BufferID buffer); - + // »ñÈ¡µ±Ç°¼¤»îµÄ»º³åÇø BufferID activeBuffer(); + // ¸ù¾ÝÎļþÃû²éÕÒ»º³åÇø£¬·µ»ØË÷ÒýÖµ£¬Èç¹ûδÕÒµ½Ôò·µ»Ø-1 BufferID findBufferByName(const TCHAR * fullfilename); //-1 if not found, something else otherwise - + // ¸ù¾Ý»º³åÇø»ñÈ¡Ë÷ÒýÖµ int getIndexByBuffer(BufferID id); + // ¸ù¾ÝË÷ÒýÖµ»ñÈ¡»º³åÇø BufferID getBufferByIndex(size_t index); - + // ÉèÖÃÖ¸¶¨Ë÷ÒýλÖõĻº³åÇø void setBuffer(size_t index, BufferID id); - + // ¾²Ì¬º¯Êý£¬ÓÃÓÚÉèÖÃÒþ²Ø»òÏÔʾѡÏÀ¸µÄ״̬ static bool setHideTabBarStatus(bool hideOrNot) { bool temp = _hideTabBarStatus; _hideTabBarStatus = hideOrNot; return temp; }; - + // ¾²Ì¬º¯Êý£¬»ñÈ¡Òþ²Ø»òÏÔʾѡÏÀ¸µÄ״̬ static bool getHideTabBarStatus() { return _hideTabBarStatus; }; - + // ÖØÐ´¸¸ÀàµÄreSizeTo·½·¨ void reSizeTo(RECT & rc) override; - + // »ñÈ¡ScintillaEditViewÖ¸Õë const ScintillaEditView* getScintillaEditView() const { return _pView; }; - + // ÉèÖÃÖ¸¶¨»º³åÇøµÄ¸öÐÔ»¯Ñ¡ÏÑÕÉ« void setIndividualTabColour(BufferID bufferId, int colorId); + // »ñȡָ¶¨Ë÷ÒýλÖõĸöÐÔ»¯Ñ¡ÏÑÕÉ« int getIndividualTabColour(int tabIndex) override; private : diff --git a/src/PowerEditor/src/WinControls/FileBrowser/fileBrowser.cpp b/src/PowerEditor/src/WinControls/FileBrowser/fileBrowser.cpp index 3f17025..aa5690d 100644 --- a/src/PowerEditor/src/WinControls/FileBrowser/fileBrowser.cpp +++ b/src/PowerEditor/src/WinControls/FileBrowser/fileBrowser.cpp @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . - +//fileBrowserÀàµÄ¾ßÌåʵÏÖ #include "fileBrowser.h" #include "resource.h" #include "tinyxml.h" @@ -41,7 +41,7 @@ #define FB_CMD_FOLDALL 2 #define FB_CMD_EXPANDALL 3 - +//Í£Ö¹ËùÓÐÎļþ¼àÊÓÆ÷ FileBrowser::~FileBrowser() { for (const auto folder : _folderUpdaters) @@ -55,7 +55,7 @@ FileBrowser::~FileBrowser() delete cd; } } - +//½«Ò»¸ö×Ö·û´®·Ö¸î³É¶à¸ö×Ó×Ö·û´®£¬º¯ÊýʹÓÃÁËforÑ­»·ÒÀ´Î¼ì²é×Ö·û´®ÖеÄÿ¸ö×Ö·û£¬µ±ÕÒµ½µÈÓÚ`sep`»òÕß¿Õ×Ö·ûµÄ×Ö·ûʱ£¬¾Í°ÑÕâ֮ǰµÄ×Ö·û×÷Ϊһ¸ö×Ó×Ö·û´®´æ´¢ÔÚ`splitedStrings`ÏòÁ¿ÖС£ vector split(const generic_string & string2split, TCHAR sep) { vector splitedStrings; @@ -71,7 +71,7 @@ vector split(const generic_string & string2split, TCHAR sep) } return splitedStrings; } - +//¼ì²é×ÓÎļþ¼ÐÊÇ·ñÓë¸ùÎļþÏà¹Ø bool isRelatedRootFolder(const generic_string & relatedRoot, const generic_string & subFolder) { if (relatedRoot.empty()) @@ -91,11 +91,11 @@ bool isRelatedRootFolder(const generic_string & relatedRoot, const generic_strin return relatedRootArray[index2Compare] == subFolderArray[index2Compare]; } - +//ÏûÏ¢´¦Àí intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) - { + {//»á»°¿ò³õʼ»¯£¬°üÀ¨´´½¨¹¤¾ßÌõ£¬Ê÷×´ÊÓͼµÄ³õʼ»¯µÈ¡£ case WM_INITDIALOG : { NppParameters& nppParam = NppParameters::getInstance(); @@ -175,7 +175,7 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l return TRUE; } - + //´¦ÀíºÚ°µÄ£Ê½Ë¢ÐµÄÏûÏ¢ case NPPM_INTERNAL_REFRESHDARKMODE: { if (static_cast(lParam) != TRUE) @@ -185,7 +185,7 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l NppDarkMode::setTreeViewStyle(_treeView.getHSelf()); return TRUE; } - + //Êó±êÏûÏ¢ case WM_MOUSEMOVE: if (_treeView.isDragging()) _treeView.dragItem(_hSelf, LOWORD(lParam), HIWORD(lParam)); @@ -197,13 +197,13 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l } break; - + //֪ͨÏûÏ¢ case WM_NOTIFY: { notified((LPNMHDR)lParam); } return TRUE; - + //µÃµ½´°ÌåµÄпí¶ÈºÍ¸ß¶È£¬È»ºóµ÷Õû¹¤¾ßÌõºÍÊ÷ÐÎÊÓͼµÄλÖúʹóС¡£ case WM_SIZE: { int width = LOWORD(lParam); @@ -220,28 +220,28 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l ::MoveWindow(hwnd, 0, toolbarMenuRect.bottom + extraValue, width, height - toolbarMenuRect.bottom - extraValue, TRUE); break; } - + //Îı¾²Ëµ¥ case WM_CONTEXTMENU: if (!_treeView.isDragging()) showContextMenu(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return TRUE; - + //À´×Բ˵¥µÄÑ¡Ôñ case WM_COMMAND: { switch (LOWORD(wParam)) - { + {//Ñ¡Ôñµ±Ç°ÕýÔڱ༭µÄÎļþ¡£ case FB_CMD_AIMFILE: { selectCurrentEditingFile(); break; } - + //ÕÛµþ case FB_CMD_FOLDALL: { _treeView.foldAll(); break; } - + //Õ¹¿ª case FB_CMD_EXPANDALL: { _treeView.expandAll(); @@ -253,7 +253,7 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l } break; } - + //Ïú»Ù case WM_DESTROY: { ::DestroyWindow(_hToolbarMenu); @@ -261,7 +261,7 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l destroyMenus(); break; } - + //Ìí¼Ó case FB_ADDFILE: { @@ -274,7 +274,7 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l break; } - + //ÒÆ³ý case FB_RMFILE: { @@ -287,7 +287,7 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l break; } - + //ÖØÃüÃû case FB_RNFILE: { const std::vector file2Change = *(std::vector *)lParam; @@ -324,7 +324,7 @@ intptr_t CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM l } return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } - +//´´½¨Ò»¸öÎļþä¯ÀÀÆ÷µÄʱºò£¬³õʼ»¯µ¯³ö²Ëµ¥¡£Ê×ÏÈÊÕ¼¯¸÷ÖÖÓë²Ëµ¥ÏîÏà¹ØµÄ×Ö·û´®£¬È»ºó´´½¨ÈýÖÖ²»Í¬µÄ²Ëµ¥£ºÈ«¾Ö²Ëµ¥¡¢¸ù²Ëµ¥¡¢Îļþ¼Ð²Ëµ¥ºÍÎļþ²Ëµ¥£¬ÏòÕâЩ²Ëµ¥ÖвåÈë¸÷Öֲ˵¥Ïî¡£ void FileBrowser::initPopupMenus() { NativeLangSpeaker* pNativeSpeaker = NppParameters::getInstance().getNativeLangSpeaker(); @@ -370,7 +370,7 @@ void FileBrowser::initPopupMenus() ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_FILEBROWSER_EXPLORERHERE, explorerHere.c_str()); ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_FILEBROWSER_CMDHERE, cmdHere.c_str()); } - +//ͨ¹ýÒ»¸ö¸ø¶¨µÄ·¾¶Ñ¡ÖÐÎļþä¯ÀÀÆ÷ÖеÄÒ»¸öÏîÄ¿¡£ËüÊ×Ïȼì²é·¾¶ÊÇ·ñΪ¿Õ£¬È»ºóͨ¹ý±éÀúËùÓеÄÎļþ¼ÐÀ´Ñ°ÕÒ¶ÔÓ¦µÄÏîÄ¿¡£ bool FileBrowser::selectItemFromPath(const generic_string& itemPath) const { if (itemPath.empty()) @@ -409,7 +409,7 @@ bool FileBrowser::selectItemFromPath(const generic_string& itemPath) const } return false; } - +//Ñ¡Ôñµ±Ç°ÕýÔڱ༭µÄÎļþ¡£ bool FileBrowser::selectCurrentEditingFile() const { TCHAR currentDocPath[MAX_PATH] = { '\0' }; @@ -418,7 +418,7 @@ bool FileBrowser::selectCurrentEditingFile() const return selectItemFromPath(currentDocPathStr); } - +//´Ý»Ù´´½¨µÄ²Ëµ¥ void FileBrowser::destroyMenus() { ::DestroyMenu(_hGlobalMenu); @@ -426,7 +426,7 @@ void FileBrowser::destroyMenus() ::DestroyMenu(_hFolderMenu); ::DestroyMenu(_hFileMenu); } - +//·µ»ØÒ»¸ö¸ø¶¨½ÚµãµÄÍêÕû·¾¶¡£ generic_string FileBrowser::getNodePath(HTREEITEM node) const { if (!node) return TEXT(""); @@ -460,12 +460,12 @@ generic_string FileBrowser::getNodePath(HTREEITEM node) const return fullPath; } - +//·µ»ØÒ»¸ö¸ø¶¨½ÚµãµÄÃû³Æ¡£ generic_string FileBrowser::getNodeName(HTREEITEM node) const { return node ? _treeView.getItemDisplayName(node) : TEXT(""); } - +//´ò¿ªÑ¡¶¨µÄÎļþ¡£Èç¹ûÑ¡¶¨µÄÏîÄ¿ÊÇÒ»¸öÎļþ£¬ÄÇô¾Í´ò¿ªËü£»·ñÔò£¬²»Ö´ÐÐÈκβÙ×÷¡£ void FileBrowser::openSelectFile() { // Get the selected item @@ -483,7 +483,7 @@ void FileBrowser::openSelectFile() ::PostMessage(_hParent, NPPM_DOOPEN, 0, reinterpret_cast(_selectedNodeFullPath.c_str())); } - +//´¦Àí¸÷Öֲ˵¥²Ù×÷µÄʼþ¡£ÀýÈ磬Èç¹ûÒ»¸ö²Ëµ¥Ï˫»÷£¬ÄÇô¾Íµ÷Óú¯Êý½øÐжÔÓ¦µÄ´¦Àí£»Èç¹ûÒ»¸ö½Úµã±êÇ©±»±à¼­£¬ÄÇôº¯Êý¾Í±£´æÐµıêÇ©¡£ void FileBrowser::notified(LPNMHDR notification) { if (notification->code == DMN_CLOSE) @@ -673,7 +673,7 @@ void FileBrowser::notified(LPNMHDR notification) } } } - +//»ñÈ¡¸ø¶¨ÏîÄ¿(`hItem`)µÄ½ÚµãÀàÐÍ¡£º¯ÊýÊ×ÏÈ»ñÈ¡ÏîÄ¿µÄË÷Òý(`iImage`)£¬Èç¹ûË÷ÒýΪ`INDEX_LEAF`£¬Ôò½ÚµãÀàÐÍΪÎļþ£»Èç¹ûÏîÄ¿µÄ²ÎÊý(`lParam`)²»Îª¿Õ²¢ÇÒ`SortingData4lParam`ÀàÖÐ`_rootPath`³ÉÔ±²»Îª¿Õ£¬ÄÇô½ÚµãÀàÐÍΪ¸ù£»·ñÔò£¬½ÚµãÀàÐÍΪÎļþ¼Ð¡£ BrowserNodeType FileBrowser::getNodeType(HTREEITEM hItem) { TVITEM tvItem; @@ -697,7 +697,7 @@ BrowserNodeType FileBrowser::getNodeType(HTREEITEM hItem) return browserNodeType_folder; } } - +//(x, y)λÖÃÏÔʾÉÏÏÂÎIJ˵¥¡£º¯ÊýÊ×Ïȼì²â¸ø¶¨Î»ÖÃÊÇ·ñÔÚÒ»¸öÔªËØÉÏ£¬Èç¹ûÊǵϰ¾ÍÑ¡ÖиÃÔªËØ£¬²¢»ñÈ¡¸ÃÔªËØµÄ½ÚµãÀàÐÍ£¬È»ºó¸ù¾Ý½ÚµãÀàÐÍÏÔʾÏàÓ¦µÄÉÏÏÂÎIJ˵¥¡£ void FileBrowser::showContextMenu(int x, int y) { TVHITTESTINFO tvHitInfo{}; @@ -735,7 +735,7 @@ void FileBrowser::showContextMenu(int x, int y) x, y, 0, _hSelf, NULL); } } - +//Ö´ÐÐÓë¸ø¶¨ÃüÁîID(`cmdID`)¹ØÁªµÄÉÏÏÂÎIJ˵¥ÃüÁî¡£ÀýÈ磬Èç¹ûÃüÁîIDΪ`IDM_FILEBROWSER_REMOVEROOTFOLDER`£¬Ôòº¯Êý½«É¾³ýÑ¡¶¨µÄ¸ùÎļþ¼Ð¡£ void FileBrowser::popupMenuCmd(int cmdID) { // get selected item handle @@ -872,7 +872,7 @@ void FileBrowser::popupMenuCmd(int cmdID) } - +//ÔÚĿ¼`dir`ÖлñÈ¡·ûºÏ`patterns`ģʽµÄËùÓÐÎļþºÍ×ÓĿ¼µÄ½á¹¹ÐÅÏ¢£¬²¢½«Æä±£´æµ½`directoryStructure`ÖС£`isRecursive`²ÎÊýÖ¸¶¨ÊÇ·ñµÝ¹é±éÀú×ÓĿ¼£¬`isInHiddenDir`²ÎÊýָʾµ±Ç°Ä¿Â¼ÊÇ·ñΪÒþ²ØÄ¿Â¼¡£ void FileBrowser::getDirectoryStructure(const TCHAR *dir, const std::vector & patterns, FolderInfo & directoryStructure, bool isRecursive, bool isInHiddenDir) { if (directoryStructure._parent == nullptr) // Root! @@ -954,12 +954,13 @@ void FileBrowser::getDirectoryStructure(const TCHAR *dir, const std::vector_rootFolder._rootPath == rootFolderPath) return; else - { + { // ¼ì²éÊÇ·ñ´æÔÚÏà¹ØµÄ¸ùÎļþ¼Ð£¬ÒÔ±ãÑ¡ÔñĿ¼ if (isRelatedRootFolder(f->_rootFolder._rootPath, rootFolderPath)) { //do nothing, go down to select the dir @@ -987,9 +988,9 @@ void FileBrowser::addRootFolder(generic_string rootFolderPath) _treeView.selectItem(foundItem); return; } - + // ¼ì²éÊÇ·ñ´æÔÚÏà¶ÔÓÚÒªÌí¼ÓµÄ¸ùÎļþ¼ÐµÄ×ÓÎļþ¼Ð if (isRelatedRootFolder(rootFolderPath, f->_rootFolder._rootPath)) - { + {// ÏÔʾÏûÏ¢¿ò£¬Ö¸Ê¾´æÔÚ×ÓÎļþ¼Ð£¬ÐèÒªÏÈÒÆ³ý NppParameters::getInstance().getNativeLangSpeaker()->messageBox("FolderAsWorspaceSubfolderExists", _hParent, TEXT("A sub-folder of the folder you want to add exists.\rPlease remove its root from the panel before you add folder \"$STR_REPLACE$\"."), @@ -1001,10 +1002,10 @@ void FileBrowser::addRootFolder(generic_string rootFolderPath) } } } - + // ÉèÖÃҪƥÅäµÄÎļþģʽ std::vector patterns2Match; patterns2Match.push_back(TEXT("*.*")); - + // »ñÈ¡¸ùÎļþ¼ÐµÄÃû³Æ²¢´´½¨ÏàÓ¦µÄÎļþ¼ÐÐÅÏ¢¶ÔÏó TCHAR *label = ::PathFindFileName(rootFolderPath.c_str()); TCHAR rootLabel[MAX_PATH] = {'\0'}; wcscpy_s(rootLabel, label); @@ -1019,10 +1020,11 @@ void FileBrowser::addRootFolder(generic_string rootFolderPath) _folderUpdaters.push_back(new FolderUpdater(directoryStructure, this)); _folderUpdaters[_folderUpdaters.size() - 1]->startWatcher(); } - +//´´½¨Îļþ¼ÐÏîÄ¿´ÓĿ¼½á¹¹ HTREEITEM FileBrowser::createFolderItemsFromDirStruct(HTREEITEM hParentItem, const FolderInfo & directoryStructure) { HTREEITEM hFolderItem = nullptr; + // Èç¹ûÊǸùĿ¼£¬Ôò´´½¨¸ù½Úµã if (directoryStructure._parent == nullptr && hParentItem == nullptr) { TCHAR rootPath[MAX_PATH] = { '\0' }; @@ -1033,14 +1035,14 @@ HTREEITEM FileBrowser::createFolderItemsFromDirStruct(HTREEITEM hParentItem, con SortingData4lParam* customData = new SortingData4lParam(rootPath, TEXT(""), true); sortingDataArray.push_back(customData); - + // Ìí¼Ó¸ù½Úµãµ½Ê÷ÊÓͼ hFolderItem = _treeView.addItem(directoryStructure._name.c_str(), TVI_ROOT, INDEX_CLOSE_ROOT, reinterpret_cast(customData)); } else { SortingData4lParam* customData = new SortingData4lParam(TEXT(""), directoryStructure._name, true); sortingDataArray.push_back(customData); - + // Ìí¼Ó½Úµãµ½Ê÷ÊÓͼ hFolderItem = _treeView.addItem(directoryStructure._name.c_str(), hParentItem, INDEX_CLOSE_NODE, reinterpret_cast(customData)); } @@ -1053,7 +1055,7 @@ HTREEITEM FileBrowser::createFolderItemsFromDirStruct(HTREEITEM hParentItem, con { SortingData4lParam* customData = new SortingData4lParam(TEXT(""), file._name, false); sortingDataArray.push_back(customData); - + // Ìí¼ÓÎļþ½Úµãµ½Ê÷ÊÓͼ _treeView.addItem(file._name.c_str(), hFolderItem, INDEX_LEAF, reinterpret_cast(customData)); } @@ -1061,7 +1063,7 @@ HTREEITEM FileBrowser::createFolderItemsFromDirStruct(HTREEITEM hParentItem, con return hFolderItem; } - +//¸ù¾Ý·¾¶ÕÒµ½¸ùĿ¼ HTREEITEM FileBrowser::getRootFromFullPath(const generic_string & rootPath) const { HTREEITEM node = nullptr; @@ -1080,7 +1082,7 @@ HTREEITEM FileBrowser::getRootFromFullPath(const generic_string & rootPath) cons } return node; } - +//ÔÚÖ¸¶¨¸¸½ÚµãϲéÕÒ¾ßÓÐÌØ¶¨Ãû³ÆµÄ×ӽڵ㡣 HTREEITEM FileBrowser::findChildNodeFromName(HTREEITEM parent, const generic_string& label) const { for (HTREEITEM hItemNode = _treeView.getChildFrom(parent); @@ -1102,7 +1104,7 @@ HTREEITEM FileBrowser::findChildNodeFromName(HTREEITEM parent, const generic_str } return nullptr; } - +//µÃµ½ËùÓиù½ÚµãµÄ·¾¶ vector FileBrowser::getRoots() const { vector roots; @@ -1121,7 +1123,7 @@ vector FileBrowser::getRoots() const } return roots; } - +//»ñȡѡÖÐÎļþµÄ·¾¶ generic_string FileBrowser::getSelectedItemPath() const { generic_string itemPath; @@ -1132,7 +1134,7 @@ generic_string FileBrowser::getSelectedItemPath() const } return itemPath; } - +//½«´«µÝµÄÎļþ·¾¶ÐÅÏ¢·Ö×飬°´ÕÕ¹²Í¬Â·¾¶ºÍ¸ù·¾¶½øÐзÖÀà¡£ std::vector FileBrowser::getFilesFromParam(LPARAM lParam) const { const std::vector filesToChange = *(std::vector*)lParam; @@ -1189,7 +1191,7 @@ std::vector FileBrowser::getFilesFromParam(LPARAM lP return groupedFiles; } - +//½«Îļþ×éÌí¼Óµ½Ê÷ÖУ¬¸ù¾ÝÎļþÀàÐÍÔÚÊ÷Öд´½¨ÏàÓ¦µÄ½Úµã¡£ bool FileBrowser::addToTree(FilesToChange & group, HTREEITEM node) { if (node == nullptr) // it's a root. Search the right root with rootPath @@ -1266,7 +1268,7 @@ bool FileBrowser::addToTree(FilesToChange & group, HTREEITEM node) } } - +//ÔÚÊ÷ÖвéÕÒ²¢É¾³ýÖ¸¶¨µÄÎļþ×é¡£ bool FileBrowser::deleteFromTree(FilesToChange & group) { std::vector foundItems = findInTree(group, nullptr); @@ -1283,7 +1285,7 @@ bool FileBrowser::deleteFromTree(FilesToChange & group) return true; } - +//ÔÚÊ÷ÐνṹÖвéÕÒÖ¸¶¨Â·¾¶£¬Ê×ÏÈÅжϵ±Ç°½ÚµãÊÇ·ñΪ¸ù½Úµã£¬ÈôÊÇÔò¸ù¾Ý¸ù·¾¶²éÕÒ¶ÔÓ¦µÄ¸ù½Úµã¡£È»ºó¸ù¾Ý·¾¶Êý×éµÄ´óС£¬ÅжÏÊÇ·ñ¼ÌÐø²éÕÒ×Ó½Úµã»òÕß·µ»Øµ±Ç°½Úµã¡£ HTREEITEM FileBrowser::findInTree(const generic_string& rootPath, HTREEITEM node, std::vector linarPathArray) const { if (node == nullptr) // it's a root. Search the right root with rootPath @@ -1326,7 +1328,7 @@ HTREEITEM FileBrowser::findInTree(const generic_string& rootPath, HTREEITEM node return nullptr; } } - +//¸Ãº¯ÊýÒ²ÓÃÓÚÔÚÊ÷ÐνṹÖвéÕÒÖ¸¶¨Â·¾¶£¬µ«²ÎÊý²»Í¬¡£²ÎÊýgroupÊÇÒ»¸ö°üº¬ÎļþÐÅÏ¢ºÍ·¾¶µÄ¶ÔÏó£¬node±íʾµ±Ç°½Úµã¡£º¯ÊýÊ×ÏÈÅжϵ±Ç°½ÚµãÊÇ·ñΪ¸ù½Úµã£¬ÈôÊÇÔò¸ù¾Ý·¾¶ÐÅÏ¢²éÕÒ¶ÔÓ¦µÄ¸ù½Úµã¡£È»ºó¸ù¾Ý·¾¶ÐÅÏ¢µÄ´óС£¬ÅжÏÊÇ·ñ¼ÌÐø²éÕÒ×Ó½Úµã»òÕß·µ»ØÕÒµ½µÄ½Úµã¼¯ºÏ¡£ std::vector FileBrowser::findInTree(FilesToChange & group, HTREEITEM node) const { if (node == nullptr) // it's a root. Search the right root with rootPath @@ -1367,7 +1369,7 @@ std::vector FileBrowser::findInTree(FilesToChange & group, HTREEITEM return {}; } } - +//ÕÒµ½Ö¸¶¨¸¸½ÚµãµÄ×Ó½Úµã std::vector FileBrowser::findChildNodesFromNames(HTREEITEM parent, std::vector & labels) const { std::vector itemNodes; @@ -1394,6 +1396,7 @@ std::vector FileBrowser::findChildNodesFromNames(HTREEITEM parent, st } return itemNodes; } +//ÒÆ³ýÒѾ­ÔÚ¸¸½ÚµãÖеÄÃû×Ö¡£Ëü±éÀú¸¸½ÚµãµÄËùÓÐ×ӽڵ㣬²¢½«Óë¸ø¶¨±êÇ©¼¯ºÏÖÐÃû×ÖÏàÆ¥ÅäµÄ±êÇ©Çå³ý¡£ void FileBrowser::removeNamesAlreadyInNode(HTREEITEM parent, std::vector & labels) const { @@ -1418,7 +1421,7 @@ void FileBrowser::removeNamesAlreadyInNode(HTREEITEM parent, std::vector& linarPathArrayFrom, const generic_string & renameTo) { HTREEITEM foundItem = findInTree(rootPath, node, linarPathArrayFrom); @@ -1433,7 +1436,7 @@ bool FileBrowser::renameInTree(const generic_string& rootPath, HTREEITEM node, c return true; } - +//ÅÅÐò»Øµ÷º¯Êý£¬°´ÕÕÎļþ¼ÐºÍÎļþÃû½øÐÐÅÅÐò¡£Ê×ÏÈÊÇÎļþ¼Ð£¬È»ºóÊÇÎļþ¡£Èç¹ûÁ½Õß¶¼ÊÇÎļþ¼Ð»òÎļþ£¬ÄÇô±È½ÏËüÃǵÄÃû×Ö¡£ int CALLBACK FileBrowser::categorySortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM /*lParamSort*/) { SortingData4lParam* item1 = reinterpret_cast(lParam1); @@ -1449,7 +1452,7 @@ int CALLBACK FileBrowser::categorySortFunc(LPARAM lParam1, LPARAM lParam2, LPARA else return lstrcmpi(item1->_label.c_str(), item2->_label.c_str()); } - +//½«¸ø¶¨µÄÍêÕû·¾¶Ìí¼Óµ½Îļþ¼ÐÐÅÏ¢½á¹¹ÖС£¸Ã·¾¶¿ÉÄÜÊÇÎļþ»òĿ¼£¬Èç¹û¸Ã·¾¶ÒѾ­´æÔÚÓڽṹÖУ¬Ôò·µ»Øfalse£¬Èç¹û³É¹¦Ìí¼Ó£¬Ôò·µ»Øtrue¡£ bool FolderInfo::addToStructure(generic_string & fullpath, std::vector linarPathArray) { if (linarPathArray.size() == 1) // could be file or folder @@ -1494,7 +1497,7 @@ bool FolderInfo::addToStructure(generic_string & fullpath, std::vector linarPathArray) { if (linarPathArray.size() == 1) // could be file or folder @@ -1532,7 +1535,7 @@ bool FolderInfo::removeFromStructure(std::vector linarPathArray) } return false; } - +//ÔÚÎļþ¼ÐÐÅÏ¢½á¹¹ÖÐÖØÃüÃû¸ø¶¨µÄÏßÐÔ·¾¶¡£Ëü½« "linarPathArrayFrom" Ö¸¶¨µÄ·¾¶µÄÃû×Ö¸ü¸ÄΪ "linarPathArrayTo" Ö¸¶¨µÄÃû×Ö¡£ bool FolderInfo::renameInStructure(std::vector linarPathArrayFrom, std::vector linarPathArrayTo) { if (linarPathArrayFrom.size() == 1) // could be file or folder @@ -1572,6 +1575,7 @@ bool FolderInfo::renameInStructure(std::vector linarPathArrayFro return false; } } +//´ò¿ª¼àÊÓÆ÷£¬´´½¨Ò»¸öʼþ¶ÔÏ󲢿ªÆôÒ»¸öеÄỊ̈߳¬Ï߳̿ªÊ¼ÔËÐÐ `watching` º¯Êý¡£ void FolderUpdater::startWatcher() { @@ -1579,6 +1583,7 @@ void FolderUpdater::startWatcher() _EventHandle = ::CreateEvent(nullptr, TRUE, FALSE, nullptr); _watchThreadHandle = ::CreateThread(NULL, 0, watching, this, 0, NULL); } +//Í£Ö¹¼àÊÓÆ÷¡£Ëüͨ¹ýÉ趨ʼþºÍ¹Ø±Õ¶ÔÓ¦µÄÏß³ÌʵÏÖ¡£ void FolderUpdater::stopWatcher() { @@ -1586,6 +1591,7 @@ void FolderUpdater::stopWatcher() ::CloseHandle(_watchThreadHandle); ::CloseHandle(_EventHandle); } +//¸ù¾Ý¶¯×÷ÀàÐ͵ĴúÂë·µ»ØÏàÓ¦µÄ¶¯×÷Ãû×Ö¡£ LPCWSTR explainAction(DWORD dwAction) { @@ -1606,6 +1612,7 @@ LPCWSTR explainAction(DWORD dwAction) } } +//¸ºÔð¼àÊÓĿ¼ÏµÄÎļþ±ä»¯¡£µ±ÓÐÎļþ±»´´½¨¡¢É¾³ý¡¢ÖØÃüÃûµÈ²Ù×÷ʱ£¬¾Í»á½«Õâ¸ö¸Ä¶¯·ÅÈë¸Ä¶¯¶ÓÁУ¬²¢Í¨¹ýʼþÌáÐÑÖ÷Ï߳̽øÐд¦Àí¡£ DWORD WINAPI FolderUpdater::watching(void *params) { @@ -1704,6 +1711,7 @@ DWORD WINAPI FolderUpdater::watching(void *params) //printStr(L"Quit watching thread"); return EXIT_SUCCESS; } +//¸ù¾Ý¸Ä¶¯µÄÀàÐÍ£¬µ÷Óò»Í¬µÄÎļþä¯ÀÀÆ÷µÄ·½·¨£¬ÀýÈçÎļþ´´½¨¡¢É¾³ý¡¢ÖØÃüÃûµÈ¡£ void FolderUpdater::processChange(DWORD dwAction, std::vector filesToChange, FolderUpdater* thisFolderUpdater) { diff --git a/src/PowerEditor/src/WinControls/TabBar/TabBar.cpp b/src/PowerEditor/src/WinControls/TabBar/TabBar.cpp index 578a0c0..20b6c3d 100644 --- a/src/PowerEditor/src/WinControls/TabBar/TabBar.cpp +++ b/src/PowerEditor/src/WinControls/TabBar/TabBar.cpp @@ -40,7 +40,7 @@ COLORREF TabBarPlus::_inactiveBgColour = RGB(192, 192, 192); HWND TabBarPlus::_hwndArray[nbCtrlMax] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; int TabBarPlus::_nbCtrl = 0; - +//³õʼ»¯±êÇ©À¸£¬´´½¨´°¿Ú void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLine) { Window::init(hInst, parent); @@ -49,7 +49,7 @@ void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLin _isVertical = isVertical; _isMultiLine = isMultiLine; - INITCOMMONCONTROLSEX icce{}; + INITCOMMONCONTROLSEX icce{};//³õʼ»¯Í¨Óÿؼþ¿â icce.dwSize = sizeof(icce); icce.dwICC = ICC_TAB_CLASSES; InitCommonControlsEx(&icce); @@ -75,27 +75,27 @@ void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLin } } - +//ÇåÀíÓëTabBarÏà¹ØµÄ×ÊÔ´ void TabBar::destroy() { if (_hFont) { ::DeleteObject(_hFont); _hFont = nullptr; - } + }//ɾ³ý×ÖÌå¶ÔÏó if (_hLargeFont) { ::DeleteObject(_hLargeFont); _hLargeFont = nullptr; - } + }//ɾ³ý×ÖÌå´óС¸ñʽ if (_hVerticalFont) { ::DeleteObject(_hVerticalFont); _hVerticalFont = nullptr; } - + //ɾ³ý´¹Ö±×ÖÌå¶ÔÏó if (_hVerticalLargeFont) { ::DeleteObject(_hVerticalLargeFont); @@ -106,13 +106,13 @@ void TabBar::destroy() _hSelf = nullptr; } - +//ÔÚTabBarĩβ²åÈëÒ»¸öеÄÑ¡Ï£¬²¢ÉèÖÃÃû³Æ¡£Ê¹ÓÃTCITEM½á¹¹ÉèÖÃÑ¡ÏµÄÊôÐÔ£¬²¢·¢ËÍÏûÏ¢½«Ñ¡Ï²åÈëTabBarÖÐ int TabBar::insertAtEnd(const TCHAR *subTabName) { TCITEM tie{}; tie.mask = TCIF_TEXT | TCIF_IMAGE; int index = -1; - + //Èç¹û´æÔÚͼÏñÁÐ±í£¬ÄÇôÐÂTabItemÓ¦¸Ã±»·ÅÖÃÔÚÁбíµÄ¿ªÊ¼¡£ if (_hasImgLst) index = 0; tie.iImage = index; @@ -120,7 +120,7 @@ int TabBar::insertAtEnd(const TCHAR *subTabName) return int(::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast(&tie))); } - +//»ñÈ¡µ±Ç°Ñ¡¶¨Ñ¡ÏµÄ±êÌâ¡£ void TabBar::getCurrentTitle(TCHAR *title, int titleLen) { TCITEM tci{}; @@ -130,7 +130,7 @@ void TabBar::getCurrentTitle(TCHAR *title, int titleLen) ::SendMessage(_hSelf, TCM_GETITEM, getCurrentTabIndex(), reinterpret_cast(&tci)); } - +//ΪTabBarÖеÄÑ¡ÏÉèÖÃ×ÖÌå¡£¸ù¾ÝÌṩµÄ²ÎÊý´´½¨ÐÂ×ÖÌ壬²¢·¢ËÍÏûϢΪTabBarÉèÖøÃ×ÖÌå void TabBar::setFont(const TCHAR *fontName, int fontSize) { if (_hFont) @@ -147,7 +147,7 @@ void TabBar::setFont(const TCHAR *fontName, int fontSize) ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast(_hFont), 0); } - +//¼¤»îÖ¸¶¨Ë÷Òý´¦µÄÑ¡Ï¡£·¢ËÍÏûÏ¢ÒÔÈ·±£ÔÚTabBarÖ줻îÖ¸¶¨Ë÷Òý´¦µÄÑ¡Ï¡£ void TabBar::activateAt(int index) const { if (getCurrentTabIndex() != index) @@ -163,14 +163,14 @@ void TabBar::activateAt(int index) const } } - +//ɾ³ýÖ¸¶¨Ë÷Òý´¦µÄÑ¡Ï void TabBar::deletItemAt(size_t index) { if (index == _nbItem - 1) { //prevent invisible tabs. If last visible tab is removed, other tabs are put in view but not redrawn //Therefore, scroll one tab to the left if only one tab visible - if (_nbItem > 1) + if (_nbItem > 1)//ÖÁÉÙÁ½¸ö { RECT itemRect{}; ::SendMessage(_hSelf, TCM_GETITEMRECT, index, reinterpret_cast(&itemRect)); @@ -182,7 +182,7 @@ void TabBar::deletItemAt(size_t index) //There seems to be no negative effect on any internal state of the tab control or the up/down control int wParam = MAKEWPARAM(SB_THUMBPOSITION, index - 1); ::SendMessage(_hSelf, WM_HSCROLL, wParam, 0); - + //TabBar¿Ø¼þÏò×ó¹ö¶¯Ò»¸öTabÏîµÄλÖᣠwParam = MAKEWPARAM(SB_ENDSCROLL, index - 1); ::SendMessage(_hSelf, WM_HSCROLL, wParam, 0); } @@ -192,14 +192,14 @@ void TabBar::deletItemAt(size_t index) _nbItem--; } - +//ÉèÖÃTabBarÖеÄͼÏñÁÐ±í¡£Ê¹ÓÃTCM_SETIMAGELISTÏûÏ¢À´ÉèÖÃͼÏñÁÐ±í¡£ void TabBar::setImageList(HIMAGELIST himl) { _hasImgLst = true; ::SendMessage(_hSelf, TCM_SETIMAGELIST, 0, reinterpret_cast(himl)); } - +//µ÷ÕûTabBarµÄ´óСÒÔÊÊÓ¦¸ø¶¨µÄ¾ØÐÎÇøÓò¡£µ÷ÕûTabBarµÄÏÔʾ·½Ê½²¢¼ÆËãеĴóС£¬È»ºóµ÷ÕûÌṩµÄ¾ØÐÎÇøÓò¡£ void TabBar::reSizeTo(RECT & rc2Ajust) { RECT rowRect{}; @@ -208,6 +208,7 @@ void TabBar::reSizeTo(RECT & rc2Ajust) // Important to do that! // Otherwise, the window(s) it contains will take all the resouce of CPU // We don't need to resize the contained windows if they are even invisible anyway + //µ÷ÓÃdisplay·½·¨£¬¸ù¾Ýµ÷Õû¾ØÐεÄÓұ߽çÊÇ·ñ´óÓÚ10À´¾ö¶¨ÊÇ·ñÏÔʾTabBarÖеĴ°¿Ú display(rc2Ajust.right > 10); RECT rc = rc2Ajust; Window::reSizeTo(rc); @@ -226,7 +227,7 @@ void TabBar::reSizeTo(RECT & rc2Ajust) if (rowCount == 1) { style &= ~TCS_BUTTONS; - } + }// Èç¹ûÓжàÐÐTabÏÖÁÉÙÁ½ÐУ©£¬ÔòÆôÓÃTabCtrlµÄ°´Å¥Ñùʽ£¬²¢¼ÆËã¼ä¾àµÄÖµ else // (rowCount >= 2) { style |= TCS_BUTTONS; @@ -249,15 +250,19 @@ void TabBar::reSizeTo(RECT & rc2Ajust) } } - +//Ïú»ÙTabBarPlus¼°Æä×ÊÔ´¡£ void TabBarPlus::destroy() { TabBar::destroy(); ::DestroyWindow(_tooltips); _tooltips = NULL; } - - +/* +³õʼ»¯TabBarPlus¡£ +´´½¨TabControlºÍ¹¤¾ßÌáʾ´°¿Ú£¬²¢È·±£ËüÃÇÒѳɹ¦´´½¨¡£ +ÉèÖÃËùÐèµÄÑùʽ£¬²¢¸ù¾Ý²ÎÊý´´½¨ÏàÓ¦µÄ×ÖÌå¡£ +½«TabBarPlusÌí¼Óµ½¿Ø¼þÊý×éÖУ¬ÒÔ±ã¸ú×Ù¡£ +*/ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMultiLine) { Window::init(hInst, parent); @@ -290,7 +295,7 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult { throw std::runtime_error("TabBarPlus::init : CreateWindowEx() function return null"); } - + //¹¤¾ßÌáʾ _tooltips = ::CreateWindowEx( 0, TOOLTIPS_CLASS, @@ -306,7 +311,7 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult { throw std::runtime_error("TabBarPlus::init : tooltip CreateWindowEx() function return null"); } - + //°µÉ«Ö÷Ìâ NppDarkMode::setDarkTooltips(_tooltips, NppDarkMode::ToolTipsType::tooltip); ::SendMessage(_hSelf, TCM_SETTOOLTIPS, reinterpret_cast(_tooltips), 0); @@ -317,12 +322,13 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult _ctrlID = _nbCtrl; } else - { + {//²éÕÒµÚÒ»¸öΪ¿ÕµÄλÖ㬲¢ÉèÖÃ_ctrlIDΪ¸ÃλÖõÄÖµ int i = 0; bool found = false; for ( ; i < nbCtrlMax && !found ; ++i) if (!_hwndArray[i]) found = true; + //ÂúÁËδÕÒµ½£¬Ïú»Ù if (!found) { _ctrlID = -1; @@ -354,7 +360,7 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isMult _hVerticalLargeFont = CreateFontIndirect(&lfVer); } - +//´¦ÀíÑ¡Ï¿Ø¼þµÄ×Ô¶¨ÒåÌî³ä¡£ void TabBarPlus::doOwnerDrawTab() { ::SendMessage(_hwndArray[0], TCM_SETPADDING, 0, MAKELPARAM(6, 0)); @@ -363,6 +369,7 @@ void TabBarPlus::doOwnerDrawTab() if (_hwndArray[i]) { LONG_PTR style = ::GetWindowLongPtr(_hwndArray[i], GWL_STYLE); + //¼ì²éÊÇ·ñÐèÒª×Ô¶¨Òå if (isOwnerDrawTab()) style |= TCS_OWNERDRAWFIXED; else @@ -378,7 +385,7 @@ void TabBarPlus::doOwnerDrawTab() } } - +//¸ù¾Ý¸ø¶¨µÄË÷ÒýΪѡÏÀ¸ÉèÖò»Í¬µÄÑÕÉ«(Èç»î¶¯Îı¾ÑÕÉ«¡¢±³¾°ÑÕÉ«µÈ)¡£ÔÚ¸üÐÂÑÕɫ֮ºó£¬Ëüµ÷ÓÃdoOwnerDrawTab()À´Ë¢ÐÂÏÔʾ¡£ void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i) { switch (i) @@ -404,7 +411,7 @@ void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i) doOwnerDrawTab(); } - +//ÉèÖô¹Ö±Ñ¡Ï void TabBarPlus::doVertical() { for (int i = 0 ; i < _nbCtrl ; ++i) @@ -414,7 +421,7 @@ void TabBarPlus::doVertical() } } - +//ÏÔʾ¶àÐÐÑ¡Ï void TabBarPlus::doMultiLine() { for (int i = 0 ; i < _nbCtrl ; ++i) @@ -423,7 +430,7 @@ void TabBarPlus::doMultiLine() SendMessage(_hwndArray[i], WM_TABSETSTYLE, isMultiLine(), TCS_MULTILINE); } } - +//Ïò¸¸´°¿Ú·¢ËÍ֪ͨÏûÏ¢£¬ÆäÖаüº¬ÓйØÑ¡ÏË÷ÒýºÍÌØ¶¨Í¨Öª´úÂëµÄÐÅÏ¢¡£ void TabBarPlus::notify(int notifyCode, int tabIndex) { TBHDR nmhdr{}; @@ -433,7 +440,7 @@ void TabBarPlus::notify(int notifyCode, int tabIndex) nmhdr._tabOrigin = tabIndex; ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); } - +//Æô¶¯¶ÔÑ¡ÏÀ¸¿Ø¼þÉϵÄÊó±êʼþµÄ¸ú×Ù£¬ÀýÈçµ±Êó±ê½øÈë»òÀ뿪¿Ø¼þÇøÓòʱ¡£ void TabBarPlus::trackMouseEvent(DWORD event2check) { TRACKMOUSEEVENT tme = {}; @@ -442,12 +449,13 @@ void TabBarPlus::trackMouseEvent(DWORD event2check) tme.hwndTrack = _hSelf; TrackMouseEvent(&tme); } - +//ÏûÏ¢´¦Àí£¬´¦Àí´°¿ÚÏûÏ¢ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { // Custom window message to change tab control style on the fly + //¸Ä±ä´°¿ÚÑùʽ case WM_TABSETSTYLE: { LONG_PTR style = ::GetWindowLongPtr(hwnd, GWL_STYLE); @@ -465,13 +473,13 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara return TRUE; } - + //Éîɫģʽ case NPPM_INTERNAL_REFRESHDARKMODE: { NppDarkMode::setDarkTooltips(hwnd, NppDarkMode::ToolTipsType::tabbar); return TRUE; } - + //Êó±ê¹öÂÖ case WM_MOUSEWHEEL: { // .............................................................................. @@ -489,7 +497,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara // CTRL + SHIFT + MOUSEWHEEL: // will switch to the first/last tab // .............................................................................. - + //ÊÇ·ñ±»Í϶¯£¬ÈçÊÇ£¬»á½»»»µ±Ç°Êó±êËùÔÚλÖúÍÄ¿±êλÖõÄÊý¾Ý if (_isDragging) return TRUE; @@ -581,7 +589,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara } return TRUE; } - + //×ó¼ü°´Ï case WM_LBUTTONDOWN : { if (::GetWindowLongPtr(_hSelf, GWL_STYLE) & TCS_BUTTONS) @@ -592,7 +600,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara setActiveTab(nTab); } } - + //ÊÇ·ñ¹Ø±Õ if (_drawTabCloseButton) { int xPos = LOWORD(lParam); @@ -621,7 +629,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara return TRUE; } - + //ÓÒ¼ü°´Ï£¬´¦ÀíÑ¡Ïî case WM_RBUTTONDOWN : //rightclick selects tab aswell { // TCS_BUTTONS doesn't select the tab @@ -637,7 +645,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); return TRUE; } - + //Êó±êÒÆ¶¯ case WM_MOUSEMOVE : { if (_mightBeDragging && !_isDragging) @@ -670,7 +678,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara POINT p{}; p.x = LOWORD(lParam); p.y = HIWORD(lParam); - + //ÊÇ·ñÍ϶¯tag£¬ÊÇ£¬¹â±êÒÆ¶¯£¬tabÊý¾Ý½»»»£¬·ñ£¬Åжϲ¢½øÐÐÏà¹Ø²Ù×÷ if (_isDragging) { exchangeItemData(p); @@ -758,7 +766,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara break; } - + //Êó±êÒÆ¿ª£¬ÖØ»æÊó±êÇøÓò£¬ÖØÖÃÏà¹Ø±äÁ¿ case WM_MOUSELEAVE: { if (_isCloseHover) @@ -772,7 +780,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara notify(TCN_MOUSELEAVING, _currentHoverTabItem); break; } - + //ÊÍ·Å×ó¼ü£¬¸æÖª²Ù×÷½áÊø case WM_LBUTTONUP : { _mightBeDragging = false; @@ -820,7 +828,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara break; } - + //ץȡÊó±êÊäÈëµÄ¸Ä±ä case WM_CAPTURECHANGED : { if (_isDragging) @@ -830,20 +838,20 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara } break; } - + //ÖØ»ætab case WM_DRAWITEM : { drawItem((DRAWITEMSTRUCT *)lParam); return TRUE; } - + //ÊÇ·ñ°´ÏÂcontrol¼ü case WM_KEYDOWN : { if (wParam == VK_LCONTROL) ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_PLUS_TAB))); return TRUE; } - + //Êó±êÖмüÊÍ·Å case WM_MBUTTONUP: { int xPos = LOWORD(lParam); @@ -852,7 +860,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara notify(TCN_TABDELETE, currentTabOn); return TRUE; } - + //Ë«»÷Êó±ê×ó¼ü case WM_LBUTTONDBLCLK: { if (_isDbClk2Close) @@ -864,7 +872,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara } return TRUE; } - + //Èç¹û³ÌÐòÕýÔÚʹÓðµºÚģʽ£¬½«»áÓÃÖ¸¶¨µÄ»­Ë¢Ìî³äÕû¸öTabµÄ¿Í»§Çø£¬´úÌæÁËϵͳĬÈϵÄÏðÆ¤²Á±³¾°²Ù×÷¡£ case WM_ERASEBKGND: { if (!NppDarkMode::isEnabled()) @@ -878,7 +886,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara return 1; } - + //ÔÚTab¿Ø¼þÐèÒªÖØ»æÊ±µ÷Óã¬ÕâÀï»á½øÐдóÁ¿µÄ»æÖƲÙ×÷£¬ÄÚÈݰüÀ¨Tab±¾ÉíºÍÿһ¸öTabµÄÎÄ×Ö¡¢¹Ø±Õ°´Å¥µÈÔªËØ¡£ case WM_PAINT: { if (!NppDarkMode::isEnabled()) @@ -1049,7 +1057,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); } - +//ʵÏÖÁËTabµÄ»æÖƹý³Ì£¬°üÀ¨¶ÔTab±³¾°ÑÕÉ«¡¢ÎÄ×ÖÑÕÉ«µÄµ÷Õû£¬Åжϲ¢´¦Àíµ±Ç°TabµÄ¼¤»î״̬£¬´¦ÀíTabµÄͼ±êºÍ±êÌâµÈ¡£ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode) { RECT rect = pDrawItemStruct->rcItem; @@ -1371,7 +1379,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct, bool isDarkMode) ::RestoreDC(hDC, nSavedDC); } - +//ÓÃÓڸıäÊó±ê¹â±êµÄÐÎ×´£¬¸ù¾ÝÓû§ÍÐ×§±êÇ©µÄ²»Í¬Î»Öã¨ÊÇ·ñÔÚͬһӦÓÃÖС¢ÊÇ·ñÔÚÒ»¸öÓÐЧµÄ·ÅÖÃλÖõȣ©±íÏÖΪ²»Í¬µÄ¹â±êÐÎ×´¡£ void TabBarPlus::draggingCursor(POINT screenPoint) { HWND hWin = ::WindowFromPoint(screenPoint); @@ -1394,7 +1402,7 @@ void TabBarPlus::draggingCursor(POINT screenPoint) ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_OUT_TAB))); } } - +//¼òµ¥µØ°ÑÖ¸¶¨µÄ±êÇ©ÉèΪ»î¶¯×´Ì¬¡£ void TabBarPlus::setActiveTab(int tabIndex) { // TCM_SETCURFOCUS is busted on WINE/ReactOS for single line (non-TCS_BUTTONS) tabs... @@ -1407,7 +1415,7 @@ void TabBarPlus::setActiveTab(int tabIndex) ::SendMessage(_hSelf, TCM_SETCURSEL, tabIndex, 0); notify(TCN_SELCHANGE, tabIndex); } - +//½»»»Á½¸öTabµÄÊý¾Ý£¬ÊµÏÖÁ½¸öTabµÄλÖý»»»¡£ void TabBarPlus::exchangeTabItemData(int oldTab, int newTab) { //1. shift their data, and insert the source @@ -1449,7 +1457,7 @@ void TabBarPlus::exchangeTabItemData(int oldTab, int newTab) //2. set to focus setActiveTab(newTab); } - +//ÔÚ½ÓÊÕµ½Êó±êÍÐ×§ÏûÏ¢µÄʱºò±»µ÷Óã¬ÓÃÓÚ¸÷¸ö±êÇ©µÄÅÅÐòºÍ½»»»Î»Öᣠvoid TabBarPlus::exchangeItemData(POINT point) { // Find the destination tab... @@ -1486,7 +1494,7 @@ void TabBarPlus::exchangeItemData(POINT point) } - +//ÓÃÓÚ´¦ÀíÓë¹Ø±Õ°´Å¥Ïà¹ØµÄ²Ù×÷£¬Èç»ñÈ¡¹Ø±Õ°´Å¥µÄ´óС¼°Î»Öã¬ÅжÏÊÇ·ñµã»÷µ½Á˹رհ´Å¥µÈ¡£ CloseButtonZone::CloseButtonZone() { // TODO: get width/height of close button dynamically