| /******************************************************************************* |
| * Copyright (c) 2000, 2015 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 |
| * Jan-Hendrik Diederich, Bredex GmbH - bug 201052 |
| *******************************************************************************/ |
| package org.eclipse.ui.internal.registry; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.List; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.jface.preference.IPreferenceNode; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.activities.WorkbenchActivityHelper; |
| import org.eclipse.ui.internal.Workbench; |
| import org.eclipse.ui.internal.dialogs.WorkbenchPreferenceNode; |
| |
| /** |
| * Instances access the registry that is provided at creation time in order |
| * to determine the contributed preference pages |
| */ |
| public class PreferencePageRegistryReader extends CategorizedPageRegistryReader { |
| |
| private static final String TAG_PAGE = "page"; //$NON-NLS-1$ |
| |
| private List nodes; |
| |
| private IWorkbench workbench; |
| |
| |
| class PreferencesCategoryNode extends CategoryNode { |
| |
| WorkbenchPreferenceNode node; |
| |
| /** |
| * Create a new instance of the receiver. |
| * @param reader |
| * @param nodeToCategorize |
| */ |
| public PreferencesCategoryNode(CategorizedPageRegistryReader reader, |
| WorkbenchPreferenceNode nodeToCategorize) { |
| super(reader); |
| this.node = nodeToCategorize; |
| } |
| |
| @Override |
| String getLabelText() { |
| return node.getLabelText(); |
| } |
| |
| @Override |
| String getLabelText(Object element) { |
| return ((WorkbenchPreferenceNode) element).getLabelText(); |
| } |
| |
| @Override |
| Object getNode() { |
| return node; |
| } |
| } |
| |
| /** |
| * Create a new instance configured with the workbench |
| * |
| * @param newWorkbench the workbench |
| */ |
| public PreferencePageRegistryReader(IWorkbench newWorkbench) { |
| workbench = newWorkbench; |
| } |
| |
| @Override |
| Object findNode(String id) { |
| for (int i = 0; i < nodes.size(); i++) { |
| WorkbenchPreferenceNode node = (WorkbenchPreferenceNode) nodes.get(i); |
| if (node.getId().equals(id)) { |
| return node; |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| Object findNode(Object parent, String currentToken) { |
| IPreferenceNode[] subNodes = ((WorkbenchPreferenceNode) parent).getSubNodes(); |
| for (IPreferenceNode subNode : subNodes) { |
| WorkbenchPreferenceNode node = (WorkbenchPreferenceNode) subNode; |
| if (node.getId().equals(currentToken)) { |
| return node; |
| } |
| } |
| return null; |
| } |
| |
| @Override |
| void add(Object parent, Object node) { |
| ((IPreferenceNode) parent).add((IPreferenceNode) node); |
| } |
| |
| @Override |
| CategoryNode createCategoryNode(CategorizedPageRegistryReader reader, Object object) { |
| return new PreferencesCategoryNode(reader, (WorkbenchPreferenceNode) object); |
| } |
| |
| @Override |
| String getCategory(Object node) { |
| return ((WorkbenchPreferenceNode) node).getCategory(); |
| } |
| |
| @Override |
| protected String invalidCategoryNodeMessage(CategoryNode categoryNode) { |
| WorkbenchPreferenceNode wpn = (WorkbenchPreferenceNode) categoryNode.getNode(); |
| return "Invalid preference category path: " + wpn.getCategory() + " (bundle: " + wpn.getPluginId() + ", page: " + wpn.getLocalId() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ |
| } |
| |
| @Override |
| Collection getNodes() { |
| return nodes; |
| } |
| |
| /** |
| * Load the preference page contirbutions from the registry and |
| * organize preference node contributions by category into hierarchies |
| * If there is no page for a given node in the hierarchy then a blank |
| * page will be created. |
| * If no category has been specified or category information |
| * is incorrect, page will appear at the root level. workbench |
| * log entry will be created for incorrect category information. |
| * |
| * @param registry the extension registry |
| */ |
| public void loadFromRegistry(IExtensionRegistry registry) { |
| nodes = new ArrayList(); |
| |
| readRegistry(registry, PlatformUI.PLUGIN_ID, IWorkbenchRegistryConstants.PL_PREFERENCES); |
| |
| processNodes(); |
| |
| } |
| |
| /** |
| * Read preference page element. |
| */ |
| @Override |
| protected boolean readElement(IConfigurationElement element) { |
| if (element.getName().equals(TAG_PAGE) == false) { |
| return false; |
| } |
| WorkbenchPreferenceNode node = createNode(element); |
| if (node != null) { |
| if (workbench instanceof Workbench) { |
| if (node.getId().equals( |
| ((Workbench) workbench).getMainPreferencePageId())) |
| node.setPriority(-1); |
| } |
| nodes.add(node); |
| } |
| return true; |
| } |
| |
| /** |
| * Create a workbench preference node. |
| * @param element |
| * @return WorkbenchPreferenceNode |
| */ |
| public static WorkbenchPreferenceNode createNode(IConfigurationElement element) { |
| boolean nameMissing = element.getAttribute(IWorkbenchRegistryConstants.ATT_NAME) == null; |
| String id = element.getAttribute(IWorkbenchRegistryConstants.ATT_ID); |
| boolean classMissing = getClassValue(element, IWorkbenchRegistryConstants.ATT_CLASS) == null; |
| |
| if (nameMissing) { |
| logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_NAME); |
| } |
| if (id == null) { |
| logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_ID); |
| } |
| if (classMissing) { |
| logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_CLASS); |
| } |
| |
| if (nameMissing || id == null || classMissing) { |
| return null; |
| } |
| |
| WorkbenchPreferenceNode node = new WorkbenchPreferenceNode(id, element); |
| return node; |
| } |
| |
| /** |
| * Return the top level IPreferenceNodes, minus the one which fail the |
| * Expression check. |
| * @return Collection of IPreferenceNode. |
| */ |
| public Collection getTopLevelNodes() { |
| return WorkbenchActivityHelper.restrictCollection(topLevelNodes, new ArrayList()); |
| } |
| } |