// 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"
#include "wx/combobox.h"
#include "wx/valtext.h"
#include "wx/intl.h"
+ #include "wx/math.h"
#endif
#include "wx/textfile.h"
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)
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);
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();
// wxGridCellStringRenderer
// ----------------------------------------------------------------------------
-void wxGridCellStringRenderer::SetTextColoursAndFont(wxGrid& grid,
- wxGridCellAttr& attr,
+void wxGridCellStringRenderer::SetTextColoursAndFont(const wxGrid& grid,
+ const wxGridCellAttr& attr,
wxDC& dc,
bool isSelected)
{
dc.SetFont( attr.GetFont() );
}
-wxSize wxGridCellStringRenderer::DoGetBestSize(wxGridCellAttr& attr,
+wxSize wxGridCellStringRenderer::DoGetBestSize(const wxGridCellAttr& attr,
wxDC& dc,
const wxString& text)
{
// 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;
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();
{
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__
}
}
-void wxGrid::GetTextBoxSize( wxDC& dc,
+void wxGrid::GetTextBoxSize( const wxDC& dc,
const wxArrayString& lines,
long *width, long *height )
{
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 );
if ( height<0 )
return;
m_minAcceptableRowHeight = height;
-};
+}
int wxGrid::GetColMinimalAcceptableWidth() const
{