///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996 Microsoft Corporation // // Module Name: // OLCPair.cpp // // Abstract: // Implementation of the COrderedListCtrlPair class. // // Author: // David Potter (davidp) August 8, 1996 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "OLCPair.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COrderedListCtrlPair ///////////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNCREATE(COrderedListCtrlPair, CListCtrlPair) ///////////////////////////////////////////////////////////////////////////// // Message Maps BEGIN_MESSAGE_MAP(COrderedListCtrlPair, CListCtrlPair) //{{AFX_MSG_MAP(COrderedListCtrlPair) //}}AFX_MSG_MAP ON_NOTIFY(LVN_ITEMCHANGED, IDC_LCP_RIGHT_LIST, OnItemChangedRightList) ON_BN_CLICKED(IDC_LCP_MOVE_UP, OnClickedMoveUp) ON_BN_CLICKED(IDC_LCP_MOVE_DOWN, OnClickedMoveDown) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::COrderedListCtrlPair // // Routine Description: // Default constructor. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// COrderedListCtrlPair::COrderedListCtrlPair(void) { ModifyStyle(0, LCPS_ORDERED); } //*** COrderedListCtrlPair::COrderedListCtrlPair() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::COrderedListCtrlPair // // Routine Description: // Cconstructor. // // Arguments: // pdlg [IN OUT] Dialog to which controls belong. // plpobjRight [IN OUT] List for the right list control. // plpobjLeft [IN] List for the left list control. // dwStyle [IN] Style: // LCPS_SHOW_IMAGES Show images to left of items. // LCPS_ALLOW_EMPTY Allow right list to be empty. // LCPS_ORDERED Ordered right list. // pfnGetColumn [IN] Function pointer for retrieving columns. // pfnDisplayProps [IN] Function pointer for displaying properties. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// COrderedListCtrlPair::COrderedListCtrlPair( IN OUT CDialog * pdlg, IN OUT CClusterItemList * plpobjRight, IN const CClusterItemList * plpobjLeft, IN DWORD dwStyle, IN PFNLCPGETCOLUMN pfnGetColumn, IN PFNLCPDISPPROPS pfnDisplayProps ) : CListCtrlPair( pdlg, plpobjRight, plpobjLeft, dwStyle, pfnGetColumn, pfnDisplayProps ) { } //*** COrderedListCtrlPair::COrderedListCtrlPair() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::DoDataExchange // // Routine Description: // Do data exchange between the dialog and the class. // // Arguments: // pDX [IN OUT] Data exchange object // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void COrderedListCtrlPair::DoDataExchange(CDataExchange * pDX) { CListCtrlPair::DoDataExchange(pDX); DDX_Control(pDX, IDC_LCP_MOVE_UP, m_pbMoveUp); DDX_Control(pDX, IDC_LCP_MOVE_DOWN, m_pbMoveDown); } //*** COrderedListCtrlPair::DoDataExchange() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::OnInitDialog // // Routine Description: // Handler for the WM_INITDIALOG message. // // Arguments: // None. // // Return Value: // TRUE Focus needs to be set. // FALSE Focus already set. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL COrderedListCtrlPair::OnInitDialog(void) { // Call the base class method. CListCtrlPair::OnInitDialog(); // If this is an ordered list, show the Move buttons. // Otherwise, hide them. SetUpDownState(); // If this is an ordered list, don't sort items in the right list. if (BOrdered()) m_lcRight.ModifyStyle(LVS_SORTASCENDING, 0, 0); else m_lcRight.ModifyStyle(0, LVS_SORTASCENDING, 0); // Reload the list control. Pdlg()->UpdateData(FALSE /*bSaveAndValidate*/); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } //*** COrderedListCtrlPair::OnInitDialog() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::OnSetActive // // Routine Description: // Handler for the PSN_SETACTIVE message. // // Arguments: // None. // // Return Value: // TRUE Page successfully initialized. // FALSE Page not initialized. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL COrderedListCtrlPair::OnSetActive(void) { UINT nSelCount; nSelCount = m_lcRight.GetSelectedCount(); if (BPropertiesButton()) m_pbProperties.EnableWindow(nSelCount == 1); // Enable or disable the other buttons. if (!BReadOnly()) SetUpDownState(); return CListCtrlPair::OnSetActive(); } //*** COrderedListCtrlPair::OnSetActive() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::OnItemChangedRightList // // Routine Description: // Handler method for the LVN_ITEMCHANGED message in the right list. // // Arguments: // pNMHDR [IN OUT] WM_NOTIFY structure. // pResult [OUT] LRESULT in which to return the result of this operation. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void COrderedListCtrlPair::OnItemChangedRightList(NMHDR * pNMHDR, LRESULT * pResult) { NM_LISTVIEW * pNMListView = (NM_LISTVIEW *) pNMHDR; // Call the base class method. CListCtrlPair::OnItemChangedRightList(pNMHDR, pResult); if (BOrdered()) { // If the selection changed, enable/disable the Remove button. if ((pNMListView->uChanged & LVIF_STATE) && ((pNMListView->uOldState & LVIS_SELECTED) || (pNMListView->uNewState & LVIS_SELECTED))) { SetUpDownState(); } // if: selection changed } // if: list is ordered *pResult = 0; } //*** COrderedListCtrlPair::OnItemChangedRightList() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::OnClickedMoveUp // // Routine Description: // Handler for the BN_CLICKED message on the Move Up button. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void COrderedListCtrlPair::OnClickedMoveUp(void) { int nItem; CClusterItem * pci; // Find the index of the selected item. nItem = m_lcRight.GetNextItem(-1, LVNI_SELECTED); ASSERT(nItem != -1); // Get the item pointer. pci = (CClusterItem *) m_lcRight.GetItemData(nItem); ASSERT_VALID(pci); // Remove the selected item from the list and add it back in. { POSITION posRemove; POSITION posAdd; // Find the position of the item to be removed and the item before // which the item is to be inserted. posRemove = LpobjRight().FindIndex(nItem); ASSERT(posRemove != NULL); ASSERT(posRemove == LpobjRight().Find(pci)); posAdd = LpobjRight().FindIndex(nItem - 1); ASSERT(posAdd != NULL); VERIFY(LpobjRight().InsertBefore(posAdd, pci) != NULL); LpobjRight().RemoveAt(posRemove); } // Remove the selected item from the list and add it back in // Remove the selected item from the list control and add it back in. VERIFY(m_lcRight.DeleteItem(nItem)); NInsertItemInListCtrl(nItem - 1, pci, m_lcRight); m_lcRight.SetItemState( nItem - 1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED ); m_lcRight.EnsureVisible(nItem - 1, FALSE /*bPartialOK*/); m_lcRight.SetFocus(); } //*** COrderedListCtrlPair::OnClickedMoveUp() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::OnClickedMoveDown // // Routine Description: // Handler for the BN_CLICKED message on the Move Down button. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void COrderedListCtrlPair::OnClickedMoveDown(void) { int nItem; CClusterItem * pci; // Find the index of the selected item. nItem = m_lcRight.GetNextItem(-1, LVNI_SELECTED); ASSERT(nItem != -1); // Get the item pointer. pci = (CClusterItem *) m_lcRight.GetItemData(nItem); ASSERT_VALID(pci); // Remove the selected item from the list and add it back in. { POSITION posRemove; POSITION posAdd; // Find the position of the item to be removed and the item after // which the item is to be inserted. posRemove = LpobjRight().FindIndex(nItem); ASSERT(posRemove != NULL); ASSERT(posRemove == LpobjRight().Find(pci)); posAdd = LpobjRight().FindIndex(nItem + 1); ASSERT(posAdd != NULL); VERIFY(LpobjRight().InsertAfter(posAdd, pci) != NULL); LpobjRight().RemoveAt(posRemove); } // Remove the selected item from the list and add it back in // Remove the selected item from the list control and add it back in. VERIFY(m_lcRight.DeleteItem(nItem)); NInsertItemInListCtrl(nItem + 1, pci, m_lcRight); m_lcRight.SetItemState( nItem + 1, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED ); m_lcRight.EnsureVisible(nItem + 1, FALSE /*bPartialOK*/); m_lcRight.SetFocus(); } //*** COrderedListCtrlPair::OnClickedMoveDown() ///////////////////////////////////////////////////////////////////////////// //++ // // COrderedListCtrlPair::SetUpDownState // // Routine Description: // Set the state of the Up/Down buttons based on the selection. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void COrderedListCtrlPair::SetUpDownState(void) { BOOL bEnableUp; BOOL bEnableDown; if ( BOrdered() && !BReadOnly() && (m_lcRight.GetSelectedCount() == 1)) { int nItem; bEnableUp = TRUE; bEnableDown = TRUE; // Find the index of the selected item. nItem = m_lcRight.GetNextItem(-1, LVNI_SELECTED); ASSERT(nItem != -1); // If the first item is selected, can't move up. if (nItem == 0) bEnableUp = FALSE; // If the last item is selected, can't move down. if (nItem == m_lcRight.GetItemCount() - 1) bEnableDown = FALSE; } // if: only one item selected else { bEnableUp = FALSE; bEnableDown = FALSE; } // else: zero or more than one item selected m_pbMoveUp.EnableWindow(bEnableUp); m_pbMoveDown.EnableWindow(bEnableDown); } //*** COrderedListCtrlPair::SetUpDownState()