2006-03-16 Peter Dennis Bartok <pbartok@novell.com>
authorPeter Dennis Bartok <pbartok@mono-cvs.ximian.com>
Thu, 16 Mar 2006 23:39:26 +0000 (23:39 -0000)
committerPeter Dennis Bartok <pbartok@mono-cvs.ximian.com>
Thu, 16 Mar 2006 23:39:26 +0000 (23:39 -0000)
* DataGrid.cs:
  - OnMouseDown: Switch to editing mode when clicking on the cell
                 even if we're clicking on the cell that's currently
                 selected
  - ProcessGridKey: Left/Right now wrap like MS.Net does
  - ProcessGridKey: Tab now knows to add a new row when tab is
                    pressed in the cell of the last column of the
                    last row
  - ProcessGridKey: Enter now adds another row  if pressed in the last
                    row and selectes the new row, same column cell
  - ProcessGridKey: Home/End navigate columns, not rows, like
                    originally implemented
  - Broke ProcessKeyPreview code out into an extra Internal method
    so it can be called from the edit code
* DataGridTextBox.cs (ProcessKeyMessage):
  - Switched to accept Tab keypresses
  - Added F2 handling to allow jumping to the end of the edited cell
  - Added logic to allow moving caret left/right inside edited cell
    and making the edited cell jump when the caret hits cell borders
  - Tab and Enter are now passed to the datagrid after being handled
* TextBoxBase.cs:
  - Removed capture code now that Control handles it
  - set_SelectionStart now ensures caret is visible

svn path=/trunk/mcs/; revision=58092

mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGrid.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridTextBox.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextBoxBase.cs

index 7279e1f999fab9f44a18ae6e5a0026aba1a656aa..e9b8e4820be584c6915e214a2d44c5770d64a246 100644 (file)
@@ -1,3 +1,29 @@
+2006-03-16  Peter Dennis Bartok  <pbartok@novell.com>
+
+       * DataGrid.cs:
+         - OnMouseDown: Switch to editing mode when clicking on the cell
+                        even if we're clicking on the cell that's currently 
+                        selected
+         - ProcessGridKey: Left/Right now wrap like MS.Net does
+         - ProcessGridKey: Tab now knows to add a new row when tab is
+                           pressed in the cell of the last column of the 
+                           last row
+         - ProcessGridKey: Enter now adds another row  if pressed in the last
+                           row and selectes the new row, same column cell
+         - ProcessGridKey: Home/End navigate columns, not rows, like 
+                           originally implemented
+         - Broke ProcessKeyPreview code out into an extra Internal method
+           so it can be called from the edit code
+       * DataGridTextBox.cs (ProcessKeyMessage):
+         - Switched to accept Tab keypresses
+         - Added F2 handling to allow jumping to the end of the edited cell
+         - Added logic to allow moving caret left/right inside edited cell
+           and making the edited cell jump when the caret hits cell borders
+         - Tab and Enter are now passed to the datagrid after being handled
+       * TextBoxBase.cs:
+         - Removed capture code now that Control handles it
+         - set_SelectionStart now ensures caret is visible
+
 2006-03-16  Jackson Harper  <jackson@ximian.com>
 
        * TrackBar.cs: Debackwards the increment/decrement for handling
index 2fbba63c25bd9d4dfdb1297509f08c231b21b1e3..a0afaac6c78e7890f9c7e4f23bc60e69f365a5aa 100644 (file)
@@ -1303,7 +1303,7 @@ namespace System.Windows.Forms
                                        
                                DataGridCell new_cell = new DataGridCell (testinfo.Row, testinfo.Column);
 
-                               if (new_cell.Equals (current_cell) == false) {
+                               if ((new_cell.Equals (current_cell) == false) || (!is_editing)) {
                                        CancelEditing ();
                                        SetCurrentCell (new_cell);
                                        EditCell (current_cell);
@@ -1511,13 +1511,51 @@ namespace System.Windows.Forms
                                }
                                break;
                        }
