home *** CD-ROM | disk | FTP | other *** search
- // RListVw.cpp : implementation of the CRowListView class
- //
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
- #include "RowList.h"
-
- #include "RListDoc.h"
-
- #include "ListVwEx.h" // base class for CRowListView
- #include "RListVw.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CRowListView
-
- IMPLEMENT_DYNCREATE(CRowListView, CListViewEx)
-
- BEGIN_MESSAGE_MAP(CRowListView, CListViewEx)
- //{{AFX_MSG_MAP(CRowListView)
- ON_COMMAND(ID_VIEW_SMALLICONS, OnViewSmallIcons)
- ON_COMMAND(ID_VIEW_LARGEICONS, OnViewLargeIcons)
- ON_COMMAND(ID_VIEW_LIST, OnViewList)
- ON_COMMAND(ID_VIEW_DETAILS, OnViewDetails)
- ON_COMMAND(ID_VIEW_ROWDETAILS, OnViewFullRowDetails)
- ON_UPDATE_COMMAND_UI(ID_VIEW_SMALLICONS, OnUpdateViewSmallIcons)
- ON_UPDATE_COMMAND_UI(ID_VIEW_LARGEICONS, OnUpdateViewLargeIcons)
- ON_UPDATE_COMMAND_UI(ID_VIEW_LIST, OnUpdateViewList)
- ON_UPDATE_COMMAND_UI(ID_VIEW_DETAILS, OnUpdateViewDetails)
- ON_UPDATE_COMMAND_UI(ID_VIEW_ROWDETAILS, OnUpdateViewFullRowDetails)
- ON_COMMAND(ID_VIEW_STATEICONS, OnViewStateIcons)
- ON_UPDATE_COMMAND_UI(ID_VIEW_STATEICONS, OnUpdateViewStateIcons)
- ON_COMMAND(ID_VIEW_CLIENTWIDTHSEL, OnViewClientWidthSel)
- ON_UPDATE_COMMAND_UI(ID_VIEW_CLIENTWIDTHSEL, OnUpdateViewClientWidthSel)
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONDBLCLK()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CRowListView construction/destruction
-
- CRowListView::CRowListView()
- {
- m_bStateIcons = TRUE;
- m_nCheckedItem = -1;
- m_hSmallIcon = NULL;
- m_hLargeIcon = NULL;
- }
-
- CRowListView::~CRowListView()
- {
- }
-
- BOOL CRowListView::PreCreateWindow(CREATESTRUCT& cs)
- {
- cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;
-
- return CListViewEx::PreCreateWindow(cs);
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // data for the list view control
-
- #define NUM_COLUMNS 8
- #define NUM_ITEMS 7
-
- static _TCHAR *_gszColumnLabel[NUM_COLUMNS] =
- {
- _T("Color"), _T("Red"), _T("Green"), _T("Blue"),
- _T("Hue"), _T("Sat"), _T("Lum"), _T("Type")
- };
-
- static int _gnColumnFmt[NUM_COLUMNS] =
- {
- LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT,
- LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_CENTER
- };
-
- static int _gnColumnWidth[NUM_COLUMNS] =
- {
- 150, 50, 50, 50, 100, 50, 50, 150
- };
-
- static _TCHAR *_gszItem[NUM_ITEMS][NUM_COLUMNS] =
- {
- _T("Yellow"), _T("255"), _T("255"), _T("0"), _T("40"), _T("240"), _T("120"), _T("Neutral"),
- _T("Red"), _T("255"), _T("0"), _T("0"), _T("0"), _T("240"), _T("120"), _T("Warm"),
- _T("Green"), _T("0"), _T("255"), _T("0"), _T("80"), _T("240"), _T("120"), _T("Cool"),
- _T("Magenta"), _T("255"), _T("0"), _T("255"), _T("200"), _T("240"), _T("120"), _T("Warm"),
- _T("Cyan"), _T("0"), _T("255"), _T("255"), _T("120"), _T("240"), _T("120"), _T("Cool"),
- _T("Blue"), _T("0"), _T("0"), _T("255"), _T("160"), _T("240"), _T("120"), _T("Cool"),
- _T("Gray"), _T("192"), _T("192"), _T("192"), _T("160"), _T("0"), _T("181"), _T("Neutral")
- };
-
- /////////////////////////////////////////////////////////////////////////////
- // CRowListView initialization
-
- void CRowListView::OnInitialUpdate()
- {
- CListViewEx::OnInitialUpdate();
-
- CListCtrl& ListCtrl = GetListCtrl();
-
- // set image lists
-
- m_LargeImageList.Create(IDB_LARGEICONS, 32, 1, RGB(255, 255, 255));
- m_SmallImageList.Create(IDB_SMALLICONS, 16, 1, RGB(255, 255, 255));
- m_StateImageList.Create(IDB_STATEICONS, 16, 1, RGB(255, 0, 0));
-
- m_LargeImageList.SetOverlayImage(NUM_ITEMS, 1);
- m_SmallImageList.SetOverlayImage(NUM_ITEMS, 1);
-
- ListCtrl.SetImageList(&m_LargeImageList, LVSIL_NORMAL);
- ListCtrl.SetImageList(&m_SmallImageList, LVSIL_SMALL);
- ListCtrl.SetImageList(&m_StateImageList, LVSIL_STATE);
-
- // insert columns
-
- int i, j;
- LV_COLUMN lvc;
-
- lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
-
- for(i = 0; i<NUM_COLUMNS; i++)
- {
- lvc.iSubItem = i;
- lvc.pszText = _gszColumnLabel[i];
- lvc.cx = _gnColumnWidth[i];
- lvc.fmt = _gnColumnFmt[i];
- ListCtrl.InsertColumn(i,&lvc);
- }
-
- // insert items
-
- LV_ITEM lvi;
-
- for(i = 0; i < NUM_ITEMS; i++)
- {
- lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
- lvi.iItem = i;
- lvi.iSubItem = 0;
- lvi.pszText = _gszItem[i][0];
- lvi.iImage = i;
- lvi.stateMask = LVIS_STATEIMAGEMASK;
- lvi.state = INDEXTOSTATEIMAGEMASK(1);
-
- ListCtrl.InsertItem(&lvi);
- }
-
- // set item text for additional columns
-
- for(i = 0; i<NUM_ITEMS; i++)
- {
- for(j = 1; j<NUM_COLUMNS; j++)
- {
- ListCtrl.SetItemText(i,j,_gszItem[i][j]);
- }
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CRowListView diagnostics
-
- #ifdef _DEBUG
- void CRowListView::AssertValid() const
- {
- CListViewEx::AssertValid();
- }
-
- void CRowListView::Dump(CDumpContext& dc) const
- {
- CListViewEx::Dump(dc);
- }
-
- CRowListDoc* CRowListView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRowListDoc)));
- return (CRowListDoc*)m_pDocument;
- }
- #endif //_DEBUG
-
- /////////////////////////////////////////////////////////////////////////////
- // CRowListView helpers
-
- BOOL CRowListView::SetViewType(DWORD dwViewType)
- {
- return(ModifyStyle(LVS_TYPEMASK,dwViewType & LVS_TYPEMASK));
- }
-
- DWORD CRowListView::GetViewType()
- {
- return(GetStyle() & LVS_TYPEMASK);
- }
-
- void CRowListView::CheckItem(int nNewCheckedItem)
- {
- CListCtrl& ListCtrl = GetListCtrl();
-
- // reset if there is checked item
-
- if (m_nCheckedItem != -1)
- {
- if (m_bStateIcons)
- {
- ListCtrl.SetItemState(m_nCheckedItem,
- INDEXTOSTATEIMAGEMASK(1), LVIS_STATEIMAGEMASK);
- }
- else
- {
- ListCtrl.SetItemState(m_nCheckedItem,
- INDEXTOSTATEIMAGEMASK(1),
- LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
- }
-
- ::DestroyIcon(m_hSmallIcon);
- ::DestroyIcon(m_hLargeIcon);
- }
-
- // check new item and set its icon as the app icon
-
- CWnd* pMainWnd = AfxGetMainWnd();
-
- if (m_nCheckedItem == nNewCheckedItem)
- {
- m_nCheckedItem = -1;
- pMainWnd->SetIcon(NULL, FALSE);
- pMainWnd->SetIcon(NULL, TRUE);
- }
- else if ((m_nCheckedItem = nNewCheckedItem) != -1)
- {
- if (m_bStateIcons)
- {
- ListCtrl.SetItemState(m_nCheckedItem,
- INDEXTOSTATEIMAGEMASK(2), LVIS_STATEIMAGEMASK);
- }
- else
- {
- ListCtrl.SetItemState(m_nCheckedItem,
- INDEXTOSTATEIMAGEMASK(2) | INDEXTOOVERLAYMASK(1),
- LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
- }
-
- m_hSmallIcon =
- ListCtrl.GetImageList(LVSIL_SMALL)->ExtractIcon(nNewCheckedItem);
- pMainWnd->SetIcon(m_hSmallIcon,FALSE);
- m_hLargeIcon =
- ListCtrl.GetImageList(LVSIL_NORMAL)->ExtractIcon(nNewCheckedItem);
- pMainWnd->SetIcon(m_hLargeIcon,TRUE);
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CRowListView message handlers
-
- void CRowListView::OnViewSmallIcons()
- {
- if (GetViewType() != LVS_SMALLICON)
- SetViewType(LVS_SMALLICON);
- }
-
- void CRowListView::OnViewLargeIcons()
- {
- if (GetViewType() != LVS_ICON)
- SetViewType(LVS_ICON);
- }
-
- void CRowListView::OnViewList()
- {
- if (GetViewType() != LVS_LIST)
- SetViewType(LVS_LIST);
- }
-
- void CRowListView::OnViewDetails()
- {
- if ((GetViewType() != LVS_REPORT) || GetFullRowSel())
- {
- SetFullRowSel(FALSE);
- if (GetViewType() != LVS_REPORT)
- SetViewType(LVS_REPORT);
- }
- }
-
- void CRowListView::OnViewFullRowDetails()
- {
- if ((GetViewType() != LVS_REPORT) || !GetFullRowSel())
- {
- SetFullRowSel(TRUE);
- if (GetViewType() != LVS_REPORT)
- SetViewType(LVS_REPORT);
- }
- }
-
- void CRowListView::OnUpdateViewSmallIcons(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(GetViewType() == LVS_SMALLICON);
- }
-
- void CRowListView::OnUpdateViewLargeIcons(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(GetViewType() == LVS_ICON);
- }
-
- void CRowListView::OnUpdateViewList(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(GetViewType() == LVS_LIST);
- }
-
- void CRowListView::OnUpdateViewDetails(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck((GetViewType() == LVS_REPORT) && !GetFullRowSel());
- }
-
- void CRowListView::OnUpdateViewFullRowDetails(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck((GetViewType() == LVS_REPORT) && GetFullRowSel());
- }
-
- void CRowListView::OnViewStateIcons()
- {
- m_bStateIcons =! m_bStateIcons;
-
- CListCtrl& ListCtrl = GetListCtrl();
-
- if (m_bStateIcons)
- {
- ListCtrl.SetImageList(&m_StateImageList, LVSIL_STATE);
- ListCtrl.SetItemState(m_nCheckedItem, 0, LVIS_OVERLAYMASK);
- }
- else
- {
- ListCtrl.SetImageList(NULL,LVSIL_STATE);
- if (m_nCheckedItem != -1)
- {
- ListCtrl.SetItemState(m_nCheckedItem,
- INDEXTOOVERLAYMASK(1), LVIS_OVERLAYMASK);
- }
- }
- }
-
- void CRowListView::OnUpdateViewStateIcons(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(m_bStateIcons);
- }
-
- void CRowListView::OnViewClientWidthSel()
- {
- m_bClientWidthSel = !m_bClientWidthSel;
-
- Invalidate();
- UpdateWindow();
- }
-
- void CRowListView::OnUpdateViewClientWidthSel(CCmdUI* pCmdUI)
- {
- pCmdUI->SetCheck(m_bClientWidthSel);
- pCmdUI->Enable((GetViewType() == LVS_REPORT) && GetFullRowSel());
- }
-
- void CRowListView::OnLButtonDown(UINT nFlags, CPoint point)
- {
- UINT uFlags = 0;
- int nHitItem = GetListCtrl().HitTest(point, &uFlags);
-
- // we need additional checking in owner-draw mode
- // because we only get LVHT_ONITEM
- BOOL bHit = FALSE;
- if (uFlags == LVHT_ONITEM && (GetStyle() & LVS_OWNERDRAWFIXED))
- {
- CRect rect;
- GetListCtrl().GetItemRect(nHitItem, rect, LVIR_ICON);
-
- // check if hit was on a state icon
- if (m_bStateIcons && point.x < rect.left)
- bHit = TRUE;
- }
- else if (uFlags & LVHT_ONITEMSTATEICON)
- bHit = TRUE;
-
- if (bHit)
- CheckItem(nHitItem);
- else
- CListViewEx::OnLButtonDown(nFlags, point);
- }
-
- void CRowListView::OnLButtonDblClk(UINT nFlags, CPoint point)
- {
- UINT uFlags = 0;
- int nHitItem = GetListCtrl().HitTest(point, &uFlags);
-
- if (uFlags & LVHT_ONITEM)
- {
- // double click works only if we don't have state icons,
- // or if we are in icon or small icon view
- if (!m_bStateIcons || GetViewType() == LVS_ICON ||
- GetViewType()==LVS_SMALLICON)
- {
- CheckItem(nHitItem);
- }
- }
-
- CListViewEx::OnLButtonDblClk(nFlags, point);
- }
-