X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14ac4f3c548f32d9bd461734a30c1e0787c7cc06..f0834140313212fc54d09e28d21a95476d6545f2:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 405f72dc0d..a3390abd70 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -89,6 +89,10 @@ struct wxGridCellWithAttr wxGridCellCoords coords; wxGridCellAttr *attr; + +// Cannot do this: +// DECLARE_NO_COPY_CLASS(wxGridCellWithAttr) +// without rewriting the macros, which require a public copy constructor. }; WX_DECLARE_EXPORTED_OBJARRAY(wxGridCellWithAttr, wxGridCellWithAttrArray); @@ -141,6 +145,7 @@ private: DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow) DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridRowLabelWindow) }; @@ -162,6 +167,7 @@ private: DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow) DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridColLabelWindow) }; @@ -183,6 +189,7 @@ private: DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow) DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridCornerLabelWindow) }; class WXDLLEXPORT wxGridWindow : public wxWindow @@ -203,6 +210,8 @@ public: void ScrollWindow( int dx, int dy, const wxRect *rect ); + wxGrid* GetOwner() { return m_owner; } + private: wxGrid *m_owner; wxGridRowLabelWindow *m_rowLabelWin; @@ -218,6 +227,7 @@ private: DECLARE_DYNAMIC_CLASS(wxGridWindow) DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridWindow) }; @@ -240,6 +250,7 @@ private: wxGridCellEditor* m_editor; DECLARE_DYNAMIC_CLASS(wxGridCellEditorEvtHandler) DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridCellEditorEvtHandler) }; @@ -320,6 +331,8 @@ struct wxGridDataTypeInfo wxString m_typeName; wxGridCellRenderer* m_renderer; wxGridCellEditor* m_editor; + + DECLARE_NO_COPY_CLASS(wxGridDataTypeInfo) }; @@ -424,6 +437,7 @@ static inline int GetScrollY(int y) wxGridCellEditor::wxGridCellEditor() { m_control = NULL; + m_attr = NULL; } @@ -445,6 +459,10 @@ void wxGridCellEditor::PaintBackground(const wxRect& rectCell, { // erase the background because we might not fill the cell wxClientDC dc(m_control->GetParent()); + wxGridWindow* gridWindow = wxDynamicCast(m_control->GetParent(), wxGridWindow); + if (gridWindow) + gridWindow->GetOwner()->PrepareDC(dc); + dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID)); dc.DrawRectangle(rectCell); @@ -905,7 +923,7 @@ void wxGridCellNumberEditor::StartingKey(wxKeyEvent& event) { if ( !HasRange() ) { - int keycode = (int) event.KeyCode(); + int keycode = event.GetKeyCode(); if ( isdigit(keycode) || keycode == '+' || keycode == '-' || keycode == WXK_NUMPAD0 || keycode == WXK_NUMPAD1 @@ -1045,7 +1063,7 @@ void wxGridCellFloatEditor::Reset() void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event) { - int keycode = (int)event.KeyCode(); + int keycode = event.GetKeyCode(); if ( isdigit(keycode) || keycode == '+' || keycode == '-' || keycode == '.' || keycode == WXK_NUMPAD0 || keycode == WXK_NUMPAD1 @@ -1216,7 +1234,32 @@ void wxGridCellBoolEditor::SetSize(const wxRect& r) size.y -= 2; #endif - m_control->Move(r.x + r.width/2 - size.x/2, r.y + r.height/2 - size.y/2); + int hAlign = wxALIGN_CENTRE; + int vAlign = wxALIGN_CENTRE; + if (GetCellAttr()) + GetCellAttr()->GetAlignment(& hAlign, & vAlign); + + int x = 0, y = 0; + if (hAlign == wxALIGN_LEFT) + { + x = r.x + 2; +#ifdef __WXMSW__ + x += 2; +#endif + y = r.y + r.height/2 - size.y/2; + } + else if (hAlign == wxALIGN_RIGHT) + { + x = r.x + r.width - size.x - 2; + y = r.y + r.height/2 - size.y/2; + } + else if (hAlign == wxALIGN_CENTRE) + { + x = r.x + r.width/2 - size.x/2; + y = r.y + r.height/2 - size.y/2; + } + + m_control->Move(x, y); } void wxGridCellBoolEditor::Show(bool show, wxGridCellAttr *attr) @@ -1452,7 +1495,7 @@ wxString wxGridCellChoiceEditor::GetValue() const void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event) { - switch ( event.KeyCode() ) + switch ( event.GetKeyCode() ) { case WXK_ESCAPE: m_editor->Reset(); @@ -1477,7 +1520,7 @@ void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event) void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event) { - switch ( event.KeyCode() ) + switch ( event.GetKeyCode() ) { case WXK_ESCAPE: case WXK_TAB: @@ -1532,7 +1575,7 @@ void wxGridCellRenderer::Draw(wxGrid& grid, { dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) ); } - } + } else { dc.SetBrush(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE), wxSOLID)); @@ -1950,11 +1993,31 @@ void wxGridCellBoolRenderer::Draw(wxGrid& grid, } // draw a border around checkmark + int vAlign, hAlign; + attr.GetAlignment(& hAlign, &vAlign); + wxRect rectBorder; - rectBorder.x = rect.x + rect.width/2 - size.x/2; - rectBorder.y = rect.y + rect.height/2 - size.y/2; - rectBorder.width = size.x; - rectBorder.height = size.y; + if (hAlign == wxALIGN_CENTRE) + { + rectBorder.x = rect.x + rect.width/2 - size.x/2; + rectBorder.y = rect.y + rect.height/2 - size.y/2; + rectBorder.width = size.x; + rectBorder.height = size.y; + } + else if (hAlign == wxALIGN_LEFT) + { + rectBorder.x = rect.x + 2; + rectBorder.y = rect.y + rect.height/2 - size.y/2; + rectBorder.width = size.x; + rectBorder.height = size.y; + } + else if (hAlign == wxALIGN_RIGHT) + { + rectBorder.x = rect.x + rect.width - size.x - 2; + rectBorder.y = rect.y + rect.height/2 - size.y/2; + rectBorder.width = size.x; + rectBorder.height = size.y; + } bool value; if ( grid.GetTable()->CanGetValueAs(row, col, wxGRID_VALUE_BOOL) ) @@ -3900,8 +3963,7 @@ void wxGrid::Init() // TODO: something better than this ? // m_labelFont = this->GetFont(); -// m_labelFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); -// m_labelFont.SetWeight( m_labelFont.GetWeight() + 2 ); + m_labelFont.SetWeight( wxBOLD ); m_rowLabelHorizAlign = wxALIGN_CENTRE; m_rowLabelVertAlign = wxALIGN_CENTRE; @@ -3945,8 +4007,8 @@ void wxGrid::Init() m_selectingBottomRight = wxGridNoCellCoords; // m_selectionBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); // m_selectionForeground = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); - m_selectionBackground = *wxBLACK; - m_selectionForeground = *wxWHITE; + m_selectionBackground = *wxBLACK; + m_selectionForeground = *wxWHITE; m_editable = TRUE; // default for whole grid @@ -6020,7 +6082,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) // try local handlers // - switch ( event.KeyCode() ) + switch ( event.GetKeyCode() ) { case WXK_UP: if ( event.ControlDown() ) @@ -6185,7 +6247,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) // is special and will always start editing, for // other keys - ask the editor itself - if ( (event.KeyCode() == WXK_F2 && !event.HasModifiers()) + if ( (event.GetKeyCode() == WXK_F2 && !event.HasModifiers()) || editor->IsAcceptedKey(event) ) { // ensure cell is visble @@ -6223,7 +6285,7 @@ void wxGrid::OnKeyUp( wxKeyEvent& event ) { // try local handlers // - if ( event.KeyCode() == WXK_SHIFT ) + if ( event.GetKeyCode() == WXK_SHIFT ) { if ( m_selectingTopLeft != wxGridNoCellCoords && m_selectingBottomRight != wxGridNoCellCoords ) @@ -7388,6 +7450,7 @@ void wxGrid::ShowCellEditControl() rect.SetRight(client_right-1); } + editor->SetCellAttr(attr); editor->SetSize( rect ); editor->Show( TRUE, attr ); @@ -7396,6 +7459,7 @@ void wxGrid::ShowCellEditControl() CalcDimensions(); editor->BeginEdit(row, col, this); + editor->SetCellAttr(NULL); editor->DecRef(); attr->DecRef();