X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0ed3b812302781d15007b1b1382261d6043d24a1..2ee322d90c0c0f39d4a3c5f0c942bbda4c7baa1a:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 26a4668ae0..e3436a8233 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -627,7 +627,11 @@ void wxGridCellTextEditor::Create(wxWindow* parent, m_control = new wxTextCtrl(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize #if defined(__WXMSW__) - , wxTE_PROCESS_TAB | wxTE_AUTO_SCROLL | wxNO_BORDER + , + wxTE_PROCESS_ENTER | + wxTE_PROCESS_TAB | + wxTE_AUTO_SCROLL | + wxNO_BORDER #endif ); @@ -2471,7 +2475,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; @@ -2515,7 +2519,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; @@ -4353,24 +4357,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) @@ -4382,7 +4395,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; @@ -4623,6 +4657,33 @@ void wxGrid::CalcWindowSizes() int cw, ch; GetClientSize( &cw, &ch ); + // this block of code tries to work around the following problem: the grid + // could have been just resized to have enough space to show the full grid + // window contents without the scrollbars, but its client size could be + // not big enough because the grid has the scrollbars right now and so the + // scrollbars would remain even though we don't need them any more + // + // to prevent this from happening, check if we have enough space for + // everything without the scrollbars and explicitly disable them then + wxSize size = GetSize() - GetWindowBorderSize(); + if ( size != wxSize(cw, ch) ) + { + // check if we have enough space for grid window after accounting for + // the fixed size elements + size.x -= m_rowLabelWidth; + size.y -= m_colLabelHeight; + + const wxSize vsize = m_gridWin->GetVirtualSize(); + + if ( size.x >= vsize.x && size.y >= vsize.y ) + { + // yes, we do, so remove the scrollbars and use the new client size + // (which should be the same as full window size - borders now) + SetScrollbars(0, 0, 0, 0); + GetClientSize(&cw, &ch); + } + } + if ( m_cornerLabelWin && m_cornerLabelWin->IsShown() ) m_cornerLabelWin->SetSize( 0, 0, m_rowLabelWidth, m_colLabelHeight ); @@ -5014,7 +5075,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; @@ -5065,7 +5126,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; @@ -5119,7 +5180,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; @@ -5860,13 +5921,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() ) @@ -5886,6 +5940,7 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event ) coords.GetRow(), coords.GetCol(), event ); + return; } } else @@ -5907,6 +5962,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 ) { @@ -8061,7 +8124,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; @@ -8095,7 +8158,7 @@ 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; @@ -8282,7 +8345,8 @@ void wxGrid::ShowCellEditControl() // might not cover the entire cell wxClientDC dc( m_gridWin ); PrepareDC( dc ); - dc.SetBrush(wxBrush(GetCellAttr(row, col)->GetBackgroundColour(), wxSOLID)); + wxGridCellAttr* attr = GetCellAttr(row, col); + dc.SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID)); dc.SetPen(*wxTRANSPARENT_PEN); dc.DrawRectangle(rect); @@ -8302,7 +8366,6 @@ void wxGrid::ShowCellEditControl() if (rect.y > 0) rect.y--; - wxGridCellAttr* attr = GetCellAttr(row, col); wxGridCellEditor* editor = attr->GetEditor(this, row, col); if ( !editor->IsCreated() ) { @@ -8442,7 +8505,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); @@ -8524,19 +8587,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; @@ -8602,7 +8664,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); @@ -8624,7 +8686,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); @@ -8642,7 +8704,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 ); @@ -8677,7 +8739,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 // @@ -9255,7 +9317,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; @@ -9263,7 +9325,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; @@ -9271,12 +9333,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 ) { @@ -9290,7 +9352,7 @@ wxString wxGrid::GetRowLabelValue( int row ) } } -wxString wxGrid::GetColLabelValue( int col ) +wxString wxGrid::GetColLabelValue( int col ) const { if ( m_table ) { @@ -9595,24 +9657,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") ); @@ -9676,30 +9738,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(); } @@ -9718,7 +9780,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(); @@ -9727,7 +9789,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(); @@ -9736,7 +9798,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(); @@ -9745,14 +9807,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(); @@ -9761,14 +9823,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); @@ -9777,7 +9839,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); @@ -9799,7 +9861,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 ) { @@ -10250,7 +10312,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 ) { @@ -10595,7 +10658,7 @@ void wxGrid::AutoSize() // we know that we're not going to have scrollbars so disable them now to // avoid trouble in SetClientSize() which can otherwise set the correct // client size but also leave space for (not needed any more) scrollbars - SetScrollbars(0, 0, 0, 0, 0, true); + SetScrollbars(0, 0, 0, 0, 0, 0, true); SetClientSize(sizeFit.x + m_rowLabelWidth, sizeFit.y + m_colLabelHeight); EndBatch(); @@ -10652,46 +10715,22 @@ void wxGrid::AutoSizeColLabelSize( int col ) wxSize wxGrid::DoGetBestSize() const { - // don't set sizes, only calculate them wxGrid *self = (wxGrid *)this; // const_cast - int width, height; - width = self->SetOrCalcColumnSizes(true); - height = self->SetOrCalcRowSizes(true); - - 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 incantation for that? - int xpu, ypu; - GetScrollPixelsPerUnit(&xpu, &ypu); - if (xpu) - 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; - if ( width > maxwidth ) - width = maxwidth; - if ( height > maxheight ) - height = maxheight; - - wxSize best(width, height); + // we do the same as in AutoSize() here with the exception that we don't + // change the column/row sizes, only calculate them + wxSize size(self->SetOrCalcColumnSizes(true) - m_rowLabelWidth + m_extraWidth, + self->SetOrCalcRowSizes(true) - m_colLabelHeight + m_extraHeight); + wxSize sizeFit(GetScrollX(size.x) * GetScrollLineX(), + GetScrollY(size.y) * GetScrollLineY()); // NOTE: This size should be cached, but first we need to add calls to // InvalidateBestSize everywhere that could change the results of this // calculation. // CacheBestSize(size); - return best; + return wxSize(sizeFit.x + m_rowLabelWidth, sizeFit.y + m_colLabelHeight) + + GetWindowBorderSize(); } void wxGrid::Fit() @@ -10830,7 +10869,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 && @@ -10914,7 +10953,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;