+wxGridCellTextEditor::wxGridCellTextEditor()
+{
+}
+
+void wxGridCellTextEditor::Create(wxWindow* parent,
+ wxWindowID id,
+ wxEvtHandler* evtHandler)
+{
+ m_control = new wxTextCtrl(parent, id, wxEmptyString,
+ wxDefaultPosition, wxDefaultSize
+#if defined(__WXMSW__)
+ , wxTE_MULTILINE | wxTE_NO_VSCROLL // necessary ???
+#endif
+ );
+
+ wxGridCellEditor::Create(parent, id, evtHandler);
+}
+
+
+void wxGridCellTextEditor::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);
+ Text()->SetValue(m_startValue);
+ Text()->SetInsertionPointEnd();
+ Text()->SetFocus();
+}
+
+
+bool wxGridCellTextEditor::EndEdit(int row, int col, bool saveValue,
+ wxGrid* grid)
+{
+ wxASSERT_MSG(m_control,
+ wxT("The wxGridCellEditor must be Created first!"));
+
+ bool changed = FALSE;
+ wxString value = Text()->GetValue();
+ if (value != m_startValue)
+ changed = TRUE;
+
+ if (changed)
+ grid->GetTable()->SetValue(row, col, value);
+
+ m_startValue = wxEmptyString;
+ Text()->SetValue(m_startValue);
+
+ return changed;
+}
+
+
+void wxGridCellTextEditor::Reset()
+{
+ wxASSERT_MSG(m_control,
+ wxT("The wxGridCellEditor must be Created first!"));
+
+ Text()->SetValue(m_startValue);
+ Text()->SetInsertionPointEnd();
+}
+
+void wxGridCellTextEditor::StartingKey(wxKeyEvent& event)
+{
+ 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;
+ }
+
+ }
+
+ event.Skip();
+}
+
+void wxGridCellTextEditor::HandleReturn(wxKeyEvent& event)
+{
+#if defined(__WXMOTIF__) || defined(__WXGTK__)
+ // wxMotif needs a little extra help...
+ int pos = Text()->GetInsertionPoint();
+ wxString s( Text()->GetValue() );
+ s = s.Left(pos) + "\n" + s.Mid(pos);
+ Text()->SetValue(s);
+ Text()->SetInsertionPoint( pos );
+#else
+ // the other ports can handle a Return key press
+ //
+ event.Skip();
+#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)
+{
+ switch ( event.KeyCode() )
+ {
+ case WXK_ESCAPE:
+ m_editor->Reset();
+ m_grid->DisableCellEditControl();
+ break;
+
+ case WXK_TAB:
+ event.Skip( m_grid->ProcessEvent( event ) );
+ break;
+
+ case WXK_RETURN:
+ if (!m_grid->ProcessEvent(event))
+ m_editor->HandleReturn(event);
+ break;
+
+
+ default:
+ event.Skip();
+ }
+}
+
+void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event)
+{
+ switch ( event.KeyCode() )
+ {
+ case WXK_ESCAPE:
+ case WXK_TAB:
+ case WXK_RETURN:
+ break;
+
+ default:
+ event.Skip();
+ }
+}
+
+// ============================================================================
+// renderer classes
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxGridCellRenderer
+// ----------------------------------------------------------------------------
+
+void wxGridCellRenderer::Draw(wxGrid& grid,
+ wxGridCellAttr& attr,
+ wxDC& dc,
+ const wxRect& rect,
+ int row, int col,
+ bool isSelected)
+{
+ dc.SetBackgroundMode( wxSOLID );
+
+ if ( isSelected )
+ {
+ dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
+ }
+ else
+ {
+ dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) );
+ }
+
+ dc.SetPen( *wxTRANSPARENT_PEN );
+ dc.DrawRectangle(rect);
+}
+
+// ----------------------------------------------------------------------------
+// wxGridCellStringRenderer
+// ----------------------------------------------------------------------------
+
+void wxGridCellStringRenderer::Draw(wxGrid& grid,
+ wxGridCellAttr& attr,
+ wxDC& dc,
+ const wxRect& rectCell,
+ int row, int col,
+ bool isSelected)
+{
+ wxGridCellRenderer::Draw(grid, attr, dc, rectCell, row, col, isSelected);
+
+ // now we only have to draw the text
+ dc.SetBackgroundMode( wxTRANSPARENT );
+
+ // TODO some special colours for attr.IsReadOnly() case?
+
+ if ( isSelected )
+ {
+ dc.SetTextBackground( grid.GetSelectionBackground() );
+ dc.SetTextForeground( grid.GetSelectionForeground() );
+ }
+ else
+ {
+ dc.SetTextBackground( attr.GetBackgroundColour() );
+ dc.SetTextForeground( attr.GetTextColour() );
+ }
+ dc.SetFont( attr.GetFont() );
+
+ int hAlign, vAlign;
+ attr.GetAlignment(&hAlign, &vAlign);
+
+ wxRect rect = rectCell;
+ rect.x++;
+ rect.y++;
+ rect.width -= 2;
+ rect.height -= 2;
+
+ grid.DrawTextRectangle(dc, grid.GetCellValue(row, col),
+ 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
+// ----------------------------------------------------------------------------
+
+const wxColour& wxGridCellAttr::GetTextColour() const
+{
+ if (HasTextColour())
+ {
+ return m_colText;
+ }
+ else if (m_defGridAttr != this)
+ {
+ return m_defGridAttr->GetTextColour();
+ }
+ else
+ {
+ wxFAIL_MSG(wxT("Missing default cell attribute"));
+ return wxNullColour;
+ }
+}
+
+
+const wxColour& wxGridCellAttr::GetBackgroundColour() const
+{
+ if (HasBackgroundColour())
+ return m_colBack;
+ else if (m_defGridAttr != this)
+ return m_defGridAttr->GetBackgroundColour();
+ else
+ {
+ wxFAIL_MSG(wxT("Missing default cell attribute"));
+ return wxNullColour;
+ }
+}
+
+
+const wxFont& wxGridCellAttr::GetFont() const
+{
+ if (HasFont())
+ return m_font;
+ else if (m_defGridAttr != this)
+ return m_defGridAttr->GetFont();
+ else
+ {
+ wxFAIL_MSG(wxT("Missing default cell attribute"));
+ return wxNullFont;
+ }
+}
+
+
+void wxGridCellAttr::GetAlignment(int *hAlign, int *vAlign) const
+{
+ if (HasAlignment())
+ {
+ if ( hAlign ) *hAlign = m_hAlign;
+ if ( vAlign ) *vAlign = m_vAlign;
+ }
+ else if (m_defGridAttr != this)
+ m_defGridAttr->GetAlignment(hAlign, vAlign);
+ else
+ {
+ wxFAIL_MSG(wxT("Missing default cell attribute"));
+ }
+}
+
+
+wxGridCellRenderer* wxGridCellAttr::GetRenderer() const
+{
+ if (HasRenderer())
+ return m_renderer;
+ else if (m_defGridAttr != this)
+ return m_defGridAttr->GetRenderer();
+ else
+ {
+ wxFAIL_MSG(wxT("Missing default cell attribute"));
+ return NULL;
+ }
+}
+
+wxGridCellEditor* wxGridCellAttr::GetEditor() const
+{
+ if (HasEditor())
+ return m_editor;
+ else if (m_defGridAttr != this)
+ return m_defGridAttr->GetEditor();
+ else
+ {
+ wxFAIL_MSG(wxT("Missing default cell attribute"));
+ return NULL;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// wxGridCellAttrData
+// ----------------------------------------------------------------------------
+
+void wxGridCellAttrData::SetAttr(wxGridCellAttr *attr, int row, int col)