package com.isencia.passerelle.editor.common.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.commons.lang.builder.HashCodeBuilder;
public class PaletteGroup implements Serializable, Comparable<PaletteGroup> {
private static final long serialVersionUID = 1L;
@Override
public boolean equals(Object obj) {
if (!(obj instanceof PaletteGroup)) {
return false;
}
PaletteGroup group = (PaletteGroup) obj;
return id.equals(group.getId());
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(id).hashCode();
}
@Override
public String toString() {
return name;
}
private Map<String, PaletteItemDefinition> paletteItemMap = new HashMap<String, PaletteItemDefinition>();
private SortedSet<PaletteItemDefinition> paletteItems = new TreeSet<PaletteItemDefinition>();
private List<PaletteGroup> children = new ArrayList<PaletteGroup>();
private boolean authorized = true;
public void setAuthorized(boolean authorized) {
this.authorized = authorized;
}
public boolean isVisible() {
return true;
}
public Collection<PaletteGroup> getChildren() {
return children;
}
public void addChild(PaletteGroup child) {
if (children == null) {
children = new ArrayList<PaletteGroup>();
}
children.add(child);
}
public void removePaletteItem(PaletteItemDefinition child) {
if (paletteItems != null) {
paletteItems.remove(child);
}
}
/**
* Retrieve all the leaf names under this group
*
* @param deep
* Whether to nest into subgroups or not
* @return A list of all leaf names
*/
public List<String> getLeafNames(boolean deep) {
List<String> leafNames = new ArrayList<String>();
getLeafNames(leafNames, deep, this);
return leafNames;
}
/**
* Recursively retrieve all the leaf names under the given group
*
* @param leafNames
* Names collected thus far
* @param deep
* Whether to nest into subgroups or not
* @param group
* The group to collect leave names off
*/
private void getLeafNames(List<String> leafNames, boolean deep, PaletteGroup group) {
for (PaletteItemDefinition paletteItem : group.getPaletteItems()) {
leafNames.add(paletteItem.getName());
}
if (deep) {
for (PaletteGroup subGroup : group.getChildren()) {
getLeafNames(leafNames, deep, subGroup);
}
}
}
private PaletteGroup parent;
public PaletteGroup getParent() {
return parent;
}
private String parentId;
public boolean isAuthorized() {
return authorized;
}
public void init(PaletteBuilder builder) {
if (parentId == null) {
return;
}
if (parent == null) {
parent = builder.getPaletteGroup(parentId);
parent.addChild(this);
}
}
public void setParent(PaletteGroup parent) {
this.parent = parent;
}
public SortedSet<PaletteItemDefinition> getPaletteItems() {
return paletteItems;
}
public boolean hasPaletteItems() {
if (paletteItems == null) {
return false;
}
return paletteItems.size() > 0;
}
public boolean hasChildren() {
if (children == null) {
return false;
}
return children.size() > 0;
}
private boolean expanded;
public boolean isExpanded() {
return expanded;
}
public void setExpanded(boolean expanded) {
this.expanded = expanded;
}
private int priority = 0;
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PaletteGroup(String id, String name, String parentId) {
super();
this.id = id;
this.name = name;
this.parentId = parentId;
}
public void addPaletteItem(PaletteItemDefinition item) {
paletteItemMap.put(item.getId(), item);
paletteItems.add(item);
}
public PaletteItemDefinition getPaletteItem(String id) {
return paletteItemMap.get(id);
}
private Object icon;
public Object getIcon() {
return icon;
}
public void setIcon(Object icon) {
this.icon = icon;
}
public int compareTo(PaletteGroup arg0) {
final int BEFORE = -1;
final int EQUAL = 0;
final int AFTER = 1;
if (this.getParent() == null) {
if (arg0.getParent() != null) {
return BEFORE;
}
}
if (this.getParent() != null) {
if (arg0.getParent() == null) {
return AFTER;
}
}
if (this.priority != arg0.getPriority()) {
return -(new Integer(this.priority).compareTo(arg0.getPriority()));
}
return this.name.compareTo(arg0.getName());
}
}