]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/grid.cpp
Revert "Fix off by 1 error in wxGenericListCtrl::HitTest()."
[wxWidgets.git] / src / generic / grid.cpp
index 3aef6989b0dd922bf844022d411a7ea9b15ca2e0..9c795c276ba2e79ded33f1dd12bf738cc3c27926 100644 (file)
@@ -2414,6 +2414,8 @@ wxGrid::SetTable(wxGridTableBase *table,
         m_created = true;
     }
 
+    InvalidateBestSize();
+
     return m_created;
 }
 
@@ -6661,7 +6663,7 @@ int wxGrid::XToPos(int x) const
     return PosToLinePos(x, true /* clip */, wxGridColumnOperations());
 }
 
-// return the row number such that the y coord is near the edge of, or -1 if
+// return the row/col number such that the pos is near the edge of, or -1 if
 // not near an edge.
 //
 // notice that position can only possibly be near an edge if the row/column is
@@ -6670,7 +6672,8 @@ int wxGrid::XToPos(int x) const
 // _never_ be considered to be near the edge).
 int wxGrid::PosToEdgeOfLine(int pos, const wxGridOperations& oper) const
 {
-    const int line = oper.PosToLine(this, pos, true);
+    // Get the bottom or rightmost line that could match.
+    int line = oper.PosToLine(this, pos, true);
 
     if ( oper.GetLineSize(this, line) > WXGRID_LABEL_EDGE_ZONE )
     {
@@ -6682,7 +6685,16 @@ int wxGrid::PosToEdgeOfLine(int pos, const wxGridOperations& oper) const
                     pos - oper.GetLineStartPos(this,
                                                line) < WXGRID_LABEL_EDGE_ZONE )
         {
-            return oper.GetLineBefore(this, line);
+            // We need to find the previous visible line, so skip all the
+            // hidden (of size 0) ones.
+            do
+            {
+                line = oper.GetLineBefore(this, line);
+            }
+            while ( line >= 0 && oper.GetLineSize(this, line) == 0 );
+
+            // It can possibly be -1 here.
+            return line;
         }
     }
 
@@ -8104,8 +8116,11 @@ int UpdateRowOrColSize(int& sizeCurrent, int sizeNew)
         // We're showing back a previously hidden row/column.
         wxASSERT_MSG( sizeNew == -1, wxS("New size must be positive or -1.") );
 
-        wxASSERT_MSG( sizeCurrent < 0, wxS("May only show back if hidden.") );
+        // If it's already visible, simply do nothing.
+        if ( sizeCurrent >= 0 )
+            return 0;
 
+        // Otherwise show it by restoring its old size.
         sizeCurrent = -sizeCurrent;
 
         // This is positive which is correct.
@@ -8114,8 +8129,13 @@ int UpdateRowOrColSize(int& sizeCurrent, int sizeNew)
     else if ( sizeNew == 0 )
     {
         // We're hiding a row/column.
-        wxASSERT_MSG( sizeCurrent > 0, wxS("Can't hide if already hidden.") );
 
+        // If it's already hidden, simply do nothing.
+        if ( sizeCurrent <= 0 )
+            return 0;
+
+        // Otherwise hide it and also remember the shown size to be able to
+        // restore it later.
         sizeCurrent = -sizeCurrent;
 
         // This is negative which is correct.