Merge pull request #948 from ermshiperete/bug-xamarin-2394
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridView.cs
index 2bb7241f997662aa39a64969edc95bee20d9a846..393d5cba9aebfd3d0da99fd14f52067b5b2f70e6 100644 (file)
@@ -1036,8 +1036,14 @@ namespace System.Windows.Forms {
                                } else if (value > rows.Count) {
                                        // If we need to add rows and don't have any columns,
                                        // we create one column
-                                       if (ColumnCount == 0)
-                                               ColumnCount = 1;
+                                       if (ColumnCount == 0) {
+                                               System.Diagnostics.Debug.Assert (rows.Count == 0);
+                                               ColumnCount = 1; // this creates the edit row
+                                               if (VirtualMode) {
+                                                       // update edit row height
+                                                       UpdateRowHeightInfo (0, false);
+                                               }
+                                       }
 
                                        List<DataGridViewRow> newRows = new List<DataGridViewRow> (value - rows.Count);
                                        for (int i = rows.Count; i < value; i++)
@@ -1362,6 +1368,7 @@ namespace System.Windows.Forms {
                                        } else {
                                                Controls.Remove (editingControl);
                                        }
+                                       editingControl.Dispose();
                                }
                                
                                
@@ -2233,10 +2240,20 @@ namespace System.Windows.Forms {
                        int new_width = 0;
                        
                        if (rowHeadersWidthSizeMode == DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders) {
-                               foreach (DataGridViewRow row in Rows)
-                                       if (row.Displayed)
+                               bool anyRowsDisplayed = false;
+                               foreach(DataGridViewRow row in Rows)
+                                       if(row.Displayed) {
+                                               anyRowsDisplayed = true;
                                                new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
-                                               
+                                       }
+       
+                               // if there are no rows which are displayed, we still have to set new_width
+                               // to a value >= 4 as RowHeadersWidth will throw an exception otherwise 
+                               if(!anyRowsDisplayed) {
+                                       foreach (DataGridViewRow row in Rows)
+                                                       new_width = Math.Max (new_width, row.HeaderCell.PreferredSize.Width);
+                               }               
+                               
                                if (RowHeadersWidth != new_width)
                                        RowHeadersWidth = new_width;
                                        
@@ -3123,6 +3140,20 @@ namespace System.Windows.Forms {
                                InvalidateRow (i);
                }
 
+               private void UpdateRowHeightInfo (DataGridViewRow row)
+               {
+                       DataGridViewRowHeightInfoNeededEventArgs rowInfo =
+                               new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
+                       OnRowHeightInfoNeeded (rowInfo);
+
+                       if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
+                               row.MinimumHeight = rowInfo.MinimumHeight;
+                               row.Height = rowInfo.Height;
+                               OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height,
+                                                                                                       rowInfo.MinimumHeight));
+                       }
+               }
+
                public void UpdateRowHeightInfo (int rowIndex, bool updateToEnd)
                {
                        if (rowIndex < 0 && updateToEnd)
@@ -3142,33 +3173,12 @@ namespace System.Windows.Forms {
 
                        if (updateToEnd) {
                                for (int i = rowIndex; i < Rows.Count; i++) {
-                                       DataGridViewRow row = Rows[i];
-                                       if (!row.Visible)
-                                               continue;
-
-                                       DataGridViewRowHeightInfoNeededEventArgs rowInfo = 
-                                               new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
-                                       OnRowHeightInfoNeeded (rowInfo);
-
-                                       if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
-                                               row.Height = rowInfo.Height;
-                                               row.MinimumHeight = rowInfo.MinimumHeight;
-                                               OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height, 
-                                                                                                                    rowInfo.MinimumHeight));
-                                       }
+                                       DataGridViewRow row = Rows [i];
+                                       if (row.Visible)
+                                               UpdateRowHeightInfo (row);
                                }
                        } else {
-                               DataGridViewRow row = Rows[rowIndex];
-                               DataGridViewRowHeightInfoNeededEventArgs rowInfo = 
-                                       new DataGridViewRowHeightInfoNeededEventArgs (row.Index, row.Height, row.MinimumHeight);
-                               OnRowHeightInfoNeeded (rowInfo);
-
-                               if (row.Height != rowInfo.Height || row.MinimumHeight != rowInfo.MinimumHeight) {
-                                       row.Height = rowInfo.Height;
-                                       row.MinimumHeight = rowInfo.MinimumHeight;
-                                       OnRowHeightInfoPushed (new DataGridViewRowHeightInfoPushedEventArgs (row.Index, rowInfo.Height, 
-                                                                                                            rowInfo.MinimumHeight));
-                               }
+                               UpdateRowHeightInfo (Rows [rowIndex]);
                        }
                }
 
