blob: 305d3fcee60cb99307f77c1513eae56659620c8a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.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.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;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader.CategoryNode#getLabelText()
*/
String getLabelText() {
return node.getLabelText();
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader.CategoryNode#getLabelText(java.lang.Object)
*/
String getLabelText(Object element) {
return ((WorkbenchPreferenceNode) element).getLabelText();
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader.CategoryNode#getNode()
*/
Object getNode() {
return node;
}
}
/**
* Create a new instance configured with the workbench
*
* @param newWorkbench the workbench
*/
public PreferencePageRegistryReader(IWorkbench newWorkbench) {
workbench = newWorkbench;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#findNode(java.lang.String)
*/
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;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#findNode(java.lang.Object, java.lang.String)
*/
Object findNode(Object parent, String currentToken) {
IPreferenceNode[] subNodes = ((WorkbenchPreferenceNode) parent).getSubNodes();
for (int i = 0; i < subNodes.length; i++) {
WorkbenchPreferenceNode node = (WorkbenchPreferenceNode) subNodes[i];
if (node.getId().equals(currentToken)) {
return node;
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#add(java.lang.Object, java.lang.Object)
*/
void add(Object parent, Object node) {
((IPreferenceNode) parent).add((IPreferenceNode) node);
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#createCategoryNode(org.eclipse.ui.internal.registry.CategorizedPageRegistryReader, java.lang.Object)
*/
CategoryNode createCategoryNode(CategorizedPageRegistryReader reader, Object object) {
return new PreferencesCategoryNode(reader, (WorkbenchPreferenceNode) object);
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#getCategory(java.lang.Object)
*/
String getCategory(Object node) {
return ((WorkbenchPreferenceNode) node).getCategory();
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#getNodes()
*/
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.
*/
protected boolean readElement(IConfigurationElement element) {
if (element.getName().equals(TAG_PAGE) == false) {
return false;
}
WorkbenchPreferenceNode node = createNode(element);
if (node != null) {
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.
* @return Collection of IPreferenceNode.
*/
public Collection getTopLevelNodes() {
return topLevelNodes;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#getFavoriteNodeId()
*/
String getFavoriteNodeId() {
return ((Workbench) workbench).getMainPreferencePageId();
}
}