-                       case Keys.Tab:
+
+                       case Keys.Enter: {
+                               if (current_cell.RowNumber + 1 == RowsCount) {
+                                       DataGridCell new_cell = new DataGridCell (current_cell.RowNumber + 1, current_cell.ColumnNumber);
+
+                                       SetCurrentCell (new_cell);
+                                       EditCell (current_cell);
+                               }
+                               break;
+                       }
+
+                       case Keys.Tab: {
+                               if (current_cell.ColumnNumber + 1 < CurrentTableStyle.GridColumnStyles.Count) {
+                                       CurrentCell = new DataGridCell (current_cell.RowNumber, current_cell.ColumnNumber + 1);
+                                       EditCell (current_cell);
+                               } else if (current_cell.RowNumber + 1 < RowsCount) {
+                                       CurrentCell = new DataGridCell (current_cell.RowNumber + 1, 0);
+                                       EditCell (current_cell);
+                               } else if ((current_cell.RowNumber + 1 == RowsCount) && (current_cell.ColumnNumber + 1 == CurrentTableStyle.GridColumnStyles.Count)) {
+                                       int     new_row;
+                                       int     new_col;
+
+                                       new_row = current_cell.RowNumber;
+                                       new_col = current_cell.ColumnNumber + 1;
+                                       if (new_col >= CurrentTableStyle.GridColumnStyles.Count) {
+                                               new_row++;
+                                               new_col = 0;
+                                       }
+                                       DataGridCell new_cell = new DataGridCell (new_row, new_col);
+
+                                       SetCurrentCell (new_cell);
+                                       EditCell (current_cell);
+                               }
+                               break;
+                       }
+
                        case Keys.Right:
                        {                               
                                if (current_cell.ColumnNumber + 1 < CurrentTableStyle.GridColumnStyles.Count) {
                                        CurrentCell = new DataGridCell (current_cell.RowNumber, current_cell.ColumnNumber + 1);
                                        EditCell (current_cell);
-                               }
+                               } else if (current_cell.RowNumber + 1 < RowsCount) {
+                                       CurrentCell = new DataGridCell (current_cell.RowNumber + 1, 0);
+                                       EditCell (current_cell);
+                               }       
                                break;
                        }
                        case Keys.Left:
@@ -1525,6 +1563,9 @@ namespace System.Windows.Forms
                                if (current_cell.ColumnNumber > 0) {
                                        CurrentCell = new DataGridCell (current_cell.RowNumber, current_cell.ColumnNumber - 1);
                                        EditCell (current_cell);
+                               } else if (current_cell.RowNumber > 0) {
+                                       CurrentCell = new DataGridCell (current_cell.RowNumber - 1, CurrentTableStyle.GridColumnStyles.Count - 1);
+                                       EditCell (current_cell);
                                }
                                break;
                        }
@@ -1552,13 +1593,13 @@ namespace System.Windows.Forms
                        }
                        case Keys.Home:
                        {
-                               CurrentCell = new DataGridCell (0, current_cell.ColumnNumber);
+                               CurrentCell = new DataGridCell (current_cell.RowNumber, 0);
                                EditCell (current_cell);
                                break;
                        }
                        case Keys.End:
                        {
-                               CurrentCell = new DataGridCell (RowsCount - 1, current_cell.ColumnNumber);
+                               CurrentCell = new DataGridCell (current_cell.RowNumber, CurrentTableStyle.GridColumnStyles.Count - 1);
                                EditCell (current_cell);
                                break;
                        }
@@ -1579,14 +1620,20 @@ namespace System.Windows.Forms
                }
 
                // Called from DataGridTextBox
