00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00032
00033 #include "stdafx.h"
00034 #include "GridCell.h"
00035 #include "InPlaceEdit.h"
00036 #include "GridCtrl.h"
00037
00038 #ifdef _DEBUG
00039 #define new DEBUG_NEW
00040 #undef THIS_FILE
00041 static char THIS_FILE[] = __FILE__;
00042 #endif
00043
00044 IMPLEMENT_DYNCREATE(CGridCell, CGridCellBase)
00045 IMPLEMENT_DYNCREATE(CGridDefaultCell, CGridCell)
00046
00048
00049
00050 CGridCell::CGridCell()
00051 {
00052 m_plfFont = NULL;
00053 CGridCell::Reset();
00054 }
00055
00056 CGridCell::~CGridCell()
00057 {
00058 delete m_plfFont;
00059 }
00060
00062
00063
00064 void CGridCell::operator=(const CGridCell& cell)
00065 {
00066 if (this != &cell) CGridCellBase::operator=(cell);
00067 }
00068
00069 void CGridCell::Reset()
00070 {
00071 CGridCellBase::Reset();
00072
00073 m_strText.Empty();
00074 m_nImage = -1;
00075 m_pGrid = NULL;
00076 m_bEditing = FALSE;
00077 m_pEditWnd = NULL;
00078
00079 m_nFormat = (DWORD)-1;
00080 m_crBkClr = CLR_DEFAULT;
00081 m_crFgClr = CLR_DEFAULT;
00082 m_nMargin = (UINT)-1;
00083
00084 delete m_plfFont;
00085 m_plfFont = NULL;
00086 }
00087
00088 void CGridCell::SetFont(const LOGFONT* plf)
00089 {
00090 if (plf == NULL)
00091 {
00092 delete m_plfFont;
00093 m_plfFont = NULL;
00094 }
00095 else
00096 {
00097 if (!m_plfFont)
00098 m_plfFont = new LOGFONT;
00099 if (m_plfFont)
00100 memcpy(m_plfFont, plf, sizeof(LOGFONT));
00101 }
00102 }
00103
00104 LOGFONT* CGridCell::GetFont() const
00105 {
00106 if (m_plfFont == NULL)
00107 {
00108 CGridDefaultCell *pDefaultCell = (CGridDefaultCell*) GetDefaultCell();
00109 if (!pDefaultCell)
00110 return NULL;
00111
00112 return pDefaultCell->GetFont();
00113 }
00114
00115 return m_plfFont;
00116 }
00117
00118 CFont* CGridCell::GetFontObject() const
00119 {
00120
00121 if (m_plfFont == NULL)
00122 {
00123 CGridDefaultCell *pDefaultCell = (CGridDefaultCell*) GetDefaultCell();
00124 if (!pDefaultCell)
00125 return NULL;
00126
00127 return pDefaultCell->GetFontObject();
00128 }
00129 else
00130 {
00131 static CFont Font;
00132 Font.DeleteObject();
00133 Font.CreateFontIndirect(m_plfFont);
00134 return &Font;
00135 }
00136 }
00137
00138 DWORD CGridCell::GetFormat() const
00139 {
00140 if (m_nFormat == (DWORD)-1)
00141 {
00142 CGridDefaultCell *pDefaultCell = (CGridDefaultCell*) GetDefaultCell();
00143 if (!pDefaultCell)
00144 return 0;
00145
00146 return pDefaultCell->GetFormat();
00147 }
00148
00149 return m_nFormat;
00150 }
00151
00152 UINT CGridCell::GetMargin() const
00153 {
00154 if (m_nMargin == (UINT)-1)
00155 {
00156 CGridDefaultCell *pDefaultCell = (CGridDefaultCell*) GetDefaultCell();
00157 if (!pDefaultCell)
00158 return 0;
00159
00160 return pDefaultCell->GetMargin();
00161 }
00162
00163 return m_nMargin;
00164 }
00165
00167
00168
00169 BOOL CGridCell::Edit(int nRow, int nCol, CRect rect, CPoint , UINT nID, UINT nChar)
00170 {
00171 if ( m_bEditing )
00172 {
00173 if (m_pEditWnd)
00174 m_pEditWnd->SendMessage ( WM_CHAR, nChar );
00175 }
00176 else
00177 {
00178 DWORD dwStyle = ES_LEFT;
00179 if (GetFormat() & DT_RIGHT)
00180 dwStyle = ES_RIGHT;
00181 else if (GetFormat() & DT_CENTER)
00182 dwStyle = ES_CENTER;
00183
00184
00185
00186 if(!((GetFormat() & DT_SINGLELINE)))
00187 {
00188 dwStyle = dwStyle |ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN;
00189 }
00190
00191
00192
00193 m_bEditing = TRUE;
00194
00195
00196 CGridCtrl* pGrid = GetGrid();
00197 m_pEditWnd = new CInPlaceEdit(pGrid, rect, dwStyle, nID, nRow, nCol, GetText(), nChar);
00198 }
00199 return TRUE;
00200 }
00201
00202 void CGridCell::EndEdit()
00203 {
00204 if (m_pEditWnd)
00205 ((CInPlaceEdit*)m_pEditWnd)->EndEdit();
00206 }
00207
00208 void CGridCell::OnEndEdit()
00209 {
00210 m_bEditing = FALSE;
00211 m_pEditWnd = NULL;
00212 }
00213
00215
00216
00217 CGridDefaultCell::CGridDefaultCell()
00218 {
00219 #ifdef _WIN32_WCE
00220 m_nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX;
00221 #else
00222 m_nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX | DT_END_ELLIPSIS;
00223 #endif
00224 m_crFgClr = CLR_DEFAULT;
00225 m_crBkClr = CLR_DEFAULT;
00226 m_Size = CSize(30,10);
00227 m_dwStyle = 0;
00228
00229 #ifdef _WIN32_WCE
00230 LOGFONT lf;
00231 GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
00232 SetFont(&lf);
00233 #else // not CE
00234 NONCLIENTMETRICS ncm;
00235 ncm.cbSize = sizeof(NONCLIENTMETRICS);
00236 VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
00237 SetFont(&(ncm.lfMessageFont));
00238 #endif
00239 }
00240
00241 CGridDefaultCell::~CGridDefaultCell()
00242 {
00243 m_Font.DeleteObject();
00244 }
00245
00246 void CGridDefaultCell::SetFont(const LOGFONT* plf)
00247 {
00248 ASSERT(plf);
00249
00250 if (!plf) return;
00251
00252 m_Font.DeleteObject();
00253 m_Font.CreateFontIndirect(plf);
00254
00255 CGridCell::SetFont(plf);
00256
00257
00258 CDC* pDC = CDC::FromHandle(::GetDC(NULL));
00259 if (pDC)
00260 {
00261 CFont* pOldFont = pDC->SelectObject(&m_Font);
00262
00263 SetMargin(pDC->GetTextExtent(_T(" "), 1).cx);
00264 m_Size = pDC->GetTextExtent(_T(" XXXXXXXXXXXX "), 14);
00265 m_Size.cy = (m_Size.cy * 3) / 2;
00266
00267 pDC->SelectObject(pOldFont);
00268 ReleaseDC(NULL, pDC->GetSafeHdc());
00269 }
00270 else
00271 {
00272 SetMargin(3);
00273 m_Size = CSize(40,16);
00274 }
00275 }
00276
00277 LOGFONT* CGridDefaultCell::GetFont() const
00278 {
00279 ASSERT(m_plfFont);
00280 return m_plfFont;
00281 }
00282
00283 CFont* CGridDefaultCell::GetFontObject() const
00284 {
00285 ASSERT(m_Font.GetSafeHandle());
00286 return (CFont*) &m_Font;
00287 }