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() {
+	}
+	
+}