home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / general / rowlist / rlistvw.cpp < prev    next >
C/C++ Source or Header  |  1998-03-26  |  11KB  |  417 lines

  1. // RListVw.cpp : implementation of the CRowListView class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "RowList.h"
  15.  
  16. #include "RListDoc.h"
  17.  
  18. #include "ListVwEx.h"   // base class for CRowListView
  19. #include "RListVw.h"
  20.  
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26.  
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CRowListView
  29.  
  30. IMPLEMENT_DYNCREATE(CRowListView, CListViewEx)
  31.  
  32. BEGIN_MESSAGE_MAP(CRowListView, CListViewEx)
  33.     //{{AFX_MSG_MAP(CRowListView)
  34.     ON_COMMAND(ID_VIEW_SMALLICONS, OnViewSmallIcons)
  35.     ON_COMMAND(ID_VIEW_LARGEICONS, OnViewLargeIcons)
  36.     ON_COMMAND(ID_VIEW_LIST, OnViewList)
  37.     ON_COMMAND(ID_VIEW_DETAILS, OnViewDetails)
  38.     ON_COMMAND(ID_VIEW_ROWDETAILS, OnViewFullRowDetails)
  39.     ON_UPDATE_COMMAND_UI(ID_VIEW_SMALLICONS, OnUpdateViewSmallIcons)
  40.     ON_UPDATE_COMMAND_UI(ID_VIEW_LARGEICONS, OnUpdateViewLargeIcons)
  41.     ON_UPDATE_COMMAND_UI(ID_VIEW_LIST, OnUpdateViewList)
  42.     ON_UPDATE_COMMAND_UI(ID_VIEW_DETAILS, OnUpdateViewDetails)
  43.     ON_UPDATE_COMMAND_UI(ID_VIEW_ROWDETAILS, OnUpdateViewFullRowDetails)
  44.     ON_COMMAND(ID_VIEW_STATEICONS, OnViewStateIcons)
  45.     ON_UPDATE_COMMAND_UI(ID_VIEW_STATEICONS, OnUpdateViewStateIcons)
  46.     ON_COMMAND(ID_VIEW_CLIENTWIDTHSEL, OnViewClientWidthSel)
  47.     ON_UPDATE_COMMAND_UI(ID_VIEW_CLIENTWIDTHSEL, OnUpdateViewClientWidthSel)
  48.     ON_WM_LBUTTONDOWN()
  49.     ON_WM_LBUTTONDBLCLK()
  50.     //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52.  
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CRowListView construction/destruction
  55.  
  56. CRowListView::CRowListView()
  57. {
  58.     m_bStateIcons = TRUE;
  59.     m_nCheckedItem = -1;
  60.     m_hSmallIcon = NULL;
  61.     m_hLargeIcon = NULL;
  62. }
  63.  
  64. CRowListView::~CRowListView()
  65. {
  66. }
  67.  
  68. BOOL CRowListView::PreCreateWindow(CREATESTRUCT& cs)
  69. {
  70.     cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;
  71.  
  72.     return CListViewEx::PreCreateWindow(cs);
  73. }
  74.  
  75. /////////////////////////////////////////////////////////////////////////////
  76. // data for the list view control
  77.  
  78. #define NUM_COLUMNS 8
  79. #define NUM_ITEMS   7
  80.  
  81. static _TCHAR *_gszColumnLabel[NUM_COLUMNS] =
  82. {
  83.     _T("Color"), _T("Red"), _T("Green"), _T("Blue"),
  84.     _T("Hue"), _T("Sat"), _T("Lum"), _T("Type")
  85. };
  86.  
  87. static int _gnColumnFmt[NUM_COLUMNS] =
  88. {
  89.     LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT,
  90.         LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_CENTER
  91. };
  92.  
  93. static int _gnColumnWidth[NUM_COLUMNS] =
  94. {
  95.     150, 50, 50, 50, 100, 50, 50, 150
  96. };
  97.  
  98. static _TCHAR *_gszItem[NUM_ITEMS][NUM_COLUMNS] =
  99. {
  100.     _T("Yellow"),  _T("255"), _T("255"), _T("0"),   _T("40"),  _T("240"), _T("120"), _T("Neutral"),
  101.     _T("Red"),     _T("255"), _T("0"),   _T("0"),   _T("0"),   _T("240"), _T("120"), _T("Warm"),
  102.     _T("Green"),   _T("0"),   _T("255"), _T("0"),   _T("80"),  _T("240"), _T("120"), _T("Cool"),
  103.     _T("Magenta"), _T("255"), _T("0"),   _T("255"), _T("200"), _T("240"), _T("120"), _T("Warm"),
  104.     _T("Cyan"),    _T("0"),   _T("255"), _T("255"), _T("120"), _T("240"), _T("120"), _T("Cool"),
  105.     _T("Blue"),    _T("0"),   _T("0"),   _T("255"), _T("160"), _T("240"), _T("120"), _T("Cool"),
  106.     _T("Gray"),    _T("192"), _T("192"), _T("192"), _T("160"), _T("0"),   _T("181"), _T("Neutral")
  107. };
  108.  
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CRowListView initialization
  111.  
  112. void CRowListView::OnInitialUpdate()
  113. {
  114.     CListViewEx::OnInitialUpdate();
  115.  
  116.     CListCtrl& ListCtrl = GetListCtrl();
  117.  
  118. // set image lists
  119.  
  120.     m_LargeImageList.Create(IDB_LARGEICONS, 32, 1, RGB(255, 255, 255));
  121.     m_SmallImageList.Create(IDB_SMALLICONS, 16, 1, RGB(255, 255, 255));
  122.     m_StateImageList.Create(IDB_STATEICONS, 16, 1, RGB(255, 0, 0));
  123.  
  124.     m_LargeImageList.SetOverlayImage(NUM_ITEMS, 1);
  125.     m_SmallImageList.SetOverlayImage(NUM_ITEMS, 1);
  126.  
  127.     ListCtrl.SetImageList(&m_LargeImageList, LVSIL_NORMAL);
  128.     ListCtrl.SetImageList(&m_SmallImageList, LVSIL_SMALL);
  129.     ListCtrl.SetImageList(&m_StateImageList, LVSIL_STATE);
  130.  
  131. // insert columns
  132.  
  133.     int i, j;
  134.     LV_COLUMN lvc;
  135.  
  136.     lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  137.  
  138.     for(i = 0; i<NUM_COLUMNS; i++)
  139.     {
  140.         lvc.iSubItem = i;
  141.         lvc.pszText = _gszColumnLabel[i];
  142.         lvc.cx = _gnColumnWidth[i];
  143.         lvc.fmt = _gnColumnFmt[i];
  144.         ListCtrl.InsertColumn(i,&lvc);
  145.     }
  146.  
  147. // insert items
  148.  
  149.     LV_ITEM lvi;
  150.  
  151.     for(i = 0; i < NUM_ITEMS; i++)
  152.     {
  153.         lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
  154.         lvi.iItem = i;
  155.         lvi.iSubItem = 0;
  156.         lvi.pszText = _gszItem[i][0];
  157.         lvi.iImage = i;
  158.         lvi.stateMask = LVIS_STATEIMAGEMASK;
  159.         lvi.state = INDEXTOSTATEIMAGEMASK(1);
  160.  
  161.         ListCtrl.InsertItem(&lvi);
  162.     }
  163.  
  164. // set item text for additional columns
  165.  
  166.     for(i = 0; i<NUM_ITEMS; i++)
  167.     {
  168.         for(j = 1; j<NUM_COLUMNS; j++)
  169.         {
  170.             ListCtrl.SetItemText(i,j,_gszItem[i][j]);
  171.         }
  172.     }
  173. }
  174.  
  175. /////////////////////////////////////////////////////////////////////////////
  176. // CRowListView diagnostics
  177.  
  178. #ifdef _DEBUG
  179. void CRowListView::AssertValid() const
  180. {
  181.     CListViewEx::AssertValid();
  182. }
  183.  
  184. void CRowListView::Dump(CDumpContext& dc) const
  185. {
  186.     CListViewEx::Dump(dc);
  187. }
  188.  
  189. CRowListDoc* CRowListView::GetDocument() // non-debug version is inline
  190. {
  191.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRowListDoc)));
  192.     return (CRowListDoc*)m_pDocument;
  193. }
  194. #endif //_DEBUG
  195.  
  196. /////////////////////////////////////////////////////////////////////////////
  197. // CRowListView helpers
  198.  
  199. BOOL CRowListView::SetViewType(DWORD dwViewType)
  200. {
  201.     return(ModifyStyle(LVS_TYPEMASK,dwViewType & LVS_TYPEMASK));
  202. }
  203.  
  204. DWORD CRowListView::GetViewType()
  205. {
  206.     return(GetStyle() & LVS_TYPEMASK);
  207. }
  208.  
  209. void CRowListView::CheckItem(int nNewCheckedItem)
  210. {
  211.     CListCtrl& ListCtrl = GetListCtrl();
  212.  
  213. // reset if there is checked item
  214.  
  215.     if (m_nCheckedItem != -1)
  216.     {
  217.         if (m_bStateIcons)
  218.         {
  219.             ListCtrl.SetItemState(m_nCheckedItem,
  220.                 INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK);
  221.         }
  222.         else
  223.         {
  224.             ListCtrl.SetItemState(m_nCheckedItem,
  225.                 INDEXTOSTATEIMAGEMASK(1),
  226.                 LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
  227.         }
  228.  
  229.         ::DestroyIcon(m_hSmallIcon);
  230.         ::DestroyIcon(m_hLargeIcon);
  231.     }
  232.  
  233. // check new item and set its icon as the app icon
  234.  
  235.     CWnd* pMainWnd = AfxGetMainWnd();
  236.  
  237.     if (m_nCheckedItem == nNewCheckedItem)
  238.     {
  239.         m_nCheckedItem = -1;
  240.         pMainWnd->SetIcon(NULL, FALSE);
  241.         pMainWnd->SetIcon(NULL, TRUE);
  242.     }
  243.     else if ((m_nCheckedItem = nNewCheckedItem) != -1)
  244.     {
  245.         if (m_bStateIcons)
  246.         {
  247.             ListCtrl.SetItemState(m_nCheckedItem,
  248.                 INDEXTOSTATEIMAGEMASK(2), LVIS_STATEIMAGEMASK);
  249.         }
  250.         else
  251.         {
  252.             ListCtrl.SetItemState(m_nCheckedItem,
  253.                 INDEXTOSTATEIMAGEMASK(2) | INDEXTOOVERLAYMASK(1),
  254.                 LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
  255.         }
  256.  
  257.         m_hSmallIcon =
  258.             ListCtrl.GetImageList(LVSIL_SMALL)->ExtractIcon(nNewCheckedItem);
  259.         pMainWnd->SetIcon(m_hSmallIcon,FALSE);
  260.         m_hLargeIcon =
  261.             ListCtrl.GetImageList(LVSIL_NORMAL)->ExtractIcon(nNewCheckedItem);
  262.         pMainWnd->SetIcon(m_hLargeIcon,TRUE);
  263.     }
  264. }
  265.  
  266. /////////////////////////////////////////////////////////////////////////////
  267. // CRowListView message handlers
  268.  
  269. void CRowListView::OnViewSmallIcons()
  270. {
  271.     if (GetViewType() != LVS_SMALLICON)
  272.         SetViewType(LVS_SMALLICON);
  273. }
  274.  
  275. void CRowListView::OnViewLargeIcons()
  276. {
  277.     if (GetViewType() != LVS_ICON)
  278.         SetViewType(LVS_ICON);
  279. }
  280.  
  281. void CRowListView::OnViewList()
  282. {
  283.     if (GetViewType() != LVS_LIST)
  284.         SetViewType(LVS_LIST);
  285. }
  286.  
  287. void CRowListView::OnViewDetails()
  288. {
  289.     if ((GetViewType() != LVS_REPORT) || GetFullRowSel())
  290.     {
  291.         SetFullRowSel(FALSE);
  292.         if (GetViewType() != LVS_REPORT)
  293.             SetViewType(LVS_REPORT);
  294.     }
  295. }
  296.  
  297. void CRowListView::OnViewFullRowDetails()
  298. {
  299.     if ((GetViewType() != LVS_REPORT) || !GetFullRowSel())
  300.     {
  301.         SetFullRowSel(TRUE);
  302.         if (GetViewType() != LVS_REPORT)
  303.             SetViewType(LVS_REPORT);
  304.     }
  305. }
  306.  
  307. void CRowListView::OnUpdateViewSmallIcons(CCmdUI* pCmdUI)
  308. {
  309.     pCmdUI->SetCheck(GetViewType() == LVS_SMALLICON);
  310. }
  311.  
  312. void CRowListView::OnUpdateViewLargeIcons(CCmdUI* pCmdUI)
  313. {
  314.     pCmdUI->SetCheck(GetViewType() == LVS_ICON);
  315. }
  316.  
  317. void CRowListView::OnUpdateViewList(CCmdUI* pCmdUI)
  318. {
  319.     pCmdUI->SetCheck(GetViewType() == LVS_LIST);
  320. }
  321.  
  322. void CRowListView::OnUpdateViewDetails(CCmdUI* pCmdUI)
  323. {
  324.     pCmdUI->SetCheck((GetViewType() == LVS_REPORT) && !GetFullRowSel());
  325. }
  326.  
  327. void CRowListView::OnUpdateViewFullRowDetails(CCmdUI* pCmdUI)
  328. {
  329.     pCmdUI->SetCheck((GetViewType() == LVS_REPORT) && GetFullRowSel());
  330. }
  331.  
  332. void CRowListView::OnViewStateIcons()
  333. {
  334.     m_bStateIcons =! m_bStateIcons;
  335.  
  336.     CListCtrl& ListCtrl = GetListCtrl();
  337.  
  338.     if (m_bStateIcons)
  339.     {
  340.         ListCtrl.SetImageList(&m_StateImageList, LVSIL_STATE);
  341.         ListCtrl.SetItemState(m_nCheckedItem, 0, LVIS_OVERLAYMASK);
  342.     }
  343.     else
  344.     {
  345.         ListCtrl.SetImageList(NULL,LVSIL_STATE);
  346.         if (m_nCheckedItem != -1)
  347.         {
  348.             ListCtrl.SetItemState(m_nCheckedItem,
  349.                 INDEXTOOVERLAYMASK(1), LVIS_OVERLAYMASK);
  350.         }
  351.     }
  352. }
  353.  
  354. void CRowListView::OnUpdateViewStateIcons(CCmdUI* pCmdUI)
  355. {
  356.     pCmdUI->SetCheck(m_bStateIcons);
  357. }
  358.  
  359. void CRowListView::OnViewClientWidthSel()
  360. {
  361.     m_bClientWidthSel = !m_bClientWidthSel;
  362.  
  363.     Invalidate();
  364.     UpdateWindow();
  365. }
  366.  
  367. void CRowListView::OnUpdateViewClientWidthSel(CCmdUI* pCmdUI)
  368. {
  369.     pCmdUI->SetCheck(m_bClientWidthSel);
  370.     pCmdUI->Enable((GetViewType() == LVS_REPORT) && GetFullRowSel());
  371. }
  372.  
  373. void CRowListView::OnLButtonDown(UINT nFlags, CPoint point)
  374. {
  375.     UINT uFlags = 0;
  376.     int nHitItem = GetListCtrl().HitTest(point, &uFlags);
  377.  
  378.     // we need additional checking in owner-draw mode
  379.     // because we only get LVHT_ONITEM
  380.     BOOL bHit = FALSE;
  381.     if (uFlags == LVHT_ONITEM && (GetStyle() & LVS_OWNERDRAWFIXED))
  382.     {
  383.         CRect rect;
  384.         GetListCtrl().GetItemRect(nHitItem, rect, LVIR_ICON);
  385.  
  386.         // check if hit was on a state icon
  387.         if (m_bStateIcons && point.x < rect.left)
  388.             bHit = TRUE;
  389.     }
  390.     else if (uFlags & LVHT_ONITEMSTATEICON)
  391.         bHit = TRUE;
  392.  
  393.     if (bHit)
  394.         CheckItem(nHitItem);
  395.     else
  396.         CListViewEx::OnLButtonDown(nFlags, point);
  397. }
  398.  
  399. void CRowListView::OnLButtonDblClk(UINT nFlags, CPoint point)
  400. {
  401.     UINT uFlags = 0;
  402.     int nHitItem = GetListCtrl().HitTest(point, &uFlags);
  403.  
  404.     if (uFlags & LVHT_ONITEM)
  405.     {
  406.         // double click works only if we don't have state icons,
  407.         // or if we are in icon or small icon view
  408.         if (!m_bStateIcons || GetViewType() == LVS_ICON ||
  409.             GetViewType()==LVS_SMALLICON)
  410.         {
  411.             CheckItem(nHitItem);
  412.         }
  413.     }
  414.  
  415.     CListViewEx::OnLButtonDblClk(nFlags, point);
  416. }
  417.