X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/283b7808d81dcf4cf97b268ec914796c0e206732..b51b78a9c7b50053cdcf4a22d2222500a20eb8ee:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 9201252056..6f7e9dbe17 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -39,6 +39,8 @@ #include "wx/dcclient.h" #include "wx/settings.h" #include "wx/log.h" + #include "wx/textctrl.h" + #include "wx/checkbox.h" #endif // this include needs to be outside precomp for BCC @@ -274,7 +276,6 @@ static const size_t GRID_SCROLL_LINE = 10; // implementation // ============================================================================ - // ---------------------------------------------------------------------------- // wxGridCellEditor // ---------------------------------------------------------------------------- @@ -290,10 +291,18 @@ wxGridCellEditor::~wxGridCellEditor() Destroy(); } +void wxGridCellEditor::Create(wxWindow* WXUNUSED(parent), + wxWindowID WXUNUSED(id), + wxEvtHandler* evtHandler) +{ + if (evtHandler) + m_control->PushEventHandler(evtHandler); +} void wxGridCellEditor::Destroy() { - if (m_control) { + if (m_control) + { m_control->Destroy(); m_control = NULL; } @@ -370,9 +379,16 @@ void wxGridCellEditor::HandleReturn(wxKeyEvent& event) void wxGridCellEditor::StartingKey(wxKeyEvent& event) { -} + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be Created first!")); + // pass the event to the control + m_control->GetEventHandler()->ProcessEvent(event); +} +// ---------------------------------------------------------------------------- +// wxGridCellTextEditor +// ---------------------------------------------------------------------------- wxGridCellTextEditor::wxGridCellTextEditor() { @@ -382,15 +398,14 @@ void wxGridCellTextEditor::Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler) { - m_control = new wxTextCtrl(parent, -1, "", + m_control = new wxTextCtrl(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize #if defined(__WXMSW__) , wxTE_MULTILINE | wxTE_NO_VSCROLL // necessary ??? #endif - ); + ); - if (evtHandler) - m_control->PushEventHandler(evtHandler); + wxGridCellEditor::Create(parent, id, evtHandler); } @@ -400,13 +415,12 @@ void wxGridCellTextEditor::BeginEdit(int row, int col, wxGrid* grid) wxT("The wxGridCellEditor must be Created first!")); m_startValue = grid->GetTable()->GetValue(row, col); - ((wxTextCtrl*)m_control)->SetValue(m_startValue); - ((wxTextCtrl*)m_control)->SetInsertionPointEnd(); - ((wxTextCtrl*)m_control)->SetFocus(); + Text()->SetValue(m_startValue); + Text()->SetInsertionPointEnd(); + Text()->SetFocus(); } - bool wxGridCellTextEditor::EndEdit(int row, int col, bool saveValue, wxGrid* grid) { @@ -414,7 +428,7 @@ bool wxGridCellTextEditor::EndEdit(int row, int col, bool saveValue, wxT("The wxGridCellEditor must be Created first!")); bool changed = FALSE; - wxString value = ((wxTextCtrl*)m_control)->GetValue(); + wxString value = Text()->GetValue(); if (value != m_startValue) changed = TRUE; @@ -422,7 +436,7 @@ bool wxGridCellTextEditor::EndEdit(int row, int col, bool saveValue, grid->GetTable()->SetValue(row, col, value); m_startValue = wxEmptyString; - ((wxTextCtrl*)m_control)->SetValue(m_startValue); + Text()->SetValue(m_startValue); return changed; } @@ -433,35 +447,43 @@ void wxGridCellTextEditor::Reset() wxASSERT_MSG(m_control, wxT("The wxGridCellEditor must be Created first!")); - ((wxTextCtrl*)m_control)->SetValue(m_startValue); - ((wxTextCtrl*)m_control)->SetInsertionPointEnd(); + Text()->SetValue(m_startValue); + Text()->SetInsertionPointEnd(); } - void wxGridCellTextEditor::StartingKey(wxKeyEvent& event) { - wxASSERT_MSG(m_control, - wxT("The wxGridCellEditor must be Created first!")); + if ( !event.AltDown() && !event.MetaDown() && !event.ControlDown() ) + { + // insert the key in the control + long keycode = event.KeyCode(); + if ( isprint(keycode) ) + { + // FIXME this is not going to work for non letters... + if ( !event.ShiftDown() ) + { + keycode = tolower(keycode); + } + + Text()->AppendText((wxChar)keycode); + + return; + } - int code = event.KeyCode(); - if (code >= 32 && code < 255) { - wxString st((char)code); - if (! event.ShiftDown()) - st.LowerCase(); - ((wxTextCtrl*)m_control)->AppendText(st); } -} + event.Skip(); +} void wxGridCellTextEditor::HandleReturn(wxKeyEvent& event) { #if defined(__WXMOTIF__) || defined(__WXGTK__) // wxMotif needs a little extra help... - int pos = ((wxTextCtrl*)m_control)->GetInsertionPoint(); - wxString s( ((wxTextCtrl*)m_control)->GetValue() ); + int pos = Text()->GetInsertionPoint(); + wxString s( Text()->GetValue() ); s = s.Left(pos) + "\n" + s.Mid(pos); - ((wxTextCtrl*)m_control)->SetValue(s); - ((wxTextCtrl*)m_control)->SetInsertionPoint( pos ); + Text()->SetValue(s); + Text()->SetInsertionPoint( pos ); #else // the other ports can handle a Return key press // @@ -469,6 +491,107 @@ void wxGridCellTextEditor::HandleReturn(wxKeyEvent& event) #endif } +// ---------------------------------------------------------------------------- +// wxGridCellBoolEditor +// ---------------------------------------------------------------------------- + +void wxGridCellBoolEditor::Create(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler) +{ + m_control = new wxCheckBox(parent, id, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + wxNO_BORDER); + + wxGridCellEditor::Create(parent, id, evtHandler); +} + +void wxGridCellBoolEditor::SetSize(const wxRect& r) +{ + m_rectCell = r; + // position it in the centre of the rectangle (TODO: support alignment?) + wxCoord w, h; + m_control->GetSize(&w, &h); + + // the checkbox without label still has some space to the right in wxGTK, + // so shift it to the right +#ifdef __WXGTK__ + w += 8; +#endif // GTK + + m_control->Move(r.x + r.width/2 - w/2, r.y + r.height/2 - h/2); +} + +void wxGridCellBoolEditor::Show(bool show, wxGridCellAttr *attr) +{ + wxGridCellEditor::Show(show, attr); + if ( !show ) + return; + + // get the bg colour to use + wxColour colBg = attr ? attr->GetBackgroundColour() : *wxLIGHT_GREY; + + // erase the background because we don't fill the cell + if ( m_rectCell.width > 0 ) + { + wxClientDC dc(m_control->GetParent()); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(colBg, wxSOLID)); + dc.DrawRectangle(m_rectCell); + + m_rectCell.width = 0; + } + + CBox()->SetBackgroundColour(colBg); +} + +void wxGridCellBoolEditor::BeginEdit(int row, int col, wxGrid* grid) +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be Created first!")); + + m_startValue = !!grid->GetTable()->GetValue(row, col); // FIXME-DATA + CBox()->SetValue(m_startValue); + CBox()->SetFocus(); +} + +bool wxGridCellBoolEditor::EndEdit(int row, int col, + bool saveValue, + wxGrid* grid) +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be Created first!")); + + bool changed = FALSE; + bool value = CBox()->GetValue(); + if ( value != m_startValue ) + changed = TRUE; + + if ( changed ) + { + // FIXME-DATA + grid->GetTable()->SetValue(row, col, value ? _T("1") : wxEmptyString); + } + + return changed; +} + +void wxGridCellBoolEditor::Reset() +{ + wxASSERT_MSG(m_control, + wxT("The wxGridCellEditor must be Created first!")); + + CBox()->SetValue(m_startValue); +} + +void wxGridCellBoolEditor::StartingKey(wxKeyEvent& event) +{ + event.Skip(); +} + +// ---------------------------------------------------------------------------- +// wxGridCellEditorEvtHandler +// ---------------------------------------------------------------------------- void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event) { @@ -476,7 +599,7 @@ void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event) { case WXK_ESCAPE: m_editor->Reset(); - m_grid->EnableCellEditControl(FALSE); + m_grid->DisableCellEditControl(); break; case WXK_TAB: @@ -508,6 +631,10 @@ void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event) } } +// ============================================================================ +// renderer classes +// ============================================================================ + // ---------------------------------------------------------------------------- // wxGridCellRenderer // ---------------------------------------------------------------------------- @@ -534,6 +661,10 @@ void wxGridCellRenderer::Draw(wxGrid& grid, dc.DrawRectangle(rect); } +// ---------------------------------------------------------------------------- +// wxGridCellStringRenderer +// ---------------------------------------------------------------------------- + void wxGridCellStringRenderer::Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, @@ -573,6 +704,40 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid, rect, hAlign, vAlign); } +// ---------------------------------------------------------------------------- +// wxGridCellBoolRenderer +// ---------------------------------------------------------------------------- + +void wxGridCellBoolRenderer::Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected) +{ + wxGridCellRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); + + // position it in the centre (ignoring alignment - TODO) + static const wxCoord checkSize = 16; + + wxRect rectMark; + rectMark.x = rect.x + rect.width/2 - checkSize/2; + rectMark.y = rect.y + rect.height/2 - checkSize/2; + rectMark.width = rectMark.height = checkSize; + + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.SetPen(wxPen(attr.GetTextColour(), 1, wxSOLID)); + dc.DrawRectangle(rectMark); + + rectMark.Inflate(-4); + + if ( !!grid.GetTable()->GetValue(row, col) ) // FIXME-DATA + { + dc.SetTextForeground(attr.GetTextColour()); + dc.DrawCheckMark(rectMark); + } +} + // ---------------------------------------------------------------------------- // wxGridCellAttr // ---------------------------------------------------------------------------- @@ -580,10 +745,15 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid, const wxColour& wxGridCellAttr::GetTextColour() const { if (HasTextColour()) + { return m_colText; + } else if (m_defGridAttr != this) + { return m_defGridAttr->GetTextColour(); - else { + } + else + { wxFAIL_MSG(wxT("Missing default cell attribute")); return wxNullColour; } @@ -596,7 +766,8 @@ const wxColour& wxGridCellAttr::GetBackgroundColour() const return m_colBack; else if (m_defGridAttr != this) return m_defGridAttr->GetBackgroundColour(); - else { + else + { wxFAIL_MSG(wxT("Missing default cell attribute")); return wxNullColour; } @@ -609,7 +780,8 @@ const wxFont& wxGridCellAttr::GetFont() const return m_font; else if (m_defGridAttr != this) return m_defGridAttr->GetFont(); - else { + else + { wxFAIL_MSG(wxT("Missing default cell attribute")); return wxNullFont; } @@ -618,13 +790,15 @@ const wxFont& wxGridCellAttr::GetFont() const void wxGridCellAttr::GetAlignment(int *hAlign, int *vAlign) const { - if (HasAlignment()) { + if (HasAlignment()) + { if ( hAlign ) *hAlign = m_hAlign; if ( vAlign ) *vAlign = m_vAlign; } else if (m_defGridAttr != this) m_defGridAttr->GetAlignment(hAlign, vAlign); - else { + else + { wxFAIL_MSG(wxT("Missing default cell attribute")); } } @@ -636,7 +810,8 @@ wxGridCellRenderer* wxGridCellAttr::GetRenderer() const return m_renderer; else if (m_defGridAttr != this) return m_defGridAttr->GetRenderer(); - else { + else + { wxFAIL_MSG(wxT("Missing default cell attribute")); return NULL; } @@ -648,7 +823,8 @@ wxGridCellEditor* wxGridCellAttr::GetEditor() const return m_editor; else if (m_defGridAttr != this) return m_defGridAttr->GetEditor(); - else { + else + { wxFAIL_MSG(wxT("Missing default cell attribute")); return NULL; } @@ -2476,7 +2652,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) { row = YToRow(y); if ( row >= 0 && - !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) ) + !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) ) { SelectRow( row, event.ShiftDown() ); ChangeCursorMode(WXGRID_CURSOR_SELECT_ROW, m_rowLabelWin); @@ -2498,7 +2674,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) if ( YToEdgeOfRow(y) < 0 ) { row = YToRow(y); - SendEvent( EVT_GRID_LABEL_LEFT_DCLICK, row, -1, event ); + SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, row, -1, event ); } } @@ -2514,7 +2690,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) // Note: we are ending the event *after* doing // default processing in this case // - SendEvent( EVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); + SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); } ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_rowLabelWin); @@ -2527,7 +2703,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDown() ) { row = YToRow(y); - if ( !SendEvent( EVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) ) + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, row, -1, event ) ) { // no default action at the moment } @@ -2539,7 +2715,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDClick() ) { row = YToRow(y); - if ( !SendEvent( EVT_GRID_LABEL_RIGHT_DCLICK, row, -1, event ) ) + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, row, -1, event ) ) { // no default action at the moment } @@ -2642,7 +2818,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) { col = XToCol(x); if ( col >= 0 && - !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) ) + !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) ) { SelectCol( col, event.ShiftDown() ); ChangeCursorMode(WXGRID_CURSOR_SELECT_COL, m_colLabelWin); @@ -2664,7 +2840,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) if ( XToEdgeOfCol(x) < 0 ) { col = XToCol(x); - SendEvent( EVT_GRID_LABEL_LEFT_DCLICK, -1, col, event ); + SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, col, event ); } } @@ -2680,7 +2856,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) // Note: we are ending the event *after* doing // default processing in this case // - SendEvent( EVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event ); + SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event ); } ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_colLabelWin); @@ -2693,7 +2869,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDown() ) { col = XToCol(x); - if ( !SendEvent( EVT_GRID_LABEL_RIGHT_CLICK, -1, col, event ) ) + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, col, event ) ) { // no default action at the moment } @@ -2705,7 +2881,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDClick() ) { col = XToCol(x); - if ( !SendEvent( EVT_GRID_LABEL_RIGHT_DCLICK, -1, col, event ) ) + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, col, event ) ) { // no default action at the moment } @@ -2740,7 +2916,7 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event ) // indicate corner label by having both row and // col args == -1 // - if ( !SendEvent( EVT_GRID_LABEL_LEFT_CLICK, -1, -1, event ) ) + if ( !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, -1, event ) ) { SelectAll(); } @@ -2748,12 +2924,12 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event ) else if ( event.LeftDClick() ) { - SendEvent( EVT_GRID_LABEL_LEFT_DCLICK, -1, -1, event ); + SendEvent( wxEVT_GRID_LABEL_LEFT_DCLICK, -1, -1, event ); } else if ( event.RightDown() ) { - if ( !SendEvent( EVT_GRID_LABEL_RIGHT_CLICK, -1, -1, event ) ) + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_CLICK, -1, -1, event ) ) { // no default action at the moment } @@ -2761,7 +2937,7 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event ) else if ( event.RightDClick() ) { - if ( !SendEvent( EVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, event ) ) + if ( !SendEvent( wxEVT_GRID_LABEL_RIGHT_DCLICK, -1, -1, event ) ) { // no default action at the moment } @@ -2847,8 +3023,10 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // Don't start doing anything until the mouse has been drug at // least 3 pixels in any direction... - if (! m_isDragging) { - if (m_startDragPos == wxDefaultPosition) { + if (! m_isDragging) + { + if (m_startDragPos == wxDefaultPosition) + { m_startDragPos = pos; return; } @@ -2865,7 +3043,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) HideCellEditControl(); // Have we captured the mouse yet? - if (! m_winCapture) { + if (! m_winCapture) + { m_winCapture = m_gridWin; m_winCapture->CaptureMouse(); } @@ -2881,7 +3060,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) SelectBlock( m_currentCellCoords, coords ); } - if (! IsVisible(coords)) { + if (! IsVisible(coords)) + { MakeCellVisible(coords); // TODO: need to introduce a delay or something here. The // scrolling is way to fast, at least on MSW. @@ -2953,7 +3133,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // if ( event.LeftDown() ) { - EnableCellEditControl( FALSE ); + DisableCellEditControl(); if ( event.ShiftDown() ) { SelectBlock( m_currentCellCoords, coords ); @@ -2961,7 +3141,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) else if ( XToEdgeOfCol(x) < 0 && YToEdgeOfRow(y) < 0 ) { - if ( !SendEvent( EVT_GRID_CELL_LEFT_CLICK, + if ( !SendEvent( wxEVT_GRID_CELL_LEFT_CLICK, coords.GetRow(), coords.GetCol(), event ) ) @@ -2970,14 +3150,15 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // if this is the second click on this cell then start // the edit control - if (m_waitForSlowClick && coords == m_currentCellCoords) { - EnableCellEditControl(TRUE); - // VZ: this is done by the call above, so why do it - // again? please remove this line if it's ok - //ShowCellEditControl(); + if ( m_waitForSlowClick && + (coords == m_currentCellCoords) && + CanEnableCellControl()) + { + EnableCellEditControl(); m_waitForSlowClick = FALSE; } - else { + else + { SetCurrentCell( coords ); m_waitForSlowClick = TRUE; } @@ -2990,10 +3171,10 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // else if ( event.LeftDClick() ) { - EnableCellEditControl( FALSE ); + DisableCellEditControl(); if ( XToEdgeOfCol(x) < 0 && YToEdgeOfRow(y) < 0 ) { - SendEvent( EVT_GRID_CELL_LEFT_DCLICK, + SendEvent( wxEVT_GRID_CELL_LEFT_DCLICK, coords.GetRow(), coords.GetCol(), event ); @@ -3009,11 +3190,12 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) { if ( IsSelection() ) { - if (m_winCapture) { + if (m_winCapture) + { m_winCapture->ReleaseMouse(); m_winCapture = NULL; } - SendEvent( EVT_GRID_RANGE_SELECT, -1, -1, event ); + SendEvent( wxEVT_GRID_RANGE_SELECT, -1, -1, event ); } // Show the edit control, if it has been hidden for @@ -3028,7 +3210,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // Note: we are ending the event *after* doing // default processing in this case // - SendEvent( EVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); + SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); } else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL ) { @@ -3038,7 +3220,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // Note: we are ending the event *after* doing // default processing in this case // - SendEvent( EVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event ); + SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event ); } m_dragLastPos = -1; @@ -3049,8 +3231,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // else if ( event.RightDown() ) { - EnableCellEditControl( FALSE ); - if ( !SendEvent( EVT_GRID_CELL_RIGHT_CLICK, + DisableCellEditControl(); + if ( !SendEvent( wxEVT_GRID_CELL_RIGHT_CLICK, coords.GetRow(), coords.GetCol(), event ) ) @@ -3064,8 +3246,8 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // else if ( event.RightDClick() ) { - EnableCellEditControl( FALSE ); - if ( !SendEvent( EVT_GRID_CELL_RIGHT_DCLICK, + DisableCellEditControl(); + if ( !SendEvent( wxEVT_GRID_CELL_RIGHT_DCLICK, coords.GetRow(), coords.GetCol(), event ) ) @@ -3259,7 +3441,7 @@ bool wxGrid::InsertRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) if ( m_table ) { if (IsCellEditControlEnabled()) - EnableCellEditControl(FALSE); + DisableCellEditControl(); bool ok = m_table->InsertRows( pos, numRows ); @@ -3346,7 +3528,7 @@ bool wxGrid::DeleteRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) if ( m_table ) { if (IsCellEditControlEnabled()) - EnableCellEditControl(FALSE); + DisableCellEditControl(); if (m_table->DeleteRows( pos, numRows )) { @@ -3376,7 +3558,7 @@ bool wxGrid::InsertCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) if ( m_table ) { if (IsCellEditControlEnabled()) - EnableCellEditControl(FALSE); + DisableCellEditControl(); bool ok = m_table->InsertCols( pos, numCols ); @@ -3454,7 +3636,7 @@ bool wxGrid::DeleteCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) if ( m_table ) { if (IsCellEditControlEnabled()) - EnableCellEditControl(FALSE); + DisableCellEditControl(); if ( m_table->DeleteCols( pos, numCols ) ) { @@ -3482,8 +3664,7 @@ bool wxGrid::SendEvent( const wxEventType type, int row, int col, wxMouseEvent& mouseEv ) { - if ( type == EVT_GRID_ROW_SIZE || - type == EVT_GRID_COL_SIZE ) + if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE ) { int rowOrCol = (row == -1 ? col : row); @@ -3499,7 +3680,7 @@ bool wxGrid::SendEvent( const wxEventType type, return GetEventHandler()->ProcessEvent(gridEvt); } - else if ( type == EVT_GRID_RANGE_SELECT ) + else if ( type == wxEVT_GRID_RANGE_SELECT ) { wxGridRangeSelectEvent gridEvt( GetId(), type, @@ -3536,8 +3717,7 @@ bool wxGrid::SendEvent( const wxEventType type, bool wxGrid::SendEvent( const wxEventType type, int row, int col ) { - if ( type == EVT_GRID_ROW_SIZE || - type == EVT_GRID_COL_SIZE ) + if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE ) { int rowOrCol = (row == -1 ? col : row); @@ -3729,9 +3909,9 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) default: // now try the cell edit control // - if ( !IsCellEditControlEnabled() ) - EnableCellEditControl( TRUE ); - if (IsCellEditControlEnabled()) { + if ( !IsCellEditControlEnabled() && CanEnableCellControl() ) + { + EnableCellEditControl(); wxGridCellAttr* attr = GetCellAttr(m_currentCellCoords); attr->GetEditor()->StartingKey(event); attr->DecRef(); @@ -3745,14 +3925,12 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) void wxGrid::OnEraseBackground(wxEraseEvent&) -{ } - - - +{ +} void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) { - if ( SendEvent( EVT_GRID_SELECT_CELL, coords.GetRow(), coords.GetCol() ) ) + if ( SendEvent( wxEVT_GRID_SELECT_CELL, coords.GetRow(), coords.GetCol() ) ) { // the event has been intercepted - do nothing return; @@ -3763,7 +3941,7 @@ void wxGrid::SetCurrentCell( const wxGridCellCoords& coords ) { HideCellEditControl(); SaveEditControlValue(); - EnableCellEditControl(FALSE); + DisableCellEditControl(); // Clear the old current cell highlight wxRect r = BlockToDeviceRect(m_currentCellCoords, m_currentCellCoords); @@ -3869,6 +4047,10 @@ void wxGrid::DrawCell( wxDC& dc, const wxGridCellCoords& coords ) DrawCellBorder( dc, coords ); #endif + // don't draw the cell over the active edit control! + if ( (coords == m_currentCellCoords) && IsCellEditControlEnabled() ) + return; + // but all the rest is drawn by the cell renderer and hence may be // customized wxRect rect; @@ -3973,7 +4155,8 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & reg ) int top, bottom, left, right; - if (reg.IsEmpty()){ + if (reg.IsEmpty()) + { int cw, ch; m_gridWin->GetClientSize(&cw, &ch); @@ -3982,7 +4165,8 @@ void wxGrid::DrawAllGridLines( wxDC& dc, const wxRegion & reg ) CalcUnscrolledPosition( 0, 0, &left, &top ); CalcUnscrolledPosition( cw, ch, &right, &bottom ); } - else{ + else + { wxCoord x, y, w, h; reg.GetBox(x, y, w, h); CalcUnscrolledPosition( x, y, &left, &top ); @@ -4255,6 +4439,9 @@ void wxGrid::EnableEditing( bool edit ) { m_editable = edit; + // FIXME IMHO this won't disable the edit control if edit == FALSE + // because of the check in the beginning of + // EnableCellEditControl() just below (VZ) EnableCellEditControl(m_editable); } } @@ -4270,9 +4457,18 @@ void wxGrid::EnableCellEditControl( bool enable ) if ( enable != m_cellEditCtrlEnabled ) { + // TODO allow the app to Veto() this event? + SendEvent(enable ? wxEVT_GRID_EDITOR_SHOWN : wxEVT_GRID_EDITOR_HIDDEN); + if ( enable ) { + // this should be checked by the caller! + wxASSERT_MSG( CanEnableCellControl(), + _T("can't enable editing for this cell!") ); + + // do it before ShowCellEditControl() m_cellEditCtrlEnabled = enable; + SetEditControlValue(); ShowCellEditControl(); } @@ -4280,28 +4476,38 @@ void wxGrid::EnableCellEditControl( bool enable ) { HideCellEditControl(); SaveEditControlValue(); + + // do it after HideCellEditControl() m_cellEditCtrlEnabled = enable; } } } +bool wxGrid::IsCurrentCellReadOnly() const +{ + // const_cast + wxGridCellAttr* attr = ((wxGrid *)this)->GetCellAttr(m_currentCellCoords); + bool readonly = attr->IsReadOnly(); + attr->DecRef(); -bool wxGrid::IsCellEditControlEnabled() + return readonly; +} + +bool wxGrid::CanEnableCellControl() const { - bool enabled; + return m_editable && !IsCurrentCellReadOnly(); +} - if ( m_cellEditCtrlEnabled ) - { - wxGridCellAttr* attr = GetCellAttr(m_currentCellCoords); - enabled = !attr->IsReadOnly(); - attr->DecRef(); - } - else - { - enabled = FALSE; - } +bool wxGrid::IsCellEditControlEnabled() const +{ + // the cell edit control might be disable for all cells or just for the + // current one if it's read only + return m_cellEditCtrlEnabled ? !IsCurrentCellReadOnly() : FALSE; +} - return enabled; +wxWindow *wxGrid::GetGridWindow() const +{ + return m_gridWin; } void wxGrid::ShowCellEditControl() @@ -4323,9 +4529,12 @@ void wxGrid::ShowCellEditControl() int left, top, right, bottom; CalcScrolledPosition( rect.GetLeft(), rect.GetTop(), &left, &top ); CalcScrolledPosition( rect.GetRight(), rect.GetBottom(), &right, &bottom ); - left--; top--; right--; bottom--; // cell is shifted by one pixel - int cw, ch; - m_gridWin->GetClientSize( &cw, &ch ); + + // cell is shifted by one pixel + left--; + top--; + right--; + bottom--; // Make the edit control large enough to allow for internal // margins @@ -4370,7 +4579,7 @@ void wxGrid::ShowCellEditControl() rect.SetBottom( rect.GetBottom() + 2*extra ); #endif - wxGridCellAttr* attr = GetCellAttr(row, col); + wxGridCellAttr* attr = GetCellAttr(row, col); wxGridCellEditor* editor = attr->GetEditor(); if ( !editor->IsCreated() ) { @@ -4423,7 +4632,7 @@ void wxGrid::SaveEditControlValue() if (changed) { - SendEvent( EVT_GRID_CELL_CHANGE, + SendEvent( wxEVT_GRID_CELL_CHANGE, m_currentCellCoords.GetRow(), m_currentCellCoords.GetCol() ); } @@ -5485,9 +5694,12 @@ wxGridCellAttr *wxGrid::GetCellAttr(int row, int col) const attr = m_table ? m_table->GetAttr(row, col) : (wxGridCellAttr *)NULL; CacheAttr(row, col, attr); } - if (attr) { + if (attr) + { attr->SetDefAttr(m_defaultCellAttr); - } else { + } + else + { attr = m_defaultCellAttr; attr->IncRef(); } @@ -5797,7 +6009,7 @@ void wxGrid::SelectRow( int row, bool addToSelected ) } wxGridRangeSelectEvent gridEvt( GetId(), - EVT_GRID_RANGE_SELECT, + wxEVT_GRID_RANGE_SELECT, this, m_selectedTopLeft, m_selectedBottomRight ); @@ -5875,7 +6087,7 @@ void wxGrid::SelectCol( int col, bool addToSelected ) } wxGridRangeSelectEvent gridEvt( GetId(), - EVT_GRID_RANGE_SELECT, + wxEVT_GRID_RANGE_SELECT, this, m_selectedTopLeft, m_selectedBottomRight ); @@ -6005,7 +6217,7 @@ void wxGrid::SelectBlock( int topRow, int leftCol, int bottomRow, int rightCol ) if ( !m_isDragging ) { wxGridRangeSelectEvent gridEvt( GetId(), - EVT_GRID_RANGE_SELECT, + wxEVT_GRID_RANGE_SELECT, this, m_selectedTopLeft, m_selectedBottomRight );