mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-29 16:54:43 +02:00
[ENHANCE] Enhance Project Manager.
git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@811 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
parent
647748824a
commit
6f444eee1f
@ -173,7 +173,9 @@ IDI_MMPLAY_OFF_ICON ICON "icons\\playrecord_m_off.ico"
|
|||||||
IDI_MMPLAY_ON_ICON ICON "icons\\playrecord_m_on.ico"
|
IDI_MMPLAY_ON_ICON ICON "icons\\playrecord_m_on.ico"
|
||||||
|
|
||||||
|
|
||||||
IDI_PROJECT_ROOT BITMAP "icons\\project_root.bmp"
|
IDI_PROJECT_WORKSPACE BITMAP "icons\\project_work_space.bmp"
|
||||||
|
IDI_PROJECT_WORKSPACEDIRTY BITMAP "icons\\project_work_space_dirty.bmp"
|
||||||
|
IDI_PROJECT_PROJECT BITMAP "icons\\project_root.bmp"
|
||||||
IDI_PROJECT_FOLDEROPEN BITMAP "icons\\project_folder_open.bmp"
|
IDI_PROJECT_FOLDEROPEN BITMAP "icons\\project_folder_open.bmp"
|
||||||
IDI_PROJECT_FOLDERCLOSE BITMAP "icons\\project_folder_close.bmp"
|
IDI_PROJECT_FOLDERCLOSE BITMAP "icons\\project_folder_close.bmp"
|
||||||
IDI_PROJECT_FILE BITMAP "icons\\project_file.bmp"
|
IDI_PROJECT_FILE BITMAP "icons\\project_file.bmp"
|
||||||
|
@ -24,6 +24,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||||||
#include "tinyxml.h"
|
#include "tinyxml.h"
|
||||||
#include "FileDialog.h"
|
#include "FileDialog.h"
|
||||||
|
|
||||||
|
#define CX_BITMAP 16
|
||||||
|
#define CY_BITMAP 16
|
||||||
|
|
||||||
|
#define INDEX_CLEAN_ROOT 0
|
||||||
|
#define INDEX_DIRTY_ROOT 1
|
||||||
|
#define INDEX_PROJECT 2
|
||||||
|
#define INDEX_OPEN_NODE 3
|
||||||
|
#define INDEX_CLOSED_NODE 4
|
||||||
|
#define INDEX_LEAF 5
|
||||||
|
#define INDEX_LEAF_INVALID 6
|
||||||
|
|
||||||
#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))
|
||||||
|
|
||||||
@ -62,7 +73,7 @@ BOOL CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPar
|
|||||||
|
|
||||||
_treeView.init(_hInst, _hSelf, ID_PROJECTTREEVIEW);
|
_treeView.init(_hInst, _hSelf, ID_PROJECTTREEVIEW);
|
||||||
|
|
||||||
_treeView.initImageList(IDI_PROJECT_ROOT, IDI_PROJECT_FOLDEROPEN, IDI_PROJECT_FOLDERCLOSE, IDI_PROJECT_FILE, IDI_PROJECT_FILEINVALID);
|
setImageList(IDI_PROJECT_WORKSPACE, IDI_PROJECT_WORKSPACEDIRTY, IDI_PROJECT_PROJECT, IDI_PROJECT_FOLDEROPEN, IDI_PROJECT_FOLDERCLOSE, IDI_PROJECT_FILE, IDI_PROJECT_FILEINVALID);
|
||||||
_treeView.display();
|
_treeView.display();
|
||||||
openWorkSpace(TEXT("D:\\source\\notepad++\\trunk\\PowerEditor\\src\\WinControls\\ProjectPanel\\demo.xml"));
|
openWorkSpace(TEXT("D:\\source\\notepad++\\trunk\\PowerEditor\\src\\WinControls\\ProjectPanel\\demo.xml"));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -115,19 +126,19 @@ BOOL CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPar
|
|||||||
|
|
||||||
void ProjectPanel::initMenus()
|
void ProjectPanel::initMenus()
|
||||||
{
|
{
|
||||||
_hProjectMenu = ::CreatePopupMenu();
|
_hWorkSpaceMenu = ::CreatePopupMenu();
|
||||||
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWPROJECT, TEXT("Add New Project"));
|
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWPROJECT, TEXT("Add New Project"));
|
||||||
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_OPENWS, TEXT("Open WorkSpace"));
|
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_OPENWS, TEXT("Open WorkSpace"));
|
||||||
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RELOADWS, TEXT("Reload WorkSpace"));
|
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RELOADWS, TEXT("Reload WorkSpace"));
|
||||||
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_SAVEWS, TEXT("Save"));
|
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_SAVEWS, TEXT("Save"));
|
||||||
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_SAVEASWS, TEXT("Save As..."));
|
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_SAVEASWS, TEXT("Save As..."));
|
||||||
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_SAVEACOPYASWS, TEXT("Save a Copy As..."));
|
::InsertMenu(_hWorkSpaceMenu, 0, MF_BYCOMMAND, IDM_PROJECT_SAVEACOPYASWS, TEXT("Save a Copy As..."));
|
||||||
|
|
||||||
_hRootMenu = ::CreatePopupMenu();
|
_hProjectMenu = ::CreatePopupMenu();
|
||||||
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
|
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
|
||||||
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, TEXT("Add Folder"));
|
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_NEWFOLDER, TEXT("Add Folder"));
|
||||||
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, TEXT("Add Files..."));
|
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_ADDFILES, TEXT("Add Files..."));
|
||||||
::InsertMenu(_hRootMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFOLDER, TEXT("Remove"));
|
::InsertMenu(_hProjectMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFOLDER, TEXT("Remove"));
|
||||||
|
|
||||||
_hFolderMenu = ::CreatePopupMenu();
|
_hFolderMenu = ::CreatePopupMenu();
|
||||||
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
|
::InsertMenu(_hFolderMenu, 0, MF_BYCOMMAND, IDM_PROJECT_RENAME, TEXT("Rename"));
|
||||||
@ -140,10 +151,75 @@ void ProjectPanel::initMenus()
|
|||||||
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFILE, TEXT("Remove"));
|
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_PROJECT_DELETEFILE, TEXT("Remove"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL ProjectPanel::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)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
HBITMAP hbmp;
|
||||||
|
|
||||||
|
const int nbBitmaps = 7;
|
||||||
|
|
||||||
|
// Creation of image list
|
||||||
|
if ((_hImaLst = ImageList_Create(CX_BITMAP, CY_BITMAP, ILC_COLOR32 | ILC_MASK, nbBitmaps, 0)) == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
// Add the bmp in the list
|
||||||
|
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(root_clean_id));
|
||||||
|
if(hbmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
||||||
|
DeleteObject(hbmp);
|
||||||
|
|
||||||
|
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(root_dirty_id));
|
||||||
|
if(hbmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
||||||
|
DeleteObject(hbmp);
|
||||||
|
|
||||||
|
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(project_id));
|
||||||
|
if(hbmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
||||||
|
DeleteObject(hbmp);
|
||||||
|
|
||||||
|
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(open_node_id));
|
||||||
|
if(hbmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
||||||
|
DeleteObject(hbmp);
|
||||||
|
|
||||||
|
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(closed_node_id));
|
||||||
|
if(hbmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
||||||
|
DeleteObject(hbmp);
|
||||||
|
|
||||||
|
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(leaf_id));
|
||||||
|
if(hbmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
||||||
|
DeleteObject(hbmp);
|
||||||
|
|
||||||
|
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(ivalid_leaf_id));
|
||||||
|
if(hbmp == NULL)
|
||||||
|
return FALSE;
|
||||||
|
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
||||||
|
DeleteObject(hbmp);
|
||||||
|
|
||||||
|
if (ImageList_GetImageCount(_hImaLst) < nbBitmaps)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
// Set image list to the tree view
|
||||||
|
TreeView_SetImageList(_treeView.getHSelf(), _hImaLst, TVSIL_NORMAL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ProjectPanel::destroyMenus()
|
void ProjectPanel::destroyMenus()
|
||||||
{
|
{
|
||||||
|
::DestroyMenu(_hWorkSpaceMenu);
|
||||||
::DestroyMenu(_hProjectMenu);
|
::DestroyMenu(_hProjectMenu);
|
||||||
::DestroyMenu(_hRootMenu);
|
|
||||||
::DestroyMenu(_hFolderMenu);
|
::DestroyMenu(_hFolderMenu);
|
||||||
::DestroyMenu(_hFileMenu);
|
::DestroyMenu(_hFileMenu);
|
||||||
}
|
}
|
||||||
@ -164,11 +240,20 @@ bool ProjectPanel::openWorkSpace(const TCHAR *projectFileName)
|
|||||||
if (!childNode)
|
if (!childNode)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for ( ; childNode ; childNode = childNode->NextSibling(TEXT("Project")))
|
if (!::PathFileExists(projectFileName))
|
||||||
{
|
return false;
|
||||||
HTREEITEM rootItem = _treeView.addItem((childNode->ToElement())->Attribute(TEXT("name")), TVI_ROOT, INDEX_PROJECT_ROOT);
|
|
||||||
buildTreeFrom(childNode, rootItem);
|
_workSpaceFilePath = projectFileName;
|
||||||
}
|
|
||||||
|
HTREEITEM rootItem = _treeView.addItem(TEXT("Work Space"), TVI_ROOT, INDEX_CLEAN_ROOT);
|
||||||
|
|
||||||
|
for ( ; childNode ; childNode = childNode->NextSibling(TEXT("Project")))
|
||||||
|
{
|
||||||
|
HTREEITEM projectItem = _treeView.addItem((childNode->ToElement())->Attribute(TEXT("name")), rootItem, INDEX_PROJECT);
|
||||||
|
buildTreeFrom(childNode, projectItem);
|
||||||
|
}
|
||||||
|
setWorkSpaceDirty(false);
|
||||||
|
|
||||||
delete pXmlDocProject;
|
delete pXmlDocProject;
|
||||||
return loadOkay;
|
return loadOkay;
|
||||||
}
|
}
|
||||||
@ -186,7 +271,11 @@ bool ProjectPanel::writeWorkSpace(TCHAR *projectFileName)
|
|||||||
tvItem.cchTextMax = MAX_PATH;
|
tvItem.cchTextMax = MAX_PATH;
|
||||||
|
|
||||||
//for each project, write <Project>
|
//for each project, write <Project>
|
||||||
for (HTREEITEM tvProj = _treeView.getRoot();
|
HTREEITEM tvRoot = _treeView.getRoot();
|
||||||
|
if (!tvRoot)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (HTREEITEM tvProj = _treeView.getChildFrom(tvRoot);
|
||||||
tvProj != NULL;
|
tvProj != NULL;
|
||||||
tvProj = _treeView.getNextSibling(tvProj))
|
tvProj = _treeView.getNextSibling(tvProj))
|
||||||
{
|
{
|
||||||
@ -335,15 +424,25 @@ void ProjectPanel::notified(LPNMHDR notification)
|
|||||||
|
|
||||||
// For File, Folder and Project
|
// For File, Folder and Project
|
||||||
::SendMessage(_treeView.getHSelf(), TVM_SETITEM, 0,(LPARAM)(&(tvnotif->item)));
|
::SendMessage(_treeView.getHSelf(), TVM_SETITEM, 0,(LPARAM)(&(tvnotif->item)));
|
||||||
|
setWorkSpaceDirty(true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TVN_GETINFOTIP:
|
case TVN_GETINFOTIP:
|
||||||
{
|
{
|
||||||
LPNMTVGETINFOTIP lpGetInfoTip = (LPNMTVGETINFOTIP)notification;
|
LPNMTVGETINFOTIP lpGetInfoTip = (LPNMTVGETINFOTIP)notification;
|
||||||
generic_string *str = (generic_string *)lpGetInfoTip->lParam;
|
generic_string *str = NULL ;
|
||||||
if (!str)
|
|
||||||
return;
|
if (_treeView.getRoot() == lpGetInfoTip->hItem)
|
||||||
|
{
|
||||||
|
str = &_workSpaceFilePath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str = (generic_string *)lpGetInfoTip->lParam;
|
||||||
|
if (!str)
|
||||||
|
return;
|
||||||
|
}
|
||||||
lpGetInfoTip->pszText = (LPTSTR)str->c_str();
|
lpGetInfoTip->pszText = (LPTSTR)str->c_str();
|
||||||
lpGetInfoTip->cchTextMax = str->size();
|
lpGetInfoTip->cchTextMax = str->size();
|
||||||
}
|
}
|
||||||
@ -354,20 +453,16 @@ void ProjectPanel::notified(LPNMHDR notification)
|
|||||||
LPNMTREEVIEW nmtv = (LPNMTREEVIEW)notification;
|
LPNMTREEVIEW nmtv = (LPNMTREEVIEW)notification;
|
||||||
tvItem.hItem = nmtv->itemNew.hItem;
|
tvItem.hItem = nmtv->itemNew.hItem;
|
||||||
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
||||||
::SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem);
|
|
||||||
if (tvItem.iImage != INDEX_PROJECT_ROOT)
|
if (getNodeType(nmtv->itemNew.hItem) == nodeType_folder)
|
||||||
{
|
{
|
||||||
if (nmtv->action == TVE_COLLAPSE)
|
if (nmtv->action == TVE_COLLAPSE)
|
||||||
{
|
{
|
||||||
tvItem.iImage = INDEX_CLOSED_NODE;
|
_treeView.setItemImage(nmtv->itemNew.hItem, INDEX_CLOSED_NODE, INDEX_CLOSED_NODE);
|
||||||
tvItem.iSelectedImage = INDEX_CLOSED_NODE;
|
|
||||||
TreeView_SetItem(_treeView.getHSelf(), &tvItem);
|
|
||||||
}
|
}
|
||||||
else if (nmtv->action == TVE_EXPAND)
|
else if (nmtv->action == TVE_EXPAND)
|
||||||
{
|
{
|
||||||
tvItem.iImage = INDEX_OPEN_NODE;
|
_treeView.setItemImage(nmtv->itemNew.hItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE);
|
||||||
tvItem.iSelectedImage = INDEX_OPEN_NODE;
|
|
||||||
TreeView_SetItem(_treeView.getHSelf(), &tvItem);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -376,6 +471,13 @@ void ProjectPanel::notified(LPNMHDR notification)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProjectPanel::setWorkSpaceDirty(bool isDirty)
|
||||||
|
{
|
||||||
|
_isDirty = isDirty;
|
||||||
|
int iImg = _isDirty?INDEX_DIRTY_ROOT:INDEX_CLEAN_ROOT;
|
||||||
|
_treeView.setItemImage(_treeView.getRoot(), iImg, iImg);
|
||||||
|
}
|
||||||
|
|
||||||
NodeType ProjectPanel::getNodeType(HTREEITEM hItem)
|
NodeType ProjectPanel::getNodeType(HTREEITEM hItem)
|
||||||
{
|
{
|
||||||
TVITEM tvItem;
|
TVITEM tvItem;
|
||||||
@ -384,19 +486,24 @@ NodeType ProjectPanel::getNodeType(HTREEITEM hItem)
|
|||||||
SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem);
|
SendMessage(_treeView.getHSelf(), TVM_GETITEM, 0,(LPARAM)&tvItem);
|
||||||
|
|
||||||
// Root
|
// Root
|
||||||
if (tvItem.iImage == INDEX_PROJECT_ROOT)
|
if (tvItem.iImage == INDEX_CLEAN_ROOT || tvItem.iImage == INDEX_DIRTY_ROOT)
|
||||||
{
|
{
|
||||||
return nodeType_root;
|
return nodeType_root;
|
||||||
}
|
}
|
||||||
|
// Project
|
||||||
|
else if (tvItem.iImage == INDEX_PROJECT)
|
||||||
|
{
|
||||||
|
return nodeType_project;
|
||||||
|
}
|
||||||
// Folder
|
// Folder
|
||||||
else if (tvItem.lParam == NULL)
|
else if (tvItem.lParam == NULL)
|
||||||
{
|
{
|
||||||
return nodeType_node;
|
return nodeType_folder;
|
||||||
}
|
}
|
||||||
// File
|
// File
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return nodeType_leaf;
|
return nodeType_file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,10 +528,12 @@ void ProjectPanel::showContextMenu(int x, int y)
|
|||||||
NodeType nodeType = getNodeType(tvHitInfo.hItem);
|
NodeType nodeType = getNodeType(tvHitInfo.hItem);
|
||||||
HMENU hMenu = NULL;
|
HMENU hMenu = NULL;
|
||||||
if (nodeType == nodeType_root)
|
if (nodeType == nodeType_root)
|
||||||
hMenu = _hRootMenu;
|
hMenu = _hWorkSpaceMenu;
|
||||||
else if (nodeType == nodeType_node)
|
else if (nodeType == nodeType_project)
|
||||||
|
hMenu = _hProjectMenu;
|
||||||
|
else if (nodeType == nodeType_folder)
|
||||||
hMenu = _hFolderMenu;
|
hMenu = _hFolderMenu;
|
||||||
else //nodeType_leaf
|
else //nodeType_file
|
||||||
hMenu = _hFileMenu;
|
hMenu = _hFileMenu;
|
||||||
TrackPopupMenu(hMenu, TPM_LEFTALIGN, x, y, 0, _hSelf, NULL);
|
TrackPopupMenu(hMenu, TPM_LEFTALIGN, x, y, 0, _hSelf, NULL);
|
||||||
}
|
}
|
||||||
@ -457,7 +566,7 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
case IDB_PROJECT_BTN:
|
case IDB_PROJECT_BTN:
|
||||||
{
|
{
|
||||||
POINT p = getMenuDisplyPoint(0);
|
POINT p = getMenuDisplyPoint(0);
|
||||||
TrackPopupMenu(_hProjectMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hSelf, NULL);
|
TrackPopupMenu(_hWorkSpaceMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hSelf, NULL);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -466,11 +575,11 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
POINT p = getMenuDisplyPoint(1);
|
POINT p = getMenuDisplyPoint(1);
|
||||||
HMENU hMenu = NULL;
|
HMENU hMenu = NULL;
|
||||||
NodeType nodeType = getNodeType(hTreeItem);
|
NodeType nodeType = getNodeType(hTreeItem);
|
||||||
if (nodeType == nodeType_root)
|
if (nodeType == nodeType_project)
|
||||||
hMenu = _hRootMenu;
|
hMenu = _hProjectMenu;
|
||||||
else if (nodeType == nodeType_node)
|
else if (nodeType == nodeType_folder)
|
||||||
hMenu = _hFolderMenu;
|
hMenu = _hFolderMenu;
|
||||||
else //nodeType_leaf
|
else //nodeType_file
|
||||||
hMenu = _hFileMenu;
|
hMenu = _hFileMenu;
|
||||||
TrackPopupMenu(hMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hSelf, NULL);
|
TrackPopupMenu(hMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hSelf, NULL);
|
||||||
}
|
}
|
||||||
@ -481,7 +590,9 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
//
|
//
|
||||||
case IDM_PROJECT_NEWPROJECT :
|
case IDM_PROJECT_NEWPROJECT :
|
||||||
{
|
{
|
||||||
HTREEITEM addedItem = _treeView.addItem(TEXT("Project Name"), TVI_ROOT, INDEX_PROJECT_ROOT);
|
HTREEITEM root = _treeView.getRoot();
|
||||||
|
HTREEITEM addedItem = _treeView.addItem(TEXT("Project Name"), root, INDEX_PROJECT);
|
||||||
|
setWorkSpaceDirty(true);
|
||||||
TreeView_EditLabel(_treeView.getHSelf(), addedItem);
|
TreeView_EditLabel(_treeView.getHSelf(), addedItem);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -493,16 +604,19 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
case IDM_PROJECT_NEWFOLDER :
|
case IDM_PROJECT_NEWFOLDER :
|
||||||
{
|
{
|
||||||
HTREEITEM addedItem = _treeView.addItem(TEXT("Folder Name"), hTreeItem, INDEX_CLOSED_NODE);
|
HTREEITEM addedItem = _treeView.addItem(TEXT("Folder Name"), hTreeItem, INDEX_CLOSED_NODE);
|
||||||
|
setWorkSpaceDirty(true);
|
||||||
TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND);
|
TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND);
|
||||||
TreeView_EditLabel(_treeView.getHSelf(), addedItem);
|
TreeView_EditLabel(_treeView.getHSelf(), addedItem);
|
||||||
_treeView.expandItemGUI(hTreeItem);
|
if (getNodeType(hTreeItem) == nodeType_folder)
|
||||||
|
_treeView.setItemImage(hTreeItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDM_PROJECT_ADDFILES :
|
case IDM_PROJECT_ADDFILES :
|
||||||
{
|
{
|
||||||
addFiles(hTreeItem);
|
addFiles(hTreeItem);
|
||||||
_treeView.expandItemGUI(hTreeItem);
|
if (getNodeType(hTreeItem) == nodeType_folder)
|
||||||
|
_treeView.setItemImage(hTreeItem, INDEX_OPEN_NODE, INDEX_OPEN_NODE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -515,7 +629,6 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
_treeView.removeAllItems();
|
_treeView.removeAllItems();
|
||||||
openWorkSpace(fn);
|
openWorkSpace(fn);
|
||||||
_workSpaceFilePath = fn;
|
_workSpaceFilePath = fn;
|
||||||
_isDirty = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -526,13 +639,13 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
{
|
{
|
||||||
_treeView.removeAllItems();
|
_treeView.removeAllItems();
|
||||||
openWorkSpace(_workSpaceFilePath.c_str());
|
openWorkSpace(_workSpaceFilePath.c_str());
|
||||||
_isDirty = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDM_PROJECT_SAVEWS:
|
case IDM_PROJECT_SAVEWS:
|
||||||
writeWorkSpace();
|
writeWorkSpace();
|
||||||
|
setWorkSpaceDirty(false);
|
||||||
_isDirty = false;
|
_isDirty = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -548,10 +661,9 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
if (cmdID == IDM_PROJECT_SAVEASWS)
|
if (cmdID == IDM_PROJECT_SAVEASWS)
|
||||||
{
|
{
|
||||||
_workSpaceFilePath = fn;
|
_workSpaceFilePath = fn;
|
||||||
_isDirty = false;
|
setWorkSpaceDirty(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -565,13 +677,16 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
if (::MessageBox(_hSelf, str2display, TEXT("Remove folder from projet"), MB_YESNO) == IDYES)
|
if (::MessageBox(_hSelf, str2display, TEXT("Remove folder from projet"), MB_YESNO) == IDYES)
|
||||||
{
|
{
|
||||||
_treeView.removeItem(hTreeItem);
|
_treeView.removeItem(hTreeItem);
|
||||||
|
setWorkSpaceDirty(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_treeView.removeItem(hTreeItem);
|
_treeView.removeItem(hTreeItem);
|
||||||
|
setWorkSpaceDirty(true);
|
||||||
}
|
}
|
||||||
_treeView.collapsItemGUI(parent);
|
if (getNodeType(parent) == nodeType_folder)
|
||||||
|
_treeView.setItemImage(parent, INDEX_CLOSED_NODE, INDEX_CLOSED_NODE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -583,7 +698,9 @@ void ProjectPanel::popupMenuCmd(int cmdID)
|
|||||||
if (::MessageBox(_hSelf, str2display, TEXT("Remove file from projet"), MB_YESNO) == IDYES)
|
if (::MessageBox(_hSelf, str2display, TEXT("Remove file from projet"), MB_YESNO) == IDYES)
|
||||||
{
|
{
|
||||||
_treeView.removeItem(hTreeItem);
|
_treeView.removeItem(hTreeItem);
|
||||||
_treeView.collapsItemGUI(parent);
|
setWorkSpaceDirty(true);
|
||||||
|
if (getNodeType(parent) == nodeType_folder)
|
||||||
|
_treeView.setItemImage(parent, INDEX_CLOSED_NODE, INDEX_CLOSED_NODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -604,5 +721,6 @@ void ProjectPanel::addFiles(HTREEITEM hTreeItem)
|
|||||||
_treeView.addItem(strValueLabel, hTreeItem, INDEX_LEAF, pfns->at(i).c_str());
|
_treeView.addItem(strValueLabel, hTreeItem, INDEX_LEAF, pfns->at(i).c_str());
|
||||||
}
|
}
|
||||||
TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND);
|
TreeView_Expand(_treeView.getHSelf(), hTreeItem, TVE_EXPAND);
|
||||||
|
setWorkSpaceDirty(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -29,7 +29,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||||||
#include "ProjectPanel_rc.h"
|
#include "ProjectPanel_rc.h"
|
||||||
|
|
||||||
enum NodeType {
|
enum NodeType {
|
||||||
nodeType_root = 0, nodeType_node = 1, nodeType_leaf = 2
|
nodeType_root = 0, nodeType_project = 1, nodeType_folder = 2, nodeType_file = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
class TiXmlNode;
|
class TiXmlNode;
|
||||||
@ -37,7 +37,7 @@ class TiXmlNode;
|
|||||||
class ProjectPanel : public DockingDlgInterface {
|
class ProjectPanel : public DockingDlgInterface {
|
||||||
public:
|
public:
|
||||||
ProjectPanel(): DockingDlgInterface(IDD_PROJECTPANEL),\
|
ProjectPanel(): DockingDlgInterface(IDD_PROJECTPANEL),\
|
||||||
_hToolbarMenu(NULL), _hProjectMenu(NULL), _hRootMenu(NULL), _hFolderMenu(NULL), _hFileMenu(NULL){};
|
_hToolbarMenu(NULL), _hWorkSpaceMenu(NULL), _hProjectMenu(NULL), _hFolderMenu(NULL), _hFileMenu(NULL){};
|
||||||
|
|
||||||
|
|
||||||
void init(HINSTANCE hInst, HWND hPere) {
|
void init(HINSTANCE hInst, HWND hPere) {
|
||||||
@ -52,23 +52,25 @@ public:
|
|||||||
_hParent = parent2set;
|
_hParent = parent2set;
|
||||||
};
|
};
|
||||||
|
|
||||||
void destroyMenus();
|
|
||||||
void initMenus();
|
|
||||||
|
|
||||||
bool openWorkSpace(const TCHAR *projectFileName);
|
bool openWorkSpace(const TCHAR *projectFileName);
|
||||||
void addFiles(HTREEITEM hTreeItem);
|
|
||||||
|
|
||||||
bool writeWorkSpace(TCHAR *projectFileName = NULL);
|
|
||||||
void buildProjectXml(TiXmlNode *root, HTREEITEM hItem);
|
|
||||||
NodeType getNodeType(HTREEITEM hItem);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TreeView _treeView;
|
TreeView _treeView;
|
||||||
|
HIMAGELIST _hImaLst;
|
||||||
HWND _hToolbarMenu;
|
HWND _hToolbarMenu;
|
||||||
HMENU _hProjectMenu, _hRootMenu, _hFolderMenu, _hFileMenu;
|
HMENU _hWorkSpaceMenu, _hProjectMenu, _hFolderMenu, _hFileMenu;
|
||||||
generic_string _workSpaceFilePath;
|
generic_string _workSpaceFilePath;
|
||||||
bool _isDirty;
|
bool _isDirty;
|
||||||
|
|
||||||
|
void initMenus();
|
||||||
|
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);
|
||||||
|
bool writeWorkSpace(TCHAR *projectFileName = NULL);
|
||||||
|
void buildProjectXml(TiXmlNode *root, HTREEITEM hItem);
|
||||||
|
NodeType getNodeType(HTREEITEM hItem);
|
||||||
|
void setWorkSpaceDirty(bool isDirty);
|
||||||
void popupMenuCmd(int cmdID);
|
void popupMenuCmd(int cmdID);
|
||||||
POINT getMenuDisplyPoint(int iButton);
|
POINT getMenuDisplyPoint(int iButton);
|
||||||
virtual BOOL CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
|
virtual BOOL CALLBACK ProjectPanel::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
@ -18,12 +18,7 @@
|
|||||||
#include "precompiledHeaders.h"
|
#include "precompiledHeaders.h"
|
||||||
#include "TreeView.h"
|
#include "TreeView.h"
|
||||||
|
|
||||||
|
|
||||||
#define CX_BITMAP 16
|
|
||||||
#define CY_BITMAP 16
|
|
||||||
#define CY_ITEMHEIGHT 18
|
#define CY_ITEMHEIGHT 18
|
||||||
#define NUM_BITMAPS 3
|
|
||||||
|
|
||||||
|
|
||||||
void TreeView::init(HINSTANCE hInst, HWND parent, int treeViewID)
|
void TreeView::init(HINSTANCE hInst, HWND parent, int treeViewID)
|
||||||
{
|
{
|
||||||
@ -32,55 +27,6 @@ void TreeView::init(HINSTANCE hInst, HWND parent, int treeViewID)
|
|||||||
TreeView_SetItemHeight(_hSelf, CY_ITEMHEIGHT);
|
TreeView_SetItemHeight(_hSelf, CY_ITEMHEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL TreeView::initImageList(int project_root_id, int open_node_id, int closed_node_id, int leaf_id, int ivalid_leaf_id)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
HBITMAP hbmp;
|
|
||||||
|
|
||||||
// Creation of image list
|
|
||||||
if ((_hImaLst = ImageList_Create(CX_BITMAP, CY_BITMAP, ILC_COLOR32 | ILC_MASK, NUM_BITMAPS, 0)) == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
// Add the bmp in the list
|
|
||||||
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(project_root_id));
|
|
||||||
if(hbmp == NULL)
|
|
||||||
return FALSE;
|
|
||||||
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
|
||||||
DeleteObject(hbmp);
|
|
||||||
|
|
||||||
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(open_node_id));
|
|
||||||
if(hbmp == NULL)
|
|
||||||
return FALSE;
|
|
||||||
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
|
||||||
DeleteObject(hbmp);
|
|
||||||
|
|
||||||
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(closed_node_id));
|
|
||||||
if(hbmp == NULL)
|
|
||||||
return FALSE;
|
|
||||||
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
|
||||||
DeleteObject(hbmp);
|
|
||||||
|
|
||||||
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(leaf_id));
|
|
||||||
if(hbmp == NULL)
|
|
||||||
return FALSE;
|
|
||||||
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
|
||||||
DeleteObject(hbmp);
|
|
||||||
|
|
||||||
hbmp = LoadBitmap(_hInst, MAKEINTRESOURCE(ivalid_leaf_id));
|
|
||||||
if(hbmp == NULL)
|
|
||||||
return FALSE;
|
|
||||||
i =ImageList_Add(_hImaLst, hbmp, (HBITMAP)NULL);
|
|
||||||
DeleteObject(hbmp);
|
|
||||||
|
|
||||||
if (ImageList_GetImageCount(_hImaLst) < 5)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
// Set image list to the tree view
|
|
||||||
TreeView_SetImageList(_hSelf, _hImaLst, TVSIL_NORMAL);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void TreeView::destroy()
|
void TreeView::destroy()
|
||||||
{
|
{
|
||||||
@ -163,36 +109,12 @@ void TreeView::cleanSubEntries(HTREEITEM hTreeItem)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TreeView::collapsItemGUI(HTREEITEM hTreeItem)
|
void TreeView::setItemImage(HTREEITEM hTreeItem, int iImage, int iSelectedImage)
|
||||||
{
|
|
||||||
if (TreeView_GetRoot(_hSelf) == hTreeItem)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (getChildFrom(hTreeItem) == NULL)
|
|
||||||
{
|
{
|
||||||
TVITEM tvItem;
|
TVITEM tvItem;
|
||||||
tvItem.hItem = hTreeItem;
|
tvItem.hItem = hTreeItem;
|
||||||
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
|
||||||
tvItem.iImage = INDEX_CLOSED_NODE;
|
tvItem.iImage = iImage;
|
||||||
tvItem.iSelectedImage = INDEX_CLOSED_NODE;
|
tvItem.iSelectedImage = iSelectedImage;
|
||||||
TreeView_SetItem(_hSelf, &tvItem);
|
TreeView_SetItem(_hSelf, &tvItem);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TreeView::expandItemGUI(HTREEITEM hTreeItem)
|
|
||||||
{
|
|
||||||
TVITEM tvItem;
|
|
||||||
tvItem.hItem = hTreeItem;
|
|
||||||
tvItem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE;
|
|
||||||
TreeView_GetItem(_hSelf, &tvItem);
|
|
||||||
|
|
||||||
if (tvItem.iImage != INDEX_PROJECT_ROOT)
|
|
||||||
{
|
|
||||||
if (tvItem.state & TVIS_EXPANDED)
|
|
||||||
{
|
|
||||||
tvItem.iImage = INDEX_OPEN_NODE;
|
|
||||||
tvItem.iSelectedImage = INDEX_OPEN_NODE;
|
|
||||||
TreeView_SetItem(_hSelf, &tvItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -18,12 +18,6 @@
|
|||||||
#ifndef TREE_VIEW_H
|
#ifndef TREE_VIEW_H
|
||||||
#define TREE_VIEW_H
|
#define TREE_VIEW_H
|
||||||
|
|
||||||
#define INDEX_PROJECT_ROOT 0
|
|
||||||
#define INDEX_OPEN_NODE 1
|
|
||||||
#define INDEX_CLOSED_NODE 2
|
|
||||||
#define INDEX_LEAF 3
|
|
||||||
#define INDEX_LEAF_INVALID 4
|
|
||||||
|
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
class TreeView : public Window
|
class TreeView : public Window
|
||||||
@ -50,12 +44,9 @@ public:
|
|||||||
HTREEITEM getNextSibling(HTREEITEM hItem) const {
|
HTREEITEM getNextSibling(HTREEITEM hItem) const {
|
||||||
return TreeView_GetNextSibling(_hSelf, hItem);
|
return TreeView_GetNextSibling(_hSelf, hItem);
|
||||||
};
|
};
|
||||||
void expandItemGUI(HTREEITEM hTreeItem);
|
void setItemImage(HTREEITEM hTreeItem, int iImage, int iSelectedImage);
|
||||||
void collapsItemGUI(HTREEITEM hTreeItem);
|
|
||||||
BOOL initImageList(int project_root_id, int open_node_id, int closed_node_id, int leaf_id, int ivalid_leaf_id);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HIMAGELIST _hImaLst;
|
|
||||||
WNDPROC _defaultProc;
|
WNDPROC _defaultProc;
|
||||||
LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
|
LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
BIN
PowerEditor/src/icons/project_work_space.bmp
Normal file
BIN
PowerEditor/src/icons/project_work_space.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 822 B |
BIN
PowerEditor/src/icons/project_work_space_dirty.bmp
Normal file
BIN
PowerEditor/src/icons/project_work_space_dirty.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 822 B |
@ -125,11 +125,13 @@
|
|||||||
#define IDI_READONLY_ICON 503
|
#define IDI_READONLY_ICON 503
|
||||||
#define IDI_FIND_RESULT_ICON 504
|
#define IDI_FIND_RESULT_ICON 504
|
||||||
|
|
||||||
#define IDI_PROJECT_ROOT 601
|
#define IDI_PROJECT_WORKSPACE 601
|
||||||
#define IDI_PROJECT_FOLDEROPEN 602
|
#define IDI_PROJECT_WORKSPACEDIRTY 602
|
||||||
#define IDI_PROJECT_FOLDERCLOSE 603
|
#define IDI_PROJECT_PROJECT 603
|
||||||
#define IDI_PROJECT_FILE 604
|
#define IDI_PROJECT_FOLDEROPEN 604
|
||||||
#define IDI_PROJECT_FILEINVALID 605
|
#define IDI_PROJECT_FOLDERCLOSE 605
|
||||||
|
#define IDI_PROJECT_FILE 606
|
||||||
|
#define IDI_PROJECT_FILEINVALID 607
|
||||||
|
|
||||||
#define IDC_MY_CUR 1402
|
#define IDC_MY_CUR 1402
|
||||||
#define IDC_UP_ARROW 1403
|
#define IDC_UP_ARROW 1403
|
||||||
|
Loading…
x
Reference in New Issue
Block a user