diff --git a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp index 98837ec8..a405dc65 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp +++ b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp @@ -133,7 +133,14 @@ BOOL CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPar popupMenuCmd(LOWORD(wParam)); break; } - +/* +#define NPPM_INTERNAL_ISDRAGGING 40926 + case NPPM_INTERNAL_ISDRAGGING: + { + setDraggingBool(true); + break; + } +*/ case WM_DESTROY: { _treeView.destroy(); @@ -207,6 +214,8 @@ void ProjectPanel::initMenus() edit_remove = pNativeSpeaker->getProjectPanelLangMenuStr("FolderMenu", IDM_PROJECT_DELETEFOLDER, PM_EDITREMOVE); _hFolderMenu = ::CreatePopupMenu(); + ::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEUP, TEXT("Move Up")); + ::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEDOWN, TEXT("Move Down")); ::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, edit_rename.c_str()); ::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, edit_addfolder.c_str()); ::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, edit_addfiles.c_str()); @@ -218,6 +227,8 @@ void ProjectPanel::initMenus() generic_string edit_modifyfile = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_MODIFYFILEPATH, PM_EDITMODIFYFILE); _hFileMenu = ::CreatePopupMenu(); + ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEUP, TEXT("Move Up")); + ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MOVEDOWN, TEXT("Move Down")); ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, edit_rename.c_str()); ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFILE, edit_remove.c_str()); ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_MODIFYFILEPATH, edit_modifyfile.c_str()); @@ -701,7 +712,7 @@ void ProjectPanel::showContextMenu(int x, int y) if(tvHitInfo.hItem != NULL) { // Make item selected - TreeView_SelectItem(_treeView.getHSelf(), tvHitInfo.hItem); + _treeView.selectItem(tvHitInfo.hItem); // get clicked item type NodeType nodeType = getNodeType(tvHitInfo.hItem); @@ -830,7 +841,21 @@ void ProjectPanel::popupMenuCmd(int cmdID) setWorkSpaceDirty(true); } break; - + + case IDM_PROJECT_MOVEDOWN : + { + _treeView.moveDown(hTreeItem); + setWorkSpaceDirty(true); + } + break; + + case IDM_PROJECT_MOVEUP : + { + _treeView.moveUp(hTreeItem); + setWorkSpaceDirty(true); + } + break; + case IDM_PROJECT_ADDFILES : { addFiles(hTreeItem); @@ -920,7 +945,7 @@ void ProjectPanel::popupMenuCmd(int cmdID) case IDM_PROJECT_DELETEFOLDER : { - HTREEITEM parent = TreeView_GetParent(_treeView.getHSelf(), hTreeItem); + HTREEITEM parent = _treeView.getParent(hTreeItem); if (_treeView.getChildFrom(hTreeItem) != NULL) { @@ -943,7 +968,7 @@ void ProjectPanel::popupMenuCmd(int cmdID) case IDM_PROJECT_DELETEFILE : { - HTREEITEM parent = TreeView_GetParent(_treeView.getHSelf(), hTreeItem); + HTREEITEM parent = _treeView.getParent(hTreeItem); TCHAR str2display[MAX_PATH] = TEXT("Are you sure to remove this file from the project?"); if (::MessageBox(_hSelf, str2display, TEXT("Remove file from projet"), MB_YESNO) == IDYES) diff --git a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h index 10cdae5c..b4776c44 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h +++ b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h @@ -90,7 +90,15 @@ public: return _isDirty; }; void checkIfNeedSave(const TCHAR *title); +/* + HWND getTreeHandle() { + return _treeView.getHSelf(); + }; + void setDraggingBool(bool val){ + _treeView.setDraggingBool(val); + }; +*/ protected: TreeView _treeView; HIMAGELIST _hImaLst; diff --git a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h index d58e4c65..f0dfd975 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h +++ b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h @@ -28,6 +28,8 @@ #define IDM_PROJECT_DELETEFILE (IDD_PROJECTPANEL_MENU + 5) #define IDM_PROJECT_MODIFYFILEPATH (IDD_PROJECTPANEL_MENU + 6) #define IDM_PROJECT_ADDFILESRECUSIVELY (IDD_PROJECTPANEL_MENU + 7) + #define IDM_PROJECT_MOVEUP (IDD_PROJECTPANEL_MENU + 8) + #define IDM_PROJECT_MOVEDOWN (IDD_PROJECTPANEL_MENU + 9) #define IDD_PROJECTPANEL_MENUWS (IDD_PROJECTPANEL + 20) #define IDM_PROJECT_NEWPROJECT (IDD_PROJECTPANEL_MENUWS + 1) diff --git a/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp b/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp index bc3eaf1f..d37769b2 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp +++ b/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp @@ -218,13 +218,6 @@ void TreeView::dragItem(HWND parentHandle, int x, int y) HTREEITEM targetItem = (HTREEITEM)::SendMessage(_hSelf, TVM_HITTEST, (WPARAM)0, (LPARAM)&hitTestInfo); if(targetItem) { - /* - if (canBeDropped(_draggedItem, targetItem)) - // highlight the target of drag-and-drop operation - ::SendMessage(_hSelf, TVM_SELECTITEM, (WPARAM)(TVGN_DROPHILITE), (LPARAM)targetItem); - else - SendMessage(_hSelf,TVM_SELECTITEM,TVGN_CARET,(LPARAM)targetItem); - */ ::SendMessage(_hSelf, TVM_SELECTITEM, (WPARAM)(TVGN_DROPHILITE), (LPARAM)targetItem); } @@ -285,7 +278,7 @@ bool TreeView::isDescendant(HTREEITEM targetItem, HTREEITEM draggedItem) if (TreeView_GetRoot(_hSelf) == targetItem) return false; - HTREEITEM parent = TreeView_GetParent(_hSelf, targetItem); + HTREEITEM parent = getParent(targetItem); if (parent == draggedItem) return true; @@ -294,7 +287,7 @@ bool TreeView::isDescendant(HTREEITEM targetItem, HTREEITEM draggedItem) bool TreeView::isParent(HTREEITEM targetItem, HTREEITEM draggedItem) { - HTREEITEM parent = TreeView_GetParent(_hSelf, draggedItem); + HTREEITEM parent = getParent(draggedItem); if (parent == targetItem) return true; return false; @@ -323,6 +316,95 @@ void TreeView::moveTreeViewItem(HTREEITEM draggedItem, HTREEITEM targetItem) removeItem(draggedItem); } +bool TreeView::moveDown(HTREEITEM itemToMove) +{ + HTREEITEM hItemToUp = getNextSibling(itemToMove); + if (!hItemToUp) + return false; + return swapTreeViewItem(itemToMove, hItemToUp); +} + +bool TreeView::moveUp(HTREEITEM itemToMove) +{ + HTREEITEM hItemToDown = getPrevSibling(itemToMove); + if (!hItemToDown) + return false; + return swapTreeViewItem(hItemToDown, itemToMove); +} + +bool TreeView::swapTreeViewItem(HTREEITEM itemGoDown, HTREEITEM itemGoUp) +{ + HTREEITEM selectedItem = getSelection(); + int itemSelected = selectedItem == itemGoDown?1:(selectedItem == itemGoUp?2:0); + + // get previous and next for both items with () function + HTREEITEM itemTop = getPrevSibling(itemGoDown); + itemTop = itemTop?itemTop:(HTREEITEM)TVI_FIRST; + //HTREEITEM itemBottom = getNextSibling(itemGoUp); + HTREEITEM parentGoDown = getParent(itemGoDown); + HTREEITEM parentGoUp = getParent(itemGoUp); + + if (parentGoUp != parentGoDown) + return false; + + // get both item infos + TCHAR textBufferUp[MAX_PATH]; + TCHAR textBufferDown[MAX_PATH]; + TVITEM tvUpItem; + TVITEM tvDownItem; + tvUpItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; + tvDownItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; + tvUpItem.pszText = textBufferUp; + tvDownItem.pszText = textBufferDown; + tvUpItem.cchTextMax = MAX_PATH; + tvDownItem.cchTextMax = MAX_PATH; + tvUpItem.hItem = itemGoUp; + tvDownItem.hItem = itemGoDown; + SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvUpItem); + SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvDownItem); + + // make copy recursively for both items + + if (tvUpItem.lParam) + tvUpItem.lParam = (LPARAM)(new generic_string(*((generic_string *)(tvUpItem.lParam)))); + if (tvDownItem.lParam) + tvDownItem.lParam = (LPARAM)(new generic_string(*((generic_string *)(tvDownItem.lParam)))); + + // add 2 new items + TVINSERTSTRUCT tvInsertUp; + tvInsertUp.item = tvUpItem; + tvInsertUp.hInsertAfter = itemTop; + tvInsertUp.hParent = parentGoUp; + HTREEITEM hTreeParent1stInserted = (HTREEITEM)::SendMessage(_hSelf, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvInsertUp); + dupTree(itemGoUp, hTreeParent1stInserted); + + TVINSERTSTRUCT tvInsertDown; + tvInsertDown.item = tvDownItem; + tvInsertDown.hInsertAfter = hTreeParent1stInserted; + tvInsertDown.hParent = parentGoDown; + HTREEITEM hTreeParent2ndInserted = (HTREEITEM)::SendMessage(_hSelf, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvInsertDown); + dupTree(itemGoDown, hTreeParent2ndInserted); + + // remove 2 old items + removeItem(itemGoUp); + removeItem(itemGoDown); + + // Restore the selection if needed + if (itemSelected != 0) + { + if (itemSelected == 1) + { + selectItem(hTreeParent2ndInserted); + } + else if (itemSelected == 2) + { + selectItem(hTreeParent1stInserted); + } + } + return true; +} + + bool TreeView::canDropIn(HTREEITEM targetItem) { TVITEM tvItem; diff --git a/PowerEditor/src/WinControls/ProjectPanel/TreeView.h b/PowerEditor/src/WinControls/ProjectPanel/TreeView.h index 075079a0..2776ed03 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/TreeView.h +++ b/PowerEditor/src/WinControls/ProjectPanel/TreeView.h @@ -38,12 +38,21 @@ public: HTREEITEM getSelection() const { return TreeView_GetSelection(_hSelf); }; + bool selectItem(HTREEITEM hTreeItem2Select) const { + return TreeView_SelectItem(_hSelf, hTreeItem2Select) == TRUE; + }; HTREEITEM getRoot() const { return TreeView_GetRoot(_hSelf); }; + HTREEITEM getParent(HTREEITEM hItem) const { + return TreeView_GetParent(_hSelf, hItem); + }; HTREEITEM getNextSibling(HTREEITEM hItem) const { return TreeView_GetNextSibling(_hSelf, hItem); }; + HTREEITEM getPrevSibling(HTREEITEM hItem) const { + return TreeView_GetPrevSibling(_hSelf, hItem); + }; void expand(HTREEITEM hItem) const { TreeView_Expand(_hSelf, hItem, TVE_EXPAND); }; @@ -66,6 +75,14 @@ public: void addCanNotDragOutList(int val2set) { _canNotDragOutList.push_back(val2set); }; +/* + void setDraggingBool(bool val){ + _isItemDragged = val; + }; +*/ + bool moveDown(HTREEITEM itemToMove); + bool moveUp(HTREEITEM itemToMove); + bool swapTreeViewItem(HTREEITEM itemGoDown, HTREEITEM itemGoUp); protected: WNDPROC _defaultProc;