1313 *******************************************************************************/
1414package org .eclipse .ui .internal .findandreplace .overlay ;
1515
16- import java .lang .reflect .InvocationTargetException ;
1716import java .lang .reflect .Method ;
17+ import java .util .HashMap ;
1818import java .util .List ;
19+ import java .util .Map ;
1920import java .util .concurrent .atomic .AtomicReference ;
2021
2122import org .osgi .framework .FrameworkUtil ;
4647
4748import org .eclipse .core .runtime .Status ;
4849
50+ import org .eclipse .jface .action .IAction ;
4951import org .eclipse .jface .bindings .keys .KeyStroke ;
5052import org .eclipse .jface .dialogs .Dialog ;
5153import org .eclipse .jface .dialogs .IDialogSettings ;
6062import org .eclipse .jface .text .IFindReplaceTarget ;
6163import org .eclipse .jface .text .ITextViewer ;
6264
65+ import org .eclipse .ui .IActionBars ;
6366import org .eclipse .ui .IWorkbenchPart ;
6467import org .eclipse .ui .PlatformUI ;
6568import org .eclipse .ui .fieldassist .ContentAssistCommandAdapter ;
7073import org .eclipse .ui .internal .findandreplace .SearchOptions ;
7174import org .eclipse .ui .internal .findandreplace .status .IFindReplaceStatus ;
7275import org .eclipse .ui .internal .texteditor .TextEditorPlugin ;
76+ import org .eclipse .ui .part .MultiPageEditorSite ;
7377
7478import org .eclipse .ui .texteditor .AbstractTextEditor ;
7579import org .eclipse .ui .texteditor .FindReplaceAction ;
7680import org .eclipse .ui .texteditor .IAbstractTextEditorHelpContextIds ;
81+ import org .eclipse .ui .texteditor .ITextEditorActionConstants ;
7782import org .eclipse .ui .texteditor .ITextEditorActionDefinitionIds ;
7883import org .eclipse .ui .texteditor .StatusTextEditor ;
7984
@@ -148,6 +153,8 @@ private final class KeyboardShortcuts {
148153 private ContentAssistCommandAdapter contentAssistSearchField , contentAssistReplaceField ;
149154
150155 private FocusListener targetActionActivationHandling = new FocusListener () {
156+ private DeactivateGlobalActionHandlers globalActionHandlerDeaction ;
157+
151158 @ Override
152159 public void focusGained (FocusEvent e ) {
153160 setTextEditorActionsActivated (false );
@@ -167,15 +174,48 @@ private void setTextEditorActionsActivated(boolean state) {
167174 if (!(targetPart instanceof AbstractTextEditor )) {
168175 return ;
169176 }
177+ if (targetPart .getSite () instanceof MultiPageEditorSite multiEditorSite ) {
178+ if (!state && globalActionHandlerDeaction == null ) {
179+ globalActionHandlerDeaction = new DeactivateGlobalActionHandlers (multiEditorSite .getActionBars ());
180+ } else if (state && globalActionHandlerDeaction != null ) {
181+ globalActionHandlerDeaction .reactivate ();
182+ globalActionHandlerDeaction = null ;
183+ }
184+ }
170185 try {
171186 Method method = AbstractTextEditor .class .getDeclaredMethod ("setActionActivation" , boolean .class ); //$NON-NLS-1$
172187 method .setAccessible (true );
173188 method .invoke (targetPart , Boolean .valueOf (state ));
174- } catch (IllegalArgumentException | InvocationTargetException | IllegalAccessException | SecurityException | NoSuchMethodException ex ) {
189+ } catch (IllegalArgumentException | ReflectiveOperationException ex ) {
175190 TextEditorPlugin .getDefault ().getLog ()
176191 .log (Status .error ("cannot (de-)activate actions for text editor" , ex )); //$NON-NLS-1$
177192 }
178193 }
194+
195+ static final class DeactivateGlobalActionHandlers {
196+ private final static List <String > ACTIONS = List .of (ITextEditorActionConstants .CUT ,
197+ ITextEditorActionConstants .COPY , ITextEditorActionConstants .PASTE ,
198+ ITextEditorActionConstants .DELETE , ITextEditorActionConstants .SELECT_ALL ,
199+ ITextEditorActionConstants .FIND );
200+
201+ private final Map <String , IAction > deactivatedActions = new HashMap <>();
202+ private final IActionBars actionBars ;
203+
204+ public DeactivateGlobalActionHandlers (IActionBars actionBars ) {
205+ this .actionBars = actionBars ;
206+ for (String actionID : ACTIONS ) {
207+ deactivatedActions .putIfAbsent (actionID , actionBars .getGlobalActionHandler (actionID ));
208+ actionBars .setGlobalActionHandler (actionID , null );
209+ }
210+ }
211+
212+ public void reactivate () {
213+ for (String actionID : deactivatedActions .keySet ()) {
214+ actionBars .setGlobalActionHandler (actionID , deactivatedActions .get (actionID ));
215+ }
216+ }
217+ }
218+
179219 };
180220
181221 public FindReplaceOverlay (Shell parent , IWorkbenchPart part , IFindReplaceTarget target ) {
0 commit comments