Add "Fold All" toolbar command in Folder As Workspace

This commit is contained in:
Don HO 2019-12-17 13:51:53 +01:00
parent b41a480d68
commit e0d995c1a6
No known key found for this signature in database
GPG Key ID: 6C429F1D8D84F46E
7 changed files with 58 additions and 12 deletions

View File

@ -207,6 +207,7 @@ IDI_FB_ROOTOPEN BITMAP "icons/fb_root_open.bmp"
IDI_FB_ROOTCLOSE BITMAP "icons/fb_root_close.bmp" IDI_FB_ROOTCLOSE BITMAP "icons/fb_root_close.bmp"
IDI_FB_SELECTCURRENTFILE BITMAP "icons/fb_select_current_file.bmp" IDI_FB_SELECTCURRENTFILE BITMAP "icons/fb_select_current_file.bmp"
IDI_FB_FOLDALL BITMAP "icons/fb_fold_all.bmp"
IDI_FUNCLIST_ROOT BITMAP "icons/project_file.bmp" IDI_FUNCLIST_ROOT BITMAP "icons/project_file.bmp"
IDI_FUNCLIST_NODE BITMAP "icons/funcList_node.bmp" IDI_FUNCLIST_NODE BITMAP "icons/funcList_node.bmp"

View File

@ -54,6 +54,7 @@
#define FB_RMFILE (WM_USER + 1025) #define FB_RMFILE (WM_USER + 1025)
#define FB_RNFILE (WM_USER + 1026) #define FB_RNFILE (WM_USER + 1026)
#define FB_CMD_AIMFILE 1 #define FB_CMD_AIMFILE 1
#define FB_CMD_FOLDALL 2
FileBrowser::~FileBrowser() FileBrowser::~FileBrowser()
{ {
@ -109,19 +110,27 @@ INT_PTR CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP
NppParameters& nppParam = NppParameters::getInstance(); NppParameters& nppParam = NppParameters::getInstance();
int style = WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_AUTOSIZE | TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT | BTNS_AUTOSIZE | BTNS_SEP | TBSTYLE_TOOLTIPS; int style = WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_AUTOSIZE | TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT | BTNS_AUTOSIZE | BTNS_SEP | TBSTYLE_TOOLTIPS;
_hToolbarMenu = CreateWindowEx(WS_EX_LAYOUTRTL, TOOLBARCLASSNAME, NULL, style, 0, 0, 0, 0, _hSelf, nullptr, _hInst, NULL); _hToolbarMenu = CreateWindowEx(WS_EX_LAYOUTRTL, TOOLBARCLASSNAME, NULL, style, 0, 0, 0, 0, _hSelf, nullptr, _hInst, NULL);
TBBUTTON tbButtons[1]; TBBUTTON tbButtons[2];
// Add the bmap image into toolbar's imagelist // Add the bmap image into toolbar's imagelist
TBADDBITMAP addbmp = { _hInst, 0 }; TBADDBITMAP addbmp = { _hInst, 0 };
addbmp.nID = IDI_FB_SELECTCURRENTFILE; addbmp.nID = IDI_FB_SELECTCURRENTFILE;
::SendMessage(_hToolbarMenu, TB_ADDBITMAP, 1, reinterpret_cast<LPARAM>(&addbmp)); ::SendMessage(_hToolbarMenu, TB_ADDBITMAP, 1, reinterpret_cast<LPARAM>(&addbmp));
addbmp.nID = IDI_FB_FOLDALL;
::SendMessage(_hToolbarMenu, TB_ADDBITMAP, 1, reinterpret_cast<LPARAM>(&addbmp));
tbButtons[0].idCommand = FB_CMD_AIMFILE; tbButtons[0].idCommand = FB_CMD_AIMFILE;
tbButtons[0].iBitmap = 0; tbButtons[0].iBitmap = 0;
tbButtons[0].fsState = TBSTATE_ENABLED; tbButtons[0].fsState = TBSTATE_ENABLED;
tbButtons[0].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE; tbButtons[0].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE;
tbButtons[0].iString = reinterpret_cast<INT_PTR>(TEXT("")); tbButtons[0].iString = reinterpret_cast<INT_PTR>(TEXT(""));
tbButtons[1].idCommand = FB_CMD_FOLDALL;
tbButtons[1].iBitmap = 1;
tbButtons[1].fsState = TBSTATE_ENABLED;
tbButtons[1].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE;
tbButtons[1].iString = reinterpret_cast<INT_PTR>(TEXT(""));
::SendMessage(_hToolbarMenu, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); ::SendMessage(_hToolbarMenu, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
::SendMessage(_hToolbarMenu, TB_SETBUTTONSIZE, 0, MAKELONG(nppParam._dpiManager.scaleX(20), nppParam._dpiManager.scaleY(20))); ::SendMessage(_hToolbarMenu, TB_SETBUTTONSIZE, 0, MAKELONG(nppParam._dpiManager.scaleX(20), nppParam._dpiManager.scaleY(20)));
::SendMessage(_hToolbarMenu, TB_SETPADDING, 0, MAKELONG(30, 0)); ::SendMessage(_hToolbarMenu, TB_SETPADDING, 0, MAKELONG(20, 0));
::SendMessage(_hToolbarMenu, TB_ADDBUTTONS, sizeof(tbButtons) / sizeof(TBBUTTON), reinterpret_cast<LPARAM>(&tbButtons)); ::SendMessage(_hToolbarMenu, TB_ADDBUTTONS, sizeof(tbButtons) / sizeof(TBBUTTON), reinterpret_cast<LPARAM>(&tbButtons));
::SendMessage(_hToolbarMenu, TB_AUTOSIZE, 0, 0); ::SendMessage(_hToolbarMenu, TB_AUTOSIZE, 0, 0);
ShowWindow(_hToolbarMenu, SW_SHOW); ShowWindow(_hToolbarMenu, SW_SHOW);
@ -199,6 +208,12 @@ INT_PTR CALLBACK FileBrowser::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP
break; break;
} }
case FB_CMD_FOLDALL:
{
_treeView.foldAll();
break;
}
default: default:
popupMenuCmd(LOWORD(wParam)); popupMenuCmd(LOWORD(wParam));
} }
@ -348,17 +363,17 @@ void FileBrowser::initPopupMenus()
::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_FILEBROWSER_CMDHERE, cmdHere.c_str()); ::InsertMenu(_hFileMenu, 0, MF_BYCOMMAND, IDM_FILEBROWSER_CMDHERE, cmdHere.c_str());
} }
bool FileBrowser::selectCurrentEditingFile() bool FileBrowser::selectCurrentEditingFile() const
{ {
TCHAR currentDocPath[MAX_PATH] = { '0' }; TCHAR currentDocPath[MAX_PATH] = { '0' };
::SendMessage(_hParent, NPPM_GETFULLCURRENTPATH, MAX_PATH, reinterpret_cast<LPARAM>(currentDocPath)); ::SendMessage(_hParent, NPPM_GETFULLCURRENTPATH, MAX_PATH, reinterpret_cast<LPARAM>(currentDocPath));
generic_string rootFolderPath = currentDocPath; generic_string rootFolderPath = currentDocPath;
size_t nbFolderUpdaters = _folderUpdaters.size();
for (size_t i = 0; i < nbFolderUpdaters; ++i) for (const auto f : _folderUpdaters)
{ {
if (isRelatedRootFolder(_folderUpdaters[i]->_rootFolder._rootPath, rootFolderPath)) if (isRelatedRootFolder(f->_rootFolder._rootPath, rootFolderPath))
{ {
generic_string rootPath = _folderUpdaters[i]->_rootFolder._rootPath; generic_string rootPath = f->_rootFolder._rootPath;
generic_string pathSuffix = rootFolderPath.substr(rootPath.size() + 1, rootFolderPath.size() - rootPath.size()); generic_string pathSuffix = rootFolderPath.substr(rootPath.size() + 1, rootFolderPath.size() - rootPath.size());
vector<generic_string> linarPathArray = split(pathSuffix, '\\'); vector<generic_string> linarPathArray = split(pathSuffix, '\\');
@ -1054,7 +1069,7 @@ HTREEITEM FileBrowser::getRootFromFullPath(const generic_string & rootPath) cons
return node; return node;
} }
HTREEITEM FileBrowser::findChildNodeFromName(HTREEITEM parent, const generic_string& label) HTREEITEM FileBrowser::findChildNodeFromName(HTREEITEM parent, const generic_string& label) const
{ {
HTREEITEM childNodeFound = nullptr; HTREEITEM childNodeFound = nullptr;
@ -1164,7 +1179,7 @@ bool FileBrowser::addInTree(const generic_string& rootPath, const generic_string
} }
} }
HTREEITEM FileBrowser::findInTree(const generic_string& rootPath, HTREEITEM node, std::vector<generic_string> linarPathArray) HTREEITEM FileBrowser::findInTree(const generic_string& rootPath, HTREEITEM node, std::vector<generic_string> linarPathArray) const
{ {
if (node == nullptr) // it's a root. Search the right root with rootPath if (node == nullptr) // it's a root. Search the right root with rootPath
{ {

View File

@ -142,10 +142,10 @@ public:
void addRootFolder(generic_string); void addRootFolder(generic_string);
HTREEITEM getRootFromFullPath(const generic_string & rootPath) const; HTREEITEM getRootFromFullPath(const generic_string & rootPath) const;
HTREEITEM findChildNodeFromName(HTREEITEM parent, const generic_string&); HTREEITEM findChildNodeFromName(HTREEITEM parent, const generic_string&) const;
bool addInTree(const generic_string& rootPath, const generic_string& addItemFullPath, HTREEITEM node, std::vector<generic_string> linarPathArray); bool addInTree(const generic_string& rootPath, const generic_string& addItemFullPath, HTREEITEM node, std::vector<generic_string> linarPathArray);
HTREEITEM findInTree(const generic_string& rootPath, HTREEITEM node, std::vector<generic_string> linarPathArray); HTREEITEM findInTree(const generic_string& rootPath, HTREEITEM node, std::vector<generic_string> linarPathArray) const;
bool deleteFromTree(const generic_string& rootPath, HTREEITEM node, const std::vector<generic_string>& linarPathArray); bool deleteFromTree(const generic_string& rootPath, HTREEITEM node, const std::vector<generic_string>& linarPathArray);
void deleteAllFromTree() { void deleteAllFromTree() {
popupMenuCmd(IDM_FILEBROWSER_REMOVEALLROOTS); popupMenuCmd(IDM_FILEBROWSER_REMOVEALLROOTS);
@ -174,7 +174,8 @@ protected:
BrowserNodeType getNodeType(HTREEITEM hItem); BrowserNodeType getNodeType(HTREEITEM hItem);
void popupMenuCmd(int cmdID); void popupMenuCmd(int cmdID);
bool selectCurrentEditingFile(); bool selectCurrentEditingFile() const;
virtual INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); virtual INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
void notified(LPNMHDR notification); void notified(LPNMHDR notification);
void showContextMenu(int x, int y); void showContextMenu(int x, int y);

View File

@ -263,6 +263,31 @@ void TreeView::cleanSubEntries(HTREEITEM hTreeItem)
} }
} }
void TreeView::foldRecursively(HTREEITEM hParentItem) const
{
if (!hParentItem)
return;
HTREEITEM hItem = getChildFrom(hParentItem);
for (; hItem != NULL; hItem = getNextSibling(hItem))
{
foldRecursively(hItem);
fold(hItem);
}
fold(hParentItem);
}
void TreeView::foldAll() const
{
for (HTREEITEM tvProj = getRoot();
tvProj != NULL;
tvProj = getNextSibling(tvProj))
{
foldRecursively(tvProj);
}
}
void TreeView::setItemImage(HTREEITEM hTreeItem, int iImage, int iSelectedImage) void TreeView::setItemImage(HTREEITEM hTreeItem, int iImage, int iSelectedImage)
{ {
TVITEM tvItem; TVITEM tvItem;

View File

@ -88,6 +88,9 @@ public:
TreeView_Expand(_hSelf, hItem, TVE_COLLAPSE); TreeView_Expand(_hSelf, hItem, TVE_COLLAPSE);
}; };
void foldRecursively(HTREEITEM hItem) const;
void foldAll() const;
void toggleExpandCollapse(HTREEITEM hItem) const { void toggleExpandCollapse(HTREEITEM hItem) const {
TreeView_Expand(_hSelf, hItem, TVE_TOGGLE); TreeView_Expand(_hSelf, hItem, TVE_TOGGLE);
}; };

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -145,6 +145,7 @@
#define IDI_FB_ROOTOPEN 608 #define IDI_FB_ROOTOPEN 608
#define IDI_FB_ROOTCLOSE 609 #define IDI_FB_ROOTCLOSE 609
#define IDI_FB_SELECTCURRENTFILE 610 #define IDI_FB_SELECTCURRENTFILE 610
#define IDI_FB_FOLDALL 611
#define IDI_FUNCLIST_ROOT 620 #define IDI_FUNCLIST_ROOT 620
#define IDI_FUNCLIST_NODE 621 #define IDI_FUNCLIST_NODE 621