⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svctreeview.hpp

📁 j2me is based on j2mepolish, client & server for mobile application.
💻 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 + -