/******************************************************************************* * 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; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProduct; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.help.internal.HelpPlugin; import org.eclipse.help.internal.base.HelpBasePlugin; import org.eclipse.help.internal.base.IHelpActivitySupport; import org.eclipse.help.internal.toc.Toc; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.activities.IIdentifier; import org.eclipse.ui.activities.IWorkbenchActivitySupport; import org.osgi.service.prefs.BackingStoreException; /** * Wrapper for eclipse ui activity support */ public class HelpActivitySupport implements IHelpActivitySupport { private static final String PREF_KEY_SHOW_DISABLED_ACTIVITIES = "showDisabledActivityTopics"; //$NON-NLS-1$ private static final String SHOW_DISABLED_ACTIVITIES_NEVER = "never"; //$NON-NLS-1$ private static final String SHOW_DISABLED_ACTIVITIES_OFF = "off"; //$NON-NLS-1$ private static final String SHOW_DISABLED_ACTIVITIES_ON = "on"; //$NON-NLS-1$ // private static final String SHOW_DISABLED_ACTIVITIES_ALWAYS = "always"; //$NON-NLS-1$ private IWorkbenchActivitySupport activitySupport; private boolean userCanToggleFiltering; private boolean filteringEnabled; private ActivityDescriptor activityDescriptor; class ActivityDescriptor { private IConfigurationElement config; private String documentMessage; private boolean needsLiveHelp; public ActivityDescriptor() { load(); } private void load() { IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.help.base.activitySupport");//$NON-NLS-1$ if (elements.length==1 && elements[0].getName().equals("support")) //$NON-NLS-1$ config = elements[0]; else if (elements.length>0) { IProduct product = Platform.getProduct(); if (product==null) return; String productId = product.getId(); for (int i=0; i<elements.length; i++) { IConfigurationElement element = elements[i]; if (element.getAttribute("productId").equals(productId)) { //$NON-NLS-1$ config = element; break; } } } } private IConfigurationElement getChild(String name) { IConfigurationElement [] children = config.getChildren(name); return children.length==1?children[0]:null; } public String getShowAllMessage() { if (config==null) return null; IConfigurationElement child = getChild("showAllMessage"); //$NON-NLS-1$ if (child!=null) return child.getValue(); return null; } public boolean needsLiveHelp(boolean embedded) { getDocumentMessage(embedded); return needsLiveHelp; } public String getDocumentMessage(boolean embedded) { if (config!=null && documentMessage==null) { IConfigurationElement child = getChild("documentMessage"); //$NON-NLS-1$ if (child!=null) { String value = child.getValue(); String pluginId = child.getAttribute("pluginId"); //$NON-NLS-1$ String className = child.getAttribute("class"); //$NON-NLS-1$ int loc = value.indexOf("ACTIVITY_EDITOR"); //$NON-NLS-1$ if (loc!= -1 && className!=null) { needsLiveHelp=true; StringBuffer buffer = new StringBuffer(); buffer.append(value.substring(0, loc)); buffer.append(getActivityEditorValue(pluginId, className, embedded)); buffer.append(value.substring(loc+15)); documentMessage = buffer.toString(); } else documentMessage = value; } } return documentMessage; } private String getActivityEditorValue(String pluginId, String className, boolean embedded) { String evalue = embedded?"narrow":""; //$NON-NLS-1$ //$NON-NLS-2$ return "javascript:liveAction(\""+pluginId+"\", \""+className+"\",\""+evalue+"\")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ } } public HelpActivitySupport(IWorkbench workbench) { activitySupport = workbench.getActivitySupport(); activityDescriptor = new ActivityDescriptor(); String showDisabledActivities = Platform.getPreferencesService().getString(HelpBasePlugin.PLUGIN_ID, PREF_KEY_SHOW_DISABLED_ACTIVITIES, "", null); //$NON-NLS-1$ userCanToggleFiltering = SHOW_DISABLED_ACTIVITIES_OFF .equalsIgnoreCase(showDisabledActivities) || SHOW_DISABLED_ACTIVITIES_ON .equalsIgnoreCase(showDisabledActivities); userCanToggleFiltering = userCanToggleFiltering && isWorkbenchFiltering(); filteringEnabled = SHOW_DISABLED_ACTIVITIES_OFF .equalsIgnoreCase(showDisabledActivities) || SHOW_DISABLED_ACTIVITIES_NEVER .equalsIgnoreCase(showDisabledActivities); filteringEnabled = filteringEnabled && isWorkbenchFiltering(); } @Override public boolean isFilteringEnabled() { return filteringEnabled; } @Override public void setFilteringEnabled(boolean enabled) { if (userCanToggleFiltering) { filteringEnabled = enabled; IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(HelpBasePlugin.PLUGIN_ID); if (enabled) { prefs.put(PREF_KEY_SHOW_DISABLED_ACTIVITIES, SHOW_DISABLED_ACTIVITIES_OFF); } else { prefs.put(PREF_KEY_SHOW_DISABLED_ACTIVITIES, SHOW_DISABLED_ACTIVITIES_ON); } try { prefs.flush(); } catch (BackingStoreException e) { } } } @Override public boolean isUserCanToggleFiltering() { return userCanToggleFiltering; } @Override public boolean isEnabled(String href) { if (!isFilteringEnabled()) { return true; } return isRoleEnabled(href); } @Override public boolean isRoleEnabled(String href) { if (href.startsWith("/")) { //$NON-NLS-1$ href = href.substring(1); } return activitySupport.getActivityManager().getIdentifier(href) .isEnabled(); } /** * Checks whether topic belongs to a TOC that mathes enabled activity. * Enabled children TOCs are searched if linked by also enabled TOCs. * Additionally topic may match description topic of a root TOC. * * @return true if topic belongs to an enabled TOC * @param href * @param locale * locale for which TOCs are checked */ @Override public boolean isEnabledTopic(String href, String locale) { if (href == null) { return false; } if (!isFilteringEnabled()) { return true; } int ix = href.indexOf("?resultof="); //$NON-NLS-1$ if (ix >= 0) { href = href.substring(0, ix); } // Find out if description topic for enabled top level TOCs matches the // topic Toc[] tocs = HelpPlugin.getTocManager().getTocs(locale); for (int t = 0; t < tocs.length; t++) { String descriptionHref = tocs[t].getTopic(null).getHref(); if (descriptionHref != null && descriptionHref.length() > 0 && descriptionHref.equals(href) && HelpBasePlugin.getActivitySupport().isEnabled( tocs[t].getHref())) { return true; } } // Find out if any contributed toc that is enabled contains the topic return isInTocSubtree(href, tocs); } /** * @param href * href of a topic * @param tocList * List of IToc * @return true if given topic belongs to one of enabled ITocs */ private boolean isInTocSubtree(String href, Toc[] tocList) { for (int i=0;i<tocList.length;++i) { Toc toc = tocList[i]; if (!HelpBasePlugin.getActivitySupport().isEnabled(toc.getHref())) { // TOC is not enabled, check other TOCs continue; } // Check topics in navigation if (toc.getTopic(href) != null) { return true; } // Check extra docs String[] extraDocs = toc.getTocContribution().getExtraDocuments(); for (int j=0;j<extraDocs.length;++j) { if (extraDocs[j].equals(href)) { return true; } } } return false; } @Override @SuppressWarnings("unchecked") public void enableActivities(String href) { if (href.startsWith("/")) { //$NON-NLS-1$ href = href.substring(1); } IIdentifier identifier = activitySupport.getActivityManager() .getIdentifier(href); Set<String> activitityIds = identifier.getActivityIds(); if (activitityIds.isEmpty()) { // if there are no activities that match // this identifier, do nothing. return; } Set<String> enabledIds = new HashSet<>(activitySupport.getActivityManager() .getEnabledActivityIds()); enabledIds.addAll(activitityIds); activitySupport.setEnabledActivityIds(enabledIds); } /** * @return whether the UI is set up to filter contributions (has defined * activity categories). */ private static boolean isWorkbenchFiltering() { return !PlatformUI.getWorkbench().getActivitySupport() .getActivityManager().getDefinedActivityIds().isEmpty(); } @Override public String getShowAllMessage() { return activityDescriptor.getShowAllMessage(); } @Override public String getDocumentMessage(boolean embedded) { return activityDescriptor.getDocumentMessage(embedded); } @Override public boolean getDocumentMessageUsesLiveHelp(boolean embedded) { return activityDescriptor.needsLiveHelp(embedded); } }