X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/82edfbe7d99a970b00ca37e5017ce74c3c9a37e0..345ff9c65b3ef17709785708b224dfcbf5135583:/src/generic/grid.cpp?ds=inline diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 231630ea02..2ce9f06c70 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -197,8 +197,6 @@ wxGridCellWorker::~wxGridCellWorker() void wxGridCellAttr::Init(wxGridCellAttr *attrDefault) { - m_nRef = 1; - m_isReadOnly = Unset; m_renderer = NULL; @@ -645,30 +643,30 @@ void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol) { if ( attr ) { - // add the attribute - no need to do anything to reference count - // since we take ownership of the attribute. + // store the new attribute, taking its ownership m_rowsOrCols.Add(rowOrCol); m_attrs.Add(attr); } // nothing to remove } - else + else // we have an attribute for this row or column { size_t n = (size_t)i; - if ( m_attrs[n] == attr ) - // nothing to do - return; + + // notice that this code works correctly even when the old attribute is + // the same as the new one: as we own of it, we must call DecRef() on + // it in any case and this won't result in destruction of the new + // attribute if it's the same as old one because it must have ref count + // of at least 2 to be passed to us while we keep a reference to it too + m_attrs[n]->DecRef(); + if ( attr ) { - // change the attribute, handling reference count manually, - // taking ownership of the new attribute. - m_attrs[n]->DecRef(); + // replace the attribute with the new one m_attrs[n] = attr; } - else + else // remove the attribute { - // remove this attribute, handling reference count manually - m_attrs[n]->DecRef(); m_rowsOrCols.RemoveAt(n); m_attrs.RemoveAt(n); } @@ -1017,7 +1015,7 @@ wxString wxGridTableBase::GetColLabelValue( int col ) unsigned int i, n; for ( n = 1; ; n++ ) { - s += (wxChar) (_T('A') + (wxChar)(col % 26)); + s += (wxChar) (wxT('A') + (wxChar)(col % 26)); col = col / 26 - 1; if ( col < 0 ) break; @@ -1127,11 +1125,14 @@ IMPLEMENT_DYNAMIC_CLASS( wxGridStringTable, wxGridTableBase ) wxGridStringTable::wxGridStringTable() : wxGridTableBase() { + m_numCols = 0; } wxGridStringTable::wxGridStringTable( int numRows, int numCols ) : wxGridTableBase() { + m_numCols = numCols; + m_data.Alloc( numRows ); wxArrayString sa; @@ -1141,36 +1142,21 @@ wxGridStringTable::wxGridStringTable( int numRows, int numCols ) m_data.Add( sa, numRows ); } -wxGridStringTable::~wxGridStringTable() -{ -} - -int wxGridStringTable::GetNumberRows() -{ - return m_data.GetCount(); -} - -int wxGridStringTable::GetNumberCols() -{ - if ( m_data.GetCount() > 0 ) - return m_data[0].GetCount(); - else - return 0; -} - wxString wxGridStringTable::GetValue( int row, int col ) { - wxCHECK_MSG( (row < GetNumberRows()) && (col < GetNumberCols()), + wxCHECK_MSG( (row >= 0 && row < GetNumberRows()) && + (col >= 0 && col < GetNumberCols()), wxEmptyString, - _T("invalid row or column index in wxGridStringTable") ); + wxT("invalid row or column index in wxGridStringTable") ); return m_data[row][col]; } void wxGridStringTable::SetValue( int row, int col, const wxString& value ) { - wxCHECK_RET( (row < GetNumberRows()) && (col < GetNumberCols()), - _T("invalid row or column index in wxGridStringTable") ); + wxCHECK_RET( (row >= 0 && row < GetNumberRows()) && + (col >= 0 && col < GetNumberCols()), + wxT("invalid row or column index in wxGridStringTable") ); m_data[row][col] = value; } @@ -1327,6 +1313,8 @@ bool wxGridStringTable::InsertCols( size_t pos, size_t numCols ) } } + m_numCols += numCols; + if ( GetView() ) { wxGridTableMessage msg( this, @@ -1351,6 +1339,8 @@ bool wxGridStringTable::AppendCols( size_t numCols ) m_data[row].Add( wxEmptyString, numCols ); } + m_numCols += numCols; + if ( GetView() ) { wxGridTableMessage msg( this, @@ -1404,16 +1394,23 @@ bool wxGridStringTable::DeleteCols( size_t pos, size_t numCols ) m_colLabels.RemoveAt( colID, nToRm ); } - for ( row = 0; row < curNumRows; row++ ) + if ( numCols >= curNumCols ) { - if ( numCols >= curNumCols ) + for ( row = 0; row < curNumRows; row++ ) { m_data[row].Clear(); } - else + + m_numCols = 0; + } + else // something will be left + { + for ( row = 0; row < curNumRows; row++ ) { m_data[row].RemoveAt( colID, numCols ); } + + m_numCols -= numCols; } if ( GetView() ) @@ -1811,7 +1808,7 @@ wxGrid::~wxGrid() #ifdef DEBUG_ATTR_CACHE size_t total = gs_nAttrCacheHits + gs_nAttrCacheMisses; - wxPrintf(_T("wxGrid attribute cache statistics: " + wxPrintf(wxT("wxGrid attribute cache statistics: " "total: %u, hits: %u (%u%%)\n"), total, gs_nAttrCacheHits, total ? (gs_nAttrCacheHits*100) / total : 0); @@ -2969,8 +2966,12 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) if ( row != wxNOT_FOUND && CanDragRowSize(row) ) { // adjust row height depending on label text + // + // TODO: generate RESIZING event, see #10754 AutoSizeRowLabelSize( row ); + SendGridSizeEvent(wxEVT_GRID_ROW_SIZE, row, -1, event); + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, GetColLabelWindow()); m_dragLastPos = -1; } @@ -2990,14 +2991,7 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event ) else if ( event.LeftUp() ) { if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) - { - DoEndDragResizeRow(); - - // Note: we are ending the event *after* doing - // default processing in this case - // - SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); - } + DoEndDragResizeRow(event); ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, m_rowLabelWin); m_dragLastPos = -1; @@ -3318,8 +3312,12 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) else { // adjust column width depending on label text + // + // TODO: generate RESIZING event, see #10754 AutoSizeColLabelSize( colEdge ); + SendGridSizeEvent(wxEVT_GRID_COL_SIZE, -1, colEdge, event); + ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL, GetColLabelWindow()); m_dragLastPos = -1; } @@ -3332,7 +3330,7 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event ) switch ( m_cursorMode ) { case WXGRID_CURSOR_RESIZE_COL: - DoEndDragResizeCol(); + DoEndDragResizeCol(event); break; case WXGRID_CURSOR_MOVE_COL: @@ -3460,19 +3458,19 @@ void wxGrid::ChangeCursorMode(CursorMode mode, #if wxUSE_LOG_TRACE static const wxChar *cursorModes[] = { - _T("SELECT_CELL"), - _T("RESIZE_ROW"), - _T("RESIZE_COL"), - _T("SELECT_ROW"), - _T("SELECT_COL"), - _T("MOVE_COL"), + wxT("SELECT_CELL"), + wxT("RESIZE_ROW"), + wxT("RESIZE_COL"), + wxT("SELECT_ROW"), + wxT("SELECT_COL"), + wxT("MOVE_COL"), }; - wxLogTrace(_T("grid"), - _T("wxGrid cursor mode (mouse capture for %s): %s -> %s"), - win == m_colWindow ? _T("colLabelWin") - : win ? _T("rowLabelWin") - : _T("gridWin"), + wxLogTrace(wxT("grid"), + wxT("wxGrid cursor mode (mouse capture for %s): %s -> %s"), + win == m_colWindow ? wxT("colLabelWin") + : win ? wxT("rowLabelWin") + : wxT("gridWin"), cursorModes[m_cursorMode], cursorModes[mode]); #endif // wxUSE_LOG_TRACE @@ -3754,17 +3752,12 @@ wxGrid::DoGridCellLeftUp(wxMouseEvent& event, const wxGridCellCoords& coords) else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_ROW ) { ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); - DoEndDragResizeRow(); - - // Note: we are ending the event *after* doing - // default processing in this case - // - SendEvent( wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event ); + DoEndDragResizeRow(event); } else if ( m_cursorMode == WXGRID_CURSOR_RESIZE_COL ) { ChangeCursorMode(WXGRID_CURSOR_SELECT_CELL); - DoEndDragResizeCol(); + DoEndDragResizeCol(event); } m_dragLastPos = -1; @@ -3894,10 +3887,11 @@ void wxGrid::ProcessGridCellMouseEvent(wxMouseEvent& event) } } -void wxGrid::DoEndDragResizeLine(const wxGridOperations& oper) +// this function returns true only if the size really changed +bool wxGrid::DoEndDragResizeLine(const wxGridOperations& oper) { if ( m_dragLastPos == -1 ) - return; + return false; const wxGridOperations& doper = oper.Dual(); @@ -3921,9 +3915,12 @@ void wxGrid::DoEndDragResizeLine(const wxGridOperations& oper) // do resize the line const int lineStart = oper.GetLineStartPos(this, m_dragRowOrCol); + const int lineSizeOld = oper.GetLineSize(this, m_dragRowOrCol); oper.SetLineSize(this, m_dragRowOrCol, wxMax(m_dragLastPos - lineStart, oper.GetMinimalLineSize(this, m_dragRowOrCol))); + const bool + sizeChanged = oper.GetLineSize(this, m_dragRowOrCol) != lineSizeOld; m_dragLastPos = -1; @@ -3986,24 +3983,24 @@ void wxGrid::DoEndDragResizeLine(const wxGridOperations& oper) // show the edit control back again ShowCellEditControl(); + + return sizeChanged; } -void wxGrid::DoEndDragResizeRow() +void wxGrid::DoEndDragResizeRow(const wxMouseEvent& event) { - DoEndDragResizeLine(wxGridRowOperations()); + // TODO: generate RESIZING event, see #10754 + + if ( DoEndDragResizeLine(wxGridRowOperations()) ) + SendGridSizeEvent(wxEVT_GRID_ROW_SIZE, m_dragRowOrCol, -1, event); } -void wxGrid::DoEndDragResizeCol(wxMouseEvent *event) +void wxGrid::DoEndDragResizeCol(const wxMouseEvent& event) { - DoEndDragResizeLine(wxGridColumnOperations()); + // TODO: generate RESIZING event, see #10754 - // Note: we are ending the event *after* doing - // default processing in this case - // - if ( event ) - SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, *event ); - else - SendEvent( wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol ); + if ( DoEndDragResizeLine(wxGridColumnOperations()) ) + SendGridSizeEvent(wxEVT_GRID_COL_SIZE, -1, m_dragRowOrCol, event); } void wxGrid::DoStartMoveCol(int col) @@ -4177,9 +4174,27 @@ wxGrid::DoAppendLines(bool (wxGridTableBase::*funcAppend)(size_t), return (m_table->*funcAppend)(num); } -// -// ----- event handlers -// +// ---------------------------------------------------------------------------- +// event generation helpers +// ---------------------------------------------------------------------------- + +void +wxGrid::SendGridSizeEvent(wxEventType type, + int row, int col, + const wxMouseEvent& mouseEv) +{ + int rowOrCol = row == -1 ? col : row; + + wxGridSizeEvent gridEvt( GetId(), + type, + this, + rowOrCol, + mouseEv.GetX() + GetRowLabelSize(), + mouseEv.GetY() + GetColLabelSize(), + mouseEv); + + GetEventHandler()->ProcessEvent(gridEvt); +} // Generate a grid event based on a mouse event and return: // -1 if the event was vetoed @@ -4188,26 +4203,11 @@ wxGrid::DoAppendLines(bool (wxGridTableBase::*funcAppend)(size_t), int wxGrid::SendEvent(const wxEventType type, int row, int col, - wxMouseEvent& mouseEv) + const wxMouseEvent& mouseEv) { bool claimed, vetoed; - if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE ) - { - int rowOrCol = (row == -1 ? col : row); - - wxGridSizeEvent gridEvt( GetId(), - type, - this, - rowOrCol, - mouseEv.GetX() + GetRowLabelSize(), - mouseEv.GetY() + GetColLabelSize(), - mouseEv); - - claimed = GetEventHandler()->ProcessEvent(gridEvt); - vetoed = !gridEvt.IsAllowed(); - } - else if ( type == wxEVT_GRID_RANGE_SELECT ) + if ( type == wxEVT_GRID_RANGE_SELECT ) { // Right now, it should _never_ end up here! wxGridRangeSelectEvent gridEvt( GetId(), @@ -4270,28 +4270,13 @@ wxGrid::SendEvent(const wxEventType type, int wxGrid::SendEvent(const wxEventType type, int row, int col, const wxString& s) { - bool claimed, vetoed; - - if ( type == wxEVT_GRID_ROW_SIZE || type == wxEVT_GRID_COL_SIZE ) - { - int rowOrCol = (row == -1 ? col : row); - - wxGridSizeEvent gridEvt( GetId(), type, this, rowOrCol ); - - claimed = GetEventHandler()->ProcessEvent(gridEvt); - vetoed = !gridEvt.IsAllowed(); - } - else - { - wxGridEvent gridEvt( GetId(), type, this, row, col ); - gridEvt.SetString(s); + wxGridEvent gridEvt( GetId(), type, this, row, col ); + gridEvt.SetString(s); - claimed = GetEventHandler()->ProcessEvent(gridEvt); - vetoed = !gridEvt.IsAllowed(); - } + const bool claimed = GetEventHandler()->ProcessEvent(gridEvt); // A Veto'd event may not be `claimed' so test this first - if (vetoed) + if ( !gridEvt.IsAllowed() ) return -1; return claimed ? 1 : 0; @@ -5728,7 +5713,7 @@ void wxGrid::EnableCellEditControl( bool enable ) return; // this should be checked by the caller! - wxASSERT_MSG( CanEnableCellControl(), _T("can't enable editing for this cell!") ); + wxASSERT_MSG( CanEnableCellControl(), wxT("can't enable editing for this cell!") ); // do it before ShowCellEditControl() m_cellEditCtrlEnabled = enable; @@ -6885,7 +6870,7 @@ int wxGrid::GetDefaultRowSize() const int wxGrid::GetRowSize( int row ) const { - wxCHECK_MSG( row >= 0 && row < m_numRows, 0, _T("invalid row index") ); + wxCHECK_MSG( row >= 0 && row < m_numRows, 0, wxT("invalid row index") ); return GetRowHeight(row); } @@ -6897,7 +6882,7 @@ int wxGrid::GetDefaultColSize() const int wxGrid::GetColSize( int col ) const { - wxCHECK_MSG( col >= 0 && col < m_numCols, 0, _T("invalid column index") ); + wxCHECK_MSG( col >= 0 && col < m_numCols, 0, wxT("invalid column index") ); return GetColWidth(col); } @@ -7177,8 +7162,8 @@ wxGridCellAttr *wxGrid::GetOrCreateCellAttr(int row, int col) const wxGridCellAttr *attr = NULL; bool canHave = ((wxGrid*)this)->CanHaveAttributes(); - wxCHECK_MSG( canHave, attr, _T("Cell attributes not allowed")); - wxCHECK_MSG( m_table, attr, _T("must have a table") ); + wxCHECK_MSG( canHave, attr, wxT("Cell attributes not allowed")); + wxCHECK_MSG( m_table, attr, wxT("must have a table") ); attr = m_table->GetAttr(row, col, wxGridCellAttr::Cell); if ( !attr ) @@ -7212,7 +7197,7 @@ void wxGrid::SetColFormatFloat(int col, int width, int precision) wxString typeName = wxGRID_VALUE_FLOAT; if ( (width != -1) || (precision != -1) ) { - typeName << _T(':') << width << _T(',') << precision; + typeName << wxT(':') << width << wxT(',') << precision; } SetColFormatCustom(col, typeName); @@ -7523,7 +7508,7 @@ void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows ) void wxGrid::SetRowSize( int row, int height ) { - wxCHECK_RET( row >= 0 && row < m_numRows, _T("invalid row index") ); + wxCHECK_RET( row >= 0 && row < m_numRows, wxT("invalid row index") ); // if < 0 then calculate new height from label if ( height < 0 ) @@ -7581,7 +7566,7 @@ void wxGrid::SetDefaultColSize( int width, bool resizeExistingCols ) void wxGrid::SetColSize( int col, int width ) { - wxCHECK_RET( col >= 0 && col < m_numCols, _T("invalid column index") ); + wxCHECK_RET( col >= 0 && col < m_numCols, wxT("invalid column index") ); // if < 0 then calculate new width from label if ( width < 0 ) @@ -8569,7 +8554,7 @@ int wxGridTypeRegistry::FindOrCloneDataType(const wxString& typeName) { // the first part of the typename is the "real" type, anything after ':' // are the parameters for the renderer - index = FindDataType(typeName.BeforeFirst(_T(':'))); + index = FindDataType(typeName.BeforeFirst(wxT(':'))); if ( index == wxNOT_FOUND ) { return wxNOT_FOUND; @@ -8586,7 +8571,7 @@ int wxGridTypeRegistry::FindOrCloneDataType(const wxString& typeName) editorOld->DecRef(); // do it even if there are no parameters to reset them to defaults - wxString params = typeName.AfterFirst(_T(':')); + wxString params = typeName.AfterFirst(wxT(':')); renderer->SetParameters(params); editor->SetParameters(params);