Skip to content

Commit

Permalink
Avoid FindReplaceOverlay setTextEditorActionsActivated resulting in NPE
Browse files Browse the repository at this point in the history
- The FindReplaceOverlay's setTextEditorActionsActivated method
reflectively invokes AbstractTextEditor.setActionActivation(boolean) and
that method assumes that getEditorSite().getActionBarContributor()
returns non-null but MultiPageEditorSite.getActionBarContributor()
returns null so in PDE's target editor, this leads to an NPE.
- AbstractTextEditor.setActionActivation(boolean) must guard against a
null action contributor to avoid NPE and instead should get and use the
action bar contributor of the containing multi-page editor.
  • Loading branch information
merks committed Jan 18, 2025
1 parent dbf808e commit e90c9a6
Showing 1 changed file with 27 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@
import org.eclipse.jface.text.source.VerticalRuler;

import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
Expand Down Expand Up @@ -5212,10 +5213,15 @@ public void setAction(String actionID, IAction action) {
/**
* Sets this editor's actions into activated (default) or deactived state.
* <p>
* XXX: This is called by the Java editor for its breadcrumb feature. We
* don't want to make this risky method API because the Java editor
* breadcrumb might become a Platform UI feature during 3.5 and hence we can
* then delete this workaround.
* XXX: This is called by the Java editor for its breadcrumb feature. We don't
* want to make this risky method API because the Java editor breadcrumb might
* become a Platform UI feature during 3.5 and hence we can then delete this
* workaround.
* </p>
* <p>
* This is also called reflectively by
* org.eclipse.ui.internal.findandreplace.overlay.FindReplaceOverlay.targetActionActivationHandling.new
* FocusListener() {...}.setTextEditorActionsActivated(boolean).
* </p>
*
* @param state <code>true</code> if activated
Expand All @@ -5230,9 +5236,9 @@ private void setActionActivation(boolean state) {
if (action != null)
fActivationCodeTrigger.registerActionForKeyActivation(action);
}
getEditorSite().getActionBarContributor().setActiveEditor(this);
setActiveEditor(this);
} else {
getEditorSite().getActionBarContributor().setActiveEditor(null);
setActiveEditor(null);
Iterator<IAction> iter= fActions.values().iterator();
while (iter.hasNext()) {
IAction action= iter.next();
Expand All @@ -5243,6 +5249,21 @@ private void setActionActivation(boolean state) {
}
}

private void setActiveEditor(IEditorPart targetEditor) {
IEditorSite editorSite = getEditorSite();
IEditorActionBarContributor actionBarContributor = editorSite.getActionBarContributor();
// Handle that MultiPageEditorSite.getActionBarContributor() returns null.
if (actionBarContributor == null) {
if (editorSite instanceof MultiPageEditorSite multiPageEditorSite) {
actionBarContributor = multiPageEditorSite.getMultiPageEditor().getEditorSite()
.getActionBarContributor();
}
}
if (actionBarContributor != null) {
actionBarContributor.setActiveEditor(targetEditor);
}
}

private static final boolean HACK_TO_SUPPRESS_UNUSUED_WARNING= false;
{
if (HACK_TO_SUPPRESS_UNUSUED_WARNING)
Expand Down

0 comments on commit e90c9a6

Please sign in to comment.