/////////////////////////////////////////////////////////////////////////// // // GridCellDateTime.cpp: implementation of the CGridCellDateTime class. // // Provides the implementation for a datetime picker cell type of the // grid control. // // Written by Podsypalnikov Eugen 15 Mar 2001 // Modified: // 31 May 2001 Fixed m_cTime bug (Chris Maunder) // // For use with CGridCtrl v2.22+ // /////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "GridCtrl.h" #include "GridCell.h" #include "GridCellDateTime.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // CGridCellDateTime IMPLEMENT_DYNCREATE(CGridCellDateTime, CGridCell) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CGridCellDateTime::CGridCellDateTime() : CGridCell() { m_dwStyle = 0; m_cTime = CTime::GetCurrentTime(); } CGridCellDateTime::CGridCellDateTime(DWORD dwStyle) : CGridCell() { Init(dwStyle); } CGridCellDateTime::~CGridCellDateTime() { } CSize CGridCellDateTime::GetCellExtent(CDC* pDC) { CSize sizeScroll (GetSystemMetrics(SM_CXVSCROLL), GetSystemMetrics(SM_CYHSCROLL)); CSize sizeCell (CGridCell::GetCellExtent(pDC)); sizeCell.cx += sizeScroll.cx; sizeCell.cy = max(sizeCell.cy,sizeScroll.cy); return sizeCell; } BOOL CGridCellDateTime::Edit(int nRow, int nCol, CRect rect, CPoint /* point */, UINT nID, UINT nChar) { m_bEditing = TRUE; // CInPlaceDateTime auto-deletes itself m_pEditWnd = new CInPlaceDateTime(GetGrid(), rect, m_dwStyle|DTS_UPDOWN, nID, nRow, nCol, GetTextClr(), GetBackClr(), GetTime(), nChar); return TRUE; } CWnd* CGridCellDateTime::GetEditWnd() const { return m_pEditWnd; } void CGridCellDateTime::EndEdit() { if (m_pEditWnd) ((CInPlaceDateTime*)m_pEditWnd)->EndEdit(); } void CGridCellDateTime::Init(DWORD dwStyle) { m_dwStyle = dwStyle; SetTime(CTime::GetCurrentTime()); SetFormat(DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX #ifndef _WIN32_WCE |DT_END_ELLIPSIS #endif ); } // Should be changed to use locale settings void CGridCellDateTime::SetTime(CTime time) { m_cTime = time; if (DTS_TIMEFORMAT == m_dwStyle) { #ifdef _WIN32_WCE CString strTemp; strTemp.Format(_T("%02d:%02d:%02d"), m_cTime.GetHour(), m_cTime.GetMinute(), m_cTime.GetSecond()); SetText(strTemp); #else // SetText(m_cTime.Format(_T("%H:%M:%S"))); SetText(m_cTime.Format(_T("%X"))); #endif } else if (DTS_SHORTDATEFORMAT == m_dwStyle) { #ifdef _WIN32_WCE CString strTemp; strTemp.Format(_T("%02d/%02d/%02d"), m_cTime.GetMonth(), m_cTime.GetDay(), m_cTime.GetYear()); SetText(strTemp); #else // SetText(m_cTime.Format(("%d/%m/%Y"))); SetText(m_cTime.Format(("%x"))); #endif } } ///////////////////////////////////////////////////////////////////////////// // CInPlaceDateTime CInPlaceDateTime::CInPlaceDateTime(CWnd* pParent, CRect& rect, DWORD dwStyle, UINT nID, int nRow, int nColumn, COLORREF crFore, COLORREF crBack, CTime* pcTime, UINT nFirstChar) { m_crForeClr = crFore; m_crBackClr = crBack; m_nRow = nRow; m_nCol = nColumn; m_nLastChar = 0; m_bExitOnArrows = FALSE; m_pcTime = pcTime; DWORD dwStl = WS_BORDER|WS_VISIBLE|WS_CHILD|dwStyle; if (!Create(dwStl, rect, pParent, nID)) { return; } SetTime(m_pcTime); SetFont(pParent->GetFont()); SetFocus(); switch (nFirstChar) { case VK_LBUTTON: case VK_RETURN: return; case VK_BACK: break; case VK_DOWN: case VK_UP: case VK_RIGHT: case VK_LEFT: case VK_NEXT: case VK_PRIOR: case VK_HOME: case VK_END: return; default: break; } SendMessage(WM_CHAR, nFirstChar); } CInPlaceDateTime::~CInPlaceDateTime() { } void CInPlaceDateTime::EndEdit() { CString str; if (::IsWindow(m_hWnd)) { GetWindowText(str); GetTime(*m_pcTime); } // Send Notification to parent GV_DISPINFO dispinfo; dispinfo.hdr.hwndFrom = GetSafeHwnd(); dispinfo.hdr.idFrom = GetDlgCtrlID(); dispinfo.hdr.code = GVN_ENDLABELEDIT; dispinfo.item.mask = LVIF_TEXT|LVIF_PARAM; dispinfo.item.row = m_nRow; dispinfo.item.col = m_nCol; dispinfo.item.strText = str; dispinfo.item.lParam = (LPARAM) m_nLastChar; CWnd* pOwner = GetOwner(); if (IsWindow(pOwner->GetSafeHwnd())) { pOwner->SendMessage(WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&dispinfo); } // Close this window (PostNcDestroy will delete this) if (::IsWindow(m_hWnd)) { PostMessage(WM_CLOSE, 0, 0); } } void CInPlaceDateTime::PostNcDestroy() { CDateTimeCtrl::PostNcDestroy(); delete this; } BEGIN_MESSAGE_MAP(CInPlaceDateTime, CDateTimeCtrl) //{{AFX_MSG_MAP(CInPlaceDateTime) ON_WM_KILLFOCUS() ON_WM_KEYDOWN() ON_WM_KEYUP() ON_WM_GETDLGCODE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CInPlaceDateTime message handlers void CInPlaceDateTime::OnKillFocus(CWnd* pNewWnd) { CDateTimeCtrl::OnKillFocus(pNewWnd); if (GetSafeHwnd() == pNewWnd->GetSafeHwnd()) { return; } EndEdit(); } UINT CInPlaceDateTime::OnGetDlgCode() { return DLGC_WANTALLKEYS; } void CInPlaceDateTime::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if (( nChar == VK_PRIOR || nChar == VK_NEXT || nChar == VK_DOWN || nChar == VK_UP || nChar == VK_RIGHT || nChar == VK_LEFT) && (m_bExitOnArrows || GetKeyState(VK_CONTROL) < 0)) { m_nLastChar = nChar; GetParent()->SetFocus(); return; } CDateTimeCtrl::OnKeyDown(nChar, nRepCnt, nFlags); } void CInPlaceDateTime::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_TAB || nChar == VK_RETURN || nChar == VK_ESCAPE) { m_nLastChar = nChar; GetParent()->SetFocus(); // This will destroy this window return; } CDateTimeCtrl::OnKeyUp(nChar, nRepCnt, nFlags); }