/***************************************************************************** COPYRIGHT (C) 2000-2001, Ken Bertelson *****************************************************************************/ #include "stdafx.h" #include "GridBtnCellCombo.h" #include "MfcGridCtrlInPlaceEdit.h" #include "InPlaceList.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif IMPLEMENT_DYNCREATE(CGridBtnCellCombo, CGridBtnCell) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGridBtnCellCombo::CGridBtnCellCombo() : CGridBtnCell() { } CGridBtnCellCombo::~CGridBtnCellCombo() { } void CGridBtnCellCombo::Reset() { CGridBtnCell::Reset(); m_dwComboStyle = CBS_SIMPLE; m_StringArrayCombo.RemoveAll(); } void CGridBtnCellCombo::OnClick( CPoint PointCellRelative) { // immediately edit if user clicked on scroll down button picture int iCtlHit = RelPointInCtl( PointCellRelative); // Relative point coords // returns: Index of control that this point is within bounds of or -1 if no control matches BOOL bHitScrollDown = FALSE; if( iCtlHit >= 0) { // if user clicked on scroll down button picture, then show // the drop-down, too UINT uiType = GetDrawCtlType( iCtlHit); UINT uiState = GetDrawCtlState( iCtlHit); bHitScrollDown = ( uiType == DFC_SCROLL) && uiState & DFCS_SCROLLDOWN; } if( bHitScrollDown) { // invoke the edit, now -- similar to CGridCtl::OnEditCell() logic CMfcGridCtrl* pGrid = GetGrid(); ASSERT( pGrid != NULL); CRect rect; if (!pGrid->GetCellRect( m_iRow, m_iCol, rect)) return; SendMessageToParent(m_iRow, m_iCol, GVN_BEGINLABELEDIT); Edit( m_iRow, m_iCol, rect, PointCellRelative, IDC_INPLACE_CONTROL, VK_LBUTTON); return; } CGridBtnCell::OnClick( PointCellRelative); } /***************************************************************************** May mean end of a button click sequence or to edit text *****************************************************************************/ BOOL CGridBtnCellCombo::Edit(int nRow, int nCol, CRect rect, CPoint point, UINT nID, UINT nChar) { int iCtlHit = RelPointInCtl( point); // Relative point coords // returns: Index of control that this point is within bounds of or -1 if no control matches BOOL bShowDropDownNow = FALSE; if( iCtlHit >= 0) { // if user clicked on scroll down button picture, then show // the drop-down, too UINT uiType = GetDrawCtlType( iCtlHit); UINT uiState = GetDrawCtlState( iCtlHit); bShowDropDownNow = ( uiType == DFC_SCROLL) && uiState & DFCS_SCROLLDOWN; } BOOL bHitNonComboButton = ( iCtlHit >= 0) && !bShowDropDownNow; if( HasCellText() && !bHitNonComboButton ) { m_ucEditing = TRUE; // InPlaceList auto-deletes itself CMfcGridCtrl* pGrid = GetGrid(); CInPlaceList* pInPlaceList = new CInPlaceList( pGrid, rect, m_dwComboStyle, nID, nRow, nCol, m_StringArrayCombo, GetText(), nChar); if(bShowDropDownNow) { if( m_dwComboStyle & CBS_DROPDOWN || m_dwComboStyle & CBS_DROPDOWNLIST) { pInPlaceList->ShowDropDown( TRUE); } } m_pBtnDataBase->SetEditWnd( pInPlaceList); return TRUE; } // call base class, otherwise return CGridBtnCell::Edit( nRow, nCol, rect, point, nID, nChar); } void CGridBtnCellCombo::EndEdit() { ASSERT( m_pBtnDataBase != NULL); CWnd* pWnd = m_pBtnDataBase->GetEditWnd(); if (pWnd) ((CInPlaceList*)pWnd)->EndEdit(); } void CGridBtnCellCombo::OnEndEdit() { ASSERT( m_pBtnDataBase != NULL); m_ucEditing = FALSE; m_pBtnDataBase->SetEditWnd( NULL); // make sure that all pushbuttons appear in "up" state const int iCtlNbr = GetDrawCtlNbr(); for( int i1=0; i1 < iCtlNbr; i1++) { UINT uiType = GetDrawCtlType( i1); UINT uiState = GetDrawCtlState( i1); BOOL bIsScrollDown = ( uiType == DFC_SCROLL) && uiState & DFCS_SCROLLDOWN; BOOL bIsPushButton = ( uiType == DFC_BUTTON) && uiState & DFCS_BUTTONPUSH; if( bIsScrollDown || bIsPushButton) { ClickedCellCtl( WM_LBUTTONUP, // Command that invoked. e.g. WM_LBUTTONDOWN i1); // zero-based index of image to draw } } }