362 lines
8.5 KiB
C++
362 lines
8.5 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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()
|