/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.navigator.decorator;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.IPreferenceStore;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
/**
* @author Viacheslav Kabanovich
*/
public class DecoratorManager {
public static final String EXTENSION_POINT_ID = ModelUIPlugin.PLUGIN_ID + ".labelDecorator"; //$NON-NLS-1$
private Map<String, XModelObjectDecorator> mapByName = new HashMap<String, XModelObjectDecorator>();
private Map<String, XModelObjectDecorator> mapByEntity = new HashMap<String, XModelObjectDecorator>();
private Map<String, Set<XModelObjectDecorator>> mapByPartition = new HashMap<String, Set<XModelObjectDecorator>>();
private Map<String, String> entityByPartition = new HashMap<String, String>();
private DecoratorManager() {
load();
}
public static DecoratorManager getInstance() {
return DecoratorManagerHolder.INSTANCE;
}
public static class DecoratorManagerHolder {
public static DecoratorManager INSTANCE = new DecoratorManager();
}
public XModelObjectDecorator getDecoratorByEntity(String entity) {
return mapByEntity.get(entity);
}
public Set<XModelObjectDecorator> getDecoratorsByPartition(String partition) {
return mapByPartition.get(partition);
}
public String getBaseEntityForPartition(String partition) {
return entityByPartition.get(partition);
}
public String[] getPartitions() {
Set<String> set = new TreeSet<String>();
set.addAll(mapByPartition.keySet());
return set.toArray(new String[0]);
}
private void load() {
IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(EXTENSION_POINT_ID);
if(point == null) return;
IExtension[] es = point.getExtensions();
if(es != null) for (int i = 0; i < es.length; i++) {
IConfigurationElement[] elements = es[i].getConfigurationElements();
for (int j = 0; j < elements.length; j++) {
XModelObjectDecorator d = new XModelObjectDecorator();
d.load(elements[j]);
String name = d.getName();
String partition = d.getPartition();
Set<String> entities = d.getEntities();
mapByName.put(name, d);
Set<XModelObjectDecorator> set = mapByPartition.get(partition);
if(set == null) {
set = new HashSet<XModelObjectDecorator>();
mapByPartition.put(partition, set);
}
set.add(d);
for (String entity: entities) {
mapByEntity.put(entity, d);
if(entity.startsWith("File") && entityByPartition.get(partition) == null) { //$NON-NLS-1$
entityByPartition.put(partition, entity);
}
}
}
}
loadFromPreferences();
}
public void loadFromPreferences() {
IPreferenceStore p = getPreferences();
for (String name: mapByName.keySet()) {
XModelObjectDecorator d = mapByName.get(name);
String key = ModelUIPlugin.PLUGIN_ID + ".labelDecorator." + name; //$NON-NLS-1$
String value = p.getString(key);
if(value != null && value.length() > 0) {
d.setValue(value);
}
}
}
public void applyToPreferences() {
IPreferenceStore p = getPreferences();
for (String name: mapByName.keySet()) {
XModelObjectDecorator d = mapByName.get(name);
String key = ModelUIPlugin.PLUGIN_ID + ".labelDecorator." + name; //$NON-NLS-1$
String value = d.getValue();
if(value != null && !value.equals(d.getDefaultValue()) && !value.equals("{name}")) { //$NON-NLS-1$
p.setValue(key, value);
} else {
p.setValue(key, ""); //$NON-NLS-1$
}
}
if(p instanceof IPersistentPreferenceStore) {
try {
((IPersistentPreferenceStore) p).save();
} catch (IOException e) {
ModelUIPlugin.getPluginLog().logError(e);
}
}
}
public void setDefaults() {
for (String name: mapByName.keySet()) {
XModelObjectDecorator d = mapByName.get(name);
d.setValue(d.getDefaultValue());
}
}
public static IPreferenceStore getPreferences() {
return ModelUIPlugin.getDefault().getPreferenceStore();
}
}