OSDN Git Service

セットアップの追加、ヘルプの修正
[seraphyscrtools/SeraphyScriptTools.git] / TreeItem.cpp
1 // TreeItem.cpp : CTreeItem \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
2 #include "stdafx.h"
3 #include "SeraphyScriptTools.h"
4 #include "TreeItem.h"
5 #include "objectmap.h"
6
7 #include <list>
8
9
10 /////////////////////////////////////////////////////////////////////////////
11 // CTreeItem
12
13 BOOL CTreeItem::DeleteTreeItemWithData(HWND hWnd, HTREEITEM hItem)
14 {
15         HTREEITEM hRoot = hItem;
16         std::list<HTREEITEM> lst;
17         lst.push_back(hItem);
18         while (!lst.empty()) {
19                 hItem = lst.front();
20                 lst.pop_front();
21                 while (hItem) {
22                         HTREEITEM hChild = TreeView_GetChild(hWnd, hItem);
23                         if (hChild) {
24                                 // \8eq\83O\83\8b\81[\83v\82ð\8c\9f\8d¸\82·\82é\82æ\82¤\82É\83X\83^\83b\83N\82·\82é
25                                 lst.push_back(hChild);
26                         }
27                         // \82±\82Ì\83A\83C\83e\83\80\82É\8aÖ\98A\82Ã\82¯\82ç\82ê\82½\83I\83u\83W\83F\83N\83g\82ð\89ð\95ú\82·\82é
28                         TVITEM itm = {0};
29                         itm.mask = TVIF_PARAM;
30                         itm.hItem = hItem;
31                         if (TreeView_GetItem(hWnd, &itm) && itm.lParam) {
32                                 IUnknown* pUnk = (IUnknown*)itm.lParam;
33                                 pUnk->Release();
34                                 itm.lParam = NULL;
35                                 TreeView_SetItem(hWnd, &itm);
36                         }
37                         // \82Â\82¬\82Ì\83A\83C\83e\83\80\82ð\92T\82·
38                         if (hRoot == hItem) {
39                                 // \8aJ\8en\88Ê\92u\82Ì\8cZ\92í\82Í\92T\82µ\82Ä\82Í\82È\82ç\82È\82¢
40                                 hItem = NULL;
41                         }
42                         else {
43                                 hItem = TreeView_GetNextSibling(hWnd, hItem);
44                         }
45                 }
46         }
47         TreeView_DeleteItem(hWnd, hRoot);
48         return true;
49 }
50
51 /**
52  * \83c\83\8a\81[\83A\83C\83e\83\80\82ð\95Û\8e\9d\82·\82é\83I\83u\83W\83F\83N\83g\82ð\90\90¬\82µ\82Ä\95Ô\82·.
53  * IUnknown\82Í\8eQ\8fÆ\83J\83E\83\93\83g1\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\82½\82ß\81A\8cÄ\82Ñ\8fo\82µ\91¤\82ÅRelease\82ª\95K\97v.
54  */
55 HRESULT CTreeItem::CreateTreeItem(HWND hWnd, HTREEITEM hParent, LPCTSTR text, IUnknown **punkVal)
56 {
57         if (!punkVal) {
58                 return E_POINTER;
59         }
60         *punkVal = NULL;
61
62         // \83A\83C\83e\83\80\82ª\95Û\97L\82·\82é\98A\91z\94z\97ñ\82ð\90\90¬\82·\82é
63
64         HRESULT hr;
65
66         CComObject<CObjectMap>* pMap = NULL;
67         if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
68                 return hr;
69         }
70         CComPtr<IUnknown> pMapUnk;
71         if (FAILED(hr = pMap->QueryInterface(&pMapUnk))) {
72                 delete pMap;
73                 return hr;
74         }
75
76         // \91}\93ü\82·\82é\83A\83C\83e\83\80\82Ì\92è\8b`
77         ATL::CString tmp(text);
78         TVINSERTSTRUCT is = {0};
79         is.hParent = hParent;
80         is.hInsertAfter = TVI_LAST;
81         is.item.mask = TVIF_TEXT | TVIF_PARAM;
82         is.item.pszText = tmp.GetBuffer();
83         is.item.cchTextMax = tmp.GetLength();
84
85         IUnknown* pUnk = NULL;
86         if (FAILED(hr = pMapUnk.CopyTo(&pUnk))) {
87                 return hr;
88         }
89         is.item.lParam = (LPARAM)pUnk;
90
91         HTREEITEM hNewItem = TreeView_InsertItem(hWnd, &is);
92         if (!hNewItem) {
93                 // \93o\98^\82³\82ê\82È\82©\82Á\82½\8fê\8d\87\82Í\83^\83O\83A\83C\83e\83\80\82É\8aÖ\98A\82Ã\82¯\82½pUnk\82ð\89ð\95ú\82·\82é
94                 pUnk->Release();
95                 return E_FAIL; // \95s\96¾\82È\83G\83\89\81[
96         }
97
98         // \83A\83C\83e\83\80\82Ö\82Ì\83I\83u\83W\83F\83N\83g\82ð\8dì\90¬\82·\82é
99         CComObject<CTreeItem>* pItem = NULL;
100         if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
101                 return hr;
102         }
103         pItem->SetParam(hWnd, hNewItem);
104
105         if (FAILED(hr = pItem->QueryInterface(punkVal))) {
106                 delete pItem;
107                 return hr;
108         }
109         return S_OK;
110 }
111
112 STDMETHODIMP CTreeItem::IsValid(BOOL *pResult)
113 {
114         if (!pResult) {
115                 return E_FAIL;
116         }
117
118         *pResult = (m_hItem != NULL) ? VB_TRUE : VB_FALSE;
119
120         return S_OK;
121 }
122
123 STDMETHODIMP CTreeItem::Sort()
124 {
125         HRESULT ret = InitialCheck();
126         if (ret == S_OK) {
127                 if (m_hItem) {
128                         TreeView_SortChildren(m_hWnd, m_hItem, 0);
129                 }
130                 else {
131                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
132                         ret = DISP_E_EXCEPTION;
133                 }
134         }
135         return ret;
136 }
137
138 STDMETHODIMP CTreeItem::Expand()
139 {
140         HRESULT ret = InitialCheck();
141         if (ret == S_OK) {
142                 if (m_hItem) {
143                         TreeView_Expand(m_hWnd, m_hItem, TVE_EXPAND);
144                 }
145                 else {
146                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
147                         ret = DISP_E_EXCEPTION;
148                 }
149         }
150         return ret;
151 }
152
153 STDMETHODIMP CTreeItem::Select()
154 {
155         HRESULT ret = InitialCheck();
156         if (ret == S_OK) {
157                 if (m_hItem) {
158                         TreeView_SelectItem(m_hWnd, m_hItem);
159                 }
160                 else {
161                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
162                         ret = DISP_E_EXCEPTION;
163                 }
164         }
165         return ret;
166 }
167
168 STDMETHODIMP CTreeItem::Erase()
169 {
170         HRESULT ret = InitialCheck();
171         if (ret == S_OK) {
172                 if (m_hItem) {
173                         if (DeleteTreeItemWithData(m_hWnd, m_hItem)) {
174                                 // \8dí\8f\9c\82É\90¬\8c÷\82µ\82½\82ç\81A\82±\82Ì\83n\83\93\83h\83\8b\82ð\96³\8cø\82É\82·\82é
175                                 m_hWnd = NULL;
176                                 m_hItem = NULL;
177                         }
178                 }
179                 else {
180                         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
181                         ret = DISP_E_EXCEPTION;
182                 }
183         }
184         return ret;
185 }
186
187 STDMETHODIMP CTreeItem::Create(/*[in]*/VARIANT text,/*[out,retval]*/IUnknown** punkVal)
188 {
189         // \83A\83C\83e\83\80\82Ì\8dì\90¬
190         *punkVal = NULL;
191         HRESULT ret = InitialCheck();
192         if (FAILED(ret)) {
193                 return ret;
194         }
195
196         if (m_hItem) {
197                 CComVariant str;
198                 ATL::CString mes(_TEXT(""));
199                 if (str.ChangeType(VT_BSTR, &text) == S_OK) {
200                         mes = str.bstrVal;
201                 }
202                 CreateTreeItem(m_hWnd, m_hItem, mes, punkVal);
203                 return S_OK;
204         }
205         // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
206         return DISP_E_EXCEPTION;
207 }
208
209 STDMETHODIMP CTreeItem::get_Object(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal)
210 {
211         // \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é
212         ::VariantInit(pVal);
213         HRESULT ret = InitialCheck();
214         if (!m_hItem) {
215                 ret = DISP_E_EXCEPTION;
216         }
217         if (ret == S_OK) {
218                 TVITEM itm = {0};
219                 itm.mask = TVIF_PARAM;
220                 itm.hItem = m_hItem;
221                 if (TreeView_GetItem(m_hWnd, &itm)) {
222                         IUnknown* pUnk = (IUnknown*)itm.lParam;
223                         if (pUnk) {
224                                 pUnk->AddRef();
225                                 pVal->vt = VT_UNKNOWN;
226                                 pVal->punkVal = pUnk;
227                         }
228                 }
229         }
230         return ret;
231 }
232
233 HRESULT CTreeItem::InitialCheck()
234 {
235         // \83E\83B\83\93\83h\83E\82ª\97L\8cø\82©\8c\9f\8d¸\82·\82é
236         if (m_hWnd && ::IsWindow(m_hWnd)) {
237                 return S_OK;
238         }
239         return Error(IDS_ERR_TREEERROR);
240 }
241
242 STDMETHODIMP CTreeItem::get_Text(/*[out, retval]*/ BSTR *pVal)
243 {
244         // \83e\83L\83X\83g\82Ì\8eæ\93¾
245         HRESULT hr;
246         if (FAILED(hr = InitialCheck())) {
247                 return hr;
248         }
249         if (!m_hItem) {
250                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
251                 return DISP_E_EXCEPTION;
252         }
253
254         TCHAR text[MAX_PATH] = {0};
255         TVITEM itm = {0};
256         itm.mask = TVIF_TEXT;
257         itm.hItem = m_hItem;
258         itm.pszText = text;
259         itm.cchTextMax = MAX_PATH;
260         if (TreeView_GetItem(m_hWnd, &itm)) {
261                 CComBSTR ret(text);
262                 *pVal = ret.Detach();
263         }
264         return S_OK;
265 }
266
267 STDMETHODIMP CTreeItem::put_Text(/*[in]*/ BSTR newVal)
268 {
269         // \83e\83L\83X\83g\82Ì\8f\91\82«\8a·\82¦
270         HRESULT hr;
271         if (FAILED(hr = InitialCheck())) {
272                 return hr;
273         }
274         if (!m_hItem) {
275                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
276                 return DISP_E_EXCEPTION;
277         }
278
279         ATL::CString tmp(newVal);
280         TVITEM itm = {0};
281         itm.mask = TVIF_TEXT;
282         itm.hItem = m_hItem;
283         itm.pszText = tmp.GetBuffer();
284         itm.cchTextMax = tmp.GetLength(); // Set\82Ì\8fê\8d\87\82Í\96³\8e\8b\82³\82ê\82é
285         TreeView_SetItem(m_hWnd, &itm);
286         return S_OK;
287 }
288
289 STDMETHODIMP CTreeItem::get_PrevItem(/*[out, retval]*/ IUnknown* *pVal)
290 {
291         // \91O\82Ì\83A\83C\83e\83\80
292         *pVal = NULL;
293
294         HRESULT hr;
295         if (FAILED(hr = InitialCheck())) {
296                 return hr;
297         }
298
299         if (!m_hItem) {
300                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
301                 return DISP_E_EXCEPTION;
302         }
303
304         CComObject<CTreeItem>* pItem = NULL;
305         if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
306                 return hr;
307         }
308
309         HTREEITEM hNewItem = TreeView_GetPrevSibling(m_hWnd, m_hItem);
310         pItem->SetParam(m_hWnd, hNewItem);
311
312         return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
313 }
314
315 STDMETHODIMP CTreeItem::get_NextItem(/*[out, retval]*/ IUnknown* *pVal)
316 {
317         // \8e\9f\82Ì\83A\83C\83e\83\80
318         *pVal = NULL;
319
320         HRESULT hr;
321         if (FAILED(hr = InitialCheck())) {
322                 return hr;
323         }
324
325         if (!m_hItem) {
326                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
327                 return DISP_E_EXCEPTION;
328         }
329
330         CComObject<CTreeItem>* pItem = NULL;
331         if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
332                 return hr;
333         }
334
335         HTREEITEM hNewItem = TreeView_GetNextSibling(m_hWnd, m_hItem);
336         pItem->SetParam(m_hWnd, hNewItem);
337
338         return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
339 }
340
341 STDMETHODIMP CTreeItem::get_ChildItem(/*[out, retval]*/ IUnknown* *pVal)
342 {
343         // \8eq\83A\83C\83e\83\80
344         *pVal = NULL;
345
346         HRESULT hr;
347         if (FAILED(hr = InitialCheck())) {
348                 return hr;
349         }
350
351         if (!m_hItem) {
352                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
353                 return DISP_E_EXCEPTION;
354         }
355
356         CComObject<CTreeItem>* pItem = NULL;
357         if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
358                 return hr;
359         }
360
361         HTREEITEM hNewItem = TreeView_GetChild(m_hWnd, m_hItem);
362         pItem->SetParam(m_hWnd, hNewItem);
363
364         return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
365 }
366
367 STDMETHODIMP CTreeItem::get_Parent(/*[out, retval]*/ IUnknown* *pVal)
368 {
369         // \90e\83A\83C\83e\83\80
370         *pVal = NULL;
371
372         HRESULT hr;
373         if (FAILED(hr = InitialCheck())) {
374                 return hr;
375         }
376
377         if (!m_hItem) {
378                 // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
379                 return DISP_E_EXCEPTION;
380         }
381
382         CComObject<CTreeItem>* pItem = NULL;
383         if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
384                 return hr;
385         }
386
387         HTREEITEM hNewItem = TreeView_GetParent(m_hWnd, m_hItem);
388         pItem->SetParam(m_hWnd, hNewItem);
389
390         return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
391 }
392
393 //
394 void CTreeItem::SetParam(HWND hWnd, HTREEITEM hItem)
395 {
396         m_hWnd = hWnd;
397         m_hItem = hItem;
398 }
399