| /******************************************************************************* |
| * 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) { |
| } |
| } |