Bug 541790: [R-Help] Add auto selection of REnv in R help search page
Change-Id: Iea4ee20cb1b9c25188ff2cf46e1fff68f5ef208f
diff --git a/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/internal/r/console/ui/page/RConsolePage.java b/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/internal/r/console/ui/page/RConsolePage.java
index c5668d2..6faec3c 100644
--- a/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/internal/r/console/ui/page/RConsolePage.java
+++ b/r/org.eclipse.statet.r.console.ui/src/org/eclipse/statet/internal/r/console/ui/page/RConsolePage.java
@@ -226,6 +226,9 @@
if (adapterType == IContextProvider.class) {
return (T) this.helpContextProvider;
}
+ if (adapterType == REnv.class) {
+ return (T) getTool().getAdapter(REnv.class);
+ }
return super.getAdapter(adapterType);
}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/REditor.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/REditor.java
index ddcdba1..e86e2f4 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/REditor.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/editors/REditor.java
@@ -83,6 +83,7 @@
import org.eclipse.statet.r.ui.sourceediting.InsertAssignmentHandler;
import org.eclipse.statet.r.ui.sourceediting.RSourceViewerConfiguration;
import org.eclipse.statet.r.ui.sourceediting.RSourceViewerConfigurator;
+import org.eclipse.statet.rj.renv.core.REnv;
public class REditor extends SourceEditor1 implements IRSourceEditor {
@@ -315,15 +316,6 @@
@Override
- @SuppressWarnings("unchecked")
- public <T> T getAdapter(final Class<T> adapterType) {
- if (adapterType == IContextProvider.class) {
- return (T) this.helpContextProvider;
- }
- return super.getAdapter(adapterType);
- }
-
- @Override
protected SourceEditor1OutlinePage createOutlinePage() {
return new ROutlinePage(this);
}
@@ -338,4 +330,16 @@
return new String[] { IPageLayout.ID_PROJECT_EXPLORER, IPageLayout.ID_OUTLINE, RUI.R_HELP_VIEW_ID };
}
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> T getAdapter(final Class<T> adapterType) {
+ if (adapterType == REnv.class) {
+ return (T) getRCoreAccess().getREnv();
+ }
+ if (adapterType == IContextProvider.class) {
+ return (T) this.helpContextProvider;
+ }
+ return super.getAdapter(adapterType);
+ }
+
}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpSearchInputPage.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpSearchInputPage.java
index 755c63a..6c6dbeb 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpSearchInputPage.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpSearchInputPage.java
@@ -40,10 +40,13 @@
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.statet.jcommons.collections.ImCollections;
import org.eclipse.statet.jcommons.collections.ImList;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.jcommons.status.StatusException;
import org.eclipse.statet.ecommons.ui.dialogs.DialogUtils;
@@ -66,6 +69,7 @@
import org.eclipse.statet.rj.renv.core.REnv;
+@NonNullByDefault
public class RHelpSearchInputPage extends DialogPage implements ISearchPage {
@@ -94,7 +98,7 @@
return ImCollections.newList(array);
}
- private static String[] notNull(final String[] array) {
+ private static String[] notNull(final String @Nullable [] array) {
return (array != null) ? array : new String[0];
}
@@ -139,8 +143,11 @@
private REnvSelectionComposite rEnvControl;
+ private final RHelpManager rHelpManager;
+
public RHelpSearchInputPage() {
+ this.rHelpManager= RCore.getRHelpManager();
}
@@ -192,7 +199,6 @@
loadSettings();
initSettings();
- this.rEnvControl.setSetting(RCore.getREnvManager().getDefault());
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
@@ -274,6 +280,27 @@
this.fieldConceptsControl.setEnabled(enable);
}
+ private @Nullable REnvHelp getREnvHelp(final boolean fallbackDefault) {
+ { final REnv rEnv= RHelpSearchInputPage.this.rEnvControl.getSelection();
+ if (rEnv != null) {
+ final REnvHelp help= RHelpSearchInputPage.this.rHelpManager.getHelp(rEnv);
+ if (help != null) {
+ return help;
+ }
+ }
+ }
+ if (fallbackDefault) {
+ final REnv rEnv= RCore.getREnvManager().getDefault();
+ if (rEnv != null) {
+ final REnvHelp help= RHelpSearchInputPage.this.rHelpManager.getHelp(rEnv);
+ if (help != null) {
+ return help;
+ }
+ }
+ }
+ return null;
+ }
+
private Composite createRestrictToGroup(final Composite parent) {
final Group group= new Group(parent, SWT.NONE);
group.setText("Restrict to:");
@@ -292,22 +319,7 @@
@Override
public void widgetSelected(final SelectionEvent e) {
List<RHelpKeywordGroup> keywords= null;
- REnv rEnv= RHelpSearchInputPage.this.rEnvControl.getSelection();
- final RHelpManager rHelpManager= RCore.getRHelpManager();
- if (rEnv != null) {
- final REnvHelp help= rHelpManager.getHelp(rEnv);
- if (help != null) {
- try {
- keywords= help.getKeywords();
- }
- finally {
- help.unlock();
- }
- }
- }
- if (keywords == null) {
- rEnv= RCore.getREnvManager().getDefault();
- final REnvHelp help= rHelpManager.getHelp(rEnv);
+ { final REnvHelp help= getREnvHelp(true);
if (help != null) {
try {
keywords= help.getKeywords();
@@ -349,22 +361,7 @@
@Override
public void widgetSelected(final SelectionEvent e) {
List<RPkgHelp> packages= null;
- REnv rEnv= RHelpSearchInputPage.this.rEnvControl.getSelection();
- final RHelpManager rHelpManager= RCore.getRHelpManager();
- if (rEnv != null) {
- final REnvHelp help= rHelpManager.getHelp(rEnv);
- if (help != null) {
- try {
- packages= help.getPkgs();
- }
- finally {
- help.unlock();
- }
- }
- }
- if (packages == null) {
- rEnv= RCore.getREnvManager().getDefault();
- final REnvHelp help= rHelpManager.getHelp(rEnv);
+ { final REnvHelp help= getREnvHelp(true);
if (help != null) {
try {
packages= help.getPkgs();
@@ -430,7 +427,7 @@
private void updateState() {
final REnv rEnv= this.rEnvControl.getSelection();
if (rEnv == null || rEnv.get(REnvHelpConfiguration.class) == null
- || !RCore.getRHelpManager().hasHelp(rEnv)) {
+ || !this.rHelpManager.hasHelp(rEnv) ) {
this.container.setPerformActionEnabled(false);
return;
}
@@ -446,7 +443,7 @@
int num= 0;
final List<String> texts= new ArrayList<>();
while (true) {
- final IDialogSettings section= dialogSettings.getSection("searchhist"+(num++)); //$NON-NLS-1$
+ final IDialogSettings section= dialogSettings.getSection("searchhist" + (num++)); //$NON-NLS-1$
if (section != null) {
final RHelpSearchQuery hist= loadQuery(section);
texts.add(hist.getSearchString());
@@ -461,7 +458,27 @@
}
}
+ private void initREnv(final @Nullable IWorkbenchPart part) {
+ final REnv defaultREnv= RCore.getREnvManager().getDefault();
+ this.rEnvControl.setSetting(defaultREnv);
+
+ if (part == null) {
+ return;
+ }
+ final REnv rEnv= part.getAdapter(REnv.class);
+ if (rEnv == null) {
+ return;
+ }
+ if (rEnv != defaultREnv && rEnv.resolve() != defaultREnv.resolve()
+ && this.rHelpManager.hasHelp(rEnv) ) {
+ this.rEnvControl.setSetting(rEnv);
+ }
+ }
+
private void initSettings() {
+ final IWorkbenchPart part= UIAccess.getActiveWorkbenchPart(true);
+ initREnv(part);
+
final ISelection selection= this.container.getSelection();
if (selection instanceof ITextSelection) {
this.searchTextControl.setText(((ITextSelection) selection).getText());
@@ -506,7 +523,7 @@
}
}
- private void loadPattern(final RHelpSearchQuery query) {
+ private void loadPattern(final @Nullable RHelpSearchQuery query) {
if (query == null) {
return;
}
diff --git a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpViewPage.java b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpViewPage.java
index a3ede45..942bc3b 100644
--- a/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpViewPage.java
+++ b/r/org.eclipse.statet.r.ui/src/org/eclipse/statet/internal/r/ui/rhelp/RHelpViewPage.java
@@ -21,6 +21,7 @@
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler2;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.ImageDescriptor;
@@ -45,11 +46,13 @@
import org.eclipse.statet.r.core.RCore;
import org.eclipse.statet.r.ui.RUI;
+import org.eclipse.statet.rhelp.core.RHelpUtils;
import org.eclipse.statet.rhelp.core.http.RHelpHttpService;
+import org.eclipse.statet.rj.renv.core.REnv;
@NonNullByDefault
-public class RHelpViewPage extends PageBookBrowserPage {
+public class RHelpViewPage extends PageBookBrowserPage implements IAdaptable {
private IBreadcrumb breadcrumb;
@@ -216,4 +219,21 @@
this.breadcrumb.setInput(input);
}
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> @Nullable T getAdapter(final Class<T> adapterType) {
+ if (adapterType == REnv.class) {
+ final Object input= this.helpObject;
+ if (input != null) {
+ if (input instanceof REnv) {
+ return (T) input;
+ }
+ return (T) RHelpUtils.getREnv(input);
+ }
+ return null;
+ }
+ return null;
+ }
+
}
diff --git a/redocs/org.eclipse.statet.redocs.tex.r/src/org/eclipse/statet/internal/redocs/tex/r/ui/editors/LtxRweaveEditor.java b/redocs/org.eclipse.statet.redocs.tex.r/src/org/eclipse/statet/internal/redocs/tex/r/ui/editors/LtxRweaveEditor.java
index 991bda2..077ef25 100644
--- a/redocs/org.eclipse.statet.redocs.tex.r/src/org/eclipse/statet/internal/redocs/tex/r/ui/editors/LtxRweaveEditor.java
+++ b/redocs/org.eclipse.statet.redocs.tex.r/src/org/eclipse/statet/internal/redocs/tex/r/ui/editors/LtxRweaveEditor.java
@@ -83,6 +83,7 @@
import org.eclipse.statet.redocs.tex.r.ui.editors.ILtxRweaveEditor;
import org.eclipse.statet.redocs.tex.r.ui.sourceediting.LtxRweaveSourceViewerConfiguration;
import org.eclipse.statet.redocs.tex.r.ui.sourceediting.LtxRweaveSourceViewerConfigurator;
+import org.eclipse.statet.rj.renv.core.REnv;
/**
@@ -317,4 +318,13 @@
return new String[] { IPageLayout.ID_PROJECT_EXPLORER, IPageLayout.ID_OUTLINE, RUI.R_HELP_VIEW_ID };
}
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> T getAdapter(final Class<T> adapterType) {
+ if (adapterType == REnv.class) {
+ return (T) getRCoreAccess().getREnv();
+ }
+ return super.getAdapter(adapterType);
+ }
+
}
diff --git a/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/redocs/wikitext/r/ui/editors/WikidocRweaveEditor.java b/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/redocs/wikitext/r/ui/editors/WikidocRweaveEditor.java
index 6e805ef..d937059 100644
--- a/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/redocs/wikitext/r/ui/editors/WikidocRweaveEditor.java
+++ b/redocs/org.eclipse.statet.redocs.wikitext.r/src/org/eclipse/statet/redocs/wikitext/r/ui/editors/WikidocRweaveEditor.java
@@ -91,6 +91,7 @@
import org.eclipse.statet.redocs.wikitext.r.ui.WikitextRweaveUI;
import org.eclipse.statet.redocs.wikitext.r.ui.sourceediting.WikidocRweaveSourceViewerConfiguration;
import org.eclipse.statet.redocs.wikitext.r.ui.sourceediting.WikidocRweaveSourceViewerConfigurator;
+import org.eclipse.statet.rj.renv.core.REnv;
/**
@@ -364,6 +365,14 @@
@Override
+ protected void editorSaved() {
+ super.editorSaved();
+
+ this.autoDocProcessing.onEditorSaved();
+ }
+
+
+ @Override
protected SourceEditor1OutlinePage createOutlinePage() {
return new WikidocRweaveOutlinePage(this);
}
@@ -383,15 +392,6 @@
return WikitextUI.getMarkupHelpContentIdFor(this.documentSetup.getMarkupLanguage());
}
-
- @Override
- protected void editorSaved() {
- super.editorSaved();
-
- this.autoDocProcessing.onEditorSaved();
- }
-
-
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter(final Class<T> adapterType) {
@@ -401,6 +401,9 @@
if (adapterType == RunDocProcessingOnSaveExtension.class) {
return (T) this.autoDocProcessing;
}
+ if (adapterType == REnv.class) {
+ return (T) getRCoreAccess().getREnv();
+ }
return super.getAdapter(adapterType);
}
diff --git a/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/RHelpUtils.java b/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/RHelpUtils.java
new file mode 100644
index 0000000..874bc5b
--- /dev/null
+++ b/rhelp/org.eclipse.statet.rhelp.core/src/org/eclipse/statet/rhelp/core/RHelpUtils.java
@@ -0,0 +1,53 @@
+/*=============================================================================#
+ # Copyright (c) 2018 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rhelp.core;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.renv.core.REnv;
+
+
+@NonNullByDefault
+public class RHelpUtils {
+
+
+ public static @Nullable REnv getREnv(final Object helpObject) {
+ if (helpObject instanceof REnvHelp) {
+ return ((REnvHelp) helpObject).getREnv();
+ }
+ if (helpObject instanceof RPkgHelp) {
+ return ((RPkgHelp) helpObject).getREnv();
+ }
+ if (helpObject instanceof RHelpPage) {
+ return ((RHelpPage) helpObject).getPackage().getREnv();
+ }
+ if (helpObject instanceof RHelpTopicLookup) {
+ return ((RHelpTopicLookup) helpObject).getREnv();
+ }
+ if (helpObject instanceof RHelpTopicEntry) {
+ return ((RHelpTopicEntry) helpObject).getPage().getPackage().getREnv();
+ }
+ if (helpObject instanceof RHelpSearchQuery) {
+ return ((RHelpSearchQuery) helpObject).getREnv();
+ }
+ return null;
+ }
+
+
+ private RHelpUtils() {
+ }
+
+}