]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/grid.cpp
fixed typo : _ instead of wxT
[wxWidgets.git] / src / generic / grid.cpp
index fccc79f0851f0c18a36e913e47554b4d9413d76b..4a3a28cce051a4c579aad4616e23776020fd99e2 100644 (file)
@@ -52,6 +52,9 @@
 #include "wx/grid.h"
 #include "wx/generic/gridsel.h"
 
 #include "wx/grid.h"
 #include "wx/generic/gridsel.h"
 
+// Required for wxIs... functions
+#include <ctype.h>
+
 // ----------------------------------------------------------------------------
 // array classes
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // array classes
 // ----------------------------------------------------------------------------
@@ -2453,12 +2456,12 @@ wxGridStringTable::~wxGridStringTable()
 {
 }
 
 {
 }
 
-long wxGridStringTable::GetNumberRows()
+int wxGridStringTable::GetNumberRows()
 {
     return m_data.GetCount();
 }
 
 {
     return m_data.GetCount();
 }
 
-long wxGridStringTable::GetNumberCols()
+int wxGridStringTable::GetNumberCols()
 {
     if ( m_data.GetCount() > 0 )
         return m_data[0].GetCount();
 {
     if ( m_data.GetCount() > 0 )
         return m_data[0].GetCount();
@@ -3190,7 +3193,7 @@ bool wxGrid::SetTable( wxGridTableBase *table, bool takeOwnership,
         // View at runtime.  Is there anything in the implmentation that would
         // prevent this?
 
         // View at runtime.  Is there anything in the implmentation that would
         // prevent this?
 
-        // At least, you now have to copy with m_selection
+        // At least, you now have to cope with m_selection
         wxFAIL_MSG( wxT("wxGrid::CreateGrid or wxGrid::SetTable called more than once") );
         return FALSE;
     }
         wxFAIL_MSG( wxT("wxGrid::CreateGrid or wxGrid::SetTable called more than once") );
         return FALSE;
     }
@@ -3800,10 +3803,13 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
                 break;
 
                 case WXGRID_CURSOR_SELECT_ROW:
                 break;
 
                 case WXGRID_CURSOR_SELECT_ROW:
-                    if ( (row = YToRow( y )) >= 0  &&
-                         !IsInSelection( row, 0 ) )
-                    {
-                        SelectRow( row, TRUE );
+                    if ( (row = YToRow( y )) >= 0 )
+                   {
+                       m_selection->SelectRow( row,
+                                               event.ControlDown(),
+                                               event.ShiftDown(),
+                                               event.AltDown(),
+                                               event.MetaDown() );
                     }
 
                 // default label to suppress warnings about "enumeration value
                     }
 
                 // default label to suppress warnings about "enumeration value
@@ -3840,7 +3846,23 @@ void wxGrid::ProcessRowLabelMouseEvent( wxMouseEvent& event )
             if ( row >= 0  &&
                  !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) )
             {
             if ( row >= 0  &&
                  !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, row, -1, event ) )
             {
-                SelectRow( row, event.ShiftDown() );
+               if ( !event.ShiftDown() && !event.ControlDown() )
+                   ClearSelection();
+               if ( event.ShiftDown() )
+                   m_selection->SelectBlock( m_currentCellCoords.GetRow(),
+                                             0,
+                                             row,
+                                             GetNumberCols() - 1,
+                                             event.ControlDown(),
+                                             event.ShiftDown(),
+                                             event.AltDown(),
+                                             event.MetaDown() );
+               else
+                   m_selection->SelectRow( row,
+                                           event.ControlDown(),
+                                           event.ShiftDown(),
+                                           event.AltDown(),
+                                           event.MetaDown() );
                 ChangeCursorMode(WXGRID_CURSOR_SELECT_ROW, m_rowLabelWin);
             }
         }
                 ChangeCursorMode(WXGRID_CURSOR_SELECT_ROW, m_rowLabelWin);
             }
         }
@@ -3967,10 +3989,13 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
                 break;
 
                 case WXGRID_CURSOR_SELECT_COL:
                 break;
 
                 case WXGRID_CURSOR_SELECT_COL:
-                    if ( (col = XToCol( x )) >= 0  &&
-                         !IsInSelection( 0, col ) )
-                    {
-                        SelectCol( col, TRUE );
+                    if ( (col = XToCol( x )) >= 0 )
+                   {
+                       m_selection->SelectCol( col,
+                                               event.ControlDown(),
+                                               event.ShiftDown(),
+                                               event.AltDown(),
+                                               event.MetaDown() );
                     }
 
                 // default label to suppress warnings about "enumeration value
                     }
 
                 // default label to suppress warnings about "enumeration value
