Skip to content

Commit ce4e10f

Browse files
committed
Find/Replace overlay: adopt Eclipse command infrastructure
The overlay previously dispatched keyboard shortcuts through custom SWT KeyListeners and toggled button enablement by manipulating ToolItems directly, bypassing the Eclipse key binding framework entirely: shortcuts could not be seen or customized via Preferences > Keys, and user-defined overrides were silently ignored. FindReplaceOverlayAction now extends AbstractHandler, so every overlay operation is a real Eclipse handler. AccessibleToolItem.setAction() derives a ToolItem's enabled state and shortcut-hint tooltip from the action itself (via IHandlerListener and a hint resolved through IBindingService), instead of having them pushed to it explicitly at each call site. A dedicated key-binding context hierarchy, declared in plugin.xml and activated/deactivated with overlay focus, scopes the search- and replace-specific commands separately from the ones common to the whole overlay: findReplaceOverlay (parent, active while the search or replace field has focus) |- findReplaceOverlay.searchFocused (active while the search field has focus) |- findReplaceOverlay.replaceFocused (active while the replace field has focus) Handler activation for the overlay's own commands is registered once per action, scoped by an ACTIVE_FOCUS_CONTROL-based expression backed by IFocusService tracking the search/replace text controls, rather than imperatively activated and deactivated on every focus-gained/-lost event. Context activation/deactivation is made defensively idempotent rather than relying on focus-gained/-lost events always alternating strictly: activating a bar's context first clears any contexts still active from a previous activation, and disposing the overlay's container control also deactivates any active contexts and reactivates the target editor's actions, since disposal is not guaranteed to always be preceded by a focus-lost event. Fixes #2015 Prepares #1912
1 parent 5fe0fc9 commit ce4e10f

7 files changed

Lines changed: 389 additions & 171 deletions

File tree

bundles/org.eclipse.ui.workbench.texteditor/plugin.properties

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,21 @@ command.joinLines.name = Join Lines
206206
command.openHyperlink.name= Open Hyperlink
207207
command.openHyperlink.description= Opens the hyperlink at the caret location or opens a chooser if more than one hyperlink is available
208208

209+
command.findReplaceOverlay.searchForward.name= Find and Replace: Search Forward
210+
command.findReplaceOverlay.searchBackward.name= Find and Replace: Search Backward
211+
command.findReplaceOverlay.selectAll.name= Find and Replace: Select All Matches
212+
command.findReplaceOverlay.replaceOne.name= Find and Replace: Replace
213+
command.findReplaceOverlay.replaceAll.name= Find and Replace: Replace All
214+
command.findReplaceOverlay.close.name= Find and Replace: Close
215+
command.findReplaceOverlay.toggleReplace.name= Find and Replace: Toggle Replace Bar
216+
command.findReplaceOverlay.toggleCaseSensitive.name= Find and Replace: Toggle Case Sensitive
217+
command.findReplaceOverlay.toggleWholeWord.name= Find and Replace: Toggle Whole Word
218+
command.findReplaceOverlay.toggleRegex.name= Find and Replace: Toggle Regular Expression
219+
command.findReplaceOverlay.toggleSearchInSelection.name= Find and Replace: Toggle Search in Selection
220+
context.findReplaceOverlay.name= Find and Replace
221+
context.findReplaceOverlay.searchFocused.name= Find and Replace (Search Input Focused)
222+
context.findReplaceOverlay.replaceFocused.name= Find and Replace (Replace Input Focused)
223+
209224
Color.rangeIndicator= Range indicator color
210225
Color.rangeIndicatorDesc= The color that is used for the ruler that marks the range of the current selected text block.
211226

