blob: ec8a1e5640e34f6f12d39b321870efcf29f37c4b [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.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager;
import org.eclipse.ui.internal.dialogs.RegistryPageContributor;
/**
* This class loads property pages from the registry.
*/
public class PropertyPagesRegistryReader extends CategorizedPageRegistryReader {
/**
* Value "<code>nameFilter</code>".
*/
public static final String ATT_NAME_FILTER = "nameFilter";//$NON-NLS-1$
/**
* Value "<code>name</code>".
*/
public static final String ATT_FILTER_NAME = "name";//$NON-NLS-1$
/**
* Value "<code>value</code>".
*/
public static final String ATT_FILTER_VALUE = "value";//$NON-NLS-1$
private static final String TAG_PAGE = "page";//$NON-NLS-1$
/**
* Value "<code>filter</code>".
*/
public static final String TAG_FILTER = "filter";//$NON-NLS-1$
/**
* Value "<code>keywordReference</code>".
*/
public static final String TAG_KEYWORD_REFERENCE = "keywordReference";//$NON-NLS-1$
/**
* Value "<code>objectClass</code>".
*/
public static final String ATT_OBJECTCLASS = "objectClass";//$NON-NLS-1$
/**
* Value "<code>adaptable</code>".
*/
public static final String ATT_ADAPTABLE = "adaptable";//$NON-NLS-1$
private static final String CHILD_ENABLED_WHEN = "enabledWhen"; //$NON-NLS-1$;
private Collection pages = new ArrayList();
private PropertyPageContributorManager manager;
class PropertyCategoryNode extends CategoryNode {
RegistryPageContributor page;
/**
* Create a new category node on the given reader for the property page.
*
* @param reader
* @param propertyPage
*/
PropertyCategoryNode(CategorizedPageRegistryReader reader,
RegistryPageContributor propertyPage) {
super(reader);
page = propertyPage;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader.CategoryNode#getLabelText()
*/
String getLabelText() {
return page.getPageName();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader.CategoryNode#getLabelText(java.lang.Object)
*/
String getLabelText(Object element) {
return ((RegistryPageContributor) element).getPageName();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader.CategoryNode#getNode()
*/
Object getNode() {
return page;
}
}
/**
* The constructor.
*
* @param manager
* the manager
*/
public PropertyPagesRegistryReader(PropertyPageContributorManager manager) {
this.manager = manager;
}
/**
* Reads static property page specification.
*/
private void processPageElement(IConfigurationElement element) {
String pageId = element
.getAttribute(IWorkbenchRegistryConstants.ATT_ID);
if (pageId == null) {
logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_ID);
return;
}
RegistryPageContributor contributor = new RegistryPageContributor(
pageId, element);
String pageClassName = getClassValue(element,
IWorkbenchRegistryConstants.ATT_CLASS);
if (pageClassName == null) {
logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_CLASS);
return;
}
if (element.getAttribute(ATT_OBJECTCLASS) == null) {
pages.add(contributor);
manager.registerContributor(contributor, Object.class.getName());
} else {
List objectClassNames = new ArrayList();
objectClassNames.add(element.getAttribute(ATT_OBJECTCLASS));
registerContributors(contributor, objectClassNames);
}
}
/**
* Register the contributor for all of the relevant classes.
*
* @param contributor
* @param objectClassNames
*/
private void registerContributors(RegistryPageContributor contributor,
List objectClassNames) {
pages.add(contributor);
for (Iterator iter = objectClassNames.iterator(); iter.hasNext();) {
manager.registerContributor(contributor, (String) iter.next());
}
}
/**
* Reads the next contribution element.
*
* public for dynamic UI
*/
public boolean readElement(IConfigurationElement element) {
if (element.getName().equals(TAG_PAGE)) {
processPageElement(element);
readElementChildren(element);
return true;
}
if (element.getName().equals(TAG_FILTER)) {
return true;
}
if (element.getName().equals(CHILD_ENABLED_WHEN)) {
return true;
}
if (element.getName().equals(TAG_KEYWORD_REFERENCE)) {
return true;
}
return false;
}
/**
* Reads all occurances of propertyPages extension in the registry.
*
* @param registry
* the registry
*/
public void registerPropertyPages(IExtensionRegistry registry) {
readRegistry(registry, PlatformUI.PLUGIN_ID,
IWorkbenchRegistryConstants.PL_PROPERTY_PAGES);
processNodes();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#add(java.lang.Object,
* java.lang.Object)
*/
void add(Object parent, Object node) {
((RegistryPageContributor) parent)
.addSubPage((RegistryPageContributor) 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 PropertyCategoryNode(reader,
(RegistryPageContributor) object);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#findNode(java.lang.Object,
* java.lang.String)
*/
Object findNode(Object parent, String currentToken) {
return ((RegistryPageContributor) parent).getChild(currentToken);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#findNode(java.lang.String)
*/
Object findNode(String id) {
Iterator iterator = pages.iterator();
while (iterator.hasNext()) {
RegistryPageContributor next = (RegistryPageContributor) iterator
.next();
if (next.getPageId().equals(id))
return next;
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#getCategory(java.lang.Object)
*/
String getCategory(Object node) {
return ((RegistryPageContributor) node).getCategory();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#getFavoriteNodeId()
*/
String getFavoriteNodeId() {
return null;// properties do not support favorites
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.registry.CategorizedPageRegistryReader#getNodes()
*/
Collection getNodes() {
return pages;
}
}