]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/grid.cpp
image handlers moved to separate headers (imagbmp.h etc.) This change is backward...
[wxWidgets.git] / src / generic / grid.cpp
index 5d24c4943dbb23e77d616452492e9e9758fa6165..4d9ee47b8025d026e98902f97921f51cc162000f 100644 (file)
@@ -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 <wx/arrimpl.cpp>
+#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();