@@ -4007,7 +4032,22 @@ void wxGrid::ProcessColLabelMouseEvent( wxMouseEvent& event )
             if ( col >= 0  &&
                  !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) )
             {
             if ( col >= 0  &&
                  !SendEvent( wxEVT_GRID_LABEL_LEFT_CLICK, -1, col, event ) )
             {
-                SelectCol( col, event.ShiftDown() );
+               if ( !event.ShiftDown() && !event.ControlDown() )
+                   ClearSelection();
+               if ( event.ShiftDown() )
+                   m_selection->SelectBlock( 0,
+                                             m_currentCellCoords.GetCol(),
+                                             GetNumberRows() - 1, col,
+                                             event.ControlDown(),
+                                             event.ShiftDown(),
+                                             event.AltDown(),
+                                             event.MetaDown() );
+               else
+                   m_selection->SelectCol( col,
+                                           event.ControlDown(),
+                                           event.ShiftDown(),
+                                           event.AltDown(),
+                                           event.MetaDown() );
                 ChangeCursorMode(WXGRID_CURSOR_SELECT_COL, m_colLabelWin);
             }
         }
                 ChangeCursorMode(WXGRID_CURSOR_SELECT_COL, m_colLabelWin);
             }
         }
@@ -4243,20 +4283,29 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
 
             if ( coords != wxGridNoCellCoords )
             {
 
             if ( coords != wxGridNoCellCoords )
             {
-                if ( !IsSelection() )
-                {
-                    SelectBlock( coords, coords );
-                }
-                else
-                {
-                    SelectBlock( m_currentCellCoords, coords );
+               if ( event.ControlDown() )
+               {
+                   if ( m_selectingKeyboard == wxGridNoCellCoords)
+                       m_selectingKeyboard = coords;
+                   SelectBlock ( m_selectingKeyboard, coords );
+               }
+               else
+               {
+                   if ( !IsSelection() )
+                   {
+                       SelectBlock( coords, coords );
+                   }
+                   else
+                   {
+                       SelectBlock( m_currentCellCoords, coords );
+                   }
                 }
 
                 if (! IsVisible(coords))
                 {
                     MakeCellVisible(coords);
                     // TODO: need to introduce a delay or something here.  The
                 }
 
                 if (! IsVisible(coords))
                 {
                     MakeCellVisible(coords);
                     // TODO: need to introduce a delay or something here.  The
-                    // scrolling is way to fast, at least on MSW.
+                    // scrolling is way to fast, at least on MSW - also on GTK.
                 }
             }
         }
                 }
             }
         }
@@ -4326,7 +4375,11 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
             m_selection->SelectBlock( m_currentCellCoords.GetRow(),
                                       m_currentCellCoords.GetCol(),
                                       coords.GetRow(),
             m_selection->SelectBlock( m_currentCellCoords.GetRow(),
                                       m_currentCellCoords.GetCol(),
                                       coords.GetRow(),
-                                      coords.GetCol() );
+                                      coords.GetCol(),
+                                      event.ControlDown(),
+                                      event.ShiftDown(),
+                                      event.AltDown(),
+                                      event.MetaDown() );
         }
         else if ( XToEdgeOfCol(x) < 0  &&
                   YToEdgeOfRow(y) < 0 )
         }
         else if ( XToEdgeOfCol(x) < 0  &&
                   YToEdgeOfRow(y) < 0 )
@@ -4359,11 +4412,20 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
                 }
                 else
                 {
                 }
                 else
                 {
-                    m_selection->ToggleCellSelection( coords.GetRow(),
-                                                      coords.GetCol() );
-                    m_selectingTopLeft = wxGridNoCellCoords;
-                    m_selectingBottomRight = wxGridNoCellCoords;
-                    SetCurrentCell( coords );
+                   if ( event.ControlDown() )
+                   {
+                       m_selection->ToggleCellSelection( coords.GetRow(),
+                                                         coords.GetCol(),
+                                                         event.ControlDown(),
+                                                         event.ShiftDown(),
+                                                         event.AltDown(),
+                                                         event.MetaDown() );
+                       m_selectingTopLeft = wxGridNoCellCoords;
+                       m_selectingBottomRight = wxGridNoCellCoords;
+                       m_selectingKeyboard = coords;
+                   }
+                   else
+                       SetCurrentCell( coords );
                     m_waitForSlowClick = TRUE;
                 }
             }
                     m_waitForSlowClick = TRUE;
                 }
             }
