blob: 3d74930d0022ac113c1ddff7a67cd44429985a41 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2016 Intel 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:
* Intel Corporation - initial API and implementation
* IBM Corporation - 163558 Dynamic content support for all UA
* IBM Corporation - Support for see elements
* Andreas Meissner - Fix Bug 351272
*******************************************************************************/
package org.eclipse.help.ui.internal.views;
import org.eclipse.help.HelpSystem;
import org.eclipse.help.IHelpResource;
import org.eclipse.help.IIndexEntry;
import org.eclipse.help.IIndexEntry2;
import org.eclipse.help.IIndexSee;
import org.eclipse.help.UAContentFilter;
import org.eclipse.help.internal.base.HelpBasePlugin;
import org.eclipse.help.internal.base.HelpEvaluationContext;
import org.eclipse.help.internal.base.util.IndexUtils;
import org.eclipse.help.internal.index.IndexSee;
import org.eclipse.help.ui.internal.IHelpUIConstants;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.forms.widgets.FormToolkit;
public class IndexPart extends HyperlinkTreePart implements IHelpUIConstants {
private RoleFilter roleFilter;
class IndexProvider implements ITreeContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement == IndexPart.this) {
return HelpSystem.getIndex().getEntries();
}
if (parentElement instanceof IIndexEntry) {
return IndexPart.this.getChildren((IIndexEntry) parentElement);
}
return new Object[0];
}
@Override
public Object getParent(Object element) {
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 IndexLabelProvider extends LabelProvider {
@Override
public String getText(Object obj) {
if (obj instanceof IIndexEntry)
return ((IIndexEntry) obj).getKeyword();
if (obj instanceof IHelpResource)
return ((IHelpResource) obj).getLabel();
if (obj instanceof IndexSee) {
IndexSee see = (IndexSee) obj;
return getSeeString(see);
}
return super.getText(obj);
}
@Override
public Image getImage(Object obj) {
return super.getImage(obj);
}
}
public String getSeeString(IIndexSee see) {
String seeText = see.isSeeAlso() ? Messages.SeeAlso : Messages.See;
String message = NLS.bind(seeText, see.getKeyword());
String[] path = IndexUtils.getPath(see);;
for (int i = 1; i < path.length; i++) {
message = NLS.bind(Messages.SeeList, message,path[i]);
}
return message;
}
class RoleFilter extends ViewerFilter {
@Override
public boolean select(Viewer viewer, Object parentElement,
Object element) {
if (element instanceof IIndexEntry) {
return isEnabled((IIndexEntry) element);
} else if (element instanceof IHelpResource) {
return isEnabled((IHelpResource) element);
} else if (element instanceof IIndexSee) {
return isEnabled(element);
}
return false;
}
private boolean isEnabled(IIndexEntry entry) {
if (!UAContentFilter.isFiltered(entry, HelpEvaluationContext.getContext())) {
IHelpResource[] topics = entry.getTopics();
for (int i = 0; i < topics.length; i++) {
if (isEnabled(topics[i]))
return true;
}
IIndexEntry[] subentries = entry.getSubentries();
for (int i = 0; i < subentries.length; i++) {
if (isEnabled(subentries[i]))
return true;
}
if (entry instanceof IIndexEntry2) {
IIndexSee[] sees = ((IIndexEntry2)entry).getSees();
for (int i = 0; i < sees.length; i++) {
if (isEnabled(sees[i]))
return true;
}
}
}
return false;
}
private boolean isEnabled(Object obj) {
return !UAContentFilter.isFiltered(obj, HelpEvaluationContext.getContext());
}
private boolean isEnabled(IHelpResource topic) {
return isEnabled((Object)topic) && HelpBasePlugin.getActivitySupport().isEnabled(topic.getHref());
}
}
public IndexPart(Composite parent, FormToolkit toolkit, IToolBarManager tbm) {
super(parent, toolkit, tbm);
roleFilter = new RoleFilter();
}
@Override
protected void configureTreeViewer() {
treeViewer.setContentProvider(new IndexProvider());
treeViewer.setLabelProvider(new IndexLabelProvider());
}
@Override
public void init(ReusableHelpPart parent, String id, IMemento memento) {
super.init(parent, id, memento);
if (parent.isFilteredByRoles())
treeViewer.addFilter(roleFilter);
}
@Override
protected void doOpen(Object obj) {
if (obj instanceof IHelpResource) {
parent.showURL(((IHelpResource) obj).getHref());
} else if (obj instanceof IIndexEntry) {
IIndexEntry entry = (IIndexEntry) obj;
if (getChildren(entry).length > 0) {
treeViewer.setExpandedState(obj, !treeViewer.getExpandedState(obj));
}
IHelpResource[] topics = entry.getTopics();
if (topics.length == 1) {
parent.showURL(topics[0].getHref());
}
} else if (obj instanceof IIndexSee) {
IIndexSee see = (IIndexSee)obj;
IIndexEntry[] entrys = IndexUtils.findSeeTargets(HelpSystem.getIndex(), see, 0);
for (int i = 0; i < entrys.length; i++) {
treeViewer.setExpandedState(entrys[i], true);
treeViewer.setSelection(new StructuredSelection(entrys[i]), true);
}
}
}
@Override
protected boolean canAddBookmarks() {
return true;
}
@Override
public void saveState(IMemento memento) {
}
@Override
public void toggleRoleFilter() {
if (parent.isFilteredByRoles())
treeViewer.addFilter(roleFilter);
else
treeViewer.removeFilter(roleFilter);
}
private Object[] getChildren(IIndexEntry entry) {
/*
* Index entry has two types of children: topics and subentries.
*
* The method returns topics among children only if number of the topics
* more than 1.
*
* In case when the entry owns only one topic, this topic is not returned
* as child because the entry will represent this topic by its keyword.
*/
IHelpResource[] topics = entry.getTopics();
IIndexEntry[] subentries = entry.getSubentries();
IIndexSee[] sees = entry instanceof IIndexEntry2 ? ((IIndexEntry2)entry).getSees() :
new IIndexSee[0];
if (topics.length <= 1 && subentries.length == 0 && sees.length == 0) {
// Entries with only one topic do not show children
return new Object[0];
}
Object[] children = null;
if (topics.length == 1) {
children = new Object[subentries.length + sees.length];
System.arraycopy(subentries, 0, children, 0, subentries.length);
System.arraycopy(sees, 0, children, subentries.length, sees.length);
} else {
children = new Object[topics.length + subentries.length + sees.length];
System.arraycopy(topics, 0, children, 0, topics.length);
System.arraycopy(subentries, 0, children, topics.length, subentries.length);
System.arraycopy(sees, 0, children, topics.length + subentries.length, sees.length);
}
return children;
}
protected Tree getTreeWidget() {
return treeViewer.getTree();
}
}