[ENHANCE] Enhance Project Manager.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@807 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
Don Ho 2011-09-14 01:10:16 +00:00
parent bf93a79886
commit 8d137e2457
5 changed files with 147 additions and 96 deletions

View File

@ -159,7 +159,10 @@ Notepad_plus::~Notepad_plus()
delete _pFileSwitcherPanel; delete _pFileSwitcherPanel;
if (_pProjectPanel) if (_pProjectPanel)
{
_pProjectPanel->destroy();
delete _pProjectPanel; delete _pProjectPanel;
}
} }

View File

@ -22,6 +22,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "ProjectPanel.h" #include "ProjectPanel.h"
#include "resource.h" #include "resource.h"
#include "tinyxml.h" #include "tinyxml.h"
#include "FileDialog.h"
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp)) #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
@ -68,7 +69,7 @@ BOOL CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPar
case WM_DESTROY: case WM_DESTROY:
{ {
//_fileListView.destroy(); _treeView.destroy();
break; break;
} }
@ -78,6 +79,26 @@ BOOL CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPar
return DockingDlgInterface::run_dlgProc(message, wParam, lParam); return DockingDlgInterface::run_dlgProc(message, wParam, lParam);
} }
void ProjectPanel::init(HINSTANCE hInst, HWND hPere)
{
DockingDlgInterface::init(hInst, hPere);
_hRootMenu = ::CreatePopupMenu();
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, TEXT("New Folder..."));
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, TEXT("Add Files..."));
_hFolderMenu = ::CreatePopupMenu();
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, TEXT("New Folder..."));
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFOLDER, TEXT("Delete"));
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, TEXT("Add Files..."));
_hFileMenu = ::CreatePopupMenu();
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFILE, TEXT("Delete"));
}
bool ProjectPanel::openProject(TCHAR *projectFileName) bool ProjectPanel::openProject(TCHAR *projectFileName)
{ {
TiXmlDocument *pXmlDocProject = new TiXmlDocument(projectFileName); TiXmlDocument *pXmlDocProject = new TiXmlDocument(projectFileName);
@ -220,7 +241,6 @@ void ProjectPanel::notified(LPNMHDR notification)
void ProjectPanel::showContextMenu(int x, int y) void ProjectPanel::showContextMenu(int x, int y)
{ {
//TCHAR textBuffer[MAX_PATH];
TVHITTESTINFO tvHitInfo; TVHITTESTINFO tvHitInfo;
HTREEITEM hTreeItem; HTREEITEM hTreeItem;
@ -239,11 +259,8 @@ void ProjectPanel::showContextMenu(int x, int y)
// get clicked item info // get clicked item info
TVITEM tvItem; TVITEM tvItem;
tvItem.hItem = tvHitInfo.hItem; tvItem.hItem = tvHitInfo.hItem;
tvItem.mask = /*TVIF_TEXT | TVIF_PARAM |*/ TVIF_IMAGE; tvItem.mask = TVIF_IMAGE;
//tvItem.pszText = textBuffer;
//tvItem.cchTextMax = MAX_PATH;
SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem); SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem);
//printStr(tvItem.pszText);
HMENU hMenu = NULL; HMENU hMenu = NULL;
// Root // Root
@ -271,26 +288,93 @@ void ProjectPanel::popupMenuCmd(int cmdID)
HTREEITEM hTreeItem = TreeView_GetSelection(_treeView.getHSelf()); HTREEITEM hTreeItem = TreeView_GetSelection(_treeView.getHSelf());
if (!hTreeItem) if (!hTreeItem)
return; return;
/*
TVITEM tvItem;
tvItem.hItem = hTreeItem;
tvItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE;
//tvItem.pszText = textBuffer;
//tvItem.cchTextMax = MAX_PATH;
SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem);
*/
switch (cmdID) switch (cmdID)
{ {
case IDM_PROJECT_RENAME : case IDM_PROJECT_RENAME :
TreeView_EditLabel(_treeView.getHSelf(), hTreeItem); TreeView_EditLabel(_treeView.getHSelf(), hTreeItem);
break; break;
case IDM_PROJECT_NEWFOLDER : case IDM_PROJECT_NEWFOLDER :
break; {
HTREEITEM addedItem = _treeView.addItem(TEXT("Folder Name"), hTreeItem, INDEX_CLOSED_NODE);
//TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND);
::SendMessage(_treeView.getHSelf(), TVM_EXPAND, TVE_EXPAND, (LPARAM)hTreeItem);
TreeView_EditLabel(_treeView.getHSelf(), addedItem);
}
break;
case IDM_PROJECT_ADDFILES : case IDM_PROJECT_ADDFILES :
break; {
addFiles(hTreeItem);
}
break;
case IDM_PROJECT_DELETEFOLDER : case IDM_PROJECT_DELETEFOLDER :
break; {
HTREEITEM parent = TreeView_GetParent(_treeView.getHSelf(), hTreeItem);
if (_treeView.getChildFrom(hTreeItem) != NULL)
{
TCHAR str2display[MAX_PATH] = TEXT("All the sub-items will be removed.\rAre you sure to remove this folder from the project?");
if (::MessageBox(_hSelf, str2display, TEXT("Remove folder from projet"), MB_YESNO) == IDYES)
{
_treeView.removeItem(hTreeItem);
}
}
else
{
_treeView.removeItem(hTreeItem);
}
if (_treeView.getChildFrom(parent) == NULL)
{
TVITEM tvItem;
tvItem.hItem = parent;
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvItem.iImage = INDEX_CLOSED_NODE;
tvItem.iSelectedImage = INDEX_CLOSED_NODE;
TreeView_SetItem(_treeView.getHSelf(), &tvItem);
}
}
break;
case IDM_PROJECT_DELETEFILE : case IDM_PROJECT_DELETEFILE :
break; {
HTREEITEM parent = TreeView_GetParent(_treeView.getHSelf(), 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)
{
_treeView.removeItem(hTreeItem);
if (_treeView.getChildFrom(parent) == NULL)
{
TVITEM tvItem;
tvItem.hItem = parent;
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvItem.iImage = INDEX_CLOSED_NODE;
tvItem.iSelectedImage = INDEX_CLOSED_NODE;
TreeView_SetItem(_treeView.getHSelf(), &tvItem);
}
}
}
break;
} }
} }
void ProjectPanel::addFiles(HTREEITEM hTreeItem)
{
FileDialog fDlg(_hSelf, ::GetModuleHandle(NULL));
fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL);
if (stringVector *pfns = fDlg.doOpenMultiFilesDlg())
{
size_t sz = pfns->size();
for (size_t i = 0 ; i < sz ; i++)
{
TCHAR *strValueLabel = ::PathFindFileName(pfns->at(i).c_str());
_treeView.addItem(strValueLabel, hTreeItem, INDEX_LEAF, pfns->at(i).c_str());
}
TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND);
}
}