@@ -4405,7 +4467,10 @@ void wxGrid::ProcessGridCellMouseEvent( wxMouseEvent& event )
                                           m_selectingTopLeft.GetCol(),
                                           m_selectingBottomRight.GetRow(),
                                           m_selectingBottomRight.GetCol(),
                                           m_selectingTopLeft.GetCol(),
                                           m_selectingBottomRight.GetRow(),
                                           m_selectingBottomRight.GetCol(),
-                                          & event );
+                                          event.ControlDown(),
+                                          event.ShiftDown(),
+                                          event.AltDown(),
+                                          event.MetaDown() );
                 m_selectingTopLeft = wxGridNoCellCoords;
                 m_selectingBottomRight = wxGridNoCellCoords;
             }
                 m_selectingTopLeft = wxGridNoCellCoords;
                 m_selectingBottomRight = wxGridNoCellCoords;
             }
@@ -4921,8 +4986,8 @@ bool wxGrid::SendEvent( const wxEventType type,
                              type,
                              this,
                              row, col,
                              type,
                              this,
                              row, col,
-                             false,
                              mouseEv.GetX(), mouseEv.GetY(),
                              mouseEv.GetX(), mouseEv.GetY(),
+                             FALSE,
                              mouseEv.ControlDown(),
                              mouseEv.ShiftDown(),
                              mouseEv.AltDown(),
                              mouseEv.ControlDown(),
                              mouseEv.ShiftDown(),
                              mouseEv.AltDown(),
@@ -5001,6 +5066,24 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
 
         // try local handlers
         //
 
         // try local handlers
         //
+        if ( !event.ShiftDown() && 
+             m_selectingKeyboard != wxGridNoCellCoords )
+        {
+           if ( m_selectingTopLeft != wxGridNoCellCoords &&
+                m_selectingBottomRight != wxGridNoCellCoords )
+               m_selection->SelectBlock( m_selectingTopLeft.GetRow(),
+                                         m_selectingTopLeft.GetCol(),
+                                         m_selectingBottomRight.GetRow(),
+                                         m_selectingBottomRight.GetCol(),
+                                         event.ControlDown(),
+                                         event.ShiftDown(),
+                                         event.AltDown(),
+                                         event.MetaDown() );
+            m_selectingTopLeft = wxGridNoCellCoords;
+            m_selectingBottomRight = wxGridNoCellCoords;
+            m_selectingKeyboard = wxGridNoCellCoords;
+        }
+
         switch ( event.KeyCode() )
         {
             case WXK_UP:
         switch ( event.KeyCode() )
         {
             case WXK_UP:
@@ -5059,7 +5142,7 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
                 break;
 
             case WXK_ESCAPE:
                 break;
 
             case WXK_ESCAPE:
-                m_selection->ClearSelection();
+                ClearSelection();
                 break;
 
             case WXK_TAB:
                 break;
 
             case WXK_TAB:
@@ -5101,20 +5184,23 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
                 MovePageDown();
                 break;
 
                 MovePageDown();
                 break;
 
-#if 0
             case WXK_SPACE:
             case WXK_SPACE:
+               if ( event.ControlDown() )
+               {
+                   m_selection->ToggleCellSelection( m_currentCellCoords.GetRow(),
+                                                     m_currentCellCoords.GetCol(),
+                                                     event.ControlDown(),
+                                                     event.ShiftDown(),
+                                                     event.AltDown(),
+                                                     event.MetaDown() );
+                   break;
+               }
                 if ( !IsEditable() )
                 {
                     MoveCursorRight( FALSE );
                     break;
                 }
                 // Otherwise fall through to default
                 if ( !IsEditable() )
                 {
                     MoveCursorRight( FALSE );
                     break;
                 }
                 // Otherwise fall through to default
-#else
-            case WXK_SPACE:
-                m_selection->ToggleCellSelection( m_currentCellCoords.GetRow(),
-                                                  m_currentCellCoords.GetCol() );
-                break;
-#endif
 
             default:
                 // alphanumeric keys or F2 (special key just for this) enable
 
             default:
                 // alphanumeric keys or F2 (special key just for this) enable
@@ -5153,7 +5239,6 @@ void wxGrid::OnKeyDown( wxKeyEvent& event )
     m_inOnKeyDown = FALSE;
 }
 
     m_inOnKeyDown = FALSE;
 }
 
-
 void wxGrid::OnEraseBackground(wxEraseEvent&)
 {
 }
 void wxGrid::OnEraseBackground(wxEraseEvent&)
 {
 }
@@ -6132,18 +6217,22 @@ bool wxGrid::MoveCursorUp( bool expandSelection )
          m_currentCellCoords.GetRow() > 0 )
     {
         if ( expandSelection )
          m_currentCellCoords.GetRow() > 0 )
     {
         if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
-        
-        MakeCellVisible( m_currentCellCoords.GetRow() - 1,
-                        m_currentCellCoords.GetCol() );
-
-        SetCurrentCell( m_currentCellCoords.GetRow() - 1,
-                        m_currentCellCoords.GetCol() );
-
-        if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
+        {
+            if ( m_selectingKeyboard == wxGridNoCellCoords )
+                m_selectingKeyboard = m_currentCellCoords;
+            m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() - 1 );
+           MakeCellVisible( m_selectingKeyboard.GetRow(),
+                            m_selectingKeyboard.GetCol() );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           MakeCellVisible( m_currentCellCoords.GetRow() - 1,
+                            m_currentCellCoords.GetCol() );
+            SetCurrentCell( m_currentCellCoords.GetRow() - 1,
+                            m_currentCellCoords.GetCol() );
+       }
         return TRUE;
     }
 
         return TRUE;
     }
 