bundles/org.eclipse.ui.workbench.texteditor/plugin.xml

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,61 @@
507507
description="%command.openHyperlink.description"
508508
categoryId="org.eclipse.ui.category.textEditor"
509509
id="org.eclipse.ui.edit.text.open.hyperlink">
510+
</command>
511+
<command
512+
name="%command.findReplaceOverlay.searchForward.name"
513+
categoryId="org.eclipse.ui.category.textEditor"
514+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchForward">
515+
</command>
516+
<command
517+
name="%command.findReplaceOverlay.searchBackward.name"
518+
categoryId="org.eclipse.ui.category.textEditor"
519+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchBackward">
520+
</command>
521+
<command
522+
name="%command.findReplaceOverlay.selectAll.name"
523+
categoryId="org.eclipse.ui.category.textEditor"
524+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.selectAll">
525+
</command>
526+
<command
527+
name="%command.findReplaceOverlay.replaceOne.name"
528+
categoryId="org.eclipse.ui.category.textEditor"
529+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.replaceOne">
530+
</command>
531+
<command
532+
name="%command.findReplaceOverlay.replaceAll.name"
533+
categoryId="org.eclipse.ui.category.textEditor"
534+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.replaceAll">
535+
</command>
536+
<command
537+
name="%command.findReplaceOverlay.close.name"
538+
categoryId="org.eclipse.ui.category.textEditor"
539+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.close">
540+
</command>
541+
<command
542+
name="%command.findReplaceOverlay.toggleReplace.name"
543+
categoryId="org.eclipse.ui.category.textEditor"
544+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleReplace">
545+
</command>
546+
<command
547+
name="%command.findReplaceOverlay.toggleCaseSensitive.name"
548+
categoryId="org.eclipse.ui.category.textEditor"
549+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleCaseSensitive">
550+
</command>
551+
<command
552+
name="%command.findReplaceOverlay.toggleWholeWord.name"
553+
categoryId="org.eclipse.ui.category.textEditor"
554+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleWholeWord">
555+
</command>
556+
<command
557+
name="%command.findReplaceOverlay.toggleRegex.name"
558+
categoryId="org.eclipse.ui.category.textEditor"
559+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleRegex">
560+
</command>
561+
<command
562+
name="%command.findReplaceOverlay.toggleSearchInSelection.name"
563+
categoryId="org.eclipse.ui.category.textEditor"
564+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleSearchInSelection">
510565
</command>
511566
</extension>
512567

@@ -1500,4 +1555,82 @@
15001555
label="%CodeMining.show.ZWSP">
15011556
</codeMiningProvider>
15021557
</extension>
1558+
1559+
<extension
1560+
point="org.eclipse.ui.contexts">
1561+
<context
1562+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay"
1563+
name="%context.findReplaceOverlay.name"
1564+
parentId="org.eclipse.ui.textEditorScope">
1565+
</context>
1566+
<context
1567+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchFocused"
1568+
name="%context.findReplaceOverlay.searchFocused.name"
1569+
parentId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay">
1570+
</context>
1571+
<context
1572+
id="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.replaceFocused"
1573+
name="%context.findReplaceOverlay.replaceFocused.name"
1574+
parentId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay">
1575+
</context>
1576+
</extension>
1577+
1578+
<extension
1579+
point="org.eclipse.ui.bindings">
1580+
<key
1581+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.close"
1582+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay"
1583+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1584+
sequence="ESC"/>
1585+
<key
1586+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleReplace"
1587+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay"
1588+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1589+
sequence="M1+R"/>
1590+
<key
1591+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleCaseSensitive"
1592+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay"
1593+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1594+
sequence="M1+M2+C"/>
1595+
<key
1596+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleWholeWord"
1597+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay"
1598+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1599+
sequence="M1+M2+D"/>
1600+
<key
1601+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleRegex"
1602+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay"
1603+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1604+
sequence="M1+M2+P"/>
1605+
<key
1606+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.toggleSearchInSelection"
1607+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay"
1608+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1609+
sequence="M1+M2+I"/>
1610+
<key
1611+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchForward"
1612+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchFocused"
1613+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1614+
sequence="CR"/>
1615+
<key
1616+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchBackward"
1617+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchFocused"
1618+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1619+
sequence="M2+CR"/>
1620+
<key
1621+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.selectAll"
1622+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.searchFocused"
1623+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1624+
sequence="M1+CR"/>
1625+
<key
1626+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.replaceOne"
1627+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.replaceFocused"
1628+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1629+
sequence="CR"/>
1630+
<key
1631+
commandId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.replaceAll"
1632+
contextId="org.eclipse.ui.workbench.texteditor.findReplaceOverlay.replaceFocused"
1633+
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
1634+
sequence="M1+CR"/>
1635+
</extension>
15031636
</plugin>

0 commit comments

Comments
 (0)