/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.inspector.model;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Observable;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.inspector.AbstractController;
import org.openflexo.xmlcode.StringEncoder;
import org.openflexo.xmlcode.XMLCoder;
import org.openflexo.xmlcode.XMLDecoder;
import org.openflexo.xmlcode.XMLSerializable;
public class TabModel extends Observable implements XMLSerializable {
private static final Logger logger = Logger.getLogger(TabModel.class.getPackage().getName());
public String name;
public Integer index;
public LayoutModel layoutModel;
private Hashtable<String, PropertyModel> properties;
private Hashtable<String, GroupModel> groups;
public Vector hiddenProperties;
public Vector<HiddenGroupModel> hiddenGroups;
public String layoutName;
public String visibilityContext;
public TabModel() {
super();
properties = new Hashtable<String, PropertyModel>();
hiddenProperties = new Vector();
hiddenGroups = new Vector<HiddenGroupModel>();
groups = new Hashtable<String, GroupModel>();
}
public void finalizeTabModelDecoding() {
for (Enumeration<PropertyModel> e = properties.elements(); e.hasMoreElements();) {
PropertyModel next = e.nextElement();
next.setTabModel(this);
}
for (Enumeration<GroupModel> e = groups.elements(); e.hasMoreElements();) {
GroupModel next = e.nextElement();
next.setTabModel(this);
}
}
private TabModel copy(AbstractController c) {
try {
if (encodedModel == null) {
encodedModel = XMLCoder.encodeObjectWithMapping(this, InspectorMapping.getInstance(), StringEncoder.getDefaultInstance());
}
TabModel returned = (TabModel) XMLDecoder.decodeObjectWithMapping(encodedModel, InspectorMapping.getInstance(), c);
returned._inspectorModel = _inspectorModel;
return returned;
} catch (Exception e) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Unexpected exception occured: " + e.getClass().getName());
}
e.printStackTrace();
}
return null;
}
public static TabModel createMergedModel(Vector<TabModel> tabs, AbstractController c) {
if (tabs.size() == 0) {
return null;
}
Enumeration<TabModel> en = tabs.elements();
TabModel answer = en.nextElement().copy(c);
while (en.hasMoreElements()) {
answer = performMerge(answer, en.nextElement());
}
return answer;
}
private static TabModel performMerge(TabModel lower, TabModel upper) {
Iterator upperIterator = upper.properties.values().iterator();
while (upperIterator.hasNext()) {
PropertyModel propModel = (PropertyModel) upperIterator.next();
lower.setPropertyForKey(propModel, propModel.name);
}
Iterator upperIterator2 = upper.groups.values().iterator();
while (upperIterator2.hasNext()) {
GroupModel lineModel = (GroupModel) upperIterator2.next();
lower.setGroupForKey(lineModel, lineModel.name);
}
upperIterator = upper.hiddenProperties.iterator();
while (upperIterator.hasNext()) {
HiddenPropertyModel propertyToHide = (HiddenPropertyModel) upperIterator.next();
lower.removePropertyWithKey(propertyToHide.name);
}
upperIterator2 = upper.hiddenGroups.iterator();
while (upperIterator2.hasNext()) {
HiddenGroupModel lineToHide = (HiddenGroupModel) upperIterator2.next();
lower.removePropertyWithKey(lineToHide.name);
}
if (upper.visibilityContext != null) {
if (lower.visibilityContext != null) {
String merge = lower.visibilityContext;
StringTokenizer st1 = new StringTokenizer(upper.visibilityContext, ",");
while (st1.hasMoreTokens()) {
String token = st1.nextToken();
StringTokenizer st2 = new StringTokenizer(lower.visibilityContext, ",");
boolean found = false;
while (st2.hasMoreTokens() && !found) {
found = st2.nextToken().indexOf(token) >= 0;
}
if (!found) {
merge = merge + "," + token;
}
}
lower.visibilityContext = merge;
} else {
lower.visibilityContext = upper.visibilityContext;
}
}
return lower;
}
public String getWidgetTypeForProperty(String propName) {
Iterator it = properties.values().iterator();
PropertyModel prop = null;
while (it.hasNext()) {
prop = (PropertyModel) it.next();
if (prop.name.equals(propName)) {
return prop.getWidget();
}
}
Iterator i = groups.values().iterator();
while (i.hasNext()) {
GroupModel line = (GroupModel) i.next();
String type = line.getWidgetTypeForProperty(propName);
if (type != null) {
return type;
}
}
return null;
}
/**
* @param model
*/
public void setInspectorModel(InspectorModel model) {
_inspectorModel = model;
}
public InspectorModel getInspectorModel() {
return _inspectorModel;
}
private InspectorModel _inspectorModel;
private String encodedModel;
/**
* @param depends
* @return
*/
public PropertyModel getPropertyNamed(String depends) {
for (Enumeration e = properties.elements(); e.hasMoreElements();) {
PropertyModel next = (PropertyModel) e.nextElement();
if (next.name.equals(depends)) {
return next;
}
}
for (Enumeration e = groups.elements(); e.hasMoreElements();) {
GroupModel next = (GroupModel) e.nextElement();
PropertyModel p = next.getPropertyNamed(depends);
if (p != null) {
return p;
}
}
return null;
}
public Hashtable<String, PropertyModel> getProperties() {
return properties;
}
public void setProperties(Hashtable<String, PropertyModel> prop) {
orderedProperties = null;
this.properties = prop;
}
public void setPropertyForKey(PropertyModel propertyModel, String key) {
orderedProperties = null;
properties.put(key, propertyModel);
propertyModel.setTabModel(this);
}
public void removePropertyWithKey(String key) {
orderedProperties = null;
Object o = properties.remove(key);
if (o == null) {
Enumeration en = groups.elements();
while (en.hasMoreElements()) {
GroupModel line = (GroupModel) en.nextElement();
if (line.removePropertyWithKey(key)) {
return;
}
}
}
}
/**
* @param depends
* @return
*/
public GroupModel getLineNamed(String depends) {
for (Enumeration e = groups.elements(); e.hasMoreElements();) {
GroupModel next = (GroupModel) e.nextElement();
if (next.name.equals(depends)) {
return next;
}
}
return null;
}
public Hashtable<String, GroupModel> getGroups() {
return groups;
}
public void setGroups(Hashtable<String, GroupModel> lines) {
this.groups = lines;
}
public void setGroupForKey(GroupModel lineModel, String key) {
groups.put(key, lineModel);
lineModel.setTabModel(this);
}
public void removeGroupWithKey(String key) {
groups.remove(key);
}
private Vector<PropertyModel> orderedProperties = null;
public Vector<PropertyModel> getOrderedProperties() {
if (orderedProperties == null) {
orderedProperties = new Vector<PropertyModel>(properties.values());
Collections.sort(orderedProperties, new Comparator<PropertyModel>() {
@Override
public int compare(PropertyModel o1, PropertyModel o2) {
return o1.constraint - o2.constraint;
}
});
}
return orderedProperties;
}
}