@@ -6157,18 +6246,22 @@ bool wxGrid::MoveCursorDown( bool expandSelection )
          m_currentCellCoords.GetRow() < m_numRows-1 )
     {
         if ( expandSelection )
          m_currentCellCoords.GetRow() < m_numRows-1 )
     {
         if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
-
-        MakeCellVisible( m_currentCellCoords.GetRow() + 1,
-                        m_currentCellCoords.GetCol() );
-
-        SetCurrentCell( m_currentCellCoords.GetRow() + 1,
-                        m_currentCellCoords.GetCol() );
-
-        if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
+        {
+            if ( m_selectingKeyboard == wxGridNoCellCoords )
+                m_selectingKeyboard = m_currentCellCoords;
+            m_selectingKeyboard.SetRow( m_selectingKeyboard.GetRow() + 1 );
+           MakeCellVisible( m_selectingKeyboard.GetRow(),
+                            m_selectingKeyboard.GetCol() );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           MakeCellVisible( m_currentCellCoords.GetRow() + 1,
+                            m_currentCellCoords.GetCol() );
+            SetCurrentCell( m_currentCellCoords.GetRow() + 1,
+                            m_currentCellCoords.GetCol() );
+       }
         return TRUE;
     }
 
         return TRUE;
     }
 
@@ -6182,18 +6275,22 @@ bool wxGrid::MoveCursorLeft( bool expandSelection )
          m_currentCellCoords.GetCol() > 0 )
     {
         if ( expandSelection )
          m_currentCellCoords.GetCol() > 0 )
     {
         if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
-
-        MakeCellVisible( m_currentCellCoords.GetRow(),
-                        m_currentCellCoords.GetCol() - 1 );
-
-        SetCurrentCell( m_currentCellCoords.GetRow(),
-                        m_currentCellCoords.GetCol() - 1 );
-
-        if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
+        {
+            if ( m_selectingKeyboard == wxGridNoCellCoords )
+                m_selectingKeyboard = m_currentCellCoords;
+            m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() - 1 );
+           MakeCellVisible( m_selectingKeyboard.GetRow(),
+                            m_selectingKeyboard.GetCol() );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           MakeCellVisible( m_currentCellCoords.GetRow(),
+                            m_currentCellCoords.GetCol() - 1 );
+            SetCurrentCell( m_currentCellCoords.GetRow(),
+                            m_currentCellCoords.GetCol() - 1 );
+       }
         return TRUE;
     }
 
         return TRUE;
     }
 
