blob: 8cf763fb0795e891e2b6ca40d1372c09913bc13d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 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 com.ibm.icu.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.PreferenceFilterEntry;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.preferences.PreferenceTransferElement;
/**
* Preference Transfer registry reader to read extenders of the preferenceTranser schema.
*
* @since 3.1
*/
public class PreferenceTransferRegistryReader extends RegistryReader {
private List preferenceTransfers;
private String pluginPoint;
/**
* Create an instance of this class.
*
* @param pluginPointId java.lang.String
*/
public PreferenceTransferRegistryReader(String pluginPointId) {
pluginPoint = pluginPointId;
}
/**
* Adds new wizard to the provided collection. Override to
* provide more logic.
*
* TODO: remove the config parameter?
*/
protected void addNewElementToResult(PreferenceTransferElement element,
IConfigurationElement config) {
preferenceTransfers.add(element);
}
/**
* Returns a new PreferenceTransferElement configured according to the parameters
* contained in the passed Registry.
*
* May answer null if there was not enough information in the Extension to create
* an adequate wizard
*/
protected PreferenceTransferElement createPreferenceTransferElement(
IConfigurationElement element) {
// PreferenceTransfers must have a name and class attribute
if (element.getAttribute(IWorkbenchRegistryConstants.ATT_NAME) == null) {
logMissingAttribute(element, IWorkbenchRegistryConstants.ATT_NAME);
return null;
}
// must specifiy a mapping
if (element.getChildren(IWorkbenchRegistryConstants.TAG_MAPPING) == null) {
logMissingElement(element, IWorkbenchRegistryConstants.TAG_MAPPING);
return null;
}
return new PreferenceTransferElement(element);
}
/**
* Returns a sorted list of preference transfers.
*
*@return an array of <code>IPreferenceTransfer</code> objects
*/
public PreferenceTransferElement[] getPreferenceTransfers() {
readPreferenceTransfers();
PreferenceTransferElement[] transfers = new PreferenceTransferElement[preferenceTransfers.size()];
Collections.sort(preferenceTransfers, new Comparator() {
public int compare(Object o1, Object o2) {
String name1 = ((PreferenceTransferElement)o1).getName();
String name2 = ((PreferenceTransferElement)o2).getName();
return Collator.getInstance().compare(name1, name2);
}});
preferenceTransfers.toArray(transfers);
return transfers;
}
/**
* Implement this method to read element attributes.
*/
public boolean readElement(IConfigurationElement element) {
if (!element.getName().equals(IWorkbenchRegistryConstants.TAG_TRANSFER)) {
return false;
}
PreferenceTransferElement transfer = createPreferenceTransferElement(element);
if (transfer != null) {
addNewElementToResult(transfer, element);
}
return true;
}
/**
* Reads the wizards in a registry.
*/
protected void readPreferenceTransfers() {
preferenceTransfers = new ArrayList();
IExtensionRegistry registry = Platform.getExtensionRegistry();
readRegistry(registry, WorkbenchPlugin.PI_WORKBENCH, pluginPoint);
}
/**
* @param configElement
* @return the child configuration elements
*/
public static IConfigurationElement[] getMappings(IConfigurationElement configElement) {
IConfigurationElement[] children = configElement.getChildren(IWorkbenchRegistryConstants.TAG_MAPPING);
if (children.length < 1) {
logMissingElement(configElement, IWorkbenchRegistryConstants.TAG_MAPPING);
return null;
}
return children;
}
/**
* @param element
* @return the scope attribute for this element
*/
public static String getScope(IConfigurationElement element) {
return element.getAttribute(IWorkbenchRegistryConstants.ATT_SCOPE);
}
/**
* @param element
* @return the maps mapping nodes to keys for this element
*/
public static Map getEntry(IConfigurationElement element) {
IConfigurationElement[] entries = element.getChildren(IWorkbenchRegistryConstants.TAG_ENTRY);
if (entries.length == 0) {
return null;
}
Map map = new HashMap(entries.length);
for (int i = 0; i < entries.length; i++) {
IConfigurationElement entry = entries[i];
IConfigurationElement[] keys = entry.getChildren(IWorkbenchRegistryConstants.ATT_KEY);
PreferenceFilterEntry[] prefFilters = null;
if (keys.length > 0) {
prefFilters = new PreferenceFilterEntry[keys.length];
for (int j = 0; j < keys.length; j++) {
IConfigurationElement keyElement = keys[j];
prefFilters[j] = new PreferenceFilterEntry(keyElement.getAttribute(IWorkbenchRegistryConstants.ATT_NAME));
}
}
map.put(entry.getAttribute(IWorkbenchRegistryConstants.ATT_NODE), prefFilters);
}
return map;
}
}