@@ -3380,6 +3390,19 @@ namespace System.Windows.Forms {
                }
 
                protected override void Dispose (bool disposing) {
+                       if (disposing) {
+                               ClearSelection();
+                               currentCell = null;
+                               foreach (DataGridViewColumn column in Columns)
+                                       column.Dispose();
+                               Columns.Clear();
+                               foreach (DataGridViewRow row in Rows)
+                                       row.Dispose();
+                               Rows.Clear();
+                       }
+                       editingControl = null;
+
+                       base.Dispose(disposing);
                }
 
                protected override AccessibleObject GetAccessibilityObjectById (int objectId)
@@ -5079,6 +5102,11 @@ namespace System.Windows.Forms {
                                MoveCurrentCell (ColumnDisplayIndexToIndex (0), 0, true, false, false, true);
 
                        AutoResizeColumnsInternal ();
+                       if (VirtualMode) {
+                               for (int i = 0; i < e.RowCount; i++)
+                                       UpdateRowHeightInfo (e.RowIndex + i, false);
+                       }
+
                        Invalidate ();
                        OnRowsAdded (e);
                }
@@ -5433,7 +5461,7 @@ namespace System.Windows.Forms {
                        DataGridViewCell cell = CurrentCell;
                        
                        if (cell != null) {
-                               if (cell.KeyEntersEditMode (new KeyEventArgs ((Keys)m.WParam.ToInt32 ())))
+                               if (cell.KeyEntersEditMode (new KeyEventArgs (((Keys)m.WParam.ToInt32 ()) | XplatUI.State.ModifierKeys)))
                                        BeginEdit (true);
                                if (EditingControl != null && ((Msg)m.Msg == Msg.WM_KEYDOWN || (Msg)m.Msg == Msg.WM_CHAR))
                                        XplatUI.SendMessage (EditingControl.Handle, (Msg)m.Msg, m.WParam, m.LParam);
@@ -5445,7 +5473,7 @@ namespace System.Windows.Forms {
                protected override bool ProcessKeyPreview (ref Message m)
                {
                        if ((Msg)m.Msg == Msg.WM_KEYDOWN && (IsCurrentCellInEditMode || m.HWnd == horizontalScrollBar.Handle || m.HWnd == verticalScrollBar.Handle)) {
-                               KeyEventArgs e = new KeyEventArgs ((Keys)m.WParam.ToInt32 ());
+                               KeyEventArgs e = new KeyEventArgs (((Keys)m.WParam.ToInt32 ()) | XplatUI.State.ModifierKeys);
                        
                                IDataGridViewEditingControl ctrl = (IDataGridViewEditingControl)EditingControlInternal;
                                
@@ -6308,7 +6336,7 @@ namespace System.Windows.Forms {
                                
                                        horizontalScrollBar.SafeValueSet (horizontalScrollBar.Value - delta_x);
                                        OnHScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, horizontalScrollBar.Value));
-                               } else if (disp_x > first_col_index + displayedColumnsCount - 1) {
+                               } else if (disp_x > first_col_index + displayedColumnsCount - 1 && disp_x != 0) {
                                        RefreshScrollBars ();
                                        scrollbarsRefreshed = true;
                                        
@@ -6342,7 +6370,7 @@ namespace System.Windows.Forms {
 
                                        verticalScrollBar.SafeValueSet (verticalScrollBar.Value - delta_y);
                                        OnVScrollBarScroll (this, new ScrollEventArgs (ScrollEventType.ThumbPosition, verticalScrollBar.Value));
-                               } else if (disp_y > first_row_index + displayedRowsCount - 1) {
+                               } else if (disp_y > first_row_index + displayedRowsCount - 1 && disp_y != 0) {
                                        if (!scrollbarsRefreshed)
                                                RefreshScrollBars ();