X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c0b042fce9be0fab67f229f35ffd117f4e1e0730..22baaed33e9957cf1c0819441d529a64cb502d34:/src/generic/gridg.cpp diff --git a/src/generic/gridg.cpp b/src/generic/gridg.cpp index db89849d02..e1a020e44d 100644 --- a/src/generic/gridg.cpp +++ b/src/generic/gridg.cpp @@ -2,38 +2,42 @@ // Name: gridg.cpp // Purpose: wxGenericGrid // Author: Julian Smart -// Modified by: Michael Bedward 20 Apr 1999 -// Added edit in place facility +// Modified by: Michael Bedward +// Added edit in place facility, 20 Apr 1999 +// Added cursor key control, 29 Jun 1999 +// Gerhard Gruber +// Added keyboard navigation, client data, other fixes // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "gridg.h" -#pragma interface + #pragma implementation "gridg.h" + #pragma interface #endif // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP - #include "wx/utils.h" - #include "wx/dcclient.h" - #include "wx/dcmemory.h" - #include "wx/textctrl.h" + #include "wx/utils.h" + #include "wx/dcclient.h" + #include "wx/dcmemory.h" + #include "wx/textctrl.h" + #include "wx/settings.h" #endif #include #include "wx/string.h" + #include "wx/generic/gridg.h" -#include "wx/settings.h" // Set to zero to use no double-buffering #ifdef __WXMSW__ @@ -56,6 +60,8 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel) EVT_MOUSE_EVENTS(wxGenericGrid::OnMouseEvent) EVT_TEXT(wxGRID_TEXT_CTRL, wxGenericGrid::OnText) EVT_TEXT(wxGRID_EDIT_IN_PLACE_TEXT_CTRL, wxGenericGrid::OnTextInPlace) + EVT_TEXT_ENTER(wxGRID_TEXT_CTRL, wxGenericGrid::OnTextEnter) + EVT_TEXT_ENTER(wxGRID_EDIT_IN_PLACE_TEXT_CTRL, wxGenericGrid::OnTextInPlaceEnter) EVT_COMMAND_SCROLL(wxGRID_HSCROLL, wxGenericGrid::OnGridScroll) EVT_COMMAND_SCROLL(wxGRID_VSCROLL, wxGenericGrid::OnGridScroll) @@ -73,8 +79,10 @@ BEGIN_EVENT_TABLE(wxGenericGrid, wxPanel) END_EVENT_TABLE() -wxGenericGrid::wxGenericGrid(void) +wxGenericGrid::wxGenericGrid() { + m_viewWidth = 0; + m_viewHeight = 0; m_batchCount = 0; m_hScrollBar = (wxScrollBar *) NULL; m_vScrollBar = (wxScrollBar *) NULL; @@ -90,9 +98,9 @@ wxGenericGrid::wxGenericGrid(void) m_currentRectVisible = FALSE; m_editable = TRUE; - m_editInPlace = TRUE; + m_editInPlace = FALSE; m_inOnTextInPlace = FALSE; - + #if defined(__WIN95__) m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X); #elif defined(__WXGTK__) @@ -133,9 +141,15 @@ wxGenericGrid::wxGenericGrid(void) m_textItem = (wxTextCtrl *) NULL; } -bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, - long style, const wxString& name) +bool wxGenericGrid::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxString& name) { + m_viewWidth = 0; + m_viewHeight = 0; m_batchCount = 0; m_editingPanel = (wxPanel *) NULL; m_hScrollBar = (wxScrollBar *) NULL; @@ -151,6 +165,8 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_textItem = (wxTextCtrl *) NULL; m_currentRectVisible = FALSE; m_editable = TRUE; + m_editInPlace = FALSE; + m_inOnTextInPlace = FALSE; #if defined(__WIN95__) m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X); #elif defined(__WXGTK__) @@ -215,7 +231,7 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, m_textItem = new wxTextCtrl(m_editingPanel, wxGRID_TEXT_CTRL, "", wxPoint(m_editControlPosition.x, m_editControlPosition.y), wxSize(m_editControlPosition.width, -1), - 0); + wxTE_PROCESS_ENTER); m_textItem->Show(TRUE); m_textItem->SetFocus(); int controlW, controlH; @@ -233,21 +249,22 @@ bool wxGenericGrid::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, // SetSize(pos.x, pos.y, size.x, size.y); m_inPlaceTextItem = new wxTextCtrl( (wxPanel*)this, wxGRID_EDIT_IN_PLACE_TEXT_CTRL, "", - wxPoint( m_currentRect.x-2, m_currentRect.y-2 ), - wxSize( m_currentRect.width+4, m_currentRect.height+4 ), - wxNO_BORDER ); - m_inPlaceTextItem->Show(TRUE); - m_inPlaceTextItem->SetFocus(); - + wxPoint( m_currentRect.x-2, m_currentRect.y-2 ), + wxSize( m_currentRect.width+4, m_currentRect.height+4 ), + wxNO_BORDER | wxTE_PROCESS_ENTER ); + m_inPlaceTextItem->Show(m_editInPlace); + if ( m_editInPlace ) + m_inPlaceTextItem->SetFocus(); + return TRUE; } -wxGenericGrid::~wxGenericGrid(void) +wxGenericGrid::~wxGenericGrid() { ClearGrid(); } -void wxGenericGrid::ClearGrid(void) +void wxGenericGrid::ClearGrid() { int i,j; if (m_gridCells) @@ -376,7 +393,7 @@ bool wxGenericGrid::CreateGrid(int nRows, int nCols, wxString **cellValues, shor } // Need to determine various dimensions -void wxGenericGrid::UpdateDimensions(void) +void wxGenericGrid::UpdateDimensions() { int canvasWidth, canvasHeight; GetSize(&canvasWidth, &canvasHeight); @@ -800,8 +817,8 @@ void wxGenericGrid::DrawColumnLabel(wxDC *dc, wxRect *rect, int col) rect2.height -= 4; dc->SetTextForeground(GetLabelTextColour()); dc->SetFont(GetLabelTextFont()); - if ( !cell->GetTextValue().IsNull() ) - DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxHORIZONTAL)); + if ( !cell->GetTextValue().IsNull() ) + DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxHORIZONTAL)); } } @@ -853,8 +870,8 @@ void wxGenericGrid::DrawRowLabel(wxDC *dc, wxRect *rect, int row) rect2.height -= 4; dc->SetTextForeground(GetLabelTextColour()); dc->SetFont(GetLabelTextFont()); - if ( !cell->GetTextValue().IsNull() ) - DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxVERTICAL)); + if ( !cell->GetTextValue().IsNull() ) + DrawTextRect(dc, cell->GetTextValue(), &rect2, GetLabelAlignment(wxVERTICAL)); } } @@ -931,13 +948,13 @@ void wxGenericGrid::DrawCellValue(wxDC *dc, wxRect *rect, int row, int col) dc->SetTextForeground(cell->GetTextColour()); dc->SetFont(cell->GetFont()); - if ( !cell->GetTextValue().IsNull() ) - DrawTextRect(dc, cell->GetTextValue(), &rect2, cell->GetAlignment()); + if ( !cell->GetTextValue().IsNull() ) + DrawTextRect(dc, cell->GetTextValue(), &rect2, cell->GetAlignment()); } } } -void wxGenericGrid::AdjustScrollbars(void) +void wxGenericGrid::AdjustScrollbars() { int cw, ch; GetClientSize(&cw, &ch); @@ -962,56 +979,53 @@ void wxGenericGrid::AdjustScrollbars(void) int noHorizSteps = 0; int noVertSteps = 0; - if (m_totalGridWidth + vertScrollBarWidth <= cw) - noHorizSteps = 0; - else + if (m_totalGridWidth + vertScrollBarWidth > cw) { - noHorizSteps = 0; int widthCount = 0; int i; - int nx = 0; + int nx = 0; for (i = m_scrollPosX ; i < m_totalCols; i++) { widthCount += m_colWidths[i]; - // A partial bit doesn't count, we still have to scroll to see the - // rest of it + // A partial bit doesn't count, we still have to scroll to see the + // rest of it if (widthCount + m_leftOfSheet + m_verticalLabelWidth > (cw-vertScrollBarWidth)) break; - else - nx ++; - + else + nx ++; } noHorizSteps += nx; } - if (m_totalGridHeight + horizScrollBarHeight <= ch) - noVertSteps = 0; - else + m_viewWidth = noHorizSteps; + + if (m_totalGridHeight + horizScrollBarHeight > ch) { - noVertSteps = 0; int heightCount = 0; int i; - int ny = 0; + int ny = 0; for (i = m_scrollPosY ; i < m_totalRows; i++) { heightCount += m_rowHeights[i]; - // A partial bit doesn't count, we still have to scroll to see the - // rest of it + // A partial bit doesn't count, we still have to scroll to see the + // rest of it if (heightCount + m_topOfSheet + m_horizontalLabelHeight > (ch-horizScrollBarHeight)) break; - else - ny ++; + else + ny ++; } noVertSteps += ny; } + m_viewHeight = noVertSteps; + if (m_totalGridWidth + vertScrollBarWidth <= cw) { - if ( m_hScrollBar ) - m_hScrollBar->Show(FALSE); + if ( m_hScrollBar ) + m_hScrollBar->Show(FALSE); SetScrollPosX(0); } else @@ -1068,7 +1082,7 @@ void wxGenericGrid::AdjustScrollbars(void) void wxGenericGrid::OnSize(wxSizeEvent& WXUNUSED(event) ) { if (!m_vScrollBar || !m_hScrollBar) - return; + return; AdjustScrollbars(); @@ -1350,7 +1364,7 @@ void wxGenericGrid::OnMouseEvent(wxMouseEvent& ev) SetCursor(*wxSTANDARD_CURSOR); int cw, ch; GetClientSize(&cw, &ch); - wxSizeEvent evt; + wxSizeEvent evt; OnSize(evt); break; } @@ -1416,17 +1430,17 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col) { HighlightCell(dc); } - + // Highlight the new cell and copy its content to the edit control SetCurrentRect(m_wCursorRow, m_wCursorColumn); wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn); if (cell) { - if ( cell->GetTextValue().IsNull() ) - m_textItem->SetValue(""); - else - m_textItem->SetValue(cell->GetTextValue()); + if ( cell->GetTextValue().IsNull() ) + m_textItem->SetValue(""); + else + m_textItem->SetValue(cell->GetTextValue()); } SetGridClippingRegion(dc); @@ -1434,30 +1448,52 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col) if ( m_editable && m_editInPlace ) { - m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2, - m_currentRect.width+4, m_currentRect.height+4 ); + int x, y, width, height; + if ( m_currentRect.x <= 0 ) + { + x = 0; + width = m_currentRect.width + 2; + } + else + { + x = m_currentRect.x - 2; + width = m_currentRect.width + 4; + } + + if ( m_currentRect.y <= 0 ) + { + y = 0; + height = m_currentRect.height + 2; + } + else + { + y = m_currentRect.y - 2; + height = m_currentRect.height + 4; + } + + m_inPlaceTextItem->SetSize( x, y, width, height ); if ( cell ) - { - if ( cell->GetTextValue().IsNull() ) - { - m_inPlaceTextItem->SetValue( "" ); - } - else - { - m_inPlaceTextItem->SetFont( cell->GetFont() ); - m_inPlaceTextItem->SetValue( cell->GetTextValue() ); - } - } - + { + if ( cell->GetTextValue().IsNull() ) + { + m_inPlaceTextItem->SetValue( "" ); + } + else + { + m_inPlaceTextItem->SetFont( cell->GetFont() ); + m_inPlaceTextItem->SetValue( cell->GetTextValue() ); + } + } + m_inPlaceTextItem->Show(TRUE); m_inPlaceTextItem->SetFocus(); } else - { + { // 1) Why isn't this needed for Windows?? // Probably because of the SetValue?? JS. - // 2) Arrrrrgh. This isn't needed anywhere, + // 2) Arrrrrgh. This isn't needed anywhere, // of course. One hour of debugging... RR. // // 3) It *is* needed for Motif - michael @@ -1472,15 +1508,15 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col) OnSelectCell(row, col); wxGridEvent g_evt2(GetId(), wxEVT_GRID_SELECT_CELL, this, row, col); - GetEventHandler()->ProcessEvent(g_evt2); + GetEventHandler()->ProcessEvent(g_evt2); } -wxGridCell *wxGenericGrid::OnCreateCell(void) +wxGridCell *wxGenericGrid::OnCreateCell() { return new wxGridCell(this); } -void wxGenericGrid::OnChangeLabels(void) +void wxGenericGrid::OnChangeLabels() { char buf[100]; int i; @@ -1506,7 +1542,7 @@ void wxGenericGrid::OnChangeLabels(void) } } -void wxGenericGrid::OnChangeSelectionLabel(void) +void wxGenericGrid::OnChangeSelectionLabel() { if (!GetEditable()) return; @@ -1529,27 +1565,27 @@ void wxGenericGrid::HighlightCell(wxDC *dc) dc->DrawLine( m_currentRect.x + 1, m_currentRect.y + 1, m_currentRect.x + m_currentRect.width - 1, - m_currentRect.y + 1); + m_currentRect.y + 1); // Right dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, m_currentRect.y + 1, m_currentRect.x + m_currentRect.width - 1, - m_currentRect.y +m_currentRect.height - 1 ); + m_currentRect.y +m_currentRect.height - 1 ); // Bottom dc->DrawLine( m_currentRect.x + m_currentRect.width - 1, m_currentRect.y + m_currentRect.height - 1, m_currentRect.x + 1, - m_currentRect.y + m_currentRect.height - 1); + m_currentRect.y + m_currentRect.height - 1); // Left dc->DrawLine( m_currentRect.x + 1, m_currentRect.y + m_currentRect.height - 1, - m_currentRect.x + 1, - m_currentRect.y + 1); + m_currentRect.x + 1, + m_currentRect.y + 1); dc->SetLogicalFunction(wxCOPY); } -void wxGenericGrid::DrawCellText(void) +void wxGenericGrid::DrawCellText() { if (!m_currentRectVisible) return; @@ -2011,8 +2047,8 @@ void wxGenericGrid::SetEditable(bool edit) if (m_inPlaceTextItem) { - m_inPlaceTextItem->Show(TRUE); - m_inPlaceTextItem->SetFocus(); + m_inPlaceTextItem->Show(TRUE); + m_inPlaceTextItem->SetFocus(); } } else @@ -2023,10 +2059,10 @@ void wxGenericGrid::SetEditable(bool edit) m_textItem->Show(FALSE); m_editingPanel->Show(FALSE); } - + if ( m_inPlaceTextItem ) { - m_inPlaceTextItem->Show(FALSE); + m_inPlaceTextItem->Show(FALSE); } } UpdateDimensions(); @@ -2053,37 +2089,37 @@ void wxGenericGrid::SetEditInPlace(bool edit) if ( m_editInPlace != edit ) { m_editInPlace = edit; - + if ( m_editInPlace ) // switched on - { - if ( m_currentRectVisible && m_editable ) - { - m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2, - m_currentRect.width+4, m_currentRect.height+4 ); - - wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn); - - if ( cell ) - { - if ( cell->GetTextValue().IsNull() ) - { - m_inPlaceTextItem->SetValue( "" ); - } - else - { - m_inPlaceTextItem->SetFont( cell->GetFont() ); - m_inPlaceTextItem->SetValue( cell->GetTextValue() ); - } - } - - m_inPlaceTextItem->Show( TRUE ); - m_inPlaceTextItem->SetFocus(); - } - } + { + if ( m_currentRectVisible && m_editable ) + { + m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2, + m_currentRect.width+4, m_currentRect.height+4 ); + + wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn); + + if ( cell ) + { + if ( cell->GetTextValue().IsNull() ) + { + m_inPlaceTextItem->SetValue( "" ); + } + else + { + m_inPlaceTextItem->SetFont( cell->GetFont() ); + m_inPlaceTextItem->SetValue( cell->GetTextValue() ); + } + } + + m_inPlaceTextItem->Show( TRUE ); + m_inPlaceTextItem->SetFocus(); + } + } else // switched off - { - m_inPlaceTextItem->Show( FALSE ); - } + { + m_inPlaceTextItem->Show( FALSE ); + } } } @@ -2506,9 +2542,9 @@ void wxGenericGrid::SetGridCursor(int row, int col) dc.EndDrawing(); } -/* - * Grid cell - */ +// ---------------------------------------------------------------------------- +// Grid cell +// ---------------------------------------------------------------------------- wxGridCell::wxGridCell(wxGenericGrid *window) { @@ -2535,9 +2571,11 @@ wxGridCell::wxGridCell(wxGenericGrid *window) alignment = window->GetCellAlignment(); else alignment = wxLEFT; + + cellData = (void *)NULL; } -wxGridCell::~wxGridCell(void) +wxGridCell::~wxGridCell() { } @@ -2558,30 +2596,49 @@ void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) ) wxGenericGrid *grid = this; wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn()); if (cell && grid->CurrentCellVisible()) - { - cell->SetTextValue(grid->GetTextItem()->GetValue()); - if ( m_editInPlace && !m_inOnTextInPlace ) - { - m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() ); - } - - wxClientDC dc(grid); - - dc.BeginDrawing(); - grid->SetGridClippingRegion(& dc); - grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); - grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); - if ( !(m_editable && m_editInPlace ) ) grid->HighlightCell(& dc); - dc.DestroyClippingRegion(); - dc.EndDrawing(); - - //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn()); - wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid, - grid->GetCursorRow(), grid->GetCursorColumn()); - GetEventHandler()->ProcessEvent(g_evt); - - // grid->DrawCellText(); - } + { + cell->SetTextValue(grid->GetTextItem()->GetValue()); + if ( m_editInPlace && !m_inOnTextInPlace ) + { + m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() ); + } + + wxClientDC dc(grid); + + dc.BeginDrawing(); + grid->SetGridClippingRegion(& dc); + grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); + grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn()); + if ( !(m_editable && m_editInPlace ) ) grid->HighlightCell(& dc); + dc.DestroyClippingRegion(); + dc.EndDrawing(); + + //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn()); + wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid, + grid->GetCursorRow(), grid->GetCursorColumn()); + GetEventHandler()->ProcessEvent(g_evt); + + // grid->DrawCellText(); + } + } +} + +void wxGenericGrid::OnTextEnter(wxCommandEvent& WXUNUSED(ev) ) +{ + // move the cursor down the current row (if possible) + // when the enter key has been pressed + // + if ( m_editable ) + { + if ( GetCursorRow() < GetRows()-1 ) + { + wxClientDC dc( this ); + dc.BeginDrawing(); + OnSelectCellImplementation(& dc, + GetCursorRow()+1, + GetCursorColumn() ); + dc.EndDrawing(); + } } } @@ -2592,12 +2649,31 @@ void wxGenericGrid::OnTextInPlace(wxCommandEvent& ev ) wxGenericGrid *grid = this; wxGridCell *cell = grid->GetCell(grid->GetCursorRow(), grid->GetCursorColumn()); if (cell && grid->CurrentCellVisible()) - { - m_inOnTextInPlace = TRUE; - grid->GetTextItem()->SetValue( m_inPlaceTextItem->GetValue() ); - OnText( ev ); - m_inOnTextInPlace = FALSE; - } + { + m_inOnTextInPlace = TRUE; + grid->GetTextItem()->SetValue( m_inPlaceTextItem->GetValue() ); + OnText( ev ); + m_inOnTextInPlace = FALSE; + } + } +} + +void wxGenericGrid::OnTextInPlaceEnter(wxCommandEvent& WXUNUSED(ev) ) +{ + // move the cursor down the current row (if possible) + // when the enter key has been pressed + // + if ( m_editable ) + { + if ( GetCursorRow() < GetRows()-1 ) + { + wxClientDC dc( this ); + dc.BeginDrawing(); + OnSelectCellImplementation(& dc, + GetCursorRow()+1, + GetCursorColumn() ); + dc.EndDrawing(); + } } } @@ -2606,7 +2682,7 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) static bool inScroll = FALSE; if ( inScroll ) - return; + return; if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE); @@ -2639,10 +2715,10 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev) if ( m_editInPlace && m_currentRectVisible ) { - m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2, - m_currentRect.width+4, m_currentRect.height+4 ); + m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2, + m_currentRect.width+4, m_currentRect.height+4 ); m_inPlaceTextItem->Show( TRUE ); - m_inPlaceTextItem->SetFocus(); + m_inPlaceTextItem->SetFocus(); } inScroll = FALSE; @@ -2699,4 +2775,25 @@ void wxGenericGrid::_OnLabelRightClick(wxGridEvent& ev) OnLabelRightClick(ev.m_row, ev.m_col, ev.m_x, ev.m_y, ev.m_control, ev.m_shift); } +void *wxGenericGrid::SetCellData(void *data, int row, int col) +{ + void *rc = NULL; + + wxGridCell *cell = GetCell(row, col); + if ( cell ) + rc = cell->SetCellData(data); + + return rc; +} + +void *wxGenericGrid::GetCellData(int row, int col) +{ + void *rc = NULL; + + wxGridCell *cell = GetCell(row, col); + if ( cell ) + rc = cell->GetCellData(); + + return rc; +}