blob: b1b02fa48fde429d34b698fae6244d5c3cf95ca7 [file] [log] [blame]
/*
* Copyright (c) 2011, 2012, 2015 Eike Stepper (Berlin, Germany) 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.util.ui;
import org.eclipse.net4j.util.properties.IPropertyProvider;
import org.eclipse.net4j.util.properties.Property;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author Eike Stepper
* @since 3.2
*/
public class DefaultPropertySource<RECEIVER> implements IPropertySource
{
private Map<Object, IPropertyDescriptor> descriptors = new LinkedHashMap<Object, IPropertyDescriptor>();
private RECEIVER receiver;
public DefaultPropertySource(RECEIVER receiver)
{
this.receiver = receiver;
}
public DefaultPropertySource(RECEIVER object, IPropertyProvider<RECEIVER> provider)
{
this(object);
addDescriptors(provider);
}
public RECEIVER getReceiver()
{
return receiver;
}
/**
* @since 3.5
*/
public boolean addDescriptor(IPropertyDescriptor descriptor)
{
Object id = descriptor.getId();
if (descriptors.containsKey(id))
{
return false;
}
descriptors.put(id, descriptor);
return true;
}
public PropertyDescriptor addDescriptor(String category, Object id, String displayName, String description)
{
PropertyDescriptor descriptor = new PropertyDescriptor(id, displayName);
descriptor.setCategory(category);
descriptor.setDescription(description);
if (!addDescriptor(descriptor))
{
return null;
}
return descriptor;
}
public void addDescriptors(IPropertyProvider<RECEIVER> provider)
{
for (Property<RECEIVER> property : provider.getProperties())
{
if (property.getLabel() != null)
{
DelegatingPropertyDescriptor<RECEIVER> descriptor = new DelegatingPropertyDescriptor<RECEIVER>(property);
addDescriptor(descriptor);
}
}
}
public IPropertyDescriptor[] getPropertyDescriptors()
{
return descriptors.values().toArray(new IPropertyDescriptor[descriptors.size()]);
}
public IPropertyDescriptor getPropertyDescriptor(Object id)
{
for (IPropertyDescriptor propertyDescriptor : descriptors.values())
{
if (propertyDescriptor.getId().equals(id))
{
return propertyDescriptor;
}
}
return null;
}
public Property<RECEIVER> getProperty(Object id)
{
IPropertyDescriptor propertyDescriptor = getPropertyDescriptor(id);
if (propertyDescriptor instanceof DelegatingPropertyDescriptor)
{
@SuppressWarnings("unchecked")
DelegatingPropertyDescriptor<RECEIVER> delegating = (DelegatingPropertyDescriptor<RECEIVER>)propertyDescriptor;
return delegating.getProperty();
}
return null;
}
public Object getPropertyValue(Object id)
{
Property<RECEIVER> property = getProperty(id);
if (property != null)
{
return property.getValue(receiver);
}
return null;
}
public boolean isPropertySet(Object id)
{
return true;
}
public void resetPropertyValue(Object id)
{
}
public void setPropertyValue(Object id, Object value)
{
}
public Object getEditableValue()
{
return null;
}
/**
* @author Eike Stepper
* @since 3.5
*/
public static abstract class Augmented<RECEIVER, AUGMENTING_RECEIVER> extends DefaultPropertySource<RECEIVER>
{
private final Map<String, Object> propertyValues = new HashMap<String, Object>();
public Augmented(RECEIVER object, IPropertyProvider<RECEIVER> provider, AUGMENTING_RECEIVER augmentingObject)
{
super(object, provider);
if (augmentingObject != null)
{
IPropertySource augmentingPropertySource = createAugmentingPropertySource(augmentingObject);
for (IPropertyDescriptor propertyDescriptor : augmentingPropertySource.getPropertyDescriptors())
{
if (propertyDescriptor instanceof DelegatingPropertyDescriptor)
{
@SuppressWarnings("unchecked")
DelegatingPropertyDescriptor<AUGMENTING_RECEIVER> viewPropertyDescriptor = (DelegatingPropertyDescriptor<AUGMENTING_RECEIVER>)propertyDescriptor;
Property<AUGMENTING_RECEIVER> property = viewPropertyDescriptor.getProperty();
if (property != null)
{
String category = propertyDescriptor.getCategory();
String id = "___VIEW___" + propertyDescriptor.getId();
String displayName = propertyDescriptor.getDisplayName();
String description = propertyDescriptor.getDescription();
Object value = property.getValue(augmentingObject);
propertyValues.put(id, value);
addDescriptor(category, id, displayName, description);
}
}
}
}
}
@Override
public Object getPropertyValue(Object id)
{
Object value = propertyValues.get(id);
if (value != null)
{
return value;
}
return super.getPropertyValue(id);
}
protected abstract IPropertySource createAugmentingPropertySource(AUGMENTING_RECEIVER augmentingObject);
}
/**
* @author Eike Stepper
*/
public static final class DelegatingPropertyDescriptor<RECEIVER> implements IPropertyDescriptor
{
private final Property<RECEIVER> property;
private ILabelProvider labelProvider;
public DelegatingPropertyDescriptor(Property<RECEIVER> property)
{
this.property = property;
}
public Property<RECEIVER> getProperty()
{
return property;
}
public String getCategory()
{
return property.getCategory();
}
public String getId()
{
return property.getName();
}
public String getDisplayName()
{
return property.getLabel();
}
public String getDescription()
{
return property.getDescription();
}
public boolean isCompatibleWith(IPropertyDescriptor anotherProperty)
{
return anotherProperty.getCategory().equals(getCategory()) && anotherProperty.getId().equals(getId());
}
public ILabelProvider getLabelProvider()
{
if (labelProvider != null)
{
return labelProvider;
}
return new LabelProvider();
}
public void setLabelProvider(ILabelProvider labelProvider)
{
this.labelProvider = labelProvider;
}
public Object getHelpContextIds()
{
return null;
}
public String[] getFilterFlags()
{
return null;
}
public CellEditor createPropertyEditor(Composite parent)
{
return null;
}
}
}