📄 svctreeview.hpp
字号:
// Copyright E骾n O'Callaghan 2008 - 2008.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#pragma once
class SvcTreeViewCtrl :
public ATL::CWindowImpl<SvcTreeViewCtrl, WTL::CTreeViewCtrlEx>,
public WTLx::update_lockable<SvcTreeViewCtrl>,
public SettingsIni<SvcTreeViewCtrl>,
private boost::noncopyable
{
protected:
typedef SvcTreeViewCtrl thisClass;
typedef ATL::CWindowImpl<thisClass, WTL::CTreeViewCtrlEx> treeClass;
typedef SettingsIni<thisClass> iniClass;
friend class treeClass;
typedef boost::function<void (size_t i, std::wstring name)> name_changed_fn;
typedef boost::function<void (size_t i)> active_profile_selected_fn;
typedef boost::function<void (size_t i)> delete_profile_fn;
typedef boost::function<void (WTL::CTreeItem ti_p)> new_profile_fn;
typedef boost::function<bool ()> should_cancel_edit_fn;
public:
SvcTreeViewCtrl(aux::txml_ini& ini, name_changed_fn f, active_profile_selected_fn aps,
delete_profile_fn dp, new_profile_fn np, should_cancel_edit_fn sce) :
iniClass("service_pane", "service_treeview", ini),
name_changed_(f),
active_profile_selected_(aps),
delete_profile_(dp),
new_profile_(np),
should_cancel_edit_(sce)
{}
BEGIN_MSG_MAP_EX(thisClass)
MSG_WM_SHOWWINDOW(OnShowWindow)
MSG_WM_DESTROY(OnDestroy)
REFLECTED_NOTIFY_CODE_HANDLER(TVN_BEGINLABELEDIT, OnBeginLabelEdit)
REFLECTED_NOTIFY_CODE_HANDLER(TVN_ENDLABELEDIT, OnEndLabelEdit)
if (test_notification_lock())
{
REFLECTED_NOTIFY_CODE_HANDLER(TVN_SELCHANGED, OnSelChanged)
REFLECTED_NOTIFY_CODE_HANDLER(NM_RCLICK, OnRClick)
}
COMMAND_ID_HANDLER(ID_SAVEPROFILE, OnSave)
COMMAND_ID_HANDLER(ID_NEWPROFILE, OnNew)
COMMAND_ID_HANDLER(ID_NEWSUBPROFILE, OnNewSub)
COMMAND_ID_HANDLER(ID_DELETEPROFILE, OnDelete)
COMMAND_ID_HANDLER(ID_APPLYPROFILE, OnApply)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0,
ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
{
HWND hwnd = treeClass::Create(hWndParent, (RECT &)rect.m_lpRect, szWindowName,
dwStyle|TVS_HASLINES|TVS_SHOWSELALWAYS|TVS_TRACKSELECT, dwExStyle|WS_EX_CLIENTEDGE, (UINT)MenuOrID.m_hMenu, lpCreateParam);
assert(hwnd);
return hwnd;
}
void OnShowWindow(UINT, INT)
{
WTL::CMenuHandle menu;
BOOL menu_created = menu.LoadMenu(IDR_TREE_MENU);
if (menu)
{
menu_.Attach(menu.GetSubMenu(0));
}
}
LRESULT OnRClick(int i, LPNMHDR pnmh, BOOL&)
{
LPNMITEMACTIVATE pia = (LPNMITEMACTIVATE)pnmh;
if (menu_)
{
assert (menu_.IsMenu());
WTL::CPoint cur_pt;
GetCursorPos(&cur_pt);
WTL::CPoint pt = cur_pt;
ScreenToClient(&pt);
WTL::CTreeItem ti = HitTest(pt, 0);
MENUITEMINFO minfo = {sizeof(MENUITEMINFO)};
minfo.fMask = MIIM_STATE;
if (ti)
{
focused_ = ti;
minfo.fState = MFS_ENABLED;
menu_.SetMenuItemInfo(ID_SAVEPROFILE, false, &minfo);
minfo.fState = MFS_ENABLED;
menu_.SetMenuItemInfo(ID_APPLYPROFILE, false, &minfo);
minfo.fState = MFS_ENABLED;
menu_.SetMenuItemInfo(ID_DELETEPROFILE, false, &minfo);
minfo.fState = MFS_ENABLED;
menu_.SetMenuItemInfo(ID_NEWSUBPROFILE, false, &minfo);
minfo.fState = MFS_DISABLED;
menu_.SetMenuItemInfo(ID_NEWPROFILE, false, &minfo);
}
else
{
focused_ = WTL::CTreeItem();
minfo.fState = MFS_ENABLED;
menu_.SetMenuItemInfo(ID_NEWPROFILE, false, &minfo);
minfo.fState = MFS_DISABLED;
menu_.SetMenuItemInfo(ID_SAVEPROFILE, false, &minfo);
minfo.fState = MFS_DISABLED;
menu_.SetMenuItemInfo(ID_APPLYPROFILE, false, &minfo);
minfo.fState = MFS_DISABLED;
menu_.SetMenuItemInfo(ID_DELETEPROFILE, false, &minfo);
minfo.fState = MFS_DISABLED;
menu_.SetMenuItemInfo(ID_NEWSUBPROFILE, false, &minfo);
}
menu_.TrackPopupMenu(0, cur_pt.x, cur_pt.y, m_hWnd);
}
return 0;
}
LRESULT OnSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
return 0;
}
LRESULT OnNew(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
new_profile_(WTL::CTreeItem());
return 0;
}
LRESULT OnNewSub(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
new_profile_(focused_);
return 0;
}
LRESULT OnDelete(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
if (MessageBox(L"Are you sure you want to delete this profile?",
L"ServiceProfiles", MB_YESNO) == IDYES)
{
delete_profile_(focused_.GetData());
focused_.Delete();
}
return 0;
}
LRESULT OnApply(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
return 0;
}
LRESULT OnBeginLabelEdit(int i, LPNMHDR pnmh, BOOL&)
{
WTLx::notification_lock<thisClass> lock(*this);
LPNMTVDISPINFO nmtv = (LPNMTVDISPINFO)pnmh;
WTL::CTreeItem ti(nmtv->item.hItem, this);
ti.Select();
if (should_cancel_edit_())
{
active_profile_selected_(ti.GetData());
return true;
}
return false;
}
LRESULT OnEndLabelEdit(int i, LPNMHDR pnmh, BOOL&)
{
WTLx::notification_lock<thisClass> lock(*this);
LPNMTVDISPINFO nmtv = (LPNMTVDISPINFO)pnmh;
if (((TVITEM)nmtv->item).pszText)
{
WTL::CTreeItem ti(nmtv->item.hItem, this);
ti.Select();
name_changed_(ti.GetData(), ((TVITEM)nmtv->item).pszText);
return true;
}
else
{
WTL::CTreeItem ti(nmtv->item.hItem, this);
aux::win_c_str<std::wstring> str(MAX_PATH);
ti.GetText(str, str.size());
//name_changed_(ti.GetData(), str);
return false;
}
}
LRESULT OnSelChanged(int i, LPNMHDR pnmh, BOOL&)
{
LPNMTREEVIEW nmtv = (LPNMTREEVIEW)pnmh;
WTL::CTreeItem ti(nmtv->itemNew.hItem, this);
active_profile_selected_(ti.GetData());
return true;
}
void insert_item(const std::wstring& name, size_t item, size_t parent)
{
std::map<size_t, WTL::CTreeItem>::iterator i = tree_items_.find(item);
if (i == tree_items_.end())
{
WTL::CTreeItem new_file;
if (parent == 0)
{
new_file = InsertItem(name.c_str(), TVI_ROOT, TVI_LAST);
}
else
{
new_file = InsertItem(name.c_str(), tree_items_[parent], TVI_LAST);
tree_items_[parent].Expand();
}
tree_items_[item] = new_file;
new_file.SetData(item);
}
}
protected:
name_changed_fn name_changed_;
active_profile_selected_fn active_profile_selected_;
delete_profile_fn delete_profile_;
new_profile_fn new_profile_;
should_cancel_edit_fn should_cancel_edit_;
void OnDestroy()
{
// saveSettings();
}
bool editing_;
WTL::CTreeItem focused_;
private:
WTL::CMenu menu_;
std::map<size_t, WTL::CTreeItem> tree_items_;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -