mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-28 16:24:27 +02:00
[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:
parent
bf93a79886
commit
8d137e2457
@ -159,7 +159,10 @@ Notepad_plus::~Notepad_plus()
|
|||||||
delete _pFileSwitcherPanel;
|
delete _pFileSwitcherPanel;
|
||||||
|
|
||||||
if (_pProjectPanel)
|
if (_pProjectPanel)
|
||||||
|
{
|
||||||
|
_pProjectPanel->destroy();
|
||||||
delete _pProjectPanel;
|
delete _pProjectPanel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user