blob: 761e266176b62559c21e78c92be41ca8d029c55f [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.HelpSystem;
import org.eclipse.help.IHelpResource;
import org.eclipse.help.IToc;
import org.eclipse.help.ITopic;
import org.eclipse.help.internal.Topic;
import org.eclipse.help.internal.UAElement;
import org.eclipse.help.internal.toc.Toc;
import org.eclipse.help.ui.internal.HelpUIResources;
import org.eclipse.help.ui.internal.IHelpUIConstants;
import org.eclipse.help.ui.internal.util.OverlayIcon;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.forms.widgets.FormToolkit;
public class AllTopicsPart extends HyperlinkTreePart {
private Image containerWithTopicImage;
//private Action showAllAction;
class TopicsProvider implements ITreeContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement == AllTopicsPart.this)
return HelpSystem.getTocs();
if (parentElement instanceof IToc)
return ((IToc) parentElement).getTopics();
if (parentElement instanceof ITopic)
return ((ITopic) parentElement).getSubtopics();
return new Object[0];
}
@Override
public Object getParent(Object element) {
if (element instanceof IToc) {
return AllTopicsPart.this;
}
else if (element instanceof UAElement) {
return ((UAElement)element).getParentElement();
}
return null;
}
@Override
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
class TopicsLabelProvider extends LabelProvider {
@Override
public String getText(Object obj) {
if (obj instanceof IHelpResource)
return ((IHelpResource) obj).getLabel();
return super.getText(obj);
}
@Override
public Image getImage(Object obj) {
boolean expanded = treeViewer.getExpandedState(obj);
boolean expandable = treeViewer.isExpandable(obj);
if (obj instanceof Toc){
Toc toc = (Toc) obj;
Image icon = HelpUIResources.getImageFromId(toc.getIcon(), expanded, !expandable);
if (icon != null) {
return icon;
}
}
if (obj instanceof Topic) {
Topic topic = (Topic) obj;
Image icon = HelpUIResources.getImageFromId(topic.getIcon(), expanded, !expandable);
if (icon != null) {
return icon;
}
}
if (obj instanceof IToc) {
String key = expanded ? IHelpUIConstants.IMAGE_TOC_OPEN
: IHelpUIConstants.IMAGE_TOC_CLOSED;
return HelpUIResources.getImage(key);
}
if (obj instanceof ITopic) {
if (expandable) {
ITopic topic = (ITopic) obj;
if (topic.getHref() != null)
return containerWithTopicImage;
}
String key = expandable ? IHelpUIConstants.IMAGE_CONTAINER
: IHelpUIConstants.IMAGE_FILE_F1TOPIC;
return HelpUIResources.getImage(key);
}
return super.getImage(obj);
}
}
class EmptyContainerFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement,
Object element) {
if (element instanceof IToc) {
return isNotEmpty((IToc) element);
} else if (element instanceof ITopic) {
return isNotEmpty((ITopic) element);
}
return false;
}
private boolean isNotEmpty(IToc toc) {
ITopic[] topics = toc.getTopics();
return isNotEmpty(topics);
}
private boolean isNotEmpty(ITopic topic) {
String href = topic.getHref();
ITopic[] topics = topic.getSubtopics();
return href != null || isNotEmpty(topics);
}
private boolean isNotEmpty(ITopic[] topics) {
for (int i = 0; i < topics.length; i++) {
if (isNotEmpty(topics[i]))
return true;
}
return false;
}
}
/**
* @param parent
* @param toolkit
* @param style
*/
public AllTopicsPart(Composite parent, final FormToolkit toolkit,
IToolBarManager tbm) {
super(parent, toolkit, tbm);
}
@Override
protected void configureTreeViewer() {
initializeImages();
treeViewer.setContentProvider(new TopicsProvider());
treeViewer.setLabelProvider(new TopicsLabelProvider());
treeViewer.addTreeListener(new ITreeViewerListener() {
@Override
public void treeCollapsed(TreeExpansionEvent event) {
postUpdate(event.getElement());
}
@Override
public void treeExpanded(TreeExpansionEvent event) {
postUpdate(event.getElement());
}
});
}
@Override
public void init(ReusableHelpPart parent, String id, IMemento memento) {
super.init(parent, id, memento);
if (parent.isFilteredByRoles())
treeViewer.addFilter(parent.getRoleFilter());
treeViewer.addFilter(parent.getUAFilter());
treeViewer.addFilter(new EmptyContainerFilter());
}
private void initializeImages() {
ImageDescriptor base = HelpUIResources
.getImageDescriptor(IHelpUIConstants.IMAGE_CONTAINER);
ImageDescriptor ovr = HelpUIResources
.getImageDescriptor(IHelpUIConstants.IMAGE_DOC_OVR);
ImageDescriptor desc = new OverlayIcon(base,
new ImageDescriptor[][] { { ovr } });
containerWithTopicImage = desc.createImage();
}
@Override
public void dispose() {
containerWithTopicImage.dispose();
super.dispose();
}
@Override
protected void doOpen(Object obj) {
if (!(obj instanceof IHelpResource))
return;
IHelpResource res = (IHelpResource) obj;
if (res instanceof IToc
|| (res instanceof ITopic
&& ((ITopic) obj).getSubtopics().length > 0 && res
.getHref() == null))
treeViewer.setExpandedState(obj, !treeViewer.getExpandedState(res));
if (res instanceof IToc)
postUpdate(res);
else if (res.getHref() != null)
parent.showURL(res.getHref());
}
@Override
protected String getHref(IHelpResource res) {
return (res instanceof ITopic) ? res.getHref() : null;
}
public void selectReveal(String href) {
IToc[] tocs = HelpSystem.getTocs();
for (int i = 0; i < tocs.length; i++) {
IToc toc = tocs[i];
ITopic topic = toc.getTopic(href);
if (topic != null) {
selectReveal(topic);
return;
}
}
}
public void selectReveal(IHelpResource res) {
treeViewer.setSelection(new StructuredSelection(res), true);
treeViewer.expandToLevel(res, 1);
treeViewer.getControl().setFocus();
}
@Override
protected boolean canAddBookmarks() {
return true;
}
@Override
public void toggleRoleFilter() {
if (parent.isFilteredByRoles())
treeViewer.addFilter(parent.getRoleFilter());
else
treeViewer.removeFilter(parent.getRoleFilter());
}
@Override
public void saveState(IMemento memento) {
}
}