Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor: Replace inheritance with composition for Dialogs
Browse files Browse the repository at this point in the history
funap committed Sep 23, 2024
1 parent 86a3ce2 commit 50a900a
Showing 9 changed files with 330 additions and 245 deletions.
185 changes: 90 additions & 95 deletions src/Explorer/ExplorerDialog.cpp

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions src/Explorer/ExplorerDialog.h
Original file line number Diff line number Diff line change
@@ -28,7 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "Explorer.h"
#include "ExplorerContext.h"
#include "FileList.h"
#include "TreeHelperClass.h"
#include "TreeView.h"
#include "ToolBar.h"
#include "../NppPlugin/DockingFeature/DockingDlgInterface.h"

@@ -52,7 +52,7 @@ struct GetVolumeInfo {
LPBOOL pIsValidDrive;
};

class ExplorerDialog : public DockingDlgInterface, public TreeHelper, public CIDropTarget, public ExplorerContext
class ExplorerDialog : public DockingDlgInterface, public CIDropTarget, public ExplorerContext
{
public:
ExplorerDialog();
@@ -167,4 +167,5 @@ class ExplorerDialog : public DockingDlgInterface, public TreeHelper, public CID
BOOL _isDnDStarted;

INT _iDockedPos;
TreeHelper _hTreeCtrl;
};
186 changes: 83 additions & 103 deletions src/Explorer/FavesDialog.cpp

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions src/Explorer/FavesDialog.h
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

#include "Explorer.h"
#include "FavesModel.h"
#include "TreeHelperClass.h"
#include "TreeView.h"
#include "ToolBar.h"
#include "../NppPlugin/DockingFeature/DockingDlgInterface.h"

@@ -47,7 +47,7 @@ enum MenuID {
};


class FavesDialog : public DockingDlgInterface, public TreeHelper
class FavesDialog : public DockingDlgInterface
{
public:
FavesDialog();
@@ -101,7 +101,6 @@ class FavesDialog : public DockingDlgInterface, public TreeHelper
BOOL DoesLinkExist(LPTSTR link, FavesType type);
void OpenLink(FavesItemPtr pElem);
void UpdateLink(HTREEITEM hParentItem);
void UpdateNode(HTREEITEM hItem, BOOL haveChildren);

void DrawSessionChildren(HTREEITEM hItem);

@@ -141,4 +140,5 @@ class FavesDialog : public DockingDlgInterface, public TreeHelper

/* database */
FavesModel _model;
TreeHelper _hTreeCtrl;
};
8 changes: 1 addition & 7 deletions src/Explorer/OptionDialog.h
Original file line number Diff line number Diff line change
@@ -32,15 +32,9 @@ class OptionDlg : public StaticDialog
OptionDlg();
~OptionDlg();

void init(HINSTANCE hInst, HWND hParent)
{
Window::init(hInst, hParent);
};

INT_PTR doDialog(ExProp *prop);

virtual void destroy() {};

void destroy() override {}

protected :
INT_PTR CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) override;
28 changes: 14 additions & 14 deletions src/Explorer/PropDlg.cpp
Original file line number Diff line number Diff line change
@@ -111,7 +111,7 @@ INT_PTR CALLBACK PropDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam
}

SetFocus(::GetDlgItem(_hSelf, IDC_EDIT_NAME));
_hTreeCtrl = ::GetDlgItem(_hSelf, IDC_TREE_SELECT);
_hTreeCtrl.Attach(::GetDlgItem(_hSelf, IDC_TREE_SELECT));

goToCenter();

@@ -155,16 +155,16 @@ INT_PTR CALLBACK PropDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam
return elem->IsGroup();
});

HTREEITEM hItem = InsertItem(_root->m_name, iIconPos, _iUImgPos, 0, 0, TVI_ROOT, TVI_LAST, canExpand, _root);
HTREEITEM hItem = _hTreeCtrl.InsertItem(_root->m_name, iIconPos, _iUImgPos, 0, 0, TVI_ROOT, TVI_LAST, canExpand, _root);

SendMessage(_hTreeCtrl, WM_SETREDRAW, FALSE, 0);
ExpandTreeView(hItem);
SendMessage(_hTreeCtrl, WM_SETREDRAW, TRUE, 0);

if (_selectedGroup) {
hItem = FindTreeItemByParam(_selectedGroup);
hItem = _hTreeCtrl.FindTreeItemByParam(_selectedGroup);
}
TreeView_SelectItem(_hTreeCtrl, hItem);
_hTreeCtrl.SelectItem(hItem);

::SetWindowText(::GetDlgItem(_hSelf, IDC_BUTTON_DETAILS), L"Details <<");
}
@@ -280,16 +280,16 @@ INT_PTR CALLBACK PropDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam
SendDlgItemMessage(_hSelf, IDC_EDIT_LINK, WM_GETTEXT, lengthLink, (LPARAM)_pLink);

