Merge pull request #948 from ermshiperete/bug-xamarin-2394
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridView.cs
index ebb3743eb95224172f3a49b057287addefcc131d..393d5cba9aebfd3d0da99fd14f52067b5b2f70e6 100644 (file)
@@ -1368,6 +1368,7 @@ namespace System.Windows.Forms {
                                        } else {
                                                Controls.Remove (editingControl);
                                        }
+                                       editingControl.Dispose();
                                }
                                
                                
@@ -2239,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;
                                        
@@ -3129,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)
@@ -3148,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]);
                        }
                }
 
@@ -3386,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)
@@ -5444,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);
@@ -5456,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;
                                
@@ -6319,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;
                                        
@@ -6353,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 ();