|
|
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1998 Microsoft Corporation
//
// Module Name:
// AtlLCPair.cpp
//
// Abstract:
// Implementation of the CListCtrlPair class.
//
// Author:
// David Potter (davidp) August 8, 1996
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "AtlLCPair.h"
#include "AtlUtil.h" // for DDX_xxx
#include "AdmCommonRes.h" // for ADMC_IDC_LCP_xxx
/////////////////////////////////////////////////////////////////////////////
// class CListCtrlPair
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//++
//
// CListCtrlPair::BInitDialog
//
// Routine Description:
// Generic dialog initialization routine.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Dialog was initialized successfully.
// FALSE Error initializing the dialog.
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T, class ObjT, class BaseT> BOOL CListCtrlPair::BInitDialog( void ) { //
// Attach the controls to control member variables.
//
AttachControl( m_lvcRight, ADMC_IDC_LCP_RIGHT_LIST ); AttachControl( m_lvcLeft, ADMC_IDC_LCP_LEFT_LIST ); AttachControl( m_pbAdd, ADMC_IDC_LCP_ADD ); AttachControl( m_pbRemove, ADMC_IDC_LCP_REMOVE ); if ( BPropertiesButton() ) { AttachControl( m_pbProperties, ADMC_IDC_LCP_PROPERTIES ); } // if: dialog has Properties button
// if ( BShowImages() )
// {
// CClusterAdminApp * papp = GetClusterAdminApp();
//
// m_lvcLeft.SetImageList( papp->PilSmallImages(), LVSIL_SMALL );
// m_lvcRight.SetImageList( papp->PilSmallImages(), LVSIL_SMALL );
// } // if: showing images
//
// Disable buttons by default.
//
m_pbAdd.EnableWindow( FALSE ); m_pbRemove.EnableWindow( FALSE ); if ( BPropertiesButton() ) { m_pbProperties.EnableWindow( FALSE ); } // if: dialog has Properties button
//
// Set the right list to sort. Set both to show selection always.
//
m_lvcRight.ModifyStyle( 0, LVS_SHOWSELALWAYS | LVS_SORTASCENDING, 0 ); m_lvcLeft.ModifyStyle( 0, LVS_SHOWSELALWAYS, 0 );
//
// Change left list view control extended styles.
//
m_lvcLeft.SetExtendedListViewStyle( LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP );
//
// Change right list view control extended styles.
//
m_lvcRight.SetExtendedListViewStyle( LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP );
// Duplicate lists.
DuplicateLists();
//
// Insert all the columns.
//
{ int icol; int ncol; int nUpperBound = m_aColumns.size(); CString strColText;
ATLASSERT( nUpperBound >= 0 );
for ( icol = 0 ; icol <= nUpperBound ; icol++ ) { strColText.LoadString( m_aColumns[icol].m_idsText ); ncol = m_lvcLeft.InsertColumn( icol, strColText, LVCFMT_LEFT, m_aColumns[icol].m_nWidth, 0 ); ATLASSERT( ncol == icol ); ncol = m_lvcRight.InsertColumn( icol, strColText, LVCFMT_LEFT, m_aColumns[icol].m_nWidth, 0 ); ATLASSERT( ncol == icol ); } // for: each column
} // Insert all the columns
//
// Fill the list controls.
//
FillList( m_lvcRight, LpobjRight() ); FillList( m_lvcLeft, LpobjLeft() );
//
// If read-only, set all controls to be either disabled or read-only.
//
if ( BReadOnly() ) { m_lvcRight.EnableWindow( FALSE ); m_lvcLeft.EnableWindow( FALSE ); } // if: sheet is read-only
return TRUE;
} //*** CListCtrlPair::BInitDialog()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CListCtrlPair::OnSetActive
//
// Routine Description:
// Handler for the PSN_SETACTIVE message.
//
// Arguments:
// None.
//
// Return Value:
// TRUE Page successfully initialized.
// FALSE Page not initialized.
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T, class ObjT, class BaseT> BOOL CListCtrlPair::OnSetActive( void ) { UINT nSelCount;
// Set the focus to the left list.
m_lvcLeft.SetFocus(); m_plvcFocusList = &m_lvcLeft;
// Enable/disable the Properties button.
nSelCount = m_lvcLeft.GetSelectedCount(); if ( BPropertiesButton() ) { m_pbProperties.EnableWindow( nSelCount == 1 ); } // if: dialog has Properties button
// Enable or disable the other buttons.
if ( ! BReadOnly() ) { m_pbAdd.EnableWindow( nSelCount > 0 ); nSelCount = m_lvcRight.GetSelectedCount(); m_pbRemove.EnableWindow( nSelCount > 0 ); } // if: not read-only page
return TRUE;
} //*** CListCtrlPair::OnSetActive()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CListCtrlPair::OnContextMenu
//
// Routine Description:
// Handler for the WM_CONTEXTMENU method.
//
// Arguments:
// pWnd Window in which the user right clicked the mouse.
// point Position of the cursor, in screen coordinates.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T, class ObjT, class BaseT> LRESULT CListCtrlPair::OnContextMenu( IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam, IN OUT BOOL & bHandled ) { BOOL bDisplayed = FALSE; CMenu * pmenu = NULL; HWND hWnd = (HWND) wParam; WORD xPos = LOWORD( lParam ); WORD yPos = HIWORD( lParam ); CListViewCtrl * plvc; CString strMenuName; CWaitCursor wc;
//
// If focus is not in a list control, don't handle the message.
//
if ( hWnd == m_lvcLeft.m_hWnd ) { plvc = &m_lvcLeft; } // if: context menu on left list
else if ( hWnd == m_lvcRight.m_hWnd ) { plvc = &m_lvcRight; } // else if: context menu on right list
else { bHandled = FALSE; return 0; } // else: focus not in a list control
ATLASSERT( plvc != NULL );
//
// If the properties button is not enabled, don't display a menu.
//
if ( ! BPropertiesButton() ) { bHandled = FALSE; return 0; } // if: no properties button
//
// Create the menu to display.
//
pmenu = new CMenu; if ( pmenu->CreatePopupMenu() ) { UINT nFlags = MF_STRING;
//
// If there are no items in the list, disable the menu item.
//
if ( plvc->GetItemCount() == 0 ) { nFlags |= MF_GRAYED; } // if: no items in the list
//
// Add the Properties item to the menu.
//
strMenuName.LoadString( ADMC_ID_MENU_PROPERTIES ); if ( pmenu->AppendMenu( nFlags, ADMC_ID_MENU_PROPERTIES, strMenuName ) ) { m_plvcFocusList = plvc; bDisplayed = TRUE; } // if: successfully added menu item
} // if: menu created successfully
if ( bDisplayed ) { //
// Display the menu.
//
if ( ! pmenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, xPos, yPos, m_hWnd ) ) { } // if: unsuccessfully displayed the menu
} // if: there is a menu to display
delete pmenu; return 0;
} //*** CListCtrlPair::OnContextMenu()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CListCtrlPair::OnColumnClickList
//
// Routine Description:
// Handler method for the LVN_COLUMNCLICK message on the left or
// right list.
//
// Arguments:
// idCtrl [IN] ID of control sending the message.
// pnmh [IN] Notify header.
// bHandled [IN OUT] Indicates if we handled or not. Defaults to TRUE.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
template < class T, class ObjT, class BaseT> void CListCtrlPair::OnColumnClickList( IN int idCtrl, IN LPNMHDR pnmh, IN OUT BOOL & bHandled ) { NM_LISTVIEW * pNMListView = (NM_LISTVIEW *) pnmh; SortInfo * psi;
if ( idCtrl == ADMC_IDC_LCP_LEFT_LIST ) { m_plvcFocusList = &m_lvcLeft; m_psiCur = &SiLeft(); } // if: column clicked in left list
else if ( idCtrl == ADMC_IDC_LCP_RIGHT_LIST ) { m_plvcFocusList = &m_lvcRight; m_psiCur = &SiRight(); } // else if: column clicked in right list
else { ATLASSERT( 0 ); bHandled = FALSE; return 0; } // else: column clicked in unknown list
// Save the current sort column and direction.
if ( pNMListView->iSubItem == psi->m_nColumn ) { m_psiCur->m_nDirection ^= -1; } // if: sorting same column again
else { m_psiCur->m_nColumn = pNMListView->iSubItem; m_psiCur->m_nDirection = 0; } // else: different column
// Sort the list.
if ( ! m_plvcFocusList->SortItems( CompareItems, (LPARAM) this ) ) { ATLASSERT( 0 ); } // if: error sorting items
*pResult = 0;
} //*** CListCtrlPair::OnColumnClickList()
|