X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b8508db8b40b4c77ff31d97361a8d3b1af5cd132..fc9361e3ec5b81a7e8c32d93a03aea0b2cd3e045:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 2fab29c85c..47fc186875 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -120,16 +120,43 @@ DEFINE_EVENT_TYPE(wxEVT_GRID_EDITOR_CREATED) // private classes // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_ADV wxGridRowLabelWindow : public wxWindow +// common base class for various grid subwindows +class WXDLLIMPEXP_ADV wxGridSubwindow : public wxWindow { public: - wxGridRowLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridSubwindow() { m_owner = NULL; } + wxGridSubwindow(wxGrid *owner, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int additionalStyle = 0, + const wxString& name = wxPanelNameStr) + : wxWindow(owner, id, pos, size, + wxWANTS_CHARS | wxBORDER_NONE | additionalStyle, + name) + { + m_owner = owner; + } + + wxGrid *GetOwner() { return m_owner; } + +protected: + void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); + + wxGrid *m_owner; + + DECLARE_EVENT_TABLE() + DECLARE_NO_COPY_CLASS(wxGridSubwindow) +}; + +class WXDLLIMPEXP_ADV wxGridRowLabelWindow : public wxGridSubwindow +{ +public: + wxGridRowLabelWindow() { } wxGridRowLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ); private: - wxGrid *m_owner; - void OnPaint( wxPaintEvent& event ); void OnMouseEvent( wxMouseEvent& event ); void OnMouseWheel( wxMouseEvent& event ); @@ -143,16 +170,14 @@ private: }; -class WXDLLIMPEXP_ADV wxGridColLabelWindow : public wxWindow +class WXDLLIMPEXP_ADV wxGridColLabelWindow : public wxGridSubwindow { public: - wxGridColLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridColLabelWindow() { } wxGridColLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ); private: - wxGrid *m_owner; - void OnPaint( wxPaintEvent& event ); void OnMouseEvent( wxMouseEvent& event ); void OnMouseWheel( wxMouseEvent& event ); @@ -166,16 +191,14 @@ private: }; -class WXDLLIMPEXP_ADV wxGridCornerLabelWindow : public wxWindow +class WXDLLIMPEXP_ADV wxGridCornerLabelWindow : public wxGridSubwindow { public: - wxGridCornerLabelWindow() { m_owner = (wxGrid *)NULL; } + wxGridCornerLabelWindow() { } wxGridCornerLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ); private: - wxGrid *m_owner; - void OnMouseEvent( wxMouseEvent& event ); void OnMouseWheel( wxMouseEvent& event ); void OnKeyDown( wxKeyEvent& event ); @@ -188,12 +211,11 @@ private: DECLARE_NO_COPY_CLASS(wxGridCornerLabelWindow) }; -class WXDLLIMPEXP_ADV wxGridWindow : public wxWindow +class WXDLLIMPEXP_ADV wxGridWindow : public wxGridSubwindow { public: wxGridWindow() { - m_owner = NULL; m_rowLabelWin = NULL; m_colLabelWin = NULL; } @@ -202,14 +224,10 @@ public: wxGridRowLabelWindow *rowLblWin, wxGridColLabelWindow *colLblWin, wxWindowID id, const wxPoint &pos, const wxSize &size ); - virtual ~wxGridWindow() {} void ScrollWindow( int dx, int dy, const wxRect *rect ); - wxGrid* GetOwner() { return m_owner; } - private: - wxGrid *m_owner; wxGridRowLabelWindow *m_rowLabelWin; wxGridColLabelWindow *m_colLabelWin; @@ -624,21 +642,29 @@ void wxGridCellTextEditor::Create(wxWindow* parent, wxWindowID id, wxEvtHandler* evtHandler) { - m_control = new wxTextCtrl(parent, id, wxEmptyString, - wxDefaultPosition, wxDefaultSize + DoCreate(parent, id, evtHandler); +} + +void wxGridCellTextEditor::DoCreate(wxWindow* parent, + wxWindowID id, + wxEvtHandler* evtHandler, + long style) +{ #if defined(__WXMSW__) - , - wxTE_PROCESS_ENTER | - wxTE_PROCESS_TAB | - wxTE_AUTO_SCROLL | - wxNO_BORDER + style |= wxTE_PROCESS_ENTER | + wxTE_PROCESS_TAB | + wxTE_AUTO_SCROLL | + wxNO_BORDER; #endif - ); + + m_control = new wxTextCtrl(parent, id, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + style); // set max length allowed in the textctrl, if the parameter was set - if (m_maxChars != 0) + if ( m_maxChars != 0 ) { - ((wxTextCtrl*)m_control)->SetMaxLength(m_maxChars); + Text()->SetMaxLength(m_maxChars); } wxGridCellEditor::Create(parent, id, evtHandler); @@ -2475,7 +2501,7 @@ void wxGridCellAttr::GetSize( int *num_rows, int *num_cols ) const // NULL (because the table has a type that the grid does not have in its // registry), then the grid's default editor or renderer is used. -wxGridCellRenderer* wxGridCellAttr::GetRenderer(wxGrid* grid, int row, int col) const +wxGridCellRenderer* wxGridCellAttr::GetRenderer(const wxGrid* grid, int row, int col) const { wxGridCellRenderer *renderer = NULL; @@ -2519,7 +2545,7 @@ wxGridCellRenderer* wxGridCellAttr::GetRenderer(wxGrid* grid, int row, int col) } // same as above, except for s/renderer/editor/g -wxGridCellEditor* wxGridCellAttr::GetEditor(wxGrid* grid, int row, int col) const +wxGridCellEditor* wxGridCellAttr::GetEditor(const wxGrid* grid, int row, int col) const { wxGridCellEditor *editor = NULL; @@ -2699,7 +2725,7 @@ int wxGridCellAttrData::FindIndex(int row, int col) const wxGridRowOrColAttrData::~wxGridRowOrColAttrData() { - size_t count = m_attrs.Count(); + size_t count = m_attrs.GetCount(); for ( size_t n = 0; n < count; n++ ) { m_attrs[n]->DecRef(); @@ -2940,7 +2966,7 @@ void wxGridCellAttrProvider::UpdateAttrCols( size_t pos, int numCols ) wxGridTypeRegistry::~wxGridTypeRegistry() { - size_t count = m_typeinfo.Count(); + size_t count = m_typeinfo.GetCount(); for ( size_t i = 0; i < count; i++ ) delete m_typeinfo[i]; } @@ -3648,7 +3674,12 @@ bool wxGridStringTable::DeleteCols( size_t pos, size_t numCols ) if ( !m_colLabels.IsEmpty() ) { - m_colLabels.RemoveAt( colID, numCols ); + // m_colLabels stores just as many elements as it needs, e.g. if only + // the label of the first column had been set it would have only one + // element and not numCols, so account for it + int nToRm = m_colLabels.size() - colID; + if ( nToRm > 0 ) + m_colLabels.RemoveAt( colID, nToRm ); } for ( row = 0; row < curNumRows; row++ ) @@ -3740,9 +3771,18 @@ void wxGridStringTable::SetColLabelValue( int col, const wxString& value ) ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// +BEGIN_EVENT_TABLE(wxGridSubwindow, wxWindow) + EVT_MOUSE_CAPTURE_LOST(wxGridSubwindow::OnMouseCaptureLost) +END_EVENT_TABLE() + +void wxGridSubwindow::OnMouseCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) +{ + m_owner->CancelMouseCapture(); +} + IMPLEMENT_DYNAMIC_CLASS( wxGridRowLabelWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxGridSubwindow ) EVT_PAINT( wxGridRowLabelWindow::OnPaint ) EVT_MOUSEWHEEL( wxGridRowLabelWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent ) @@ -3754,7 +3794,7 @@ END_EVENT_TABLE() wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) + : wxGridSubwindow(parent, id, pos, size) { m_owner = parent; } @@ -3813,7 +3853,7 @@ void wxGridRowLabelWindow::OnChar( wxKeyEvent& event ) IMPLEMENT_DYNAMIC_CLASS( wxGridColLabelWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxGridSubwindow ) EVT_PAINT( wxGridColLabelWindow::OnPaint ) EVT_MOUSEWHEEL( wxGridColLabelWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent ) @@ -3825,7 +3865,7 @@ END_EVENT_TABLE() wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) + : wxGridSubwindow(parent, id, pos, size) { m_owner = parent; } @@ -3887,7 +3927,7 @@ void wxGridColLabelWindow::OnChar( wxKeyEvent& event ) IMPLEMENT_DYNAMIC_CLASS( wxGridCornerLabelWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxGridSubwindow ) EVT_MOUSEWHEEL( wxGridCornerLabelWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridCornerLabelWindow::OnMouseEvent ) EVT_PAINT( wxGridCornerLabelWindow::OnPaint ) @@ -3899,7 +3939,7 @@ END_EVENT_TABLE() wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE | wxFULL_REPAINT_ON_RESIZE ) + : wxGridSubwindow(parent, id, pos, size) { m_owner = parent; } @@ -3970,7 +4010,7 @@ void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event ) IMPLEMENT_DYNAMIC_CLASS( wxGridWindow, wxWindow ) -BEGIN_EVENT_TABLE( wxGridWindow, wxWindow ) +BEGIN_EVENT_TABLE( wxGridWindow, wxGridSubwindow ) EVT_PAINT( wxGridWindow::OnPaint ) EVT_MOUSEWHEEL( wxGridWindow::OnMouseWheel ) EVT_MOUSE_EVENTS( wxGridWindow::OnMouseEvent ) @@ -3988,10 +4028,8 @@ wxGridWindow::wxGridWindow( wxGrid *parent, wxWindowID id, const wxPoint &pos, const wxSize &size ) - : wxWindow( - parent, id, pos, size, - wxWANTS_CHARS | wxBORDER_NONE | wxCLIP_CHILDREN | wxFULL_REPAINT_ON_RESIZE, - wxT("grid window") ) + : wxGridSubwindow(parent, id, pos, size, + wxCLIP_CHILDREN, wxT("grid window") ) { m_owner = parent; m_rowLabelWin = rowLblWin; @@ -4183,6 +4221,7 @@ bool wxGrid::Create(wxWindow *parent, wxWindowID id, Create(); SetInitialSize(size); + CalcDimensions(); return true; } @@ -4357,24 +4396,33 @@ wxGrid::wxGridSelectionModes wxGrid::GetSelectionMode() const bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership, wxGrid::wxGridSelectionModes selmode ) { + bool checkSelection = false; if ( m_created ) { // stop all processing m_created = false; - if (m_ownTable) + if (m_table) { - wxGridTableBase *t = m_table; + m_table->SetView(0); + if( m_ownTable ) + delete m_table; m_table = NULL; - delete t; } delete m_selection; - - m_table = NULL; m_selection = NULL; + + m_ownTable = false; m_numRows = 0; m_numCols = 0; + checkSelection = true; + + // kill row and column size arrays + m_colWidths.Empty(); + m_colRights.Empty(); + m_rowHeights.Empty(); + m_rowBottoms.Empty(); } if (table) @@ -4386,7 +4434,28 @@ bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership, m_table->SetView( this ); m_ownTable = takeOwnership; m_selection = new wxGridSelection( this, selmode ); - + if (checkSelection) + { + // If the newly set table is smaller than the + // original one current cell and selection regions + // might be invalid, + m_selectingKeyboard = wxGridNoCellCoords; + m_currentCellCoords = + wxGridCellCoords(wxMin(m_numRows, m_currentCellCoords.GetRow()), + wxMin(m_numCols, m_currentCellCoords.GetCol())); + if (m_selectingTopLeft.GetRow() >= m_numRows || + m_selectingTopLeft.GetCol() >= m_numCols) + { + m_selectingTopLeft = wxGridNoCellCoords; + m_selectingBottomRight = wxGridNoCellCoords; + } + else + m_selectingBottomRight = + wxGridCellCoords(wxMin(m_numRows, + m_selectingBottomRight.GetRow()), + wxMin(m_numCols, + m_selectingBottomRight.GetCol())); + } CalcDimensions(); m_created = true; @@ -5045,7 +5114,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) return result; } -wxArrayInt wxGrid::CalcRowLabelsExposed( const wxRegion& reg ) +wxArrayInt wxGrid::CalcRowLabelsExposed( const wxRegion& reg ) const { wxRegionIterator iter( reg ); wxRect r; @@ -5096,7 +5165,7 @@ wxArrayInt wxGrid::CalcRowLabelsExposed( const wxRegion& reg ) return rowlabels; } -wxArrayInt wxGrid::CalcColLabelsExposed( const wxRegion& reg ) +wxArrayInt wxGrid::CalcColLabelsExposed( const wxRegion& reg ) const { wxRegionIterator iter( reg ); wxRect r; @@ -5150,7 +5219,7 @@ wxArrayInt wxGrid::CalcColLabelsExposed( const wxRegion& reg ) return colLabels; } -wxGridCellCoordsArray wxGrid::CalcCellsExposed( const wxRegion& reg ) +wxGridCellCoordsArray wxGrid::CalcCellsExposed( const wxRegion& reg ) const { wxRegionIterator iter( reg ); wxRect r; @@ -5772,6 +5841,21 @@ void wxGrid::ProcessCornerLabelMouseEvent( wxMouseEvent& event ) } } +void wxGrid::CancelMouseCapture() +{ + // cancel operation currently in progress, whatever it is + if ( m_winCapture ) + { + m_isDragging = false; + m_cursorMode = WXGRID_CURSOR_SELECT_CELL; + m_winCapture->SetCursor( *wxSTANDARD_CURSOR ); + m_winCapture = NULL; + + // remove traces of whatever we drew on screen + Refresh(); + } +} + void wxGrid::ChangeCursorMode(CursorMode mode, wxWindow *win, bool captureMouse) @@ -5891,13 +5975,6 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) SaveEditControlValue(); } - // Have we captured the mouse yet? - if (! m_winCapture) - { - m_winCapture = m_gridWin; - m_winCapture->CaptureMouse(); - } - if ( coords != wxGridNoCellCoords ) { if ( event.CmdDown() ) @@ -5917,6 +5994,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) coords.GetRow(), coords.GetCol(), event ); + return; } } else @@ -5938,6 +6016,14 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) // scrolling is way to fast, at least on MSW - also on GTK. } } + // Have we captured the mouse yet? + if (! m_winCapture) + { + m_winCapture = m_gridWin; + m_winCapture->CaptureMouse(); + } + + } else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) { @@ -6700,7 +6786,7 @@ int wxGrid::SendEvent( const wxEventType type, pos.y += GetColLabelSize(); if ( mouseEv.GetEventObject() == GetGridColLabelWindow() ) pos.x += GetRowLabelSize(); - + wxGridEvent gridEvt( GetId(), type, this, @@ -6866,14 +6952,13 @@ void wxGrid::Refresh(bool eraseb, const wxRect* rect) } } -void wxGrid::OnSize( wxSizeEvent& event ) +void wxGrid::OnSize(wxSizeEvent& WXUNUSED(event)) { - // position the child windows - CalcWindowSizes(); - - // don't call CalcDimensions() from here, the base class handles the size - // changes itself - event.Skip(); + if (m_targetWindow != this) // check whether initialisation has been done + { + // update our children window positions and scrollbars + CalcDimensions(); + } } void wxGrid::OnKeyDown( wxKeyEvent& event ) @@ -6901,7 +6986,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event ) else if (event.GetKeyCode() == WXK_LEFT) event.m_keyCode = WXK_RIGHT; } - + // try local handlers switch ( event.GetKeyCode() ) { @@ -8047,7 +8132,7 @@ void wxGrid::DrawTextRectangle(wxDC& dc, continue; } - long lineWidth = 0, + wxCoord lineWidth = 0, lineHeight = 0; dc.GetTextExtent(line, &lineWidth, &lineHeight); @@ -8092,7 +8177,7 @@ void wxGrid::DrawTextRectangle(wxDC& dc, // Split multi-line text up into an array of strings. // Any existing contents of the string array are preserved. // -void wxGrid::StringToLines( const wxString& value, wxArrayString& lines ) +void wxGrid::StringToLines( const wxString& value, wxArrayString& lines ) const { int startPos = 0; int pos; @@ -8126,11 +8211,11 @@ void wxGrid::StringToLines( const wxString& value, wxArrayString& lines ) void wxGrid::GetTextBoxSize( const wxDC& dc, const wxArrayString& lines, - long *width, long *height ) + long *width, long *height ) const { - long w = 0; - long h = 0; - long lineW = 0, lineH = 0; + wxCoord w = 0; + wxCoord h = 0; + wxCoord lineW = 0, lineH = 0; size_t i; for ( i = 0; i < lines.GetCount(); i++ ) @@ -8473,7 +8558,7 @@ void wxGrid::SaveEditControlValue() // coordinates for mouse events etc. // -void wxGrid::XYToCell( int x, int y, wxGridCellCoords& coords ) +void wxGrid::XYToCell( int x, int y, wxGridCellCoords& coords ) const { int row = YToRow(y); int col = XToCol(x); @@ -8555,19 +8640,18 @@ static int CoordToRowOrCol(int coord, int defaultDist, int minDist, return i_max; } -int wxGrid::YToRow( int y ) +int wxGrid::YToRow( int y ) const { return CoordToRowOrCol(y, m_defaultRowHeight, m_minAcceptableRowHeight, m_rowBottoms, m_numRows, false); } -int wxGrid::XToCol( int x, bool clipToMinMax ) +int wxGrid::XToCol( int x, bool clipToMinMax ) const { if (x < 0) return clipToMinMax && (m_numCols > 0) ? GetColAt( 0 ) : -1; - if (!m_defaultColWidth) - m_defaultColWidth = 1; + wxASSERT_MSG(m_defaultColWidth > 0, wxT("Default column width can not be zero")); int maxPos = x / m_defaultColWidth; int minPos = 0; @@ -8633,7 +8717,7 @@ int wxGrid::XToCol( int x, bool clipToMinMax ) // (b) resizing rows/columns (the thing for which edge detection is // relevant at all) is enabled. // -int wxGrid::YToEdgeOfRow( int y ) +int wxGrid::YToEdgeOfRow( int y ) const { int i; i = internalYToRow(y); @@ -8655,7 +8739,7 @@ int wxGrid::YToEdgeOfRow( int y ) // -1 if not near an edge // See comment at YToEdgeOfRow for conditions on edge detection. // -int wxGrid::XToEdgeOfCol( int x ) +int wxGrid::XToEdgeOfCol( int x ) const { int i; i = internalXToCol(x); @@ -8673,7 +8757,7 @@ int wxGrid::XToEdgeOfCol( int x ) return -1; } -wxRect wxGrid::CellToRect( int row, int col ) +wxRect wxGrid::CellToRect( int row, int col ) const { wxRect rect( -1, -1, -1, -1 ); @@ -8708,7 +8792,7 @@ wxRect wxGrid::CellToRect( int row, int col ) return rect; } -bool wxGrid::IsVisible( int row, int col, bool wholeCellVisible ) +bool wxGrid::IsVisible( int row, int col, bool wholeCellVisible ) const { // get the cell rectangle in logical coords // @@ -9286,7 +9370,7 @@ bool wxGrid::MoveCursorRightBlock( bool expandSelection ) // ------ Label values and formatting // -void wxGrid::GetRowLabelAlignment( int *horiz, int *vert ) +void wxGrid::GetRowLabelAlignment( int *horiz, int *vert ) const { if ( horiz ) *horiz = m_rowLabelHorizAlign; @@ -9294,7 +9378,7 @@ void wxGrid::GetRowLabelAlignment( int *horiz, int *vert ) *vert = m_rowLabelVertAlign; } -void wxGrid::GetColLabelAlignment( int *horiz, int *vert ) +void wxGrid::GetColLabelAlignment( int *horiz, int *vert ) const { if ( horiz ) *horiz = m_colLabelHorizAlign; @@ -9302,12 +9386,12 @@ void wxGrid::GetColLabelAlignment( int *horiz, int *vert ) *vert = m_colLabelVertAlign; } -int wxGrid::GetColLabelTextOrientation() +int wxGrid::GetColLabelTextOrientation() const { return m_colLabelTextOrientation; } -wxString wxGrid::GetRowLabelValue( int row ) +wxString wxGrid::GetRowLabelValue( int row ) const { if ( m_table ) { @@ -9321,7 +9405,7 @@ wxString wxGrid::GetRowLabelValue( int row ) } } -wxString wxGrid::GetColLabelValue( int col ) +wxString wxGrid::GetColLabelValue( int col ) const { if ( m_table ) { @@ -9337,7 +9421,13 @@ wxString wxGrid::GetColLabelValue( int col ) void wxGrid::SetRowLabelSize( int width ) { - width = wxMax( width, 0 ); + wxASSERT( width >= 0 || width == wxGRID_AUTOSIZE ); + + if ( width == wxGRID_AUTOSIZE ) + { + width = CalcColOrRowLabelAreaMinSize(wxGRID_ROW); + } + if ( width != m_rowLabelWidth ) { if ( width == 0 ) @@ -9360,7 +9450,13 @@ void wxGrid::SetRowLabelSize( int width ) void wxGrid::SetColLabelSize( int height ) { - height = wxMax( height, 0 ); + wxASSERT( height >=0 || height == wxGRID_AUTOSIZE ); + + if ( height == wxGRID_AUTOSIZE ) + { + height = CalcColOrRowLabelAreaMinSize(wxGRID_COLUMN); + } + if ( height != m_colLabelHeight ) { if ( height == 0 ) @@ -9578,7 +9674,7 @@ void wxGrid::SetCellHighlightPenWidth(int width) // make any visible change if the the thickness is getting smaller. int row = m_currentCellCoords.GetRow(); int col = m_currentCellCoords.GetCol(); - if ( GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) + if ( row == -1 || col == -1 || GetColWidth(col) <= 0 || GetRowHeight(row) <= 0 ) return; wxRect rect = CellToRect(row, col); @@ -9626,24 +9722,24 @@ void wxGrid::EnableGridLines( bool enable ) } } -int wxGrid::GetDefaultRowSize() +int wxGrid::GetDefaultRowSize() const { return m_defaultRowHeight; } -int wxGrid::GetRowSize( int row ) +int wxGrid::GetRowSize( int row ) const { wxCHECK_MSG( row >= 0 && row < m_numRows, 0, _T("invalid row index") ); return GetRowHeight(row); } -int wxGrid::GetDefaultColSize() +int wxGrid::GetDefaultColSize() const { return m_defaultColWidth; } -int wxGrid::GetColSize( int col ) +int wxGrid::GetColSize( int col ) const { wxCHECK_MSG( col >= 0 && col < m_numCols, 0, _T("invalid column index") ); @@ -9707,30 +9803,30 @@ void wxGrid::SetDefaultEditor(wxGridCellEditor *editor) } // ---------------------------------------------------------------------------- -// access to the default attrbiutes +// access to the default attributes // ---------------------------------------------------------------------------- -wxColour wxGrid::GetDefaultCellBackgroundColour() +wxColour wxGrid::GetDefaultCellBackgroundColour() const { return m_defaultCellAttr->GetBackgroundColour(); } -wxColour wxGrid::GetDefaultCellTextColour() +wxColour wxGrid::GetDefaultCellTextColour() const { return m_defaultCellAttr->GetTextColour(); } -wxFont wxGrid::GetDefaultCellFont() +wxFont wxGrid::GetDefaultCellFont() const { return m_defaultCellAttr->GetFont(); } -void wxGrid::GetDefaultCellAlignment( int *horiz, int *vert ) +void wxGrid::GetDefaultCellAlignment( int *horiz, int *vert ) const { m_defaultCellAttr->GetAlignment(horiz, vert); } -bool wxGrid::GetDefaultCellOverflow() +bool wxGrid::GetDefaultCellOverflow() const { return m_defaultCellAttr->GetOverflow(); } @@ -9749,7 +9845,7 @@ wxGridCellEditor *wxGrid::GetDefaultEditor() const // access to cell attributes // ---------------------------------------------------------------------------- -wxColour wxGrid::GetCellBackgroundColour(int row, int col) +wxColour wxGrid::GetCellBackgroundColour(int row, int col) const { wxGridCellAttr *attr = GetCellAttr(row, col); wxColour colour = attr->GetBackgroundColour(); @@ -9758,7 +9854,7 @@ wxColour wxGrid::GetCellBackgroundColour(int row, int col) return colour; } -wxColour wxGrid::GetCellTextColour( int row, int col ) +wxColour wxGrid::GetCellTextColour( int row, int col ) const { wxGridCellAttr *attr = GetCellAttr(row, col); wxColour colour = attr->GetTextColour(); @@ -9767,7 +9863,7 @@ wxColour wxGrid::GetCellTextColour( int row, int col ) return colour; } -wxFont wxGrid::GetCellFont( int row, int col ) +wxFont wxGrid::GetCellFont( int row, int col ) const { wxGridCellAttr *attr = GetCellAttr(row, col); wxFont font = attr->GetFont(); @@ -9776,14 +9872,14 @@ wxFont wxGrid::GetCellFont( int row, int col ) return font; } -void wxGrid::GetCellAlignment( int row, int col, int *horiz, int *vert ) +void wxGrid::GetCellAlignment( int row, int col, int *horiz, int *vert ) const { wxGridCellAttr *attr = GetCellAttr(row, col); attr->GetAlignment(horiz, vert); attr->DecRef(); } -bool wxGrid::GetCellOverflow( int row, int col ) +bool wxGrid::GetCellOverflow( int row, int col ) const { wxGridCellAttr *attr = GetCellAttr(row, col); bool allow = attr->GetOverflow(); @@ -9792,14 +9888,14 @@ bool wxGrid::GetCellOverflow( int row, int col ) return allow; } -void wxGrid::GetCellSize( int row, int col, int *num_rows, int *num_cols ) +void wxGrid::GetCellSize( int row, int col, int *num_rows, int *num_cols ) const { wxGridCellAttr *attr = GetCellAttr(row, col); attr->GetSize( num_rows, num_cols ); attr->DecRef(); } -wxGridCellRenderer* wxGrid::GetCellRenderer(int row, int col) +wxGridCellRenderer* wxGrid::GetCellRenderer(int row, int col) const { wxGridCellAttr* attr = GetCellAttr(row, col); wxGridCellRenderer* renderer = attr->GetRenderer(this, row, col); @@ -9808,7 +9904,7 @@ wxGridCellRenderer* wxGrid::GetCellRenderer(int row, int col) return renderer; } -wxGridCellEditor* wxGrid::GetCellEditor(int row, int col) +wxGridCellEditor* wxGrid::GetCellEditor(int row, int col) const { wxGridCellAttr* attr = GetCellAttr(row, col); wxGridCellEditor* editor = attr->GetEditor(this, row, col); @@ -9830,7 +9926,7 @@ bool wxGrid::IsReadOnly(int row, int col) const // attribute support: cache, automatic provider creation, ... // ---------------------------------------------------------------------------- -bool wxGrid::CanHaveAttributes() +bool wxGrid::CanHaveAttributes() const { if ( !m_table ) { @@ -10184,10 +10280,7 @@ wxGridCellEditor * wxGrid::GetDefaultEditorForType(const wxString& typeName) con int index = m_typeRegistry->FindOrCloneDataType(typeName); if ( index == wxNOT_FOUND ) { - wxString errStr; - - errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str()); - wxFAIL_MSG(errStr.c_str()); + wxFAIL_MSG(wxString::Format(wxT("Unknown data type name [%s]"), typeName.c_str())); return NULL; } @@ -10200,10 +10293,7 @@ wxGridCellRenderer * wxGrid::GetDefaultRendererForType(const wxString& typeName) int index = m_typeRegistry->FindOrCloneDataType(typeName); if ( index == wxNOT_FOUND ) { - wxString errStr; - - errStr.Printf(wxT("Unknown data type name [%s]"), typeName.c_str()); - wxFAIL_MSG(errStr.c_str()); + wxFAIL_MSG(wxString::Format(wxT("Unknown data type name [%s]"), typeName.c_str())); return NULL; } @@ -10281,7 +10371,8 @@ void wxGrid::SetRowSize( int row, int height ) void wxGrid::SetDefaultColSize( int width, bool resizeExistingCols ) { - m_defaultColWidth = wxMax( width, m_minAcceptableColWidth ); + // we dont allow zero default column width + m_defaultColWidth = wxMax( wxMax( width, m_minAcceptableColWidth ), 1 ); if ( resizeExistingCols ) { @@ -10406,8 +10497,11 @@ int wxGrid::GetRowMinimalAcceptableHeight() const // auto sizing // ---------------------------------------------------------------------------- -void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column ) +void +wxGrid::AutoSizeColOrRow(int colOrRow, bool setAsMin, wxGridDirection direction) { + const bool column = direction == wxGRID_COLUMN; + wxClientDC dc(m_gridWin); // cancel editing of cell @@ -10518,12 +10612,66 @@ void wxGrid::AutoSizeColOrRow( int colOrRow, bool setAsMin, bool column ) } } +wxCoord wxGrid::CalcColOrRowLabelAreaMinSize(wxGridDirection direction) +{ + // calculate size for the rows or columns? + const bool calcRows = direction == wxGRID_ROW; + + wxClientDC dc(calcRows ? GetGridRowLabelWindow() + : GetGridColLabelWindow()); + dc.SetFont(GetLabelFont()); + + // which dimension should we take into account for calculations? + // + // for columns, the text can be only horizontal so it's easy but for rows + // we also have to take into account the text orientation + const bool + useWidth = calcRows || (GetColLabelTextOrientation() == wxVERTICAL); + + wxArrayString lines; + wxCoord extentMax = 0; + + const int numRowsOrCols = calcRows ? m_numRows : m_numCols; + for ( int rowOrCol = 0; rowOrCol < numRowsOrCols; rowOrCol++ ) + { + lines.Clear(); + + wxString label = calcRows ? GetRowLabelValue(rowOrCol) + : GetColLabelValue(rowOrCol); + StringToLines(label, lines); + + long w, h; + GetTextBoxSize(dc, lines, &w, &h); + + const wxCoord extent = useWidth ? w : h; + if ( extent > extentMax ) + extentMax = extent; + } + + if ( !extentMax ) + { + // empty column - give default extent (notice that if extentMax is less + // than default extent but != 0, it's OK) + extentMax = calcRows ? GetDefaultRowLabelSize() + : GetDefaultColLabelSize(); + } + + // leave some space around text (taken from AutoSizeColOrRow) + if ( calcRows ) + extentMax += 10; + else + extentMax += 6; + + return extentMax; +} + int wxGrid::SetOrCalcColumnSizes(bool calcOnly, bool setAsMin) { int width = m_rowLabelWidth; - if ( !calcOnly ) - BeginBatch(); + wxGridUpdateLocker locker; + if(!calcOnly) + locker.Create(this); for ( int col = 0; col < m_numCols; col++ ) { @@ -10533,9 +10681,6 @@ int wxGrid::SetOrCalcColumnSizes(bool calcOnly, bool setAsMin) width += GetColWidth(col); } - if ( !calcOnly ) - EndBatch(); - return width; } @@ -10543,8 +10688,9 @@ int wxGrid::SetOrCalcRowSizes(bool calcOnly, bool setAsMin) { int height = m_colLabelHeight; - if ( !calcOnly ) - BeginBatch(); + wxGridUpdateLocker locker; + if(!calcOnly) + locker.Create(this); for ( int row = 0; row < m_numRows; row++ ) { @@ -10554,15 +10700,12 @@ int wxGrid::SetOrCalcRowSizes(bool calcOnly, bool setAsMin) height += GetRowHeight(row); } - if ( !calcOnly ) - EndBatch(); - return height; } void wxGrid::AutoSize() { - BeginBatch(); + wxGridUpdateLocker locker(this); // we need to round up the size of the scrollable area to a multiple of // scroll step to ensure that we don't get the scrollbars when we're sized @@ -10628,8 +10771,6 @@ void wxGrid::AutoSize() // client size but also leave space for (not needed any more) scrollbars SetScrollbars(0, 0, 0, 0, 0, 0, true); SetClientSize(sizeFit.x + m_rowLabelWidth, sizeFit.y + m_colLabelHeight); - - EndBatch(); } void wxGrid::AutoSizeRowLabelSize( int row ) @@ -10837,7 +10978,7 @@ void wxGrid::DeselectCell( int row, int col ) m_selection->ToggleCellSelection(row, col); } -bool wxGrid::IsSelection() +bool wxGrid::IsSelection() const { return ( m_selection && (m_selection->IsSelection() || ( m_selectingTopLeft != wxGridNoCellCoords && @@ -10921,7 +11062,7 @@ void wxGrid::ClearSelection() // in device coords clipped to the client size of the grid window. // wxRect wxGrid::BlockToDeviceRect( const wxGridCellCoords &topLeft, - const wxGridCellCoords &bottomRight ) + const wxGridCellCoords &bottomRight ) const { wxRect rect( wxGridNoCellRect ); wxRect cellRect;