if ((wcslen(_pName) != 0) && (wcslen(_pLink) != 0)) {
auto *selectedItem = TreeView_GetSelection(_hTreeCtrl);
_selectedGroup = (FavesItemPtr)GetParam(selectedItem);
auto *selectedItem = _hTreeCtrl.GetSelection();
_selectedGroup = (FavesItemPtr)_hTreeCtrl.GetParam(selectedItem);
::EndDialog(_hSelf, TRUE);
return TRUE;
}
::MessageBox(_hParent, L"Fill out all fields!", L"Error", MB_OK);
}
else {
auto *selectedItem = TreeView_GetSelection(_hTreeCtrl);
_selectedGroup = (FavesItemPtr)GetParam(selectedItem);
auto *selectedItem = _hTreeCtrl.GetSelection();
_selectedGroup = (FavesItemPtr)_hTreeCtrl.GetParam(selectedItem);
::EndDialog(_hSelf, TRUE);
return TRUE;
}
@@ -342,10 +342,10 @@ INT_PTR CALLBACK PropDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam
case TVN_SELCHANGED: {
/* only when link params are also viewed */
if (_bWithLink == TRUE) {
HTREEITEM hItem = TreeView_GetSelection(_hTreeCtrl);
HTREEITEM hItem = _hTreeCtrl.GetSelection();

if (hItem != nullptr) {
FavesItemPtr pElem = (FavesItemPtr)GetParam(hItem);
FavesItemPtr pElem = (FavesItemPtr)_hTreeCtrl.GetParam(hItem);

if (pElem != nullptr) {
if (pElem->IsLink()) {
@@ -400,7 +400,7 @@ void PropDlg::setSelectedGroup(FavesItemPtr group)

void PropDlg::ExpandTreeView(HTREEITEM hParentItem)
{
FavesItemPtr parent = (FavesItemPtr)GetParam(hParentItem);
FavesItemPtr parent = (FavesItemPtr)_hTreeCtrl.GetParam(hParentItem);
if (parent == nullptr) {
return;
}
@@ -414,7 +414,7 @@ void PropDlg::ExpandTreeView(HTREEITEM hParentItem)
}
}
// add new item
HTREEITEM pCurrentItem = InsertItem(child->m_name, ICON_GROUP, ICON_GROUP, 0, 0, hParentItem, TVI_LAST, haveChildren, child.get());
HTREEITEM pCurrentItem = _hTreeCtrl.InsertItem(child->m_name, ICON_GROUP, ICON_GROUP, 0, 0, hParentItem, TVI_LAST, haveChildren, child.get());
ExpandTreeView(pCurrentItem);
}

@@ -424,9 +424,9 @@ void PropDlg::ExpandTreeView(HTREEITEM hParentItem)
INT iIconSelected = 0;
INT iIconOverlayed = 0;
ExtractIcons(child->m_name.c_str(), nullptr, DEVT_FILE, &iIconNormal, &iIconSelected, &iIconOverlayed);
HTREEITEM pCurrentItem = InsertItem(child->m_name, _iUImgPos, _iUImgPos, 0, 0, hParentItem, TVI_LAST, haveChildren, child.get());
HTREEITEM pCurrentItem = _hTreeCtrl.InsertItem(child->m_name, _iUImgPos, _iUImgPos, 0, 0, hParentItem, TVI_LAST, haveChildren, child.get());
ExpandTreeView(pCurrentItem);
}
}
TreeView_Expand(_hTreeCtrl, hParentItem, TVE_EXPAND);
_hTreeCtrl.Expand(hParentItem, TVE_EXPAND);
}
5 changes: 3 additions & 2 deletions src/Explorer/PropDlg.h
Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "Explorer.h"
#include "FileDlg.h"
#include "ExplorerResource.h"
#include "TreeHelperClass.h"
#include "TreeView.h"
#include "FavesModel.h"

