X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/52068ea5ff2e7937581c850d17fb6cad7e599c4b..c8b4eea8f23cd90e8b8390f2a742f0f828c57461:/src/generic/grid.cpp diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index 5d24c4943d..4d9ee47b80 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -1,4 +1,4 @@ -//////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// // Name: grid.cpp // Purpose: wxGrid and related classes // Author: Michael Bedward (based on code by Julian Smart, Robin Dunn) @@ -63,8 +63,8 @@ wxGridTableBase::~wxGridTableBase() bool wxGridTableBase::InsertRows( size_t pos, size_t numRows ) { - wxLogWarning( "Called grid table class function InsertRows(pos=%d, N=%d)\n" - "but your derived table class does not override this function", + wxLogWarning( wxT("Called grid table class function InsertRows(pos=%d, N=%d)\n" + "but your derived table class does not override this function"), pos, numRows ); return FALSE; @@ -72,8 +72,8 @@ bool wxGridTableBase::InsertRows( size_t pos, size_t numRows ) bool wxGridTableBase::AppendRows( size_t numRows ) { - wxLogWarning( "Called grid table class function AppendRows(N=%d)\n" - "but your derived table class does not override this function", + wxLogWarning( wxT("Called grid table class function AppendRows(N=%d)\n" + "but your derived table class does not override this function"), numRows ); return FALSE; @@ -81,8 +81,8 @@ bool wxGridTableBase::AppendRows( size_t numRows ) bool wxGridTableBase::DeleteRows( size_t pos, size_t numRows ) { - wxLogWarning( "Called grid table class function DeleteRows(pos=%d, N=%d)\n" - "but your derived table class does not override this function", + wxLogWarning( wxT("Called grid table class function DeleteRows(pos=%d, N=%d)\n" + "but your derived table class does not override this function"), pos, numRows ); return FALSE; @@ -90,8 +90,8 @@ bool wxGridTableBase::DeleteRows( size_t pos, size_t numRows ) bool wxGridTableBase::InsertCols( size_t pos, size_t numCols ) { - wxLogWarning( "Called grid table class function InsertCols(pos=%d, N=%d)\n" - "but your derived table class does not override this function", + wxLogWarning( wxT("Called grid table class function InsertCols(pos=%d, N=%d)\n" + "but your derived table class does not override this function"), pos, numCols ); return FALSE; @@ -99,8 +99,8 @@ bool wxGridTableBase::InsertCols( size_t pos, size_t numCols ) bool wxGridTableBase::AppendCols( size_t numCols ) { - wxLogWarning( "Called grid table class function AppendCols(N=%d)\n" - "but your derived table class does not override this function", + wxLogWarning( wxT("Called grid table class function AppendCols(N=%d)\n" + "but your derived table class does not override this function"), numCols ); return FALSE; @@ -108,8 +108,8 @@ bool wxGridTableBase::AppendCols( size_t numCols ) bool wxGridTableBase::DeleteCols( size_t pos, size_t numCols ) { - wxLogWarning( "Called grid table class function DeleteCols(pos=%d, N=%d)\n" - "but your derived table class does not override this function", + wxLogWarning( wxT("Called grid table class function DeleteCols(pos=%d, N=%d)\n" + "but your derived table class does not override this function"), pos, numCols ); return FALSE; @@ -184,7 +184,7 @@ wxGridTableMessage::wxGridTableMessage( wxGridTableBase *table, int id, // this is a magic incantation which must be done! -#include +#include "wx/arrimpl.cpp" WX_DEFINE_OBJARRAY(wxGridStringArray) @@ -354,8 +354,8 @@ bool wxGridStringTable::DeleteRows( size_t pos, size_t numRows ) if ( pos >= curNumRows ) { - wxLogError( "Called wxGridStringTable::DeleteRows(pos=%d, N=%d)...\n" - "Pos value is invalid for present table with %d rows", + wxLogError( wxT("Called wxGridStringTable::DeleteRows(pos=%d, N=%d)...\n" + "Pos value is invalid for present table with %d rows"), pos, numRows, curNumRows ); return FALSE; } @@ -432,8 +432,8 @@ bool wxGridStringTable::AppendCols( size_t numCols ) { // TODO: something better than this ? // - wxLogError( "Unable to append cols to a grid table with no rows.\n" - "Call AppendRows() first" ); + wxLogError( wxT("Unable to append cols to a grid table with no rows.\n" + "Call AppendRows() first") ); return FALSE; } @@ -466,8 +466,8 @@ bool wxGridStringTable::DeleteCols( size_t pos, size_t numCols ) if ( pos >= curNumCols ) { - wxLogError( "Called wxGridStringTable::DeleteCols(pos=%d, N=%d)...\n" - "Pos value is invalid for present table with %d cols", + wxLogError( wxT("Called wxGridStringTable::DeleteCols(pos=%d, N=%d)...\n" + "Pos value is invalid for present table with %d cols"), pos, numCols, curNumCols ); return FALSE; } @@ -740,20 +740,24 @@ void wxGrid::Init() m_rowHeights.Alloc( m_numRows ); m_rowBottoms.Alloc( m_numRows ); + m_sumRowHeights = 0; for ( i = 0; i < m_numRows; i++ ) { m_rowHeights.Add( m_defaultRowHeight ); m_rowBottoms.Add( 0 ); // set by CalcDimensions() } - + m_sumRowHeights = m_defaultRowHeight * m_numRows; + m_colWidths.Alloc( m_numCols ); m_colRights.Alloc( m_numRows ); + m_sumColWidths = 0; for ( i = 0; i < m_numCols; i++ ) { m_colWidths.Add( m_defaultColWidth ); m_colRights.Add( 0 ); // set by CalcDimensions() } - + m_sumColWidths = m_defaultColWidth * m_numCols; + // TODO: improve this ? // m_defaultCellFont = this->GetFont(); @@ -839,23 +843,8 @@ void wxGrid::CalcDimensions() m_top = 0; } - int bottom = m_top + m_colLabelHeight; - for ( i = m_scrollPosY; i < m_numRows; i++ ) - { - bottom += m_rowHeights[i]; - m_rowBottoms[i] = bottom; - } - - int right = m_left + m_rowLabelWidth; - for ( i = m_scrollPosX; i < m_numCols; i++ ) - { - right += m_colWidths[i]; - m_colRights[i] = right; - } - - // adjust the scroll bars + // check to see if either of the scroll bars are required // - int cw, ch; GetClientSize(&cw, &ch); @@ -871,58 +860,84 @@ void wxGrid::CalcDimensions() int check; for ( check = 0; check < 2; check++ ) { - if ( m_numRows > 0 && - m_rowBottoms[m_numRows-1] + horizScrollBarHeight > ch ) + if ( m_top + m_colLabelHeight + m_sumRowHeights + horizScrollBarHeight > ch ) { vertScrollBarWidth = m_scrollBarWidth; + } - m_wholeRowsVisible = 0; - for ( i = m_scrollPosY; i < m_numRows; i++ ) - { - // A partial row doesn't count, we still have to scroll to - // see the rest of it - if ( m_rowBottoms[i] + horizScrollBarHeight > ch ) break; + if ( m_left + m_rowLabelWidth + m_sumColWidths + vertScrollBarWidth > cw) + { + horizScrollBarHeight = m_scrollBarWidth; + } + } - m_wholeRowsVisible++ ; - } + + // if the window has been resized while scrolled then the scroll + // position might need to be adjusted... + // + bool adjustScrollPos = FALSE; + if ( !vertScrollBarWidth ) + { + if ( m_scrollPosY ) + { + adjustScrollPos = TRUE; + m_scrollPosY = 0; } - else + } + if ( !horizScrollBarHeight ) + { + if ( m_scrollPosX ) { - m_wholeRowsVisible = m_numRows - m_scrollPosY; - if ( m_scrollPosY ) - { - vertScrollBarWidth = m_scrollBarWidth; - } + adjustScrollPos = TRUE; + m_scrollPosX = 0; } - + } + + + // calculate the coords of row bottom edges and col right edges + // + int bottom = m_top + m_colLabelHeight; + for ( i = m_scrollPosY; i < m_numRows; i++ ) + { + bottom += m_rowHeights[i]; + m_rowBottoms[i] = bottom; + } - if ( m_numCols && - m_colRights[m_numCols-1] + vertScrollBarWidth > cw) + int right = m_left + m_rowLabelWidth; + for ( i = m_scrollPosX; i < m_numCols; i++ ) + { + right += m_colWidths[i]; + m_colRights[i] = right; + } + + + // check how many rows and cols are visible + // + m_wholeRowsVisible = 0; + if ( m_numRows > 0 ) + { + for ( i = m_scrollPosY; i < m_numRows; i++ ) { - horizScrollBarHeight = m_scrollBarWidth; + // A partial row doesn't count, we still have to scroll to + // see the rest of it + if ( m_rowBottoms[i] + horizScrollBarHeight > ch ) break; - m_wholeColsVisible = 0; - for ( i = m_scrollPosX; i < m_numCols; i++ ) - { - // A partial col doesn't count, we still have to scroll to - // see the rest of it - if ( m_colRights[i] + vertScrollBarWidth > cw ) break; - - m_wholeColsVisible++ ; - } + m_wholeRowsVisible++ ; } - else + } + + m_wholeColsVisible = 0; + if ( m_numCols ) + { + for ( i = m_scrollPosX; i < m_numCols; i++ ) { - // we can see the right-most column - // - m_wholeColsVisible = m_numCols - m_scrollPosX; - if ( m_scrollPosX ) - { - horizScrollBarHeight = m_scrollBarWidth; - } + // A partial col doesn't count, we still have to scroll to + // see the rest of it + if ( m_colRights[i] + vertScrollBarWidth > cw ) break; + + m_wholeColsVisible++ ; } } - if ( m_vertScrollBar ) { @@ -980,6 +995,12 @@ void wxGrid::CalcDimensions() m_right = wxMin( m_colRights[m_numCols-1], cw - vertScrollBarWidth ); } + + // if the scroll position was adjusted (due to a window resize) + // ensure that the cell highlight and edit control are displayed + // correctly + // + if ( adjustScrollPos ) SelectCell( m_currentCellCoords ); } @@ -1008,6 +1029,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) { m_rowHeights.Insert( m_defaultRowHeight, pos ); m_rowBottoms.Insert( 0, pos ); + m_sumRowHeights += m_defaultRowHeight; } m_numRows += numRows; CalcDimensions(); @@ -1021,6 +1043,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) { m_rowHeights.Add( m_defaultRowHeight ); m_rowBottoms.Add( 0 ); + m_sumRowHeights += m_defaultRowHeight; } m_numRows += numRows; CalcDimensions(); @@ -1033,6 +1056,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) int numRows = msg.GetCommandInt2(); for ( i = 0; i < numRows; i++ ) { + m_sumRowHeights -= m_rowHeights[ pos ]; m_rowHeights.Remove( pos ); m_rowBottoms.Remove( pos ); } @@ -1066,6 +1090,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) { m_colWidths.Insert( m_defaultColWidth, pos ); m_colRights.Insert( 0, pos ); + m_sumColWidths += m_defaultColWidth; } m_numCols += numCols; CalcDimensions(); @@ -1079,6 +1104,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) { m_colWidths.Add( m_defaultColWidth ); m_colRights.Add( 0 ); + m_sumColWidths += m_defaultColWidth; } m_numCols += numCols; CalcDimensions(); @@ -1091,6 +1117,7 @@ bool wxGrid::Redimension( wxGridTableMessage& msg ) int numCols = msg.GetCommandInt2(); for ( i = 0; i < numCols; i++ ) { + m_sumColWidths -= m_colWidths[ pos ]; m_colWidths.Remove( pos ); m_colRights.Remove( pos ); } @@ -1547,8 +1574,11 @@ void wxGrid::OnMouse( wxMouseEvent& ev ) int top = m_top + m_colLabelHeight; if ( m_dragRowOrCol > 0 ) top = m_rowBottoms[m_dragRowOrCol-1]; + + m_sumRowHeights -= m_rowHeights[ m_dragRowOrCol ]; m_rowHeights[m_dragRowOrCol] = wxMax( ev.GetY() - top, WXGRID_MIN_ROW_HEIGHT ); + m_sumRowHeights += m_rowHeights[ m_dragRowOrCol ]; CalcDimensions(); ShowCellEditControl(); Refresh(); @@ -1575,8 +1605,12 @@ void wxGrid::OnMouse( wxMouseEvent& ev ) int left = m_left + m_rowLabelWidth; if ( m_dragRowOrCol > 0 ) left = m_colRights[m_dragRowOrCol-1]; + + m_sumColWidths -= m_colWidths[m_dragRowOrCol]; m_colWidths[m_dragRowOrCol] = wxMax( ev.GetX() - left, WXGRID_MIN_COL_WIDTH ); + m_sumColWidths += m_colWidths[m_dragRowOrCol]; + CalcDimensions(); ShowCellEditControl(); Refresh(); @@ -1792,7 +1826,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& ev ) { // shouldn't be here - we are going round in circles... // - wxLogFatalError( "wxGrid::OnKeyDown called while alread active" ); + wxLogFatalError( wxT("wxGrid::OnKeyDown called while alread active") ); } m_inOnKeyDown = TRUE; @@ -1908,7 +1942,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& ev ) // Text updated in an edit control - either a text control or a // combo box // -void wxGrid::OnText( wxKeyEvent& ev ) +void wxGrid::OnText( wxCommandEvent& ev ) { if ( !m_inOnText ) { @@ -3380,7 +3414,7 @@ bool wxGrid::CreateGrid( int numRows, int numCols ) { if ( m_created ) { - wxLogError( "wxGrid::CreateGrid(numRows, numCols) called more than once" ); + wxLogError( wxT("wxGrid::CreateGrid(numRows, numCols) called more than once") ); return FALSE; } else @@ -3420,7 +3454,7 @@ bool wxGrid::InsertRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) if ( !m_created ) { - wxLogError( "Called wxGrid::InsertRows() before calling CreateGrid()" ); + wxLogError( wxT("Called wxGrid::InsertRows() before calling CreateGrid()") ); return FALSE; } @@ -3468,7 +3502,7 @@ bool wxGrid::AppendRows( int numRows, bool WXUNUSED(updateLabels) ) if ( !m_created ) { - wxLogError( "Called wxGrid::AppendRows() before calling CreateGrid()" ); + wxLogError( wxT("Called wxGrid::AppendRows() before calling CreateGrid()") ); return FALSE; } @@ -3500,7 +3534,7 @@ bool wxGrid::DeleteRows( int pos, int numRows, bool WXUNUSED(updateLabels) ) if ( !m_created ) { - wxLogError( "Called wxGrid::DeleteRows() before calling CreateGrid()" ); + wxLogError( wxT("Called wxGrid::DeleteRows() before calling CreateGrid()") ); return FALSE; } @@ -3529,7 +3563,7 @@ bool wxGrid::InsertCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) if ( !m_created ) { - wxLogError( "Called wxGrid::InsertCols() before calling CreateGrid()" ); + wxLogError( wxT("Called wxGrid::InsertCols() before calling CreateGrid()") ); return FALSE; } @@ -3569,7 +3603,7 @@ bool wxGrid::AppendCols( int numCols, bool WXUNUSED(updateLabels) ) if ( !m_created ) { - wxLogError( "Called wxGrid::AppendCols() before calling CreateGrid()" ); + wxLogError( wxT("Called wxGrid::AppendCols() before calling CreateGrid()") ); return FALSE; } @@ -3600,7 +3634,7 @@ bool wxGrid::DeleteCols( int pos, int numCols, bool WXUNUSED(updateLabels) ) if ( !m_created ) { - wxLogError( "Called wxGrid::DeleteCols() before calling CreateGrid()" ); + wxLogError( wxT("Called wxGrid::DeleteCols() before calling CreateGrid()") ); return FALSE; } @@ -3930,6 +3964,7 @@ void wxGrid::SetDefaultRowSize( int height, bool resizeExistingRows ) { m_rowHeights[row] = m_defaultRowHeight; } + m_sumRowHeights = m_defaultRowHeight * m_numRows; CalcDimensions(); if ( !GetBatchCount() ) Refresh(); } @@ -3939,7 +3974,9 @@ void wxGrid::SetRowSize( int row, int height ) { if ( row >= 0 && row < m_numRows ) { + m_sumRowHeights -= m_rowHeights[row]; m_rowHeights[row] = wxMax( 0, height ); + m_sumRowHeights += m_rowHeights[row]; CalcDimensions(); if ( !GetBatchCount() ) Refresh(); @@ -3969,6 +4006,7 @@ void wxGrid::SetDefaultColSize( int width, bool resizeExistingCols ) { m_colWidths[col] = m_defaultColWidth; } + m_sumColWidths = m_defaultColWidth * m_numCols; CalcDimensions(); if ( !GetBatchCount() ) Refresh(); } @@ -3978,7 +4016,9 @@ void wxGrid::SetColSize( int col, int width ) { if ( col >= 0 && col < m_numCols ) { + m_sumColWidths -= m_colWidths[col]; m_colWidths[col] = wxMax( 0, width ); + m_sumColWidths += m_colWidths[col]; CalcDimensions(); if ( !GetBatchCount() ) Refresh();