INT_PTR CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG : { ProjectPanel::initMenus(); // Create toolbar menu int style = WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_AUTOSIZE | TBSTYLE_FLAT | TBSTYLE_LIST; _hToolbarMenu = CreateWindowEx(0,TOOLBARCLASSNAME,NULL, style, 0,0,0,0,_hSelf,(HMENU)0, _hInst, NULL); TBBUTTON tbButtons[2]; NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker(); generic_string workspace_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 0, PM_WORKSPACEMENUENTRY); generic_string edit_entry = pNativeSpeaker->getProjectPanelLangMenuStr("Entries", 1, PM_EDITMENUENTRY); tbButtons[0].idCommand = IDB_PROJECT_BTN; tbButtons[0].iBitmap = I_IMAGENONE; tbButtons[0].fsState = TBSTATE_ENABLED; tbButtons[0].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE; tbButtons[0].iString = (INT_PTR)workspace_entry.c_str(); tbButtons[1].idCommand = IDB_EDIT_BTN; tbButtons[1].iBitmap = I_IMAGENONE; tbButtons[1].fsState = TBSTATE_ENABLED; tbButtons[1].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE; tbButtons[1].iString = (INT_PTR)edit_entry.c_str(); SendMessage(_hToolbarMenu, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); SendMessage(_hToolbarMenu, TB_ADDBUTTONS, (WPARAM)sizeof(tbButtons) / sizeof(TBBUTTON), (LPARAM)&tbButtons); SendMessage(_hToolbarMenu, TB_AUTOSIZE, 0, 0); ShowWindow(_hToolbarMenu, SW_SHOW); _treeView.init(_hInst, _hSelf, ID_PROJECTTREEVIEW); setImageList(IDI_PROJECT_WORKSPACE, IDI_PROJECT_WORKSPACEDIRTY, IDI_PROJECT_PROJECT, IDI_PROJECT_FOLDEROPEN, IDI_PROJECT_FOLDERCLOSE, IDI_PROJECT_FILE, IDI_PROJECT_FILEINVALID); _treeView.addCanNotDropInList(INDEX_LEAF); _treeView.addCanNotDropInList(INDEX_LEAF_INVALID); _treeView.addCanNotDragOutList(INDEX_CLEAN_ROOT); _treeView.addCanNotDragOutList(INDEX_DIRTY_ROOT); _treeView.addCanNotDragOutList(INDEX_PROJECT); _treeView.display(); if (!openWorkSpace(_workSpaceFilePath.c_str())) newWorkSpace(); return TRUE; } case WM_MOUSEMOVE: if (_treeView.isDragging()) _treeView.dragItem(_hSelf, LOWORD(lParam), HIWORD(lParam)); break; case WM_LBUTTONUP: if (_treeView.isDragging()) if (_treeView.dropItem()) setWorkSpaceDirty(true); break; case WM_NOTIFY: { notified((LPNMHDR)lParam); } return TRUE; case WM_SIZE: { int width = LOWORD(lParam); int height = HIWORD(lParam); RECT toolbarMenuRect; ::GetClientRect(_hToolbarMenu, &toolbarMenuRect); ::MoveWindow(_hToolbarMenu, 0, 0, width, toolbarMenuRect.bottom, TRUE); HWND hwnd = _treeView.getHSelf(); if (hwnd) ::MoveWindow(hwnd, 0, toolbarMenuRect.bottom + 2, width, height - toolbarMenuRect.bottom - 2, TRUE); break; } case WM_CONTEXTMENU: if (!_treeView.isDragging()) showContextMenu(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return TRUE; case WM_COMMAND: { popupMenuCmd(LOWORD(wParam)); break; } case WM_DESTROY: { _treeView.destroy(); destroyMenus(); ::DestroyWindow(_hToolbarMenu); break; } case WM_KEYDOWN: //if (wParam == VK_F2) { ::MessageBoxA(NULL,"vkF2","",MB_OK); } break; default : return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } return DockingDlgInterface::run_dlgProc(message, wParam, lParam); }
void ProjectPanel::notified(LPNMHDR notification) { if ((notification->hwndFrom == _treeView.getHSelf())) { TCHAR textBuffer[MAX_PATH]; TVITEM tvItem; tvItem.mask = TVIF_TEXT | TVIF_PARAM; tvItem.pszText = textBuffer; tvItem.cchTextMax = MAX_PATH; switch (notification->code) { case NM_DBLCLK: { openSelectFile(); } break; case TVN_ENDLABELEDIT: { LPNMTVDISPINFO tvnotif = (LPNMTVDISPINFO)notification; if (!tvnotif->item.pszText) return; if (getNodeType(tvnotif->item.hItem) == nodeType_root) return; // Processing for only File case if (tvnotif->item.lParam) { // Get the old label tvItem.hItem = _treeView.getSelection(); ::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem); size_t len = lstrlen(tvItem.pszText); // Find the position of old label in File path generic_string *filePath = (generic_string *)tvnotif->item.lParam; size_t found = filePath->rfind(tvItem.pszText); // If found the old label, replace it with the modified one if (found != generic_string::npos) filePath->replace(found, len, tvnotif->item.pszText); // Check the validity of modified file path tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (::PathFileExists(filePath->c_str())) { tvItem.iImage = INDEX_LEAF; tvItem.iSelectedImage = INDEX_LEAF; } else { tvItem.iImage = INDEX_LEAF_INVALID; tvItem.iSelectedImage = INDEX_LEAF_INVALID; } TreeView_SetItem(_treeView.getHSelf(), &tvItem); } // For File, Folder and Project ::SendMessage(_treeView.getHSelf(), TVM_SETITEM, 0,(LPARAM)(&(tvnotif->item))); setWorkSpaceDirty(true); } break; case TVN_GETINFOTIP: { LPNMTVGETINFOTIP lpGetInfoTip = (LPNMTVGETINFOTIP)notification; generic_string *str = NULL ; if (_treeView.getRoot() == lpGetInfoTip->hItem) { str = &_workSpaceFilePath; } else { str = (generic_string *)lpGetInfoTip->lParam; if (!str) return; } lpGetInfoTip->pszText = (LPTSTR)str->c_str(); lpGetInfoTip->cchTextMax = str->size(); } break; case TVN_KEYDOWN: { //tvItem.hItem = _treeView.getSelection(); //::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem); LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)notification; if (ptvkd->wVKey == VK_DELETE) { HTREEITEM hItem = _treeView.getSelection(); NodeType nType = getNodeType(hItem); if (nType == nodeType_project || nType == nodeType_folder) popupMenuCmd(IDM_PROJECT_DELETEFOLDER); else if (nType == nodeType_file) popupMenuCmd(IDM_PROJECT_DELETEFILE); } else if (ptvkd->wVKey == VK_RETURN) { HTREEITEM hItem = _treeView.getSelection(); NodeType nType = getNodeType(hItem); if (nType == nodeType_file) openSelectFile(); else _treeView.toggleExpandCollapse(hItem); } else if (ptvkd->wVKey == VK_UP) { if (0x80 & GetKeyState(VK_CONTROL)) { popupMenuCmd(IDM_PROJECT_MOVEUP); } } else if (ptvkd->wVKey == VK_DOWN) { if (0x80 & GetKeyState(VK_CONTROL)) { popupMenuCmd(IDM_PROJECT_MOVEDOWN); } } else if (ptvkd->wVKey == VK_F2) popupMenuCmd(IDM_PROJECT_RENAME); } break; case TVN_ITEMEXPANDED: { LPNMTREEVIEW nmtv = (LPNMTREEVIEW)notification; tvItem.hItem = nmtv->itemNew.hItem; tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; if (getNodeType(nmtv->itemNew.hItem) == nodeType_folder) { if (nmtv->action == TVE_COLLAPSE) { _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_CLOSED_NODE, INDEX_CLOSED_NODE); } else if (nmtv->action == TVE_EXPAND) { _treeView.setItemImage(nmtv->itemNew.hItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE); } } } break; case TVN_BEGINDRAG: { //printStr(TEXT("hello")); _treeView.beginDrag((LPNMTREEVIEW)notification); } break; } } }
INT_PTR CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG : { FileBrowser::initPopupMenus(); _treeView.init(_hInst, _hSelf, ID_FILEBROWSERTREEVIEW); setImageList(IDI_PROJECT_WORKSPACE, IDI_PROJECT_WORKSPACEDIRTY, IDI_PROJECT_PROJECT, IDI_PROJECT_FOLDEROPEN, IDI_PROJECT_FOLDERCLOSE, IDI_PROJECT_FILE, IDI_PROJECT_FILEINVALID); _treeView.addCanNotDropInList(INDEX_OPEN_ROOT); _treeView.addCanNotDropInList(INDEX_CLOSE_ROOT); _treeView.addCanNotDropInList(INDEX_OPEN_NODE); _treeView.addCanNotDropInList(INDEX_CLOSED_NODE); _treeView.addCanNotDropInList(INDEX_LEAF); _treeView.addCanNotDropInList(INDEX_LEAF_INVALID); _treeView.addCanNotDragOutList(INDEX_OPEN_ROOT); _treeView.addCanNotDragOutList(INDEX_CLOSE_ROOT); _treeView.addCanNotDragOutList(INDEX_OPEN_NODE); _treeView.addCanNotDragOutList(INDEX_CLOSED_NODE); _treeView.addCanNotDragOutList(INDEX_LEAF); _treeView.addCanNotDragOutList(INDEX_LEAF_INVALID); _treeView.makeLabelEditable(false); _treeView.display(); return TRUE; } case WM_MOUSEMOVE: if (_treeView.isDragging()) _treeView.dragItem(_hSelf, LOWORD(lParam), HIWORD(lParam)); break; case WM_LBUTTONUP: if (_treeView.isDragging()) if (_treeView.dropItem()) { } break; case WM_NOTIFY: { notified((LPNMHDR)lParam); } return TRUE; case WM_SIZE: { int width = LOWORD(lParam); int height = HIWORD(lParam); HWND hwnd = _treeView.getHSelf(); if (hwnd) ::MoveWindow(hwnd, 0, 0, width, height, TRUE); break; } case WM_CONTEXTMENU: if (!_treeView.isDragging()) showContextMenu(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return TRUE; case WM_COMMAND: { popupMenuCmd(LOWORD(wParam)); break; } case WM_DESTROY: { _treeView.destroy(); destroyMenus(); break; } case FB_ADDFILE: { const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam; generic_string separator = TEXT("\\\\"); size_t sepPos = file2Change[0].find(separator); if (sepPos == generic_string::npos) return false; generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1); // remove prefix of file/folder in changeInfo, splite the remained path vector<generic_string> linarPathArray = split(pathSuffix, '\\'); generic_string rootPath = file2Change[0].substr(0, sepPos); generic_string path = rootPath; generic_string addedFilePath = file2Change[0].substr(0, sepPos + 1); addedFilePath += pathSuffix; bool isAdded = addInTree(rootPath, addedFilePath, nullptr, linarPathArray); if (not isAdded) { //MessageBox(NULL, addedFilePath.c_str(), TEXT("file/folder is not added"), MB_OK); } break; } case FB_RMFILE: { const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam; generic_string separator = TEXT("\\\\"); size_t sepPos = file2Change[0].find(separator); if (sepPos == generic_string::npos) return false; generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1); // remove prefix of file/folder in changeInfo, splite the remained path vector<generic_string> linarPathArray = split(pathSuffix, '\\'); generic_string rootPath = file2Change[0].substr(0, sepPos); // search recursively and modify the tree structure bool isRemoved = deleteFromTree(rootPath, nullptr, linarPathArray); if (not isRemoved) { //MessageBox(NULL, file2Change[0].c_str(), TEXT("file/folder is not removed"), MB_OK); } break; } case FB_RNFILE: { const std::vector<generic_string> file2Change = *(std::vector<generic_string> *)lParam; generic_string separator = TEXT("\\\\"); size_t sepPos = file2Change[0].find(separator); if (sepPos == generic_string::npos) return false; generic_string pathSuffix = file2Change[0].substr(sepPos + separator.length(), file2Change[0].length() - 1); // remove prefix of file/folder in changeInfo, splite the remained path vector<generic_string> linarPathArray = split(pathSuffix, '\\'); generic_string rootPath = file2Change[0].substr(0, sepPos); size_t sepPos2 = file2Change[1].find(separator); if (sepPos2 == generic_string::npos) return false; generic_string pathSuffix2 = file2Change[1].substr(sepPos2 + separator.length(), file2Change[1].length() - 1); vector<generic_string> linarPathArray2 = split(pathSuffix2, '\\'); bool isRenamed = renameInTree(rootPath, nullptr, linarPathArray, linarPathArray2); if (not isRenamed) { //MessageBox(NULL, file2Change[0].c_str(), TEXT("file/folder is not removed"), MB_OK); } break; } default : return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } return DockingDlgInterface::run_dlgProc(message, wParam, lParam); }