-               protected override bool ProcessKeyPreview (ref Message m)
-               {
+               internal bool ProcessKeyPreviewInternal(ref Message m) {
                        Keys key = (Keys) m.WParam.ToInt32 ();
                        KeyEventArgs ke = new KeyEventArgs (key);
                        if (ProcessGridKey (ke) == true) {
                                return true;
                        }
+                       return false;
+               }
 
+               protected override bool ProcessKeyPreview (ref Message m)
+               {
+                       if (ProcessKeyPreviewInternal(ref m)) {
+                               return true;
+                       }
                        return base.ProcessKeyPreview (ref m);
                }
                
index d7b88104bc5b8967cad2467cfda03365ea391156..d4c2e4584957d891eab4dceb08a2fe829ee3a3ae 100644 (file)
@@ -49,6 +49,7 @@ namespace System.Windows.Forms
                {
                        isedit = true;
                        grid = null;
+                       accepts_tab = true;
 
                        SetStyle (ControlStyles.UserPaint | ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false);
                        SetStyle (ControlStyles.FixedHeight, true);
@@ -85,33 +86,86 @@ namespace System.Windows.Forms
                protected internal override bool ProcessKeyMessage (ref Message m)
                {
                        Keys key = (Keys) m.WParam.ToInt32 ();
-                       
-                       switch (key) {
-                       case Keys.Return:
-                               grid.EndEdit (false);
-                               return true;
-                       
-                       case Keys.Escape:
-                               grid.EndEdit (true);
-                               return true;
-                               
-                       case Keys.Right:
-                       case Keys.Tab:
-                       case Keys.Up:
-                       case Keys.Down:
-                       case Keys.PageUp:
-                       case Keys.PageDown:
-                       case Keys.Home:
-                       case Keys.End:
-                               grid.EndEdit (false);
-                               break;
-                       
-                       default:
-                               break;
-                       }                       
-                       
-                       isedit = false;
-                       return base.ProcessKeyMessage (ref m);
+
+                       // If we decide DataGrid needs to process we call grid.ProcessKeyPreviewInternal and return true
+                       // If we want TextBox to handle the key , we return false;
+
+                       // We only care about KEYDOWN messages
+                       if (m.Msg != (int)Msg.WM_KEYDOWN) {
+                               return false;
+                       }
+
+                       // Anything with control key pressed is for DataGrid
+                       if ((Control.ModifierKeys & Keys.Control) != 0) {
+                               return grid.ProcessKeyPreviewInternal(ref m);
+                       }
+
+                       if (isedit) {
+                               switch (key) {
+                                       case Keys.F2: {
+                                               this.SelectionStart = this.Text.Length;
+                                               this.SelectionLength = 0;
+                                               return true;
+                                       }
+
+                                       case Keys.Up:
+                                       case Keys.Down:
+                                       case Keys.PageDown:
+                                       case Keys.PageUp: {
+                                               isedit = false;
+                                               grid.EndEdit(false);
+                                               grid.ProcessKeyPreviewInternal(ref m);
+                                               return true;
+                                       }
+
+                                       case Keys.Escape: {
+                                               isedit = false;
+                                               grid.EndEdit (true);
+                                               return true;
+                                       }
+
+                                       case Keys.Enter: {
+                                               isedit = false;
+                                               grid.EndEdit (false);
+                                               grid.ProcessKeyPreviewInternal(ref m);
+                                               return true;
+                                       }
+
+                                       case Keys.Left: {
+                                               if (base.SelectionStart == 0) {
+                                                       isedit = false;
+                                                       grid.EndEdit (false);
+                                                       grid.ProcessKeyPreviewInternal(ref m);
+                                                       return true;
+                                               }
+                                               return false;
+                                       }
+
+                                       case Keys.Right: {
+                                               // Arrow keys go right until we hit the end of the text
+                                               if ((base.SelectionStart + base.SelectionLength) == base.Text.Length) {
+                                                       isedit = false;
+                                                       grid.EndEdit (false);
+                                                       grid.ProcessKeyPreviewInternal(ref m);
+                                                       return true;
+                                               }
+                                               return false;
+                                       }
+
+                                       case Keys.Tab: {
+                                               isedit = false;
+                                               grid.EndEdit(false);
+                                               grid.ProcessKeyPreviewInternal(ref m);
+                                               return true;
+                                       }
+
+                                       default: {
+                                               return base.ProcessKeyMessage(ref m);
+                                       }
+                               }
+                       }
+
+                       return base.ProcessKeyMessage(ref m);
                }
 
                public void SetDataGrid (DataGrid parentGrid)
index 6f570897e7c173b3976ef39533d59baa269d7bce..442649c7a6a49b3b0e44d900db7efeb95055590c 100644 (file)
@@ -447,6 +447,7 @@ namespace System.Windows.Forms {
 
                                document.CharIndexToLineTag(value, out line, out tag, out pos);
                                document.SetSelectionStart(line, pos);
+                               ScrollToCaret();
                        }
                }
 
@@ -1303,7 +1304,6 @@ namespace System.Windows.Forms {
 
                                interval = DateTime.Now - click_last;
                                document.PositionCaret(e.X + document.ViewPortX, e.Y + document.ViewPortY);
-                               this.Capture = true;
                                
                                // Handle place caret/select word/select line behaviour
                                if (e.Clicks == 1) {
@@ -1382,7 +1382,6 @@ namespace System.Windows.Forms {
                }
 
                private void TextBoxBase_MouseUp(object sender, MouseEventArgs e) {
-                       this.Capture = false;
                        if (e.Button == MouseButtons.Left) {
                                document.PositionCaret(e.X + document.ViewPortX, e.Y + document.ViewPortY);
                                if (click_mode == CaretSelection.Position) {