From 8daa455c0d096cae6cc02697fa06e63c396bd6cd Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 31 Oct 2011 01:25:40 +0000 Subject: [PATCH] [NEW_FEATURE] Add "adding files from folder" for Project Manager. git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@833 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/src/MISC/Common/Common.cpp | 38 +++++ PowerEditor/src/MISC/Common/Common.h | 1 + PowerEditor/src/Notepad_plus.cpp | 5 +- .../WinControls/ProjectPanel/ProjectPanel.cpp | 136 +++++++++++++++++- .../WinControls/ProjectPanel/ProjectPanel.h | 8 ++ .../WinControls/ProjectPanel/ProjectPanel.rc | 2 +- .../ProjectPanel/ProjectPanel_rc.h | 3 +- .../src/WinControls/ProjectPanel/TreeView.cpp | 34 ++++- 8 files changed, 216 insertions(+), 11 deletions(-) diff --git a/PowerEditor/src/MISC/Common/Common.cpp b/PowerEditor/src/MISC/Common/Common.cpp index ef40be798..29a0cd545 100644 --- a/PowerEditor/src/MISC/Common/Common.cpp +++ b/PowerEditor/src/MISC/Common/Common.cpp @@ -99,6 +99,44 @@ void folderBrowser(HWND parent, int outputCtrlID, const TCHAR *defaultStr) } } + +generic_string getFolderName(HWND parent) +{ + generic_string folderName(TEXT("")); + LPMALLOC pShellMalloc = 0; + if (::SHGetMalloc(&pShellMalloc) == NO_ERROR) + { + BROWSEINFO info; + memset(&info, 0, sizeof(info)); + info.hwndOwner = parent; + info.pidlRoot = NULL; + TCHAR szDisplayName[MAX_PATH]; + info.pszDisplayName = szDisplayName; + info.lpszTitle = TEXT("Select a folder"); + info.ulFlags = 0; + info.lpfn = BrowseCallbackProc; + + // Execute the browsing dialog. + LPITEMIDLIST pidl = ::SHBrowseForFolder(&info); + + // pidl will be null if they cancel the browse dialog. + // pidl will be not null when they select a folder. + if (pidl) + { + // Try to convert the pidl to a display generic_string. + // Return is true if success. + TCHAR szDir[MAX_PATH]; + if (::SHGetPathFromIDList(pidl, szDir)) + // Set edit control to the directory path. + folderName = szDir; + pShellMalloc->Free(pidl); + } + pShellMalloc->Release(); + } + return folderName; +} + + void ClientRectToScreenRect(HWND hWnd, RECT* rect) { POINT pt; diff --git a/PowerEditor/src/MISC/Common/Common.h b/PowerEditor/src/MISC/Common/Common.h index dbe799e70..ccc684d07 100644 --- a/PowerEditor/src/MISC/Common/Common.h +++ b/PowerEditor/src/MISC/Common/Common.h @@ -74,6 +74,7 @@ const bool dirDown = false; typedef std::basic_string generic_string; void folderBrowser(HWND parent, int outputCtrlID, const TCHAR *defaultStr = NULL); +generic_string getFolderName(HWND parent); void printInt(int int2print); void printStr(const TCHAR *str2print); diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 6a83c550d..6769f592b 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -1074,7 +1074,7 @@ void Notepad_plus::getMatchedFileNames(const TCHAR *dir, const vectorcreate(&data); + data.pszName = TEXT("ST"); ::SendMessage(_pPublicInterface->getHSelf(), NPPM_MODELESSDIALOG, MODELESSDIALOGREMOVE, (WPARAM)(*pProjPanel)->getHSelf()); // define the default docking behaviour diff --git a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp index b1dcb78d0..6ee009fb7 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp +++ b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp @@ -172,23 +172,27 @@ void ProjectPanel::initMenus() generic_string edit_rename = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_RENAME, PM_EDITRENAME); generic_string edit_addfolder = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_NEWFOLDER, PM_EDITNEWFOLDER); generic_string edit_addfiles = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_ADDFILES, PM_EDITADDFILES); + generic_string edit_addfilesRecursive = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_ADDFILESRECUSIVELY, PM_EDITADDFILESRECUSIVELY); generic_string edit_remove = pNativeSpeaker->getProjectPanelLangMenuStr("ProjectMenu", IDM_PROJECT_DELETEFOLDER, PM_EDITREMOVE); _hProjectMenu = ::CreatePopupMenu(); ::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, edit_rename.c_str()); ::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, edit_addfolder.c_str()); ::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, edit_addfiles.c_str()); + ::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILESRECUSIVELY, edit_addfilesRecursive.c_str()); ::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFOLDER, edit_remove.c_str()); edit_rename = pNativeSpeaker->getProjectPanelLangMenuStr("FolderMenu", IDM_PROJECT_RENAME, PM_EDITRENAME); edit_addfolder = pNativeSpeaker->getProjectPanelLangMenuStr("FolderMenu", IDM_PROJECT_NEWFOLDER, PM_EDITNEWFOLDER); edit_addfiles = pNativeSpeaker->getProjectPanelLangMenuStr("FolderMenu", IDM_PROJECT_ADDFILES, PM_EDITADDFILES); + edit_addfilesRecursive = pNativeSpeaker->getProjectPanelLangMenuStr("FolderMenu", IDM_PROJECT_ADDFILESRECUSIVELY, PM_EDITADDFILESRECUSIVELY); edit_remove = pNativeSpeaker->getProjectPanelLangMenuStr("FolderMenu", IDM_PROJECT_DELETEFOLDER, PM_EDITREMOVE); _hFolderMenu = ::CreatePopupMenu(); ::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()); + ::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILESRECUSIVELY, edit_addfilesRecursive.c_str()); ::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFOLDER, edit_remove.c_str()); edit_rename = pNativeSpeaker->getProjectPanelLangMenuStr("FileMenu", IDM_PROJECT_RENAME, PM_EDITRENAME); @@ -616,6 +620,13 @@ void ProjectPanel::notified(LPNMHDR notification) } } break; + + case TVN_BEGINDRAG: + { + //printStr(TEXT("hello")); + + } + break; } } } @@ -700,6 +711,18 @@ POINT ProjectPanel::getMenuDisplyPoint(int iButton) return p; } +HTREEITEM ProjectPanel::addFolder(HTREEITEM hTreeItem, const TCHAR *folderName) +{ + HTREEITEM addedItem = _treeView.addItem(folderName, hTreeItem, INDEX_CLOSED_NODE); + + TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND); + TreeView_EditLabel(_treeView.getHSelf(), addedItem); + if (getNodeType(hTreeItem) == nodeType_folder) + _treeView.setItemImage(hTreeItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE); + + return addedItem; +} + void ProjectPanel::popupMenuCmd(int cmdID) { // get selected item handle @@ -741,7 +764,10 @@ void ProjectPanel::popupMenuCmd(int cmdID) case IDM_PROJECT_NEWPROJECT : { HTREEITEM root = _treeView.getRoot(); - HTREEITEM addedItem = _treeView.addItem(TEXT("Project Name"), root, INDEX_PROJECT); + + NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker(); + generic_string newProjectLabel = pNativeSpeaker->getProjectPanelLangStr("NewProjectName", PM_NEWPROJECTNAME); + HTREEITEM addedItem = _treeView.addItem(newProjectLabel.c_str(), root, INDEX_PROJECT); setWorkSpaceDirty(true); _treeView.expand(hTreeItem); TreeView_EditLabel(_treeView.getHSelf(), addedItem); @@ -779,12 +805,10 @@ void ProjectPanel::popupMenuCmd(int cmdID) case IDM_PROJECT_NEWFOLDER : { - HTREEITEM addedItem = _treeView.addItem(TEXT("Folder Name"), hTreeItem, INDEX_CLOSED_NODE); + NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker(); + generic_string newFolderLabel = pNativeSpeaker->getProjectPanelLangStr("NewFolderName", PM_NEWFOLDERNAME); + addFolder(hTreeItem, newFolderLabel.c_str()); setWorkSpaceDirty(true); - TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND); - TreeView_EditLabel(_treeView.getHSelf(), addedItem); - if (getNodeType(hTreeItem) == nodeType_folder) - _treeView.setItemImage(hTreeItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE); } break; @@ -796,6 +820,14 @@ void ProjectPanel::popupMenuCmd(int cmdID) } break; + case IDM_PROJECT_ADDFILESRECUSIVELY : + { + addFilesFromDirectory(hTreeItem); + if (getNodeType(hTreeItem) == nodeType_folder) + _treeView.setItemImage(hTreeItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE); + } + break; + case IDM_PROJECT_OPENWS: { if (_isDirty) @@ -977,6 +1009,98 @@ void ProjectPanel::addFiles(HTREEITEM hTreeItem) } } +void ProjectPanel::recursiveAddFilesFrom(const TCHAR *folderPath, HTREEITEM hTreeItem) +{ + bool isRecursive = true; + bool isInHiddenDir = false; + generic_string dirFilter(folderPath); + if (folderPath[lstrlen(folderPath)-1] != '\\') + dirFilter += TEXT("\\"); + + dirFilter += TEXT("*.*"); + WIN32_FIND_DATA foundData; + + HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData); + + if (hFile != INVALID_HANDLE_VALUE) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!isInHiddenDir && (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + { + // do nothing + } + else if (isRecursive) + { + if ((lstrcmp(foundData.cFileName, TEXT("."))) && (lstrcmp(foundData.cFileName, TEXT("..")))) + { + generic_string pathDir(folderPath); + if (folderPath[lstrlen(folderPath)-1] != '\\') + pathDir += TEXT("\\"); + pathDir += foundData.cFileName; + pathDir += TEXT("\\"); + HTREEITEM addedItem = addFolder(hTreeItem, foundData.cFileName); + recursiveAddFilesFrom(pathDir.c_str(), addedItem); + } + } + } + else + { + generic_string pathFile(folderPath); + if (folderPath[lstrlen(folderPath)-1] != '\\') + pathFile += TEXT("\\"); + pathFile += foundData.cFileName; + TCHAR *strValueLabel = ::PathFindFileName(pathFile.c_str()); + _treeView.addItem(strValueLabel, hTreeItem, INDEX_LEAF, pathFile.c_str()); + } + } + while (::FindNextFile(hFile, &foundData)) + { + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!isInHiddenDir && (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + { + // do nothing + } + else if (isRecursive) + { + if ((lstrcmp(foundData.cFileName, TEXT("."))) && (lstrcmp(foundData.cFileName, TEXT("..")))) + { + generic_string pathDir(folderPath); + if (folderPath[lstrlen(folderPath)-1] != '\\') + pathDir += TEXT("\\"); + pathDir += foundData.cFileName; + pathDir += TEXT("\\"); + HTREEITEM addedItem = addFolder(hTreeItem, foundData.cFileName); + recursiveAddFilesFrom(pathDir.c_str(), addedItem); + } + } + } + else + { + generic_string pathFile(folderPath); + if (folderPath[lstrlen(folderPath)-1] != '\\') + pathFile += TEXT("\\"); + pathFile += foundData.cFileName; + TCHAR *strValueLabel = ::PathFindFileName(pathFile.c_str()); + _treeView.addItem(strValueLabel, hTreeItem, INDEX_LEAF, pathFile.c_str()); + } + } + ::FindClose(hFile); +} + +void ProjectPanel::addFilesFromDirectory(HTREEITEM hTreeItem) +{ + generic_string folderName = getFolderName(_hSelf); + if (folderName != TEXT("")) + { + recursiveAddFilesFrom(folderName.c_str(), hTreeItem); + _treeView.expand(hTreeItem); + setWorkSpaceDirty(true); + } +} + BOOL CALLBACK FileRelocalizerDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM) { switch (Message) diff --git a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h index 2059b7d22..6c4f8caa4 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h +++ b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h @@ -30,6 +30,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #define PM_PROJECTPANELTITLE TEXT("Project") #define PM_WORKSPACEROOTNAME TEXT("Workspace") +#define PM_NEWFOLDERNAME TEXT("Folder Name") +#define PM_NEWPROJECTNAME TEXT("Project Name") + #define PM_NEWWORKSPACE TEXT("New Workspace") #define PM_OPENWORKSPACE TEXT("Open Workspace") #define PM_RELOADWORKSPACE TEXT("Reload Workspace") @@ -41,6 +44,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #define PM_EDITRENAME TEXT("Rename") #define PM_EDITNEWFOLDER TEXT("Add Folder") #define PM_EDITADDFILES TEXT("Add Files...") +#define PM_EDITADDFILESRECUSIVELY TEXT("Add Files from Directory...") #define PM_EDITREMOVE TEXT("Remove") #define PM_EDITMODIFYFILE TEXT("Modify File Path") @@ -98,6 +102,10 @@ protected: void destroyMenus(); BOOL setImageList(int root_clean_id, int root_dirty_id, int project_id, int open_node_id, int closed_node_id, int leaf_id, int ivalid_leaf_id); void addFiles(HTREEITEM hTreeItem); + void addFilesFromDirectory(HTREEITEM hTreeItem); + void recursiveAddFilesFrom(const TCHAR *folderPath, HTREEITEM hTreeItem); + HTREEITEM addFolder(HTREEITEM hTreeItem, const TCHAR *folderName); + bool writeWorkSpace(TCHAR *projectFileName = NULL); generic_string getRelativePath(const generic_string & fn, const TCHAR *workSpaceFileName); void buildProjectXml(TiXmlNode *root, HTREEITEM hItem, const TCHAR* fn2write); diff --git a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.rc b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.rc index acd7e850d..1c0c33e52 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.rc +++ b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.rc @@ -26,7 +26,7 @@ EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE CAPTION "Project" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - CONTROL "",ID_PROJECTTREEVIEW,"SysTreeView32", TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS | TVS_INFOTIP | TVS_HASLINES | WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,7,172,93 + //CONTROL "",ID_PROJECTTREEVIEW,"SysTreeView32", TVS_HASBUTTONS | TVS_EDITLABELS | TVS_INFOTIP | TVS_HASLINES | WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,7,172,93 END IDD_FILERELOCALIZER_DIALOG DIALOGEX 0, 0, 350, 48 diff --git a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h index e02a27446..d58e4c65d 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h +++ b/PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h @@ -26,7 +26,8 @@ #define IDM_PROJECT_ADDFILES (IDD_PROJECTPANEL_MENU + 3) #define IDM_PROJECT_DELETEFOLDER (IDD_PROJECTPANEL_MENU + 4) #define IDM_PROJECT_DELETEFILE (IDD_PROJECTPANEL_MENU + 5) - #define IDM_PROJECT_MODIFYFILEPATH (IDD_PROJECTPANEL_MENU + 6) + #define IDM_PROJECT_MODIFYFILEPATH (IDD_PROJECTPANEL_MENU + 6) + #define IDM_PROJECT_ADDFILESRECUSIVELY (IDD_PROJECTPANEL_MENU + 7) #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 2e83ed8bf..e1e632ae7 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp +++ b/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp @@ -24,7 +24,22 @@ void TreeView::init(HINSTANCE hInst, HWND parent, int treeViewID) { Window::init(hInst, parent); _hSelf = ::GetDlgItem(parent, treeViewID); + + _hSelf = CreateWindowEx(0, + WC_TREEVIEW, + TEXT("Tree View"), + TVS_HASBUTTONS | WS_CHILD | WS_BORDER | WS_HSCROLL | + TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS | TVS_INFOTIP | WS_TABSTOP, + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + (LPVOID)0); + TreeView_SetItemHeight(_hSelf, CY_ITEMHEIGHT); + + ::SetWindowLongPtr(_hSelf, GWLP_USERDATA, (LONG_PTR)this); + _defaultProc = reinterpret_cast(::SetWindowLongPtr(_hSelf, GWLP_WNDPROC, (LONG_PTR)staticProc)); } @@ -37,7 +52,24 @@ void TreeView::destroy() } LRESULT TreeView::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) -{ +{/* + switch(Message) + { + case WM_MOUSEMOVE: + //::MessageBoxA(NULL, "WM_MOUSEMOVE", "", MB_OK); + break; + case WM_LBUTTONUP: + //::MessageBoxA(NULL, "WM_LBUTTONUP", "", MB_OK); + //SendMessage to parent + break; + case WM_KEYDOWN: + if (wParam == VK_F2) + ::MessageBoxA(NULL, "VK_F2", "", MB_OK); + break; + default: + return ::CallWindowProc(_defaultProc, hwnd, Message, wParam, lParam); + } + */ return ::CallWindowProc(_defaultProc, hwnd, Message, wParam, lParam); }