blob: b28cd37dff202a78773762b1e976156d67522fc6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.ui.internal.views;
import org.eclipse.help.IContext;
import org.eclipse.help.IContextProvider;
import org.eclipse.help.IHelpResource;
import org.eclipse.help.internal.HelpPlugin;
import org.eclipse.help.ui.internal.IHelpUIConstants;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.IPageChangeProvider;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.viewers.IPostSelectionProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.HyperlinkGroup;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.part.ViewPart;
public class HelpView extends ViewPart implements IPartListener2,
ISelectionChangedListener, IPageChangedListener {
private FormToolkit toolkit;
private String firstPageId;
private ReusableHelpPart reusableHelpPart;
//private Hashtable pageRecs;
private IWorkbenchPart monitoredPart;
private boolean visible;
/**
*
*/
public HelpView() {
}
@Override
public void createPartControl(Composite parent) {
toolkit = new FormToolkit(parent.getDisplay());
toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(
HyperlinkGroup.UNDERLINE_HOVER);
// toolkit.setBackground(toolkit.getColors().createNoContentBackground());
toolkit.getColors().initializeSectionToolBarColors();
reusableHelpPart.createControl(parent, toolkit);
reusableHelpPart.setDefaultContextHelpText(Messages.HelpView_defaultText);
reusableHelpPart.showPage(getFirstPage());
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
"org.eclipse.help.ui.helpView"); //$NON-NLS-1$
IWorkbenchWindow window = getSite().getPage().getWorkbenchWindow();
if (window == null)
return;
IWorkbenchPage page = window.getActivePage();
if (page == null)
return;
IWorkbenchPartReference aref = page.getActivePartReference();
if (aref != null)
handlePartActivation(aref);
}
@Override
public void dispose() {
IWorkbenchWindow window = getSite().getPage().getWorkbenchWindow();
IPartService service = window.getPartService();
if (monitoredPart != null) {
uninstallSelectionListener(monitoredPart);
uninstallPageListener(monitoredPart);
}
service.removePartListener(this);
if (reusableHelpPart != null) {
reusableHelpPart.dispose();
reusableHelpPart = null;
}
if (toolkit != null) {
toolkit.dispose();
toolkit = null;
}
super.dispose();
}
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
if (memento!=null)
this.firstPageId = memento.getString("pageId"); //$NON-NLS-1$
init(site);
reusableHelpPart = new ReusableHelpPart(site.getWorkbenchWindow(),
getHelpPartStyle());
IActionBars actionBars = site.getActionBars();
reusableHelpPart.init(actionBars, actionBars.getToolBarManager(),
actionBars.getStatusLineManager(), actionBars.getMenuManager(), memento);
IWorkbenchWindow window = site.getPage().getWorkbenchWindow();
IPartService service = window.getPartService();
service.addPartListener(this);
}
@Override
public void saveState(IMemento memento) {
if (reusableHelpPart!=null && memento!=null) {
String pageId = reusableHelpPart.getCurrentPageId();
if (pageId!=null)
memento.putString("pageId", pageId); //$NON-NLS-1$
reusableHelpPart.saveState(memento);
}
}
private void handlePartActivation(IWorkbenchPartReference ref) {
if (reusableHelpPart == null)
return;
if (!visible || !reusableHelpPart.isMonitoringContextHelp())
return;
if (isThisPart(ref))
return;
IWorkbenchPart part = ref.getPart(false);
Display display = part.getSite().getShell().getDisplay();
Control c = display.getFocusControl();
if (c != null && c.isVisible() && !c.isDisposed()) {
IContextProvider provider = part.getAdapter(IContextProvider.class);
if (provider != null) {
reusableHelpPart.update(provider, null, part, c, false);
if ((provider.getContextChangeMask() & IContextProvider.SELECTION) != 0) {
// context help changes with selections
installSelectionListener(part);
}
} else
reusableHelpPart.update(part, c);
if (part instanceof IPageChangeProvider)
installPageListener(part);
} else {
if (HelpPlugin.DEBUG_CONTEXT) {
if (c == null) {
System.out.println("Context: focus control is null " ); //$NON-NLS-1$
}
if (!c.isVisible()) {
System.out.println("Context: focus control not visible " ); //$NON-NLS-1$
}
}
}
}
private void installPageListener(IWorkbenchPart part) {
if (part instanceof IPageChangeProvider)
((IPageChangeProvider)part).addPageChangedListener(this);
monitoredPart = part;
}
private void uninstallPageListener(IWorkbenchPart part) {
if (part instanceof IPageChangeProvider)
((IPageChangeProvider)part).removePageChangedListener(this);
monitoredPart = null;
}
private void installSelectionListener(IWorkbenchPart part) {
ISelectionProvider provider = part.getSite().getSelectionProvider();
if (provider instanceof IPostSelectionProvider)
((IPostSelectionProvider) provider)
.addPostSelectionChangedListener(this);
else
provider.addSelectionChangedListener(this);
monitoredPart = part;
}
private void uninstallSelectionListener(IWorkbenchPart part) {
ISelectionProvider provider = part.getSite().getSelectionProvider();
if (provider instanceof IPostSelectionProvider)
((IPostSelectionProvider) provider)
.removePostSelectionChangedListener(this);
else if (provider != null)
provider.removeSelectionChangedListener(this);
monitoredPart = null;
}
private boolean isThisPart(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
return part != null && part.equals(this);
}
private void updateActivePart() {
if (reusableHelpPart == null)
return;
if (!reusableHelpPart.isMonitoringContextHelp())
return;
if (monitoredPart == null)
return;
Control c = monitoredPart.getSite().getShell().getDisplay()
.getFocusControl();
if (c != null && c.isDisposed() == false && visible) {
IContextProvider provider = monitoredPart.getAdapter(IContextProvider.class);
if (provider != null)
reusableHelpPart.update(provider, null, monitoredPart, c, false);
else
reusableHelpPart.update(monitoredPart, c);
}
}
private void handlePartDeactivation(IWorkbenchPartReference ref) {
IWorkbenchPart part = ref.getPart(false);
if (monitoredPart != null && part != null && part.equals(monitoredPart)) {
uninstallSelectionListener(part);
uninstallPageListener(part);
}
}
@Override
public void partActivated(final IWorkbenchPartReference partRef) {
if (isThisPart(partRef)) {
visible = true;
hook(true, partRef);
selectionChanged(null);
} else {
if (HelpPlugin.DEBUG_CONTEXT) {
System.out.println("Help View: activation of " + partRef.getPartName() + " part"); //$NON-NLS-1$ //$NON-NLS-2$
}
handlePartActivation(partRef);
}
}
@Override
public void partBroughtToTop(IWorkbenchPartReference partRef) {
if (isThisPart(partRef)) {
visible = true;
hook(true, partRef);
selectionChanged(null);
}
}
@Override
public void partClosed(IWorkbenchPartReference partRef) {
handlePartDeactivation(partRef);
}
@Override
public void partDeactivated(IWorkbenchPartReference partRef) {
handlePartDeactivation(partRef);
}
@Override
public void partHidden(IWorkbenchPartReference partRef) {
if (isThisPart(partRef)) {
visible = false;
hook(false, partRef);
}
}
@Override
public void partInputChanged(IWorkbenchPartReference partRef) {
}
@Override
public void partOpened(IWorkbenchPartReference partRef) {
if (isThisPart(partRef)) {
visible = true;
hook(true, partRef);
selectionChanged(null);
}
}
@Override
public void partVisible(IWorkbenchPartReference partRef) {
if (isThisPart(partRef)) {
visible = true;
hook(true, partRef);
selectionChanged(null);
}
}
private void hook(boolean doHook, IWorkbenchPartReference partref) {
if (doHook) {
IWorkbenchWindow window = partref.getPage().getWorkbenchWindow();
IPartService service = window.getPartService();
IWorkbenchPartReference aref = service.getActivePartReference();
if (aref != null)
handlePartActivation(aref);
} else {
if (monitoredPart != null) {
uninstallSelectionListener(monitoredPart);
uninstallPageListener(monitoredPart);
}
}
}
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (!visible)
return;
getSite().getShell().getDisplay().asyncExec(() -> updateActivePart());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.help.ui.internal.views.BaseHelpView#getFirstPage()
*/
protected String getFirstPage() {
if (firstPageId!=null)
return firstPageId;
return IHelpUIConstants.HV_CONTEXT_HELP_PAGE;
}
public void displayContext(IContext context, IWorkbenchPart part,
Control control) {
if (reusableHelpPart != null) {
/*
* If the context help has no description text and exactly one
* topic, go straight to the topic and skip context help.
*/
IHelpResource[] topics = context.getRelatedTopics();
if (context.getText() != null || topics.length != 1) {
// Ensure that context help is currently showing
reusableHelpPart.showPage(IHelpUIConstants.HV_CONTEXT_HELP_PAGE);
// check if there is a dynamic version
IContextProvider provider = null;
if (part!=null)
provider = part.getAdapter(IContextProvider.class);
reusableHelpPart.update(provider, context, part, control, true);
}
else {
reusableHelpPart.showURL(topics[0].getHref());
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.help.ui.internal.views.BaseHelpView#getHelpPartStyle()
*/
protected int getHelpPartStyle() {
return ReusableHelpPart.getDefaultStyle();
}
@Override
public void setFocus() {
if (reusableHelpPart != null)
reusableHelpPart.setFocus();
}
public void startSearch(String phrase) {
if (reusableHelpPart != null)
reusableHelpPart.startSearch(phrase);
}
public void showIndex() {
if (reusableHelpPart != null)
reusableHelpPart.showPage(IHelpUIConstants.HV_INDEX_PAGE, true);
}
public void showHelp(String href) {
if (reusableHelpPart != null)
reusableHelpPart.showURL(href);
}
public void showDynamicHelp(IWorkbenchPart part, Control c) {
if (reusableHelpPart != null)
reusableHelpPart.showDynamicHelp(part, c);
}
@Override
public void pageChanged(PageChangedEvent event) {
if (!visible)
return;
updateActivePart();
}
}