Skip to content

Commit

Permalink
[NEW_FEATURE] Add "adding files from folder" for Project Manager.
Browse files Browse the repository at this point in the history
- Notepad-plus svn trunk @ 833
  • Loading branch information
donho committed Oct 31, 2011
1 parent d5b7d8d commit fdbf7d6
Show file tree
Hide file tree
Showing 8 changed files with 216 additions and 11 deletions.
38 changes: 38 additions & 0 deletions PowerEditor/src/MISC/Common/Common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions PowerEditor/src/MISC/Common/Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ const bool dirDown = false;
typedef std::basic_string<TCHAR> 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);
Expand Down
5 changes: 3 additions & 2 deletions PowerEditor/src/Notepad_plus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1074,7 +1074,7 @@ void Notepad_plus::getMatchedFileNames(const TCHAR *dir, const vector<generic_st
{
if (!isInHiddenDir && (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
{
// branles rien
// do nothing
}
else if (isRecursive)
{
Expand Down Expand Up @@ -1103,7 +1103,7 @@ void Notepad_plus::getMatchedFileNames(const TCHAR *dir, const vector<generic_st
{
if (!isInHiddenDir && (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
{
// branles rien
// do nothing
}
else if (isRecursive)
{
Expand Down Expand Up @@ -4704,6 +4704,7 @@ void Notepad_plus::launchProjectPanel(int cmdID, ProjectPanel ** pProjPanel, int
tTbData data;
memset(&data, 0, sizeof(data));
(*pProjPanel)->create(&data);
data.pszName = TEXT("ST");

::SendMessage(_pPublicInterface->getHSelf(), NPPM_MODELESSDIALOG, MODELESSDIALOGREMOVE, (WPARAM)(*pProjPanel)->getHSelf());
// define the default docking behaviour
Expand Down
136 changes: 130 additions & 6 deletions PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -616,6 +620,13 @@ void ProjectPanel::notified(LPNMHDR notification)
}
}
break;

case TVN_BEGINDRAG:
{
//printStr(TEXT("hello"));

}
break;
}
}
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 8 additions & 0 deletions PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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")

Expand Down Expand Up @@ -98,6 +102,10 @@ class ProjectPanel : public DockingDlgInterface {
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);
Expand Down
2 changes: 1 addition & 1 deletion PowerEditor/src/WinControls/ProjectPanel/ProjectPanel.rc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion PowerEditor/src/WinControls/ProjectPanel/ProjectPanel_rc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
34 changes: 33 additions & 1 deletion PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<WNDPROC>(::SetWindowLongPtr(_hSelf, GWLP_WNDPROC, (LONG_PTR)staticProc));
}


Expand All @@ -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);
}

Expand Down

0 comments on commit fdbf7d6

Please sign in to comment.