View File

@ -42,24 +42,7 @@ public:
ProjectPanel(): DockingDlgInterface(IDD_PROJECTPANEL),\ ProjectPanel(): DockingDlgInterface(IDD_PROJECTPANEL),\
_hRootMenu(NULL), _hFolderMenu(NULL), _hFileMenu(NULL){}; _hRootMenu(NULL), _hFolderMenu(NULL), _hFileMenu(NULL){};
void init(HINSTANCE hInst, HWND hPere) { void init(HINSTANCE hInst, HWND hPere);
DockingDlgInterface::init(hInst, hPere);
_hRootMenu = ::CreatePopupMenu();
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, TEXT("New Folder..."));
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, TEXT("Add Files..."));
_hFolderMenu = ::CreatePopupMenu();
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, TEXT("New Folder..."));
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFOLDER, TEXT("Delete"));
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, TEXT("Add Files..."));
_hFileMenu = ::CreatePopupMenu();
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFILE, TEXT("Delete"));
};
void destroy() { void destroy() {
::DestroyMenu(_hRootMenu); ::DestroyMenu(_hRootMenu);
@ -76,6 +59,7 @@ public:
}; };
bool openProject(TCHAR *projectFileName); bool openProject(TCHAR *projectFileName);
void addFiles(HTREEITEM hTreeItem);
protected: protected:
TreeView _treeView; TreeView _treeView;

View File

