X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/140954fd9cb214e81469aea705f0dda801369e49..312f1e6e371f72910501aad1e270e04756d613ec:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 26b0750fc4..e8c4009b95 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "grid.h" -#endif - // For compilers that support precompilatixon, includes "wx/wx.h". #include "wx/wxprec.h" @@ -42,6 +38,7 @@ #include "wx/combobox.h" #include "wx/valtext.h" #include "wx/intl.h" + #include "wx/math.h" #endif #include "wx/textfile.h" @@ -242,7 +239,8 @@ class wxGridCellEditorEvtHandler : public wxEvtHandler public: wxGridCellEditorEvtHandler(wxGrid* grid, wxGridCellEditor* editor) : m_grid(grid), - m_editor(editor) + m_editor(editor), + m_inSetFocus(false) { } @@ -250,10 +248,16 @@ public: void OnKeyDown(wxKeyEvent& event); void OnChar(wxKeyEvent& event); + void SetInSetFocus(bool inSetFocus) { m_inSetFocus = inSetFocus; } + private: wxGrid* m_grid; wxGridCellEditor* m_editor; + // Work around the fact that a focus kill event can be sent to + // a combobox within a set focus event. + bool m_inSetFocus; + DECLARE_EVENT_TABLE() DECLARE_DYNAMIC_CLASS(wxGridCellEditorEvtHandler) DECLARE_NO_COPY_CLASS(wxGridCellEditorEvtHandler) @@ -571,7 +575,7 @@ bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event) // through in that case. if ((ctrl || alt) && !(ctrl && alt)) return false; - + #if wxUSE_UNICODE int key = event.GetUnicodeKey(); bool keyOk = true; @@ -588,7 +592,7 @@ bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event) return keyOk; #else // !wxUSE_UNICODE int key = event.GetKeyCode(); - if (key <= 255) + if (key <= 255) return true; return false; #endif // wxUSE_UNICODE/!wxUSE_UNICODE @@ -752,7 +756,7 @@ void wxGridCellTextEditor::StartingKey(wxKeyEvent& event) wxTextCtrl* tc = Text(); wxChar ch; long pos; - + #if wxUSE_UNICODE ch = event.GetUnicodeKey(); if (ch <= 127) @@ -1082,7 +1086,8 @@ bool wxGridCellFloatEditor::EndEdit(int row, int col, double value = 0.0; wxString text(Text()->GetValue()); - if ( (text.empty() || text.ToDouble(&value)) && (value != m_valueOld) ) + if ( (text.empty() || text.ToDouble(&value)) && + !wxIsSameDouble(value, m_valueOld) ) { if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT)) grid->GetTable()->SetValueAsDouble(row, col, value); @@ -1106,7 +1111,7 @@ void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event) tmpbuf[0] = (char) keycode; tmpbuf[1] = '\0'; wxString strbuf(tmpbuf, *wxConvCurrent); -#if wxUSE_INTL +#if wxUSE_INTL bool is_decimal_point = ( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) ); #else @@ -1184,14 +1189,14 @@ bool wxGridCellFloatEditor::IsAcceptedKey(wxKeyEvent& event) tmpbuf[0] = (char) keycode; tmpbuf[1] = '\0'; wxString strbuf(tmpbuf, *wxConvCurrent); -#if wxUSE_INTL +#if wxUSE_INTL bool is_decimal_point = ( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) ); #else bool is_decimal_point = ( strbuf == _T(".") ); #endif - if ( (keycode < 128) && + if ( (keycode < 128) && (wxIsdigit(keycode) || tolower(keycode) == 'e' || is_decimal_point || keycode == '+' || keycode == '-') ) return true; @@ -1375,11 +1380,11 @@ void wxGridCellBoolEditor::StartingKey(wxKeyEvent& event) case WXK_SPACE: CBox()->SetValue(!CBox()->GetValue()); break; - + case '+': CBox()->SetValue(true); break; - + case '-': CBox()->SetValue(false); break; @@ -1460,6 +1465,14 @@ void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid) wxASSERT_MSG(m_control, wxT("The wxGridCellEditor must be Created first!")); + wxGridCellEditorEvtHandler* evtHandler = NULL; + if (m_control) + evtHandler = wxDynamicCast(m_control->GetEventHandler(), wxGridCellEditorEvtHandler); + + // Don't immediately end if we get a kill focus event within BeginEdit + if (evtHandler) + evtHandler->SetInSetFocus(true); + m_startValue = grid->GetTable()->GetValue(row, col); if (m_allowOthers) @@ -1468,12 +1481,15 @@ void wxGridCellChoiceEditor::BeginEdit(int row, int col, wxGrid* grid) { // find the right position, or default to the first if not found int pos = Combo()->FindString(m_startValue); - if (pos == -1) + if (pos == wxNOT_FOUND) pos = 0; Combo()->SetSelection(pos); } Combo()->SetInsertionPointEnd(); Combo()->SetFocus(); + + if (evtHandler) + evtHandler->SetInSetFocus(false); } bool wxGridCellChoiceEditor::EndEdit(int row, int col, @@ -1525,6 +1541,10 @@ wxString wxGridCellChoiceEditor::GetValue() const void wxGridCellEditorEvtHandler::OnKillFocus(wxFocusEvent& event) { + // Don't disable the cell if we're just starting to edit it + if (m_inSetFocus) + return; + // accept changes m_grid->DisableCellEditControl(); @@ -1626,8 +1646,8 @@ void wxGridCellRenderer::Draw(wxGrid& grid, // wxGridCellStringRenderer // ---------------------------------------------------------------------------- -void wxGridCellStringRenderer::SetTextColoursAndFont(wxGrid& grid, - wxGridCellAttr& attr, +void wxGridCellStringRenderer::SetTextColoursAndFont(const wxGrid& grid, + const wxGridCellAttr& attr, wxDC& dc, bool isSelected) { @@ -1658,7 +1678,7 @@ void wxGridCellStringRenderer::SetTextColoursAndFont(wxGrid& grid, dc.SetFont( attr.GetFont() ); } -wxSize wxGridCellStringRenderer::DoGetBestSize(wxGridCellAttr& attr, +wxSize wxGridCellStringRenderer::DoGetBestSize(const wxGridCellAttr& attr, wxDC& dc, const wxString& text) { @@ -1779,7 +1799,7 @@ void wxGridCellStringRenderer::Draw(wxGrid& grid, // wxGridCellNumberRenderer // ---------------------------------------------------------------------------- -wxString wxGridCellNumberRenderer::GetString(wxGrid& grid, int row, int col) +wxString wxGridCellNumberRenderer::GetString(const wxGrid& grid, int row, int col) { wxGridTableBase *table = grid.GetTable(); wxString text; @@ -1845,7 +1865,7 @@ wxGridCellRenderer *wxGridCellFloatRenderer::Clone() const return renderer; } -wxString wxGridCellFloatRenderer::GetString(wxGrid& grid, int row, int col) +wxString wxGridCellFloatRenderer::GetString(const wxGrid& grid, int row, int col) { wxGridTableBase *table = grid.GetTable(); @@ -1950,21 +1970,19 @@ void wxGridCellFloatRenderer::SetParameters(const wxString& params) { wxLogDebug(_T("Invalid wxGridCellFloatRenderer width parameter string '%s ignored"), params.c_str()); } - } - tmp = params.AfterFirst(_T(',')); - if ( !tmp.empty() ) - { - long precision; + tmp = params.AfterFirst(_T(',')); + if ( !tmp.empty() ) + { + long precision; if ( tmp.ToLong(&precision) ) - { + { SetPrecision((int)precision); - } - else - { + } + else + { wxLogDebug(_T("Invalid wxGridCellFloatRenderer precision parameter string '%s ignored"), params.c_str()); - } - + } } } } @@ -3672,7 +3690,8 @@ void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) int client_width = 0; GetClientSize( &client_width, &client_height ); -#if __WXGTK__ + // VZ: any reason for this ifdef? (FIXME) +#ifdef __WXGTK__ wxRect rect; rect.SetX( 1 ); rect.SetY( 1 ); @@ -3680,7 +3699,7 @@ void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) rect.SetHeight( client_height - 2 ); wxRendererNative::Get().DrawHeaderButton( this, dc, rect, 0 ); -#else +#else // !__WXGTK__ dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) ); dc.DrawLine( client_width-1, client_height-1, client_width-1, 0 ); dc.DrawLine( client_width-1, client_height-1, 0, client_height-1 ); @@ -3690,7 +3709,7 @@ void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) dc.SetPen( *wxWHITE_PEN ); dc.DrawLine( 1, 1, client_width-1, 1 ); dc.DrawLine( 1, 1, 1, client_height-1 ); -#endif +#endif // __WXGTK__/!__WXGTK__ } @@ -3783,7 +3802,7 @@ void wxGridWindow::OnMouseEvent( wxMouseEvent& event ) { if (event.ButtonDown(wxMOUSE_BTN_LEFT) && FindFocus() != this) SetFocus(); - + m_owner->ProcessGridCellMouseEvent( event ); } @@ -4905,6 +4924,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) break; case WXGRID_CURSOR_SELECT_ROW: + { if ( (row = YToRow( y )) >= 0 ) { if ( m_selection ) @@ -4916,6 +4936,8 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) event.MetaDown() ); } } + } + break; // default label to suppress warnings about "enumeration value // 'xxx' not handled in switch @@ -4999,7 +5021,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) // else if (event.LeftDClick() ) { - int row = YToEdgeOfRow(y); + row = YToEdgeOfRow(y); if ( row < 0 ) { row = YToRow(y); @@ -5127,6 +5149,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) break; case WXGRID_CURSOR_SELECT_COL: + { if ( (col = XToCol( x )) >= 0 ) { if ( m_selection ) @@ -5138,6 +5161,8 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) event.MetaDown() ); } } + } + break; // default label to suppress warnings about "enumeration value // 'xxx' not handled in switch @@ -5220,7 +5245,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) // if ( event.LeftDClick() ) { - int col = XToEdgeOfCol(x); + col = XToEdgeOfCol(x); if ( col < 0 ) { col = XToCol(x); @@ -7540,7 +7565,7 @@ void wxGrid::StringToLines( const wxString& value, wxArrayString& lines ) } -void wxGrid::GetTextBoxSize( wxDC& dc, +void wxGrid::GetTextBoxSize( const wxDC& dc, const wxArrayString& lines, long *width, long *height ) { @@ -7835,7 +7860,9 @@ void wxGrid::HideCellEditControl() editor->Show( false ); editor->DecRef(); attr->DecRef(); + m_gridWin->SetFocus(); + // refresh whole row to the right wxRect rect( CellToRect(row, col) ); CalcScrolledPosition(rect.x, rect.y, &rect.x, &rect.y ); @@ -9717,7 +9744,7 @@ void wxGrid::SetRowMinimalAcceptableHeight( int height ) if ( height<0 ) return; m_minAcceptableRowHeight = height; -}; +} int wxGrid::GetColMinimalAcceptableWidth() const {