/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.table;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.ui.properties.ModelObjectPropertySourceProvider;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* @author SDelap
*
* @since 8.0
*/
public class EObjectPropertiesOrderPreferences implements Serializable {
private static final long serialVersionUID = 1L;
private Map eObjectMap;
private ModelObjectPropertySourceProvider propertySourceProvider;
private final String newLine = "\n"; //$NON-NLS-1$
private List listeners = new ArrayList();
public EObjectPropertiesOrderPreferences() {
this.eObjectMap = new HashMap();
}
public Set getInitializedEObjects() {
return this.eObjectMap.keySet();
}
public void setProperty( String eObject,
String property ) {
Set propertiesSet = getOrderedPropertiesSet(eObject);
if (propertiesSet == null) {
propertiesSet = new TreeSet();
this.eObjectMap.put(eObject, propertiesSet);
}
PropertyOrder columnOrder = new PropertyOrder(property, propertiesSet.size() + 1);
if (!propertiesSet.contains(columnOrder)) {
propertiesSet.add(columnOrder);
}
}
private TreeSet getOrderedPropertiesSet( String eObjectName ) {
TreeSet propertyMap = (TreeSet)this.eObjectMap.get(eObjectName);
return propertyMap;
}
public void replaceColumnsList( String eObject,
ArrayList list ) {
Set propertiesSet = getOrderedPropertiesSet(eObject);
if (propertiesSet == null) {
propertiesSet = new TreeSet();
this.eObjectMap.put(eObject, propertiesSet);
} else {
propertiesSet.clear();
}
propertiesSet.addAll(list);
}
public void removeEObject( String eObject ) {
this.eObjectMap.remove(eObject);
}
public ArrayList getOrderedPropertyList( String eObject ) {
Set propertiesSet = getOrderedPropertiesSet(eObject);
ArrayList columns;
if (propertiesSet == null) {
columns = new ArrayList();
} else {
columns = new ArrayList(propertiesSet);
}
Collections.sort(columns, new SortedPropertyOrderComparator());
return columns;
}
public void addOrUpdateEObject( String eObject,
EObject propertiesEObject ) {
IPropertySource propertySource = getPropertySource(propertiesEObject);
IPropertyDescriptor[] propertyDescriptors = propertySource.getPropertyDescriptors();
// need to add 2 to the properties list since location and description are not properties
for (int size = propertyDescriptors.length, i = 0; i < size; ++i) {
setProperty(eObject, propertyDescriptors[i].getDisplayName());
}
}
public void addOrUpdateProperty( String eObject,
String column ) {
setProperty(eObject, column);
}
private IPropertySource getPropertySource( EObject modelObject ) {
if (propertySourceProvider == null) {
propertySourceProvider = ModelUtilities.getPropertySourceProvider(); // new ModelObjectPropertySourceProvider();
}
return propertySourceProvider.getPropertySource(modelObject);
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuffer buffer = new StringBuffer();
Iterator keyIterator = getInitializedEObjects().iterator();
while (keyIterator.hasNext()) {
String eObject = (String)keyIterator.next();
List properties = getOrderedPropertyList(eObject);
if (properties.size() > 0) {
Iterator propertiesIterator = properties.iterator();
while (propertiesIterator.hasNext()) {
buffer.append(eObject);
buffer.append(newLine);
PropertyOrder propertyOrder = (PropertyOrder)propertiesIterator.next();
buffer.append(propertyOrder.getName());
buffer.append(newLine);
buffer.append(propertyOrder.getOrder());
buffer.append(newLine);
buffer.append(String.valueOf(propertyOrder.isVisible()));
buffer.append(newLine);
}
}
}
return buffer.toString();
}
public void initializeFromString( String stringRep ) {
this.eObjectMap.clear();
List lines = CoreStringUtil.split(stringRep, newLine);
int count = 0;
while (count < lines.size()) {
String eObject = (String)lines.get(count);
String property = (String)lines.get(count + 1);
String order = (String)lines.get(count + 2);
String visible = (String)lines.get(count + 3);
PropertyOrder propertyOrder = new PropertyOrder(property, Integer.parseInt(order));
propertyOrder.setVisible(Boolean.valueOf(visible).booleanValue());
Set columnSet = getOrderedPropertiesSet(eObject);
if (columnSet == null) {
columnSet = new TreeSet();
this.eObjectMap.put(eObject, columnSet);
}
columnSet.add(propertyOrder);
count += 4;
}
}
class SortedPropertyOrderComparator implements Comparator {
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
@Override
public int compare( Object o1,
Object o2 ) {
int result = -1;
if ((o1 instanceof PropertyOrder) & (o2 instanceof PropertyOrder)) {
PropertyOrder p1 = (PropertyOrder)o1;
PropertyOrder p2 = (PropertyOrder)o2;
if (p1.getOrder() > p2.getOrder()) {
result = 1;
} else if (p1.getOrder() < p2.getOrder()) {
result = -1;
} else {
result = p1.getName().compareTo(p2.getName());
}
}
return result;
}
}
public void addEObjectPropertiesOrderPreferencesListener( EObjectPropertiesOrderPreferencesListener listener ) {
this.listeners.add(listener);
}
public void removeEObjectPropertiesOrderPreferencesListener( EObjectPropertiesOrderPreferencesListener listener ) {
this.listeners.remove(listener);
}
public void firePropertiesChanged( List changedEObjects ) {
for (int i = 0; i < this.listeners.size(); i++) {
((EObjectPropertiesOrderPreferencesListener)this.listeners.get(i)).propertiesChanged(changedEObjects);
}
}
}