@@ -6207,18 +6304,22 @@ bool wxGrid::MoveCursorRight( bool expandSelection )
          m_currentCellCoords.GetCol() < m_numCols - 1 )
     {
         if ( expandSelection )
          m_currentCellCoords.GetCol() < m_numCols - 1 )
     {
         if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
-
-        MakeCellVisible( m_currentCellCoords.GetRow(),
-                        m_currentCellCoords.GetCol() + 1 );
-
-        SetCurrentCell( m_currentCellCoords.GetRow(),
-                        m_currentCellCoords.GetCol() + 1 );
-
-        if ( expandSelection )
-            m_selection->SelectCell( m_currentCellCoords.GetRow(),
-                                     m_currentCellCoords.GetCol() );
+        {
+            if ( m_selectingKeyboard == wxGridNoCellCoords )
+                m_selectingKeyboard = m_currentCellCoords;
+            m_selectingKeyboard.SetCol( m_selectingKeyboard.GetCol() + 1 );
+           MakeCellVisible( m_selectingKeyboard.GetRow(),
+                            m_selectingKeyboard.GetCol() );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           MakeCellVisible( m_currentCellCoords.GetRow(),
+                            m_currentCellCoords.GetCol() + 1 );
+           SetCurrentCell( m_currentCellCoords.GetRow(),
+                            m_currentCellCoords.GetCol() + 1 );
+       }
         return TRUE;
     }
 
         return TRUE;
     }
 
@@ -6334,11 +6435,15 @@ bool wxGrid::MoveCursorUpBlock( bool expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
-            m_selection->SelectBlock( m_currentCellCoords.GetRow(),
-                                      m_currentCellCoords.GetCol(),
-                                      row, col );
-        SetCurrentCell( row, col );
-
+        {
+            m_selectingKeyboard = wxGridCellCoords( row, col );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           SetCurrentCell( row, col );
+       }
         return TRUE;
     }
 
         return TRUE;
     }
 
@@ -6393,10 +6498,15 @@ bool wxGrid::MoveCursorDownBlock( bool expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
-            m_selection->SelectBlock( m_currentCellCoords.GetRow(),
-                                      m_currentCellCoords.GetCol(),
-                                      row, col );
-        SetCurrentCell( row, col );
+        {
+            m_selectingKeyboard = wxGridCellCoords( row, col );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           SetCurrentCell( row, col );
+       }
 
         return TRUE;
     }
 
         return TRUE;
     }
@@ -6452,10 +6562,15 @@ bool wxGrid::MoveCursorLeftBlock( bool expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
-            m_selection->SelectBlock( m_currentCellCoords.GetRow(),
-                                      m_currentCellCoords.GetCol(),
-                                      row, col );
-        SetCurrentCell( row, col );
+        {
+            m_selectingKeyboard = wxGridCellCoords( row, col );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           SetCurrentCell( row, col );
+       }
 
         return TRUE;
     }
 
         return TRUE;
     }
@@ -6511,10 +6626,15 @@ bool wxGrid::MoveCursorRightBlock( bool expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
 
         MakeCellVisible( row, col );
         if ( expandSelection )
-            m_selection->SelectBlock( m_currentCellCoords.GetRow(),
-                                      m_currentCellCoords.GetCol(),
-                                      row, col );
-        SetCurrentCell( row, col );
+        {
+            m_selectingKeyboard = wxGridCellCoords( row, col );
+            SelectBlock( m_currentCellCoords, m_selectingKeyboard );
+        }
+        else
+       {
+           ClearSelection();
+           SetCurrentCell( row, col );
+       }
 
         return TRUE;
     }
 
         return TRUE;
     }
@@ -7502,7 +7622,7 @@ void wxGrid::SetCellValue( int row, int col, const wxString& s )
 void wxGrid::SelectRow( int row, bool addToSelected )
 {
     if ( IsSelection() && !addToSelected )
 void wxGrid::SelectRow( int row, bool addToSelected )
 {
     if ( IsSelection() && !addToSelected )
-        m_selection->ClearSelection();
+        ClearSelection();
 
     m_selection->SelectRow( row );
 }
 
     m_selection->SelectRow( row );
 }
@@ -7511,7 +7631,7 @@ void wxGrid::SelectRow( int row, bool addToSelected )
 void wxGrid::SelectCol( int col, bool addToSelected )
 {
     if ( IsSelection() && !addToSelected )
 void wxGrid::SelectCol( int col, bool addToSelected )
 {
     if ( IsSelection() && !addToSelected )
-        m_selection->ClearSelection();
+        ClearSelection();
 
     m_selection->SelectCol( col );
 }
 
     m_selection->SelectCol( col );
 }