diff --git a/OneMore/Commands/Settings/FavoritesSheet.cs b/OneMore/Commands/Settings/FavoritesSheet.cs index b0ec5052da..cdbce91a45 100644 --- a/OneMore/Commands/Settings/FavoritesSheet.cs +++ b/OneMore/Commands/Settings/FavoritesSheet.cs @@ -156,48 +156,24 @@ private void DeleteItems(object sender, EventArgs e) first--; if (first < 0 && gridView.Rows.Count > 0) { - gridView.Rows[0].Cells[0].Selected = true; + gridView.Rows[0].Selected = true; } else if (first < gridView.Rows.Count && first >= 0) { - gridView.Rows[first].Cells[0].Selected = true; + gridView.Rows[first].Selected = true; } } private void MoveItemDown(object sender, EventArgs e) { - if (gridView.SelectedCells.Count > 0) - { - int colIndex = gridView.SelectedCells[0].ColumnIndex; - int rowIndex = gridView.SelectedCells[0].RowIndex; - if (rowIndex < favorites.Count - 1) - { - var item = favorites[rowIndex]; - favorites.RemoveAt(rowIndex); - favorites.Insert(rowIndex + 1, item); - - gridView.Rows[rowIndex + 1].Cells[colIndex].Selected = true; - } - } + gridView.MoveSelectedItemDown(favorites); } private void MoveItemUp(object sender, EventArgs e) { - if (gridView.SelectedCells.Count > 0) - { - int colIndex = gridView.SelectedCells[0].ColumnIndex; - int rowIndex = gridView.SelectedCells[0].RowIndex; - if (rowIndex > 0 && rowIndex < favorites.Count) - { - var item = favorites[rowIndex]; - favorites.RemoveAt(rowIndex); - favorites.Insert(rowIndex - 1, item); - - gridView.Rows[rowIndex - 1].Cells[colIndex].Selected = true; - } - } + gridView.MoveSelectedItemUp(favorites); } diff --git a/OneMore/Commands/Settings/SearchEngineSheet.cs b/OneMore/Commands/Settings/SearchEngineSheet.cs index f828341f0e..12761b9fd1 100644 --- a/OneMore/Commands/Settings/SearchEngineSheet.cs +++ b/OneMore/Commands/Settings/SearchEngineSheet.cs @@ -223,39 +223,15 @@ private void deleteButton_Click(object sender, EventArgs e) } - private void upButton_Click(object sender, EventArgs e) + private void downButton_Click(object sender, EventArgs e) { - if (gridView.SelectedCells.Count > 0) - { - int colIndex = gridView.SelectedCells[0].ColumnIndex; - int rowIndex = gridView.SelectedCells[0].RowIndex; - if (rowIndex > 0 && rowIndex < engines.Count) - { - var item = engines[rowIndex]; - engines.RemoveAt(rowIndex); - engines.Insert(rowIndex - 1, item); - - gridView.Rows[rowIndex - 1].Cells[colIndex].Selected = true; - } - } + gridView.MoveSelectedItemDown(engines); } - private void downButton_Click(object sender, EventArgs e) + private void upButton_Click(object sender, EventArgs e) { - if (gridView.SelectedCells.Count > 0) - { - int colIndex = gridView.SelectedCells[0].ColumnIndex; - int rowIndex = gridView.SelectedCells[0].RowIndex; - if (rowIndex < engines.Count - 1) - { - var item = engines[rowIndex]; - engines.RemoveAt(rowIndex); - engines.Insert(rowIndex + 1, item); - - gridView.Rows[rowIndex + 1].Cells[colIndex].Selected = true; - } - } + gridView.MoveSelectedItemUp(engines); } diff --git a/OneMore/UI/MoreDataGridView.cs b/OneMore/UI/MoreDataGridView.cs index 60033b5387..990dafafc9 100644 --- a/OneMore/UI/MoreDataGridView.cs +++ b/OneMore/UI/MoreDataGridView.cs @@ -4,6 +4,9 @@ namespace River.OneMoreAddIn.UI { + using System; + using System.ComponentModel; + using System.Linq; using System.Media; using System.Windows.Forms; @@ -79,5 +82,83 @@ protected override bool ProcessDialogKey(Keys keyData) return base.ProcessDialogKey(keyData); } + + + /// + /// Moves the first selected row down in the grid, also updating is position in the + /// given BindingList. + /// + /// Type of the items in the BindingList + /// The BindingList of items to modify + public void MoveSelectedItemDown(BindingList items) + { + if (SelectedCells.Count == 0) + { + return; + } + + int rowIndex = SelectedCells[0].RowIndex; + if (rowIndex < items.Count - 1) + { + var lastDisplayed = Math.Max(0, Rows.Cast() + .Last(row => row.Displayed) + .Index - 1); + + // clear all selections and must set CurrentCell to null; reset below + ClearSelection(); + CurrentCell = null; + + var item = items[rowIndex]; + items.RemoveAt(rowIndex); + items.Insert(++rowIndex, item); + + if (rowIndex > lastDisplayed) + { + FirstDisplayedScrollingRowIndex++; + } + + Rows[rowIndex].Selected = true; + CurrentCell = Rows[rowIndex].Cells[0]; + } + } + + + /// + /// Moves the first selected row up in the grid, also updating is position in the + /// given BindingList. + /// + /// Type of the items in the BindingList + /// The BindingList of items to modify + public void MoveSelectedItemUp(BindingList items) + { + if (SelectedCells.Count == 0) + { + return; + } + + int rowIndex = SelectedCells[0].RowIndex; + if (rowIndex > 0 && rowIndex < items.Count) + { + var firstDisplayed = Math.Max(0, Rows.Cast() + .First(row => row.Displayed) + .Index); + + // clear all selections and must set CurrentCell to null; reset below + ClearSelection(); + CurrentCell = null; + + var item = items[rowIndex]; + items.RemoveAt(rowIndex); + items.Insert(--rowIndex, item); + + if (rowIndex < firstDisplayed) + { + FirstDisplayedScrollingRowIndex--; + } + + Rows[rowIndex].Selected = true; + CurrentCell = Rows[rowIndex].Cells[0]; + } + } } }