Skip to content

Commit 86c3548

Browse files
committed
Track spreadsheet cell selection for Find/Replace
Add tracking of active spreadsheet cell editor and selected text in EditTextWindow. Implement GetSpreadsheetSelectedText to retrieve selection from the cell editor, last known selection, or cell value. Update Find/Replace to use this logic in spreadsheet mode. Handle PreparingCellForEdit to attach selection tracking and ensure cleanup on edit end and selection changes. closes #663
1 parent b76eaed commit 86c3548

2 files changed

Lines changed: 59 additions & 2 deletions

File tree

Text-Grab/Views/EditTextWindow.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,7 @@
824824
HorizontalGridLinesBrush="{DynamicResource ControlStrokeColorDefaultBrush}"
825825
HorizontalScrollBarVisibility="Auto"
826826
LoadingRow="SpreadsheetDataGrid_LoadingRow"
827+
PreparingCellForEdit="SpreadsheetDataGrid_PreparingCellForEdit"
827828
PreviewKeyDown="SpreadsheetDataGrid_PreviewKeyDown"
828829
PreviewMouseLeftButtonDown="SpreadsheetDataGrid_PreviewMouseLeftButtonDown"
829830
PreviewMouseRightButtonDown="SpreadsheetDataGrid_PreviewMouseRightButtonDown"

Text-Grab/Views/EditTextWindow.xaml.cs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ public partial class EditTextWindow : Wpf.Ui.Controls.FluentWindow
101101
private readonly DataTable spreadsheetTable = new();
102102
private readonly List<DataGridColumn> trackedSpreadsheetColumns = [];
103103
private List<(int RowIndex, int ColumnIndex)> selectedSpreadsheetCellCoordinates = [];
104+
private System.Windows.Controls.TextBox? activeSpreadsheetCellEditor;
105+
private string lastSpreadsheetCellEditorSelectedText = string.Empty;
104106
private EtwEditorMode editorMode = EtwEditorMode.Text;
105107
private SpellCheckMode spellCheckMode = SpellCheckMode.Auto;
106108
private bool isSyncingTextFromSpreadsheet = false;
@@ -1097,6 +1099,8 @@ private void SpreadsheetDataGrid_BeginningEdit(object sender, DataGridBeginningE
10971099

10981100
private void SpreadsheetDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
10991101
{
1102+
DetachSpreadsheetCellEditor();
1103+
11001104
if (e.EditAction == DataGridEditAction.Cancel)
11011105
{
11021106
pendingSpreadsheetUndoState = null;
@@ -1112,6 +1116,32 @@ private void SpreadsheetDataGrid_CellEditEnding(object sender, DataGridCellEditE
11121116
DispatcherPriority.Background);
11131117
}
11141118

1119+
private void SpreadsheetDataGrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
1120+
{
1121+
DetachSpreadsheetCellEditor();
1122+
1123+
if (e.EditingElement is not System.Windows.Controls.TextBox cellTextBox)
1124+
return;
1125+
1126+
activeSpreadsheetCellEditor = cellTextBox;
1127+
lastSpreadsheetCellEditorSelectedText = cellTextBox.SelectedText;
1128+
cellTextBox.SelectionChanged += SpreadsheetCellEditor_SelectionChanged;
1129+
}
1130+
1131+
private void SpreadsheetCellEditor_SelectionChanged(object sender, RoutedEventArgs e)
1132+
{
1133+
if (sender is System.Windows.Controls.TextBox cellTextBox)
1134+
lastSpreadsheetCellEditorSelectedText = cellTextBox.SelectedText;
1135+
}
1136+
1137+
private void DetachSpreadsheetCellEditor()
1138+
{
1139+
if (activeSpreadsheetCellEditor is not null)
1140+
activeSpreadsheetCellEditor.SelectionChanged -= SpreadsheetCellEditor_SelectionChanged;
1141+
1142+
activeSpreadsheetCellEditor = null;
1143+
}
1144+
11151145
private void SpreadsheetDataGrid_CurrentCellChanged(object sender, EventArgs e)
11161146
{
11171147
if (editorMode == EtwEditorMode.Spreadsheet)
@@ -1241,6 +1271,9 @@ private void SpreadsheetDataGrid_PreviewMouseRightButtonDown(object sender, Mous
12411271

12421272
private void SpreadsheetDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
12431273
{
1274+
if (activeSpreadsheetCellEditor is null)
1275+
lastSpreadsheetCellEditorSelectedText = string.Empty;
1276+
12441277
UpdateSelectedSpreadsheetCellCoordinates();
12451278

12461279
if (editorMode == EtwEditorMode.Spreadsheet)
@@ -1826,6 +1859,28 @@ private bool IsSpreadsheetCellEditorFocused()
18261859
&& FindVisualParent<System.Windows.Controls.TextBox>(focusedElement) is not null;
18271860
}
18281861

1862+
private string GetSpreadsheetSelectedText()
1863+
{
1864+
if (activeSpreadsheetCellEditor is System.Windows.Controls.TextBox cellTextBox)
1865+
return cellTextBox.SelectedText;
1866+
1867+
if (lastSpreadsheetCellEditorSelectedText.Length > 0)
1868+
return lastSpreadsheetCellEditorSelectedText;
1869+
1870+
List<(int RowIndex, int ColumnIndex)> targetCells = GetSelectedOrCurrentSpreadsheetCellCoordinates();
1871+
if (targetCells.Count != 1)
1872+
return string.Empty;
1873+
1874+
(int rowIndex, int columnIndex) = targetCells[0];
1875+
if (rowIndex < 0 || rowIndex >= spreadsheetTable.Rows.Count
1876+
|| columnIndex < 0 || columnIndex >= spreadsheetTable.Columns.Count)
1877+
{
1878+
return string.Empty;
1879+
}
1880+
1881+
return spreadsheetTable.Rows[rowIndex][columnIndex]?.ToString() ?? string.Empty;
1882+
}
1883+
18291884
internal static bool ShouldHandleSpreadsheetDeleteKey(int selectedCellCount, bool isCellEditorFocused)
18301885
{
18311886
return !isCellEditorFocused && selectedCellCount > 0;
@@ -3461,10 +3516,11 @@ private void LaunchFindAndReplace()
34613516
findAndReplaceWindow.TextEditWindow = this;
34623517
findAndReplaceWindow.Show();
34633518

3519+
string selectedText = IsSpreadsheetMode ? GetSpreadsheetSelectedText() : PassedTextControl.SelectedText;
34643520

3465-
if (PassedTextControl.SelectedText.Length > 0)
3521+
if (selectedText.Length > 0)
34663522
{
3467-
findAndReplaceWindow.SetFindText(PassedTextControl.SelectedText.Trim());
3523+
findAndReplaceWindow.SetFindText(selectedText.Trim());
34683524
findAndReplaceWindow.SearchForText();
34693525
}
34703526
}

0 commit comments

Comments
 (0)