supergridctrl.h
上传用户:meggie0806
上传日期:2007-01-02
资源大小:87k
文件大小:16k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. #if !defined(AFX_SUPERGRIDCTRL_H__C6DF1701_806D_11D2_9A94_002018026B76__INCLUDED_)
  2. #define AFX_SUPERGRIDCTRL_H__C6DF1701_806D_11D2_9A94_002018026B76__INCLUDED_
  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif // _MSC_VER > 1000
  6. // SuperGridCtrl.h : header file
  7. //
  8. #include <afxtempl.h>
  9. class CItemInfo //should have called this LV_INSERTITEM ..what ever
  10. {
  11. public:
  12. CItemInfo():m_bCheck(0),m_iImage((const int)-1),m_lParam(NULL),m_clf((COLORREF)-1){};
  13. void SetItemText(const CString& strItem){ m_strItemName = strItem; }
  14. void SetItemText(const CString& strItem, COLORREF clf) { m_strItemName = strItem; m_clf = clf;}
  15. void AddSubItemText(const CString& strSubItem){ m_SubItems.Add(strSubItem); }
  16. void AddSubItemText(const CString& strSubItem, COLORREF clf)
  17. int nIndex = m_SubItems.Add(strSubItem); 
  18. m_mapClf.SetAt(nIndex, clf);
  19. }
  20. void SetSubItemText(int iSubItem, const CString& strSubItem){ m_SubItems.SetAtGrow(iSubItem, strSubItem); }
  21. void SetSubItemText(int iSubItem, const CString& strSubItem, COLORREF clf)
  22. {
  23. m_SubItems.SetAtGrow(iSubItem, strSubItem);
  24. m_mapClf.SetAt(iSubItem, clf);
  25. }
  26. const CString& GetItemText(void){ return m_strItemName; }
  27. CString GetSubItem(int iSubItem){ return m_SubItems.GetAt(iSubItem); }
  28. int GetItemCount(void) const { return m_SubItems.GetSize(); }
  29. enum CONTROLTYPE {edit/*default*/, combobox, datecontrol/*your control*/, spinbutton/*your control*/, dropdownlistviewwhatevercontrol/*your control*/};
  30. //all cols in this row is default edit
  31. void SetControlType(CONTROLTYPE enumCtrlType, int nCol=-1){ m_controlType.SetAt(nCol, enumCtrlType); }
  32. BOOL GetControlType(int nCol, CONTROLTYPE& controlType) const
  33. {
  34. if(!m_controlType.Lookup(nCol,controlType))
  35. {
  36. controlType = edit;//default;
  37. return 0;
  38. }
  39. return 1;
  40. }
  41. void SetListData(int iSubItem, CStringList *strInitArr)
  42. {
  43. CStringList *list;
  44. list = new CStringList;//will be deleted in destructor
  45. list->AddTail(strInitArr);
  46. m_listdata.SetAt(iSubItem, list);
  47. }
  48. BOOL GetListData(int iSubItem, CStringList*& pList) const
  49. {
  50. return m_listdata.Lookup(iSubItem, pList);
  51. }
  52. //used if LVS_EX_CHECKBOXES style
  53. void SetCheck(BOOL bCheck){ m_bCheck = bCheck;}
  54. BOOL GetCheck(void) const {return m_bCheck;}
  55. void SetImage(int iImage){m_iImage = iImage;}
  56. int GetImage(void) const {return m_iImage;}//return icon
  57. COLORREF GetItemClr(void) const {return m_clf;}
  58. COLORREF GetBkColor(int iSubItem) const
  59. {
  60. COLORREF clref;
  61. if(!m_mapClf.Lookup(iSubItem,clref))
  62. {
  63. return (COLORREF)-1;
  64. }
  65. return clref;
  66. }
  67. LPARAM m_lParam;//why not use this like you use it in listbox, listctrl...
  68. //YOU SHOULD MODIFY THIS WHEN EVER YOU ADD NEW DATA TO THIS CLASS
  69. void CopyObjects(CItemInfo* pItemInfo)
  70. {
  71. SetItemText(pItemInfo->GetItemText());
  72. m_SubItems.Copy(pItemInfo->m_SubItems);
  73. CopyControls(pItemInfo);
  74. CopyColors(pItemInfo);
  75. SetCheck(pItemInfo->GetCheck());
  76. SetImage(pItemInfo->GetImage());
  77. m_lParam = pItemInfo->m_lParam;
  78. m_clf=pItemInfo->m_clf;
  79. }
  80. void CopyControls(CItemInfo* pItemInfo)
  81. {
  82. for(int nCol=0; nCol < pItemInfo->GetItemCount(); nCol++)
  83. {
  84. CItemInfo::CONTROLTYPE ctrlType;
  85. if(pItemInfo->GetControlType(nCol, ctrlType))//true if other than edit-control
  86. {
  87. SetControlType(ctrlType, nCol);
  88. //should test if this is listdata material
  89. CStringList *list = NULL;
  90. pItemInfo->GetListData(nCol, list);
  91. if(list!=NULL)
  92. SetListData(nCol, list);
  93. }
  94. }
  95. }
  96. void CopyColors(CItemInfo* pItemInfo)
  97. {
  98. for(int nCol=0; nCol < pItemInfo->GetItemCount(); nCol++)
  99. {
  100. COLORREF clref;
  101. if(pItemInfo->m_mapClf.Lookup(nCol, clref))
  102. m_mapClf.SetAt(nCol, clref);
  103. }
  104. }
  105. ~CItemInfo()
  106. {
  107. POSITION pos = m_listdata.GetStartPosition();
  108. while(pos != NULL)
  109. {
  110. int nKey;
  111. CStringList* b; 
  112. m_listdata.GetNextAssoc(pos, nKey, b);
  113. if(b!=NULL)
  114. {
  115. b->RemoveAll();
  116. delete b;
  117. }
  118. }
  119. m_listdata.RemoveAll();
  120. }
  121. private:
  122. CONTROLTYPE m_enumCtrlType; 
  123. CMap<int,int, CONTROLTYPE, CONTROLTYPE&> m_controlType;//hmm
  124. CMap<int,int, COLORREF, COLORREF&> m_mapClf;//colors
  125. CMap<int,int, CStringList*, CStringList*> m_listdata;//listbox
  126. CString m_strItemName;//col 0...
  127. CStringArray m_SubItems;//col 1... N
  128. BOOL m_bCheck;
  129. int m_iImage;
  130. COLORREF m_clf;
  131. };
  132. /////////////////////////////////////////////////////////////////////////////
  133. //
  134. // CSuperGridCtrl 
  135. //
  136. /////////////////////////////////////////////////////////////////////////////
  137. class CSuperGridCtrl : public CListCtrl
  138. {
  139. // Construction
  140. public:
  141. CSuperGridCtrl();
  142. protected:
  143. //nested class forward decl.
  144. class CTreeItem;
  145. public:
  146. // Overrides
  147. //MUST override this to make a copy of CItemInfo..see the CMySuperGrid.cpp for implementation
  148. //used in drag/drop operations
  149. virtual CItemInfo* CopyData(CItemInfo* lpSrc);
  150. //sets the icon state...called from within DrawItem returns valid image index
  151. //You MUST override this function to set your current icon, must of course be a valid CImageList index
  152. virtual int GetIcon(const CTreeItem* pItem);
  153. //override this to set the color for current cell
  154. virtual COLORREF GetCellRGB(void);
  155. //override this to update listview items, called from within OnEndlabeledit.
  156. virtual void OnUpdateListViewItem(CTreeItem* lpItem, LV_ITEM *plvItem);
  157. //override this to activate any control when lButtonDown in a cell, called from within OnLButtonDown
  158. virtual void OnControlLButtonDown(UINT nFlags, CPoint point, LVHITTESTINFO& ht);
  159. //override this to provide your dragimage, default: creates an image + text
  160. virtual CImageList *CreateDragImageEx(int nItem);
  161.     //called before item is about to explode, return TRUE to continue, FALSE to prevent expanding
  162. virtual BOOL OnItemExpanding(CTreeItem *pItem, int iItem);
  163. //called after item has expanded
  164. virtual BOOL OnItemExpanded(CTreeItem* pItem, int iItem);
  165. //called before item are collapsed,return TRUE to continue, FALSE to prevent collapse
  166. virtual BOOL OnCollapsing(CTreeItem *pItem);
  167. //called after item has collapsed
  168. virtual BOOL OnItemCollapsed(CTreeItem *pItem);
  169. //called before item is about to be deleted,return TRUE to continue, FALSE to prevent delete item
  170. virtual BOOL OnDeleteItem(CTreeItem* pItem, int nIndex);
  171. //called before VK_MULTIPLY keydown, return TRUE to continue, FALSE to prevent expandall
  172. virtual BOOL OnVKMultiply(CTreeItem *pItem, int nIndex);
  173. //called before VK_SUBTRACT keydown, return TRUE to continue, FALSE to prevent collapse item
  174. virtual BOOL OnVkSubTract(CTreeItem *pItem, int nIndex);
  175. //called before VK_ADD keydown, return TRUE to continue, FALSE to prevent expanding item
  176. virtual BOOL OnVKAdd(CTreeItem *pItem, int nIndex);
  177. //called from PreTranslateMessage, override this to handle other controls than editctrl's
  178. virtual BOOL OnVkReturn(void);
  179. //called before from within OnlButtonDown and OnDblclk, but before anything happens, return TRUE to continue, FALSE to say not selecting the item
  180. virtual BOOL OnItemLButtonDown(LVHITTESTINFO& ht);
  181. public:
  182. //creates a root
  183. CTreeItem*  InsertRootItem(CItemInfo * lpRoot);
  184. //from the looks of it,...it deletes a rootitem
  185. void DeleteRootItem(CTreeItem * lpRoot);
  186. //hmm
  187. BOOL IsRoot(CTreeItem * lpItem);
  188. //given the rootindex it returns the rootptr
  189. CTreeItem* GetRootItem(int nIndex);
  190. int GetRootCount() { return m_RootItems.GetCount();}
  191. //call this to delete all items in grid
  192. void DeleteAll();
  193. //return previous node from pItem, given a RootItem
  194. CTreeItem* GetPrev(CTreeItem* pRoot, CTreeItem *pItem, BOOL bInit = TRUE, BOOL bDontIncludeHidden=TRUE);
  195. //return next node from pItem, given a RootItem
  196. CTreeItem* GetNext(CTreeItem* pRoot, CTreeItem* pNode, BOOL bInit = TRUE, BOOL bDontIncludeHidden=TRUE);
  197. //returns the selected item :)
  198. int GetSelectedItem(void) const;
  199. //returns the itemdata associated with the supergrid
  200. CTreeItem* GetTreeItem(int nIndex);
  201. // Retrieves the number of items associated with the SuperGrid control.
  202. UINT GetCount(void);
  203. //returns number of children given the pItem node ptr.
  204. int NumChildren(const CTreeItem *pItem) const;
  205. //Determines if this tree item is a child of the specified parent
  206. BOOL IsChildOf(const CTreeItem* pParent, const CTreeItem* pChild) const;
  207. //hmm
  208. BOOL ItemHasChildren(const CTreeItem* pItem) const;
  209. // Use this to indicate that pItem has children, but has not been inserted yet.
  210. void SetChildrenFlag(CTreeItem *pItem,int nFlag) const;
  211. //are children collapsed
  212. BOOL IsCollapsed(const CTreeItem* pItem) const;
  213. //return the Indent Level of pItem
  214. int GetIndent(const CTreeItem* pItem) const;
  215. //Sets the Indentlevel of pItem
  216. void SetIndent(CTreeItem *pItem, int iIndent);
  217. //get the pItems current listview index, 
  218. int GetCurIndex(const CTreeItem *pItem) const;
  219. //set pItems current listview index
  220. void SetCurIndex(CTreeItem* pItem, int nIndex);
  221. //sets the pItem' parent
  222. void SetParentItem(CTreeItem*pItem, CTreeItem* pParent);
  223. //gets pItems parent
  224. CTreeItem* GetParentItem(const CTreeItem* pItem); 
  225. //return ptr to CItemInfo daaa
  226. CItemInfo* GetData(const CTreeItem* pItem); 
  227. //sets the CItemInfo ptr of pItem
  228. void UpdateData(CTreeItem* pItem, CItemInfo* lpInfo);
  229. //Insert item and return new parent node.
  230. //the bUpdate is here for performance reasons, when you insert say 100 node each having 10 children(1000 listview items)
  231. //the bUpdate should be set to FALSE(default) but when you want to insert an item, and you want to user to see it right away
  232. //set bUpdate to TRUE.(see the use of bUpdate in the HowToInsertItemsAfterTheGridHasBeenInitialized function in the CMySuperGridCtrl)
  233. CTreeItem* InsertItem(CTreeItem *pParent, CItemInfo* lpInfo, BOOL bUpdate=FALSE);
  234. //collapse all children from pItem
  235. void Collapse(CTreeItem *pItem);
  236. //expand one folder and return the last index of the expanded folder
  237. int Expand(CTreeItem* pSelItem, int nIndex);
  238. //expand all items from pItem and return last index of the expanded folder
  239. void ExpandAll(CTreeItem *pItem, int& nScroll);
  240. //expand all node in pItem and stop at pStopAt, used in SelectNode function
  241. void ExpandUntil(CTreeItem *pItem, CTreeItem* pStopAt);
  242. //use this if you want to select a node 
  243. //if the node is collapsed all items with in the node are expanded and the node is selected
  244. //it returns the listview index for the selected node
  245. int SelectNode(CTreeItem *pLocateNode);
  246. //Delete an item in the listview 
  247. //takes the node to be delete and its listview item index as arg.
  248. //note the item you delete must be visible, hence the nItem as arg. 
  249. void DeleteItemEx(CTreeItem *pSelItem, int nItem);
  250. //returns the number of columns in the listview
  251. int GetNumCol(void);
  252. //does a Quicksort of the pParents children and if bSortChildren set, 
  253. //all items from pParent are sorted. 
  254. void Sort(CTreeItem* pParent, BOOL bSortChildren);
  255. // simpel wrapper for the CObList in CTreeItem, same usage as in the COblist
  256. POSITION GetHeadPosition(CTreeItem* pItem) const;
  257. POSITION GetTailPosition(CTreeItem *pItem) const;
  258. CTreeItem* GetNextChild(CTreeItem *pItem, POSITION& pos) const;
  259. CTreeItem* GetPrevChild(CTreeItem *pItem, POSITION& pos) const;
  260. void AddTail(CTreeItem *pParent, CTreeItem *pChild);
  261. //simpel wrapper for the CPtrList collection of rootitems
  262. //feel free to add more of these simple wrappers.
  263. POSITION GetRootHeadPosition(void) const;
  264. POSITION GetRootTailPosition(void) const;
  265. CTreeItem* GetNextRoot(POSITION& pos) const;
  266. CTreeItem* GetPrevRoot(POSITION& pos) const;
  267. // ClassWizard generated virtual function overrides
  268. //{{AFX_VIRTUAL(CSuperGridCtrl)
  269. public:
  270. //handle VK_xxxx
  271. virtual BOOL PreTranslateMessage(MSG* pMsg);
  272. protected:
  273. virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
  274. //}}AFX_VIRTUAL
  275. // Implementation
  276. public:
  277. virtual ~CSuperGridCtrl();
  278. protected:
  279. //given the rootptr it returns the rootindex.
  280. int GetRootIndex(CTreeItem * lpRoot);
  281. //delete pItem and all of its children
  282. BOOL Delete(CTreeItem *pItem, BOOL bClean=TRUE/*delete itemdata*/);
  283. //used in drag/drop operation..
  284. void CopyChildren(CTreeItem* pDest, CTreeItem* pSrc);
  285. //drag/drop thing....clipboard not supported!
  286. BOOL DoDragDrop(CTreeItem* pTarget, CTreeItem* pSelItem);
  287. //updates internal nodes, called when ever insert,delete on listview
  288. void InternaleUpdateTree(void);
  289. //Get ListView Index from pNode
  290. int NodeToIndex(CTreeItem *pNode);
  291. //see if user clicked the [+] [-] sign, also handles LVS_EX_CHECKBOXES.
  292. BOOL HitTestOnSign(CPoint point, LVHITTESTINFO& ht);
  293. //positions an edit-control and creates it
  294. CEdit* EditLabelEx(int nItem, int nCol);
  295. int m_cxImage, m_cyImage;//icon size
  296. //translates column index value to a column order value.
  297. int IndexToOrder(int iIndex);
  298. //set hideflag for pItem
  299. void Hide(CTreeItem* pItem, BOOL bFlag);
  300. //hmm
  301. int GetCurSubItem(void){return m_CurSubItem;}
  302. int GetDragItem(void) const {return m_nDragItem; }
  303. int GetDropTargetItem(void) const {return m_nDragTarget; }
  304. private:
  305. //list of rootItems
  306. CPtrList m_RootItems;
  307. //internal helpers
  308. BOOL _Delete(CTreeItem* pStartAt, CTreeItem *pItem, BOOL bClean=TRUE/*delete itemdata*/);
  309. UINT _GetCount(CTreeItem* pItem, UINT& nCount);
  310. //hmm
  311. void DrawTreeItem(CDC* pDC, CTreeItem* pSelItem, int nListItem, const CRect& rcBounds);
  312. //makes the dot ... thing
  313. LPCTSTR MakeShortString(CDC* pDC, LPCTSTR lpszLong, int nColumnLen, int nOffset);
  314. //set the hideflag from pItem and all its children
  315. void HideChildren(CTreeItem *pItem, BOOL bHide, int iIndent);
  316. //checks whether a column is visible, if not scrolls to it
  317. void MakeColumnVisible(int nCol);
  318. //hmm
  319. void DrawFocusCell(CDC *pDC, int nItem, int iSubItem);
  320. //draw the down arrow if any combobox precent in the listview item
  321. void DrawComboBox(CDC *pDC, CTreeItem *pSelItem, int nItem, int nColumn);
  322. int m_CurSubItem;//keyboard handling..it is what it says
  323. //hmm these represents the state of my expresso machine
  324.     int m_nDragItem, m_nDragTarget;
  325.     BOOL m_bIsDragging;
  326. //helper compare fn used with Quicksort
  327. static int CompareChildren(const void* p1, const void* p2);
  328. void CleanMe(CTreeItem *pItem);
  329. int _NodeToIndex(CTreeItem *pStartpos, CTreeItem* pNode, int& nIndex, BOOL binit = TRUE);
  330. CPen m_psTreeLine;
  331. CPen m_psRectangle;
  332. CPen m_psPlusMinus;
  333. CBrush m_brushErase;
  334. friend class CRectangle;
  335. HIMAGELIST m_himl;
  336. // Generated message map functions
  337. protected:
  338. //{{AFX_MSG(CSuperGridCtrl)
  339. afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
  340. afx_msg void OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult);
  341. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  342. afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  343. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  344. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  345. afx_msg void OnTimer(UINT nIDEvent);
  346. afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  347. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  348. afx_msg void OnKeydown(NMHDR* pNMHDR, LRESULT* pResult);
  349. afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);
  350. afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
  351. afx_msg void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  352. afx_msg void OnSysColorChange();
  353. //}}AFX_MSG
  354. DECLARE_MESSAGE_MAP()
  355. };
  356. class CRectangle
  357. {
  358. public:
  359. CRectangle(CSuperGridCtrl* pCtrl, CDC* pDC, int iIndent, const CRect& rcBounds);
  360. ~CRectangle();
  361. void DrawRectangle(CSuperGridCtrl *pCtrl);
  362. BOOL HitTest(CPoint pt);
  363. void DrawPlus(void);
  364. void DrawMinus(void);
  365. int GetLeft(void){return m_left;}
  366. int GetTop(void){return m_top;}
  367. CRect GetHitTestRect(void) { return CRect(m_left_top, m_right_bottom);}
  368. private:
  369. CDC *m_pDC;
  370. SIZE m_right_bottom;
  371. int m_left;
  372. int m_top;
  373. POINT m_left_top;
  374. int m_topdown;
  375. };
  376. //the nested class 
  377. class CSuperGridCtrl::CTreeItem : public CObject
  378. {
  379. CTreeItem(): m_pParent(NULL), m_bHideChildren(0), m_nIndex(-1), m_nIndent(-1),m_bSetChildFlag(-1){};
  380. ~CTreeItem();
  381. CObList m_listChild;
  382. CTreeItem* m_pParent;
  383. CItemInfo* m_lpNodeInfo;
  384. BOOL m_bHideChildren;  
  385. int m_nIndex; //CListCtrl index
  386. int m_nIndent; 
  387. int m_bSetChildFlag;
  388. friend class CSuperGridCtrl;
  389. };
  390. /////////////////////////////////////////////////////////////////////////////
  391. /////////////////////////////////////////////////////////////////////////////
  392. //{{AFX_INSERT_LOCATION}}
  393. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  394. #endif // !defined(AFX_SUPERGRIDCTRL_H__C6DF1701_806D_11D2_9A94_002018026B76__INCLUDED_)