OSDN Git Service

4bf5423b6f2d4a6caeb5f8d3b114c222e5be0322
[seraphyscrtools/SeraphyScriptTools.git] / TreeItem.h
1 // TreeItem.h : CTreeItem \82Ì\90é\8c¾
2
3 #ifndef __TREEITEM_H_
4 #define __TREEITEM_H_
5
6 #include "resource.h"       // \83\81\83C\83\93 \83V\83\93\83{\83\8b
7 #include "generic.h"
8
9 /////////////////////////////////////////////////////////////////////////////
10 // CTreeItem
11 class ATL_NO_VTABLE CTreeItem : 
12         public CComObjectRootEx<CComSingleThreadModel>,
13 //      public CComCoClass<CTreeItem, &CLSID_TreeItem>,
14         public ISupportErrorInfo,
15         public IDispatchImpl<ITreeItem, &IID_ITreeItem, &LIBID_SERAPHYSCRIPTTOOLSLib>
16 {
17 public:
18         CTreeItem()
19         {
20                 m_hWnd = NULL;
21                 m_hItem = NULL;
22         }
23 static BOOL DeleteTreeItemWithData(HWND hWnd,HTREEITEM hItem);
24 //DECLARE_REGISTRY_RESOURCEID(IDR_TREEITEM)
25
26 DECLARE_PROTECT_FINAL_CONSTRUCT()
27
28 BEGIN_COM_MAP(CTreeItem)
29         COM_INTERFACE_ENTRY(ITreeItem)
30         COM_INTERFACE_ENTRY(IDispatch)
31         COM_INTERFACE_ENTRY(ISupportErrorInfo)
32 END_COM_MAP()
33
34 // ISupportsErrorInfo
35         STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
36
37 // ITreeItem
38 public:
39         STDMETHOD(IsValid)(/*[out,retval]*/BOOL* pResult);
40         static void CreateTreeItem(HWND hWnd,HTREEITEM hParent,LPCSTR text,IUnknown** punkVal);
41         STDMETHOD(Sort)()
42         {
43                 HRESULT ret = InitialCheck();
44                 if(ret == S_OK){
45                         if(m_hItem){
46                                 TreeView_SortChildren(m_hWnd,m_hItem,0);
47                         }
48                         else{
49                                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
50                                 ret = DISP_E_EXCEPTION;
51                         }
52                 }
53                 return ret;
54         }
55         STDMETHOD(Expand)()
56         {
57                 HRESULT ret = InitialCheck();
58                 if(ret == S_OK){
59                         if(m_hItem){
60                                 TreeView_Expand(m_hWnd,m_hItem,TVE_EXPAND);
61                         }
62                         else{
63                                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
64                                 ret = DISP_E_EXCEPTION;
65                         }
66                 }
67                 return ret;
68         }
69         STDMETHOD(Select)()
70         {
71                 HRESULT ret = InitialCheck();
72                 if(ret == S_OK){
73                         if(m_hItem){
74                                 TreeView_SelectItem(m_hWnd,m_hItem);
75                         }
76                         else{
77                                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
78                                 ret = DISP_E_EXCEPTION;
79                         }
80                 }
81                 return ret;
82         }
83         STDMETHOD(Erase)()
84         {
85                 HRESULT ret = InitialCheck();
86                 if(ret == S_OK){
87                         if(m_hItem){
88                                 if(DeleteTreeItemWithData(m_hWnd,m_hItem)){
89                                         // \8dí\8f\9c\82É\90¬\8c÷\82µ\82½\82ç\81A\82±\82Ì\83n\83\93\83h\83\8b\82ð\96³\8cø\82É\82·\82é
90                                         m_hWnd = NULL;
91                                         m_hItem = NULL;
92                                 }
93                         }
94                         else{
95                                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
96                                 ret = DISP_E_EXCEPTION;
97                         }
98                 }
99                 return ret;
100         }
101         STDMETHOD(Create)(/*[in]*/VARIANT text,/*[out,retval]*/IUnknown** punkVal)
102         {
103                 // \83A\83C\83e\83\80\82Ì\8dì\90¬
104                 *punkVal = NULL;
105                 HRESULT ret = InitialCheck();
106                 if(ret == S_OK){
107                         if(m_hItem){
108                                 CHAR mes[MAX_PATH];
109                                 CComVariant str;
110                                 if(str.ChangeType(VT_BSTR,&text) == S_OK){
111                                         int cnt = WideCharToMultiByte(GetACP(),0,str.bstrVal,-1,mes,MAX_PATH,NULL,NULL);
112                                         CreateTreeItem(m_hWnd,m_hItem,mes,punkVal);
113                                 }
114                         }
115                         else{
116                                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
117                                 ret = DISP_E_EXCEPTION;
118                         }
119                 }
120                 return ret;
121         }
122         STDMETHOD(get_Object)(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal)
123         {
124                 // \83A\83C\83e\83\80\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82ð\8eæ\93¾\82·\82é
125                 ::VariantInit(pVal);
126                 HRESULT ret = InitialCheck();
127                 if(!m_hItem){
128                         ret = DISP_E_EXCEPTION;
129                 }
130                 if(ret == S_OK){
131                         TVITEM itm = {0};
132                         itm.mask   = TVIF_PARAM;
133                         itm.hItem  = m_hItem;
134                         if(TreeView_GetItem(m_hWnd,&itm)){
135                                 IUnknown* pUnk = (IUnknown*)itm.lParam;
136                                 if(pUnk){
137                                         pUnk->AddRef();
138                                         pVal->vt      = VT_UNKNOWN;
139                                         pVal->punkVal = pUnk;
140                                 }
141                         }
142                 }
143                 return ret;
144         }
145         HRESULT InitialCheck()
146         {
147                 // \83E\83B\83\93\83h\83E\82ª\97L\8cø\82©\8c\9f\8d¸\82·\82é
148                 if(m_hWnd && ::IsWindow(m_hWnd)){
149                         return S_OK;
150                 }
151                 ErrorInfo(IDS_ERR_TREEERROR);
152                 return DISP_E_EXCEPTION;
153         }
154         STDMETHOD(get_Text)(/*[out, retval]*/ BSTR *pVal)
155         {
156                 // \83e\83L\83X\83g\82Ì\8eæ\93¾
157                 HRESULT ret = InitialCheck();
158                 if(!m_hItem){
159                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
160                         ret = DISP_E_EXCEPTION;
161                 }
162                 if(ret == S_OK){
163                         CHAR text[MAX_PATH];
164                         TVITEM itm = {0};
165                         itm.mask       = TVIF_TEXT;
166                         itm.hItem      = m_hItem;
167                         itm.pszText    = text;
168                         itm.cchTextMax = MAX_PATH;
169                         if(TreeView_GetItem(m_hWnd,&itm)){
170                                 WCHAR wMes[MAX_PATH] = {0};
171                                 MultiByteToWideChar(GetACP(),0,text,-1,wMes,MAX_PATH);
172                                 *pVal = SysAllocString(wMes);
173                         }
174                 }
175                 return ret;
176         }
177         STDMETHOD(put_Text)(/*[in]*/ BSTR newVal)
178         {
179                 // \83e\83L\83X\83g\82Ì\8f\91\82«\8a·\82¦
180                 HRESULT ret = InitialCheck();
181                 if(!m_hItem){
182                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
183                         ret = DISP_E_EXCEPTION;
184                 }
185                 if(ret == S_OK){
186                         CHAR text[MAX_PATH] = {0};
187                         TVITEM itm = {0};
188                         itm.mask       = TVIF_TEXT;
189                         itm.hItem      = m_hItem;
190                         itm.pszText    = text;
191                         itm.cchTextMax = MAX_PATH;
192                         WideCharToMultiByte(GetACP(),0,newVal,-1,text,MAX_PATH,NULL,NULL);
193                         TreeView_SetItem(m_hWnd,&itm);
194                 }
195                 return ret;
196         }
197         STDMETHOD(get_PrevItem)(/*[out, retval]*/ IUnknown* *pVal)
198         {
199                 // \91O\82Ì\83A\83C\83e\83\80
200                 *pVal = NULL;
201                 HRESULT ret = InitialCheck();
202                 if(!m_hItem){
203                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
204                         ret = DISP_E_EXCEPTION;
205                 }
206                 if(ret == S_OK){
207                         HTREEITEM hNewItem = TreeView_GetPrevSibling(m_hWnd,m_hItem);
208                         CComObject<CTreeItem>* pItem = NULL;
209                         if(pItem->CreateInstance(&pItem) == S_OK){
210                                 pItem->SetParam(m_hWnd,hNewItem);
211                                 ret = pItem->QueryInterface(IID_IUnknown,(void**)pVal);
212                         }
213                 }
214                 return ret;
215         }
216         STDMETHOD(get_NextItem)(/*[out, retval]*/ IUnknown* *pVal)
217         {
218                 // \8e\9f\82Ì\83A\83C\83e\83\80
219                 *pVal = NULL;
220                 HRESULT ret = InitialCheck();
221                 if(!m_hItem){
222                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
223                         ret = DISP_E_EXCEPTION;
224                 }
225                 if(ret == S_OK){
226                         HTREEITEM hNewItem = TreeView_GetNextSibling(m_hWnd,m_hItem);
227                         CComObject<CTreeItem>* pItem = NULL;
228                         if(pItem->CreateInstance(&pItem) == S_OK){
229                                 pItem->SetParam(m_hWnd,hNewItem);
230                                 ret = pItem->QueryInterface(IID_IUnknown,(void**)pVal);
231                         }
232                 }
233                 return ret;
234         }
235         STDMETHOD(get_ChildItem)(/*[out, retval]*/ IUnknown* *pVal)
236         {
237                 // \8eq\83A\83C\83e\83\80
238                 *pVal = NULL;
239                 HRESULT ret = InitialCheck();
240                 if(!m_hItem){
241                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
242                         ret = DISP_E_EXCEPTION;
243                 }
244                 if(ret == S_OK){
245                         HTREEITEM hNewItem = TreeView_GetChild(m_hWnd,m_hItem);
246                         CComObject<CTreeItem>* pItem = NULL;
247                         if(pItem->CreateInstance(&pItem) == S_OK){
248                                 pItem->SetParam(m_hWnd,hNewItem);
249                                 ret = pItem->QueryInterface(IID_IUnknown,(void**)pVal);
250                         }
251                 }
252                 return S_OK;
253         }
254         STDMETHOD(get_Parent)(/*[out, retval]*/ IUnknown* *pVal)
255         {
256                 // \90e\83A\83C\83e\83\80
257                 *pVal = NULL;
258                 HRESULT ret = InitialCheck();
259                 if(!m_hItem){
260                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
261                         ret = DISP_E_EXCEPTION;
262                 }
263                 if(ret == S_OK){
264                         HTREEITEM hNewItem = TreeView_GetParent(m_hWnd,m_hItem);
265                         CComObject<CTreeItem>* pItem = NULL;
266                         if(pItem->CreateInstance(&pItem) == S_OK){
267                                 pItem->SetParam(m_hWnd,hNewItem);
268                                 ret = pItem->QueryInterface(IID_IUnknown,(void**)pVal);
269                         }
270                 }
271                 return S_OK;
272         }
273         //
274         void SetParam(HWND hWnd,HTREEITEM hItem)
275         {
276                 m_hWnd = hWnd;
277                 m_hItem = hItem;
278         }
279 protected:
280         HWND m_hWnd;
281         HTREEITEM m_hItem;
282 };
283
284 #endif //__TREEITEM_H_