X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/71e60f703cd81c80970db55164b1415bfbace34f..0281278534339322516fa6133ed4df925c2156be:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 67c696f3b7..65d60341f8 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -47,6 +47,7 @@ #include "wx/textfile.h" #include "wx/spinctrl.h" #include "wx/tokenzr.h" +#include "wx/renderer.h" #include "wx/grid.h" #include "wx/generic/gridsel.h" @@ -206,7 +207,7 @@ public: wxGridRowLabelWindow *rowLblWin, wxGridColLabelWindow *colLblWin, wxWindowID id, const wxPoint &pos, const wxSize &size ); - ~wxGridWindow(); + ~wxGridWindow(){} void ScrollWindow( int dx, int dy, const wxRect *rect ); @@ -413,6 +414,7 @@ static const size_t GRID_SCROLL_LINE_Y = GRID_SCROLL_LINE_X; // in these hash tables is the number of rows/columns) static const int GRID_HASH_SIZE = 100; +#if 0 // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- @@ -426,6 +428,7 @@ static inline int GetScrollY(int y) { return (y + GRID_SCROLL_LINE_Y - 1) / GRID_SCROLL_LINE_Y; } +#endif // ============================================================================ // implementation @@ -500,9 +503,11 @@ void wxGridCellEditor::Show(bool show, wxGridCellAttr *attr) m_colBgOld = m_control->GetBackgroundColour(); m_control->SetBackgroundColour(attr->GetBackgroundColour()); +// Workaround for GTK+1 font setting problem on some platforms +#if !defined(__WXGTK__) || defined(__WXGTK20__) m_fontOld = m_control->GetFont(); m_control->SetFont(attr->GetFont()); - +#endif // can't do anything more in the base class version, the other // attributes may only be used by the derived classes } @@ -521,12 +526,14 @@ void wxGridCellEditor::Show(bool show, wxGridCellAttr *attr) m_control->SetBackgroundColour(m_colBgOld); m_colBgOld = wxNullColour; } - +// Workaround for GTK+1 font setting problem on some platforms +#if !defined(__WXGTK__) || defined(__WXGTK20__) if ( m_fontOld.Ok() ) { m_control->SetFont(m_fontOld); m_fontOld = wxNullFont; } +#endif } } @@ -796,6 +803,7 @@ void wxGridCellNumberEditor::Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler) { +#if wxUSE_SPINCTRL if ( HasRange() ) { // create a spin ctrl @@ -807,6 +815,7 @@ void wxGridCellNumberEditor::Create(wxWindow* parent, wxGridCellEditor::Create(parent, id, evtHandler); } else +#endif { // just a text control wxGridCellTextEditor::Create(parent, id, evtHandler); @@ -829,19 +838,21 @@ void wxGridCellNumberEditor::BeginEdit(int row, int col, wxGrid* grid) { m_valueOld = 0; wxString sValue = table->GetValue(row, col); - if (! sValue.ToLong(&m_valueOld) && ! sValue.IsEmpty()) + if (! sValue.ToLong(&m_valueOld) && ! sValue.empty()) { wxFAIL_MSG( _T("this cell doesn't have numeric value") ); return; } } +#if wxUSE_SPINCTRL if ( HasRange() ) { Spin()->SetValue((int)m_valueOld); Spin()->SetFocus(); } else +#endif { DoBeginEdit(GetString()); } @@ -854,6 +865,7 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col, long value = 0; wxString text; +#if wxUSE_SPINCTRL if ( HasRange() ) { value = Spin()->GetValue(); @@ -862,9 +874,10 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col, text = wxString::Format(wxT("%ld"), value); } else +#endif { text = Text()->GetValue(); - changed = (text.IsEmpty() || text.ToLong(&value)) && (value != m_valueOld); + changed = (text.empty() || text.ToLong(&value)) && (value != m_valueOld); } if ( changed ) @@ -880,11 +893,13 @@ bool wxGridCellNumberEditor::EndEdit(int row, int col, void wxGridCellNumberEditor::Reset() { +#if wxUSE_SPINCTRL if ( HasRange() ) { Spin()->SetValue((int)m_valueOld); } else +#endif { DoReset(GetString()); } @@ -986,18 +1001,21 @@ void wxGridCellNumberEditor::SetParameters(const wxString& params) // return the value in the spin control if it is there (the text control otherwise) wxString wxGridCellNumberEditor::GetValue() const { - wxString s; + wxString s; - if( HasRange() ) - { - long value = Spin()->GetValue(); - s.Printf(wxT("%ld"), value); - } - else - { - s = Text()->GetValue(); - } - return s; +#if wxUSE_SPINCTRL + if( HasRange() ) + { + long value = Spin()->GetValue(); + s.Printf(wxT("%ld"), value); + } + else +#endif + { + s = Text()->GetValue(); + } + + return s; } // ---------------------------------------------------------------------------- @@ -1033,7 +1051,7 @@ void wxGridCellFloatEditor::BeginEdit(int row, int col, wxGrid* grid) { m_valueOld = 0.0; wxString sValue = table->GetValue(row, col); - if (! sValue.ToDouble(&m_valueOld) && ! sValue.IsEmpty()) + if (! sValue.ToDouble(&m_valueOld) && ! sValue.empty()) { wxFAIL_MSG( _T("this cell doesn't have float value") ); return; @@ -1049,7 +1067,7 @@ bool wxGridCellFloatEditor::EndEdit(int row, int col, double value = 0.0; wxString text(Text()->GetValue()); - if ( (text.IsEmpty() || text.ToDouble(&value)) && (value != m_valueOld) ) + if ( (text.empty() || text.ToDouble(&value)) && (value != m_valueOld) ) { if (grid->GetTable()->CanSetValueAs(row, col, wxGRID_VALUE_FLOAT)) grid->GetTable()->SetValueAsDouble(row, col, value); @@ -1072,7 +1090,8 @@ void wxGridCellFloatEditor::StartingKey(wxKeyEvent& event) char tmpbuf[2]; tmpbuf[0] = (char) keycode; tmpbuf[1] = '\0'; - bool is_decimal_point = ( wxString(tmpbuf, *wxConvCurrent) == + wxString strbuf(tmpbuf, *wxConvCurrent); + bool is_decimal_point = ( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER) ); if ( wxIsdigit(keycode) || keycode == '+' || keycode == '-' || is_decimal_point @@ -1180,10 +1199,10 @@ bool wxGridCellFloatEditor::IsAcceptedKey(wxKeyEvent& event) char tmpbuf[2]; tmpbuf[0] = (char) keycode; tmpbuf[1] = '\0'; + wxString strbuf(tmpbuf, *wxConvCurrent); bool is_decimal_point = - ( wxString(tmpbuf, *wxConvCurrent) == - wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, - wxLOCALE_CAT_NUMBER) ); + ( strbuf == wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, + wxLOCALE_CAT_NUMBER) ); if ( (keycode < 128) && (wxIsdigit(keycode) || tolower(keycode) == 'e' || is_decimal_point || keycode == '+' || keycode == '-') ) @@ -1578,18 +1597,18 @@ void wxGridCellRenderer::Draw(wxGrid& grid, // grey out fields if the grid is disabled if( grid.IsEnabled() ) { - if ( isSelected ) - { - dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) ); - } - else - { - dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) ); - } + if ( isSelected ) + { + dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) ); + } + else + { + dc.SetBrush( wxBrush(attr.GetBackgroundColour(), wxSOLID) ); + } } else { - dc.SetBrush(wxBrush(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE), wxSOLID)); + dc.SetBrush(wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), wxSOLID)); } dc.SetPen( *wxTRANSPARENT_PEN ); @@ -1625,8 +1644,8 @@ void wxGridCellStringRenderer::SetTextColoursAndFont(wxGrid& grid, } else { - dc.SetTextBackground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE)); - dc.SetTextForeground(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_GRAYTEXT)); + dc.SetTextBackground(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); } dc.SetFont( attr.GetFont() ); @@ -1913,7 +1932,7 @@ void wxGridCellFloatRenderer::SetParameters(const wxString& params) else { wxString tmp = params.BeforeFirst(_T(',')); - if ( !!tmp ) + if ( !tmp.empty() ) { long width; if ( tmp.ToLong(&width) ) @@ -1927,7 +1946,7 @@ void wxGridCellFloatRenderer::SetParameters(const wxString& params) } tmp = params.AfterFirst(_T(',')); - if ( !!tmp ) + if ( !tmp.empty() ) { long precision; if ( tmp.ToLong(&precision) ) @@ -2412,7 +2431,8 @@ void wxGridCellAttrData::UpdateAttrRows( size_t pos, int numRows ) else { // ...or remove the attribute - m_attrs.RemoveAt((size_t)n); + m_attrs[n].attr->DecRef(); + m_attrs.RemoveAt(n); n--; count--; } } @@ -2445,7 +2465,8 @@ void wxGridCellAttrData::UpdateAttrCols( size_t pos, int numCols ) else { // ...or remove the attribute - m_attrs.RemoveAt((size_t)n); + m_attrs[n].attr->DecRef(); + m_attrs.RemoveAt(n); n--; count--; } } @@ -2543,8 +2564,9 @@ void wxGridRowOrColAttrData::UpdateAttrRowsOrCols( size_t pos, int numRowsOrCols rowOrCol += numRowsOrCols; else { - m_rowsOrCols.RemoveAt((size_t)n); - m_attrs.RemoveAt((size_t)n); + m_rowsOrCols.RemoveAt(n); + m_attrs[n]->DecRef(); + m_attrs.RemoveAt(n); n--; count--; } } @@ -2591,8 +2613,8 @@ wxGridCellAttr *wxGridCellAttrProvider::GetAttr(int row, int col, wxGridCellAttr *attrrow = m_data->m_rowAttrs.GetAttr(row); wxGridCellAttr *attrcol = m_data->m_colAttrs.GetAttr(col); - if((attrcell != attrrow) && (attrrow !=attrcol) && (attrcell != attrcol)){ - // Two or move are non NULL + if((attrcell != attrrow) && (attrrow != attrcol) && (attrcell != attrcol)){ + // Two or more are non NULL attr = new wxGridCellAttr; attr->SetKind(wxGridCellAttr::Merged); @@ -2614,11 +2636,21 @@ wxGridCellAttr *wxGridCellAttrProvider::GetAttr(int row, int col, //m_data->m_mergeAttr.SetAttr(attr, row, col); } else - { + { // one or none is non null return it or null. if(attrrow) attr = attrrow; - if(attrcol) attr = attrcol; - if(attrcell) attr = attrcell; + if(attrcol) + { + if(attr) + attr->DecRef(); + attr = attrcol; + } + if(attrcell) + { + if(attr) + attr->DecRef(); + attr = attrcell; + } } } break; @@ -2626,10 +2658,10 @@ wxGridCellAttr *wxGridCellAttrProvider::GetAttr(int row, int col, attr = m_data->m_cellAttrs.GetAttr(row, col); break; case (wxGridCellAttr::Col): - attr = m_data->m_colAttrs.GetAttr(col); + attr = m_data->m_colAttrs.GetAttr(col); break; case (wxGridCellAttr::Row): - attr = m_data->m_rowAttrs.GetAttr(row); + attr = m_data->m_rowAttrs.GetAttr(row); break; default: // unused as yet... @@ -3618,6 +3650,15 @@ void wxGridCornerLabelWindow::OnPaint( wxPaintEvent& WXUNUSED(event) ) int client_width = 0; GetClientSize( &client_width, &client_height ); +#if __WXGTK__ + wxRect rect; + rect.SetX( 1 ); + rect.SetY( 1 ); + rect.SetWidth( client_width - 2 ); + rect.SetHeight( client_height - 2 ); + + wxRendererNative::Get().DrawHeaderButton( this, dc, rect, 0 ); +#else 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 ); @@ -3627,6 +3668,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 } @@ -3687,11 +3729,6 @@ wxGridWindow::wxGridWindow( wxGrid *parent, } -wxGridWindow::~wxGridWindow() -{ -} - - void wxGridWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) { wxPaintDC dc( this ); @@ -3815,7 +3852,7 @@ wxEND_HANDLERS_TABLE() wxCONSTRUCTOR_5( wxGrid , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle ) /* - TODO : Expose more information of a list's layout etc. via appropriate objects (à la NotebookPageInfo) + TODO : Expose more information of a list's layout etc. via appropriate objects (à la NotebookPageInfo) */ #else IMPLEMENT_DYNAMIC_CLASS( wxGrid, wxScrolledWindow ) @@ -4160,6 +4197,9 @@ void wxGrid::Init() m_extraWidth = m_extraHeight = 0; + + m_scrollLineX = GRID_SCROLL_LINE_X; + m_scrollLineY = GRID_SCROLL_LINE_Y; } // ---------------------------------------------------------------------------- @@ -7177,6 +7217,19 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row ) if ( GetRowHeight(row) <= 0 ) return; + wxRect rect; +#ifdef __WXGTK__ + rect.SetX( 1 ); + rect.SetY( GetRowTop(row) + 1 ); + rect.SetWidth( m_rowLabelWidth - 2 ); + rect.SetHeight( GetRowHeight(row) - 2 ); + + CalcScrolledPosition( 0, rect.y, NULL, &rect.y ); + + wxWindowDC *win_dc = (wxWindowDC*) &dc; + + wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 ); +#else int rowTop = GetRowTop(row), rowBottom = GetRowBottom(row) - 1; @@ -7191,7 +7244,7 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row ) dc.SetPen( *wxWHITE_PEN ); dc.DrawLine( 1, rowTop, 1, rowBottom ); dc.DrawLine( 1, rowTop, m_rowLabelWidth-1, rowTop ); - +#endif dc.SetBackgroundMode( wxTRANSPARENT ); dc.SetTextForeground( GetLabelTextColour() ); dc.SetFont( GetLabelFont() ); @@ -7199,7 +7252,6 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row ) int hAlign, vAlign; GetRowLabelAlignment( &hAlign, &vAlign ); - wxRect rect; rect.SetX( 2 ); rect.SetY( GetRowTop(row) + 2 ); rect.SetWidth( m_rowLabelWidth - 4 ); @@ -7227,8 +7279,20 @@ void wxGrid::DrawColLabel( wxDC& dc, int col ) if ( GetColWidth(col) <= 0 ) return; - int colLeft = GetColLeft(col), - colRight = GetColRight(col) - 1; + int colLeft = GetColLeft(col); + + wxRect rect; +#ifdef __WXGTK__ + rect.SetX( colLeft + 1 ); + rect.SetY( 1 ); + rect.SetWidth( GetColWidth(col) - 2 ); + rect.SetHeight( m_colLabelHeight - 2 ); + + wxWindowDC *win_dc = (wxWindowDC*) &dc; + + wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 ); +#else + int colRight = GetColRight(col) - 1; dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW),1, wxSOLID) ); dc.DrawLine( colRight, 0, @@ -7242,7 +7306,7 @@ void wxGrid::DrawColLabel( wxDC& dc, int col ) dc.SetPen( *wxWHITE_PEN ); dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight-1 ); dc.DrawLine( colLeft, 1, colRight, 1 ); - +#endif dc.SetBackgroundMode( wxTRANSPARENT ); dc.SetTextForeground( GetLabelTextColour() ); dc.SetFont( GetLabelFont() ); @@ -7251,7 +7315,6 @@ void wxGrid::DrawColLabel( wxDC& dc, int col ) GetColLabelAlignment( &hAlign, &vAlign ); orient = GetColLabelTextOrientation(); - wxRect rect; rect.SetX( colLeft + 2 ); rect.SetY( 2 ); rect.SetWidth( GetColWidth(col) - 4 ); @@ -8882,14 +8945,24 @@ void wxGrid::SetDefaultCellFont( const wxFont& font ) m_defaultCellAttr->SetFont(font); } + +// For editors and renderers the type registry takes precedence over the +// default attr, so we need to register the new editor/renderer for the string +// data type in order to make setting a default editor/renderer appear to +// work correctly. + void wxGrid::SetDefaultRenderer(wxGridCellRenderer *renderer) { - m_defaultCellAttr->SetRenderer(renderer); + RegisterDataType(wxGRID_VALUE_STRING, + renderer, + GetDefaultEditorForType(wxGRID_VALUE_STRING)); } void wxGrid::SetDefaultEditor(wxGridCellEditor *editor) { - m_defaultCellAttr->SetEditor(editor); + RegisterDataType(wxGRID_VALUE_STRING, + GetDefaultRendererForType(wxGRID_VALUE_STRING), + editor); } // ---------------------------------------------------------------------------- @@ -9520,26 +9593,30 @@ void wxGrid::SetColSize( int col, int width ) void wxGrid::SetColMinimalWidth( int col, int width ) { if (width > GetColMinimalAcceptableWidth()) { - m_colMinWidths[col] = width; + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)col; + m_colMinWidths[key] = width; } } void wxGrid::SetRowMinimalHeight( int row, int width ) { if (width > GetRowMinimalAcceptableHeight()) { - m_rowMinHeights[row] = width; + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)row; + m_rowMinHeights[key] = width; } } int wxGrid::GetColMinimalWidth(int col) const { - wxLongToLongHashMap::const_iterator it = m_colMinWidths.find(col); + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)col; + wxLongToLongHashMap::const_iterator it = m_colMinWidths.find(key); return it != m_colMinWidths.end() ? (int)it->second : m_minAcceptableColWidth; } int wxGrid::GetRowMinimalHeight(int row) const { - wxLongToLongHashMap::const_iterator it = m_rowMinHeights.find(row); + wxLongToLongHashMap::key_type key = (wxLongToLongHashMap::key_type)row; + wxLongToLongHashMap::const_iterator it = m_rowMinHeights.find(key); return it != m_rowMinHeights.end() ? (int)it->second : m_minAcceptableRowHeight; } @@ -9871,7 +9948,7 @@ wxSize wxGrid::DoGetBestSize() const if (!width) width=100; if (!height) height=80; - + // Round up to a multiple the scroll rate NOTE: this still doesn't get rid // of the scrollbars, is there any magic incantaion for that? int xpu, ypu; @@ -9880,16 +9957,16 @@ wxSize wxGrid::DoGetBestSize() const width += 1 + xpu - (width % xpu); if (ypu) height += 1 + ypu - (height % ypu); - + // limit to 1/4 of the screen size int maxwidth, maxheight; wxDisplaySize( & maxwidth, & maxheight ); maxwidth /= 2; - maxheight /= 2; + maxheight /= 2; if ( width > maxwidth ) width = maxwidth; if ( height > maxheight ) height = maxheight; - + wxSize best(width, height); // NOTE: This size should be cached, but first we need to add calls to // InvalidateBestSize everywhere that could change the results of this