public:
wxGridCellEditorEvtHandler(wxGrid* grid, wxGridCellEditor* editor)
: m_grid(grid),
- m_editor(editor)
+ m_editor(editor),
+ m_inSetFocus(false)
{
}
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)
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)
}
Combo()->SetInsertionPointEnd();
Combo()->SetFocus();
+
+ if (evtHandler)
+ evtHandler->SetInSetFocus(false);
}
bool wxGridCellChoiceEditor::EndEdit(int row, int col,
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();
{
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());
- }
-
+ }
}
}
}
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 );
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 );
dc.SetPen( *wxWHITE_PEN );
dc.DrawLine( 1, 1, client_width-1, 1 );
dc.DrawLine( 1, 1, 1, client_height-1 );
-#endif
+#endif // __WXGTK__/!__WXGTK__
}
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 );