enum class LinkDlg {
@@ -38,7 +38,7 @@ enum class LinkDlg {
FILE
};

class PropDlg : public StaticDialog, public TreeHelper
class PropDlg : public StaticDialog
{

public:
@@ -71,4 +71,5 @@ protected :
FavesItemPtr _root;
INT _iUImgPos;
FavesItemPtr _selectedGroup;
TreeHelper _hTreeCtrl;
};
112 changes: 103 additions & 9 deletions src/Explorer/TreeHelperClass.cpp → src/Explorer/TreeView.cpp
Original file line number Diff line number Diff line change
@@ -18,11 +18,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/


#include "TreeHelperClass.h"
#include "TreeView.h"

#include <memory>


BOOL TreeHelper::Attach(HWND wnd)
{
_hTreeCtrl = wnd;
return TRUE;
}

HTREEITEM TreeHelper::InsertItem(const std::wstring &itemName,
INT nImage,
INT nSelectedImage,
@@ -64,7 +70,7 @@ HTREEITEM TreeHelper::InsertItem(const std::wstring &itemName,

void TreeHelper::DeleteChildren(HTREEITEM parentItem)
{
HTREEITEM pCurrentItem = TreeView_GetNextItem(_hTreeCtrl, parentItem, TVGN_CHILD);
auto pCurrentItem = TreeView_GetNextItem(_hTreeCtrl, parentItem, TVGN_CHILD);

while (pCurrentItem != nullptr) {
TreeView_DeleteItem(_hTreeCtrl, pCurrentItem);
@@ -111,7 +117,7 @@ BOOL TreeHelper::UpdateItem(HTREEITEM hItem,
return TreeView_SetItem(_hTreeCtrl, &item);
}

BOOL TreeHelper::GetItemText(HTREEITEM hItem, LPTSTR szBuf, INT bufSize)
BOOL TreeHelper::GetItemText(HTREEITEM hItem, LPTSTR szBuf, INT bufSize) const
{
TVITEM tvi {
.mask = TVIF_TEXT,
@@ -140,7 +146,7 @@ std::wstring TreeHelper::GetItemText(HTREEITEM hItem) const
return { buffer.get() };
}

void* TreeHelper::GetParam(HTREEITEM hItem)
void* TreeHelper::GetParam(HTREEITEM hItem) const
{
TVITEM tvi {
.mask = TVIF_PARAM,
@@ -164,8 +170,16 @@ void TreeHelper::SetParam(HTREEITEM hItem, void* lParam)
TreeView_SetItem(_hTreeCtrl, &item);
}

BOOL TreeHelper::SetItemHasChildren(HTREEITEM item, BOOL hasChildren) {
TVITEM data{
.mask = TVIF_CHILDREN,
.hItem = item,
.cChildren = hasChildren,
};
return TreeView_SetItem(_hTreeCtrl, &data);
}

BOOL TreeHelper::GetItemIcons(HTREEITEM hItem, LPINT piIcon, LPINT piSelected, LPINT piOverlay)
BOOL TreeHelper::GetItemIcons(HTREEITEM hItem, LPINT piIcon, LPINT piSelected, LPINT piOverlay) const
{
if ((piIcon == nullptr) || (piSelected == nullptr) || (piOverlay == nullptr)) {
return FALSE;
@@ -201,12 +215,12 @@ void TreeHelper::SetItemIcons(HTREEITEM hItem, INT icon, INT selected, INT overl
TreeView_SetItem(_hTreeCtrl, &item);
}

BOOL TreeHelper::IsItemExpanded(HTREEITEM hItem)
BOOL TreeHelper::IsItemExpanded(HTREEITEM hItem) const
{
return (BOOL)(TreeView_GetItemState(_hTreeCtrl, hItem, TVIS_EXPANDED) & TVIS_EXPANDED);
}

INT TreeHelper::GetChildrenCount(HTREEITEM item)
INT TreeHelper::GetChildrenCount(HTREEITEM item) const
{
INT count = 0;

@@ -257,6 +271,86 @@ HTREEITEM TreeHelper::FindTreeItemByParam(const void* param)
return nullptr;
};

HTREEITEM root = TreeView_GetRoot(_hTreeCtrl);
auto root = TreeView_GetRoot(_hTreeCtrl);
return FindTreeItemByParamRecursive(FindTreeItemByParamRecursive, root);
}
}

HIMAGELIST TreeHelper::SetImageList(HIMAGELIST images, int type /* =TVSIL_NORMAL */)
{
return TreeView_SetImageList(_hTreeCtrl, images, type);
}

HTREEITEM TreeHelper::HitTest(TVHITTESTINFO* hitInfo) const
{
return TreeView_HitTest(_hTreeCtrl, hitInfo);
}

HTREEITEM TreeHelper::GetSelection() const
{
return TreeView_GetSelection(_hTreeCtrl);
}

HTREEITEM TreeHelper::GetRoot() const
{
return TreeView_GetRoot(_hTreeCtrl);
}

HTREEITEM TreeHelper::GetChild(HTREEITEM item) const
{
return TreeView_GetChild(_hTreeCtrl, item);
}

HTREEITEM TreeHelper::GetParent(HTREEITEM item) const
{
return TreeView_GetParent(_hTreeCtrl, item);
}

HTREEITEM TreeHelper::GetNextItem(HTREEITEM item, UINT code) const
{
return TreeView_GetNextItem(_hTreeCtrl, item, code);
}

HTREEITEM TreeHelper::GetDropHilightItem() const
{
return TreeView_GetDropHilight(_hTreeCtrl);
}

HTREEITEM TreeHelper::GetLastVisibleItem() const
{
return TreeView_GetLastVisible(_hTreeCtrl);
}

BOOL TreeHelper::ItemHasChildren(HTREEITEM item) const
{
return TreeView_GetChild(_hTreeCtrl, item) ? TRUE : FALSE;
}

BOOL TreeHelper::Expand(HTREEITEM item, UINT code) const
{
return TreeView_Expand(_hTreeCtrl, item, code);
}

BOOL TreeHelper::GetItemRect(HTREEITEM item, RECT* rect, BOOL isTextOnly) const
{
return TreeView_GetItemRect(_hTreeCtrl, item, rect, isTextOnly);
}

BOOL TreeHelper::SelectItem(HTREEITEM item)
{
return TreeView_SelectItem(_hTreeCtrl, item);
}

BOOL TreeHelper::DeleteItem(HTREEITEM item)
{
return TreeView_DeleteItem(_hTreeCtrl, item);
}

BOOL TreeHelper::EnsureVisible(HTREEITEM item)
{
return TreeView_EnsureVisible(_hTreeCtrl, item);
}

BOOL TreeHelper::SelectDropTarget(HTREEITEM item)
{
return TreeView_SelectDropTarget(_hTreeCtrl, item);
}
40 changes: 30 additions & 10 deletions src/Explorer/TreeHelperClass.h → src/Explorer/TreeView.h
Original file line number Diff line number Diff line change
@@ -28,23 +28,43 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class TreeHelper
{
public:
TreeHelper() : _hTreeCtrl(nullptr) {};
~TreeHelper() {};
TreeHelper() {};
virtual ~TreeHelper() {};

BOOL Attach(HWND wnd);
operator HWND() const { return _hTreeCtrl; }

protected:
std::vector<std::wstring> GetItemPathFromRoot(HTREEITEM currentItem) const;
HTREEITEM InsertItem(const std::wstring &itemName, INT nImage, INT nSelectedImage, INT nOverlayedImage, BOOL bHidden, HTREEITEM hParent, HTREEITEM hInsertAfter = TVI_LAST, BOOL haveChildren = FALSE, void* lParam = NULL);
BOOL UpdateItem(HTREEITEM hItem, const std::wstring &itemName, INT nImage, INT nSelectedImage, INT nOverlayedImage, BOOL bHidden, BOOL haveChildren = FALSE, void* lParam = NULL, BOOL delChildren = TRUE);
void DeleteChildren(HTREEITEM parentItem);
BOOL GetItemText(HTREEITEM hItem, LPTSTR szBuf, INT bufSize);
BOOL GetItemText(HTREEITEM hItem, LPTSTR szBuf, INT bufSize) const;
std::wstring GetItemText(HTREEITEM hItem) const;
void* GetParam(HTREEITEM hItem);
void* GetParam(HTREEITEM hItem) const;
void SetParam(HTREEITEM hItem, void* lParam);
BOOL GetItemIcons(HTREEITEM hItem, LPINT iIcon, LPINT piSelected, LPINT iOverlay);
BOOL SetItemHasChildren(HTREEITEM item, BOOL hasChildren);
BOOL GetItemIcons(HTREEITEM hItem, LPINT iIcon, LPINT piSelected, LPINT iOverlay) const;
void SetItemIcons(HTREEITEM hItem, INT icon, INT selected, INT overlay);
BOOL IsItemExpanded(HTREEITEM hItem);
INT GetChildrenCount(HTREEITEM item);
BOOL IsItemExpanded(HTREEITEM hItem) const;
INT GetChildrenCount(HTREEITEM item) const;
std::vector<std::wstring> GetItemPathFromRoot(HTREEITEM currentItem) const;
HTREEITEM FindTreeItemByParam(const void* param);

HWND _hTreeCtrl;
HIMAGELIST SetImageList(HIMAGELIST images, int type = TVSIL_NORMAL);
HTREEITEM HitTest(TVHITTESTINFO* hitInfo) const;
HTREEITEM GetSelection() const;
HTREEITEM GetRoot() const;
HTREEITEM GetChild(HTREEITEM item) const;
HTREEITEM GetParent(HTREEITEM item) const;
HTREEITEM GetNextItem(HTREEITEM item, UINT code) const;
HTREEITEM GetDropHilightItem() const;
HTREEITEM GetLastVisibleItem() const;
BOOL ItemHasChildren(HTREEITEM item) const;
BOOL Expand(HTREEITEM item, UINT code) const;
BOOL GetItemRect(HTREEITEM item, RECT* rect, BOOL isTextOnly) const;
BOOL SelectItem(HTREEITEM item);
BOOL DeleteItem(HTREEITEM item);
BOOL EnsureVisible(HTREEITEM item);
BOOL SelectDropTarget(HTREEITEM item);
protected:
HWND _hTreeCtrl{nullptr};
};

0 comments on commit 50a900a

Please sign in to comment.