@ -78,6 +78,8 @@ BOOL TreeView::initImageList(int project_root_id, int open_node_id, int closed_n
void TreeView::destroy() void TreeView::destroy()
{ {
HTREEITEM root = TreeView_GetRoot(_hSelf);
cleanSubEntries(root);
::DestroyWindow(_hSelf); ::DestroyWindow(_hSelf);
_hSelf = NULL; _hSelf = NULL;
} }
@ -111,67 +113,36 @@ HTREEITEM TreeView::addItem(const TCHAR *itemName, HTREEITEM hParentItem, int iI
return (HTREEITEM)::SendMessage(_hSelf, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvInsertStruct); return (HTREEITEM)::SendMessage(_hSelf, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tvInsertStruct);
} }
void TreeView::removeItem(HTREEITEM hTreeItem)
{
// Deallocate all the sub-entries recursively
cleanSubEntries(hTreeItem);
/* // Deallocate current entry
HTREEITEM TreeView::addItem(const TCHAR *itemName, int nLevel) TVITEM tvItem;
{ tvItem.hItem = hTreeItem;
TVITEM tvi; tvItem.mask = TVIF_PARAM;
TVINSERTSTRUCT tv_insert_struct; SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvItem);
static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST; if (tvItem.lParam)
static HTREEITEM hPrevRootItem = NULL; delete (generic_string *)(tvItem.lParam);
static HTREEITEM hPrevLev2Item = NULL;
HTREEITEM hti;
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; // Remove the node
TreeView_DeleteItem(_hSelf, hTreeItem);
// Set the text of the item. }
tvi.pszText = (LPTSTR) itemName;
tvi.cchTextMax = sizeof(tvi.pszText)/sizeof(tvi.pszText[0]); void TreeView::cleanSubEntries(HTREEITEM hTreeItem)
{
// Assume the item is not a parent item, so give it a for (HTREEITEM hItem = getChildFrom(hTreeItem); hItem != NULL; hItem = getNextSibling(hItem))
// document image. {
TVITEM tvItem;
tvi.iImage = INDEX_LEAF; tvItem.hItem = hItem;
tvi.iSelectedImage = INDEX_LEAF; tvItem.mask = TVIF_PARAM;
SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvItem);
// Save the heading level in the item's application-defined if (tvItem.lParam)
// data area. {
tvi.lParam = (LPARAM)nLevel; delete (generic_string *)(tvItem.lParam);
tv_insert_struct.item = tvi; }
tv_insert_struct.hInsertAfter = hPrev; cleanSubEntries(hItem);
}
// Set the parent item based on the specified level.
if (nLevel == 1)
tv_insert_struct.hParent = TVI_ROOT;
else if (nLevel == 2)
tv_insert_struct.hParent = hPrevRootItem;
else
tv_insert_struct.hParent = hPrevLev2Item;
// Add the item to the tree-view control.
hPrev = (HTREEITEM)SendMessage(_hSelf, TVM_INSERTITEM, 0, (LPARAM)(LPTVINSERTSTRUCT)&tv_insert_struct);
if (hPrev == NULL)
return NULL;
// Save the handle to the item.
if (nLevel == 1)
hPrevRootItem = hPrev;
else if (nLevel == 2)
hPrevLev2Item = hPrev;
// The new item is a child item. Give the parent item a
// closed folder bitmap to indicate it now has child items.
if (nLevel > 1)
{
hti = TreeView_GetParent(_hSelf, hPrev);
tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = hti;
tvi.iImage = INDEX_CLOSED_NODE;
tvi.iSelectedImage = INDEX_CLOSED_NODE;
TreeView_SetItem(_hSelf, &tvi);
}
return hPrev;
} }
*/

View File

@ -34,6 +34,15 @@ public:
virtual void init(HINSTANCE hInst, HWND parent, int treeViewID); virtual void init(HINSTANCE hInst, HWND parent, int treeViewID);
virtual void destroy(); virtual void destroy();
HTREEITEM addItem(const TCHAR *itemName, HTREEITEM hParentItem, int iImage, const TCHAR *filePath = NULL); HTREEITEM addItem(const TCHAR *itemName, HTREEITEM hParentItem, int iImage, const TCHAR *filePath = NULL);
void removeItem(HTREEITEM hTreeItem);
void cleanSubEntries(HTREEITEM hTreeItem);
HTREEITEM getChildFrom(HTREEITEM hTreeItem) {
return TreeView_GetChild(_hSelf, hTreeItem);
};
HTREEITEM getNextSibling(HTREEITEM hTreeItem){
return TreeView_GetNextSibling(_hSelf ,hTreeItem);
};
BOOL initImageList(int project_root_id, int open_node_id, int closed_node_id, int leaf_id); BOOL initImageList(int project_root_id, int open_node_id, int closed_node_id, int leaf_id);
protected: protected: