OSDN Git Service

20021009版ソース
[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 #include <list>
7 using namespace std;
8
9
10 /////////////////////////////////////////////////////////////////////////////
11 // CTreeItem
12
13 STDMETHODIMP CTreeItem::InterfaceSupportsErrorInfo(REFIID riid)
14 {
15         static const IID* arr[] = 
16         {
17                 &IID_ITreeItem
18         };
19         for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
20         {
21                 if (IsEqualGUID(*arr[i],riid))
22                         return S_OK;
23         }
24         return S_FALSE;
25 }
26
27 BOOL CTreeItem::DeleteTreeItemWithData(HWND hWnd,HTREEITEM hItem)
28 {
29         HTREEITEM hRoot = hItem;
30         list<HTREEITEM> lst;
31         lst.push_back(hItem);
32         while(!lst.empty()){
33                  hItem = lst.front();
34                  lst.pop_front();
35                  while(hItem){
36                          HTREEITEM hChild = TreeView_GetChild(hWnd,hItem);
37                          if(hChild){
38                                  // \8eq\83O\83\8b\81[\83v\82ð\8c\9f\8d¸\82·\82é\82æ\82¤\82É\83X\83^\83b\83N\82·\82é
39                                  lst.push_back(hChild);
40                          }
41                          // \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é
42                          TVITEM itm = {0};
43                          itm.mask  = TVIF_PARAM;
44                          itm.hItem = hItem;
45                          if(TreeView_GetItem(hWnd,&itm) && itm.lParam){
46                                 IUnknown* pUnk = (IUnknown*)itm.lParam;
47                                 pUnk->Release();
48                                 itm.lParam = NULL;
49                                 TreeView_SetItem(hWnd,&itm);
50                          }      
51                          // \82Â\82¬\82Ì\83A\83C\83e\83\80\82ð\92T\82·
52                          if(hRoot == hItem){
53                                  // \8aJ\8en\88Ê\92u\82Ì\8cZ\92í\82Í\92T\82µ\82Ä\82Í\82È\82ç\82È\82¢
54                                  hItem = NULL;
55                          }
56                          else{
57                                  hItem = TreeView_GetNextSibling(hWnd,hItem);
58                          }
59                  }
60         }
61         TreeView_DeleteItem(hWnd,hRoot);
62         return true;
63 }
64
65 void CTreeItem::CreateTreeItem(HWND hWnd, HTREEITEM hParent, LPCSTR text, IUnknown **punkVal)
66 {
67         // \83A\83C\83e\83\80\82ª\95Û\97L\82·\82é\98A\91z\94z\97ñ\82ð\90\90¬\82·\82é
68         IUnknown* pUnk = NULL;
69         CComObject<CObjectMap>* pMap = NULL;
70         if(pMap->CreateInstance(&pMap) == S_OK){
71                 pMap->QueryInterface(IID_IUnknown,(void**)&pUnk);
72         }
73         // \91}\93ü\82·\82é\83A\83C\83e\83\80\82Ì\92è\8b`
74         TVINSERTSTRUCT is = { 0 };
75         is.hParent       = hParent;
76         is.hInsertAfter  = TVI_LAST;
77         is.item.mask     = TVIF_TEXT | TVIF_PARAM;
78         is.item.pszText  = (LPSTR)text;
79         is.item.cchTextMax = lstrlen(text);
80         is.item.lParam   = (LPARAM)pUnk;
81
82         HTREEITEM hNewItem = TreeView_InsertItem(hWnd,&is);
83         if(hNewItem){
84                 // \83A\83C\83e\83\80\82Ö\82Ì\83I\83u\83W\83F\83N\83g\82ð\8dì\90¬\82·\82é
85                 CComObject<CTreeItem>* pItem = NULL;
86                 if(pItem->CreateInstance(&pItem) == S_OK){
87                         pItem->SetParam(hWnd,hNewItem);
88                         pItem->QueryInterface(IID_IUnknown,(void**)punkVal);
89                 }
90         }
91 }
92
93 STDMETHODIMP CTreeItem::IsValid(BOOL *pResult)
94 {
95         *pResult = (m_hItem != NULL)?VB_TRUE:VB_FALSE;
96         return S_OK;
97 }