package com.revolsys.swing.map.symbol;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import com.revolsys.collection.list.Lists;
import com.revolsys.collection.map.MapEx;
import com.revolsys.util.CaseConverter;
public class SymbolGroup extends AbstractSymbolElement {
private List<SymbolGroup> groups = new ArrayList<>();
private List<Symbol> symbols = new ArrayList<>();
private Map<String, Symbol> symbolByName = new TreeMap<>();
public SymbolGroup() {
}
public SymbolGroup(final Map<String, ? extends Object> properties) {
setProperties(properties);
}
public SymbolGroup(final String name) {
this(name, CaseConverter.toCapitalizedWords(name));
}
public SymbolGroup(final String name, final String title) {
super(name, title);
}
public void addSymbol(final Symbol symbol) {
addSymbolDo(symbol);
}
protected void addSymbolDo(final Symbol symbol) {
this.symbols.add(symbol);
final String name = symbol.getName();
this.symbolByName.put(name, symbol);
}
public SymbolGroup addSymbolGroup(final String name) {
final SymbolGroup symbolGroup = new SymbolGroup(name);
addSymbolGroup(symbolGroup);
return symbolGroup;
}
public void addSymbolGroup(final SymbolGroup symbolGroup) {
this.groups.add(symbolGroup);
symbolGroup.setParent(this);
}
public ShapeSymbol addSymbolShape(final String name) {
final String title = CaseConverter.toCapitalizedWords(name);
return addSymbolShape(name, title);
}
public ShapeSymbol addSymbolShape(final String name, final String title) {
final ShapeSymbol symbol = new ShapeSymbol(name, title);
addSymbol(symbol);
return symbol;
}
public void addSymbolsToList(final List<Symbol> symbols) {
for (final SymbolGroup group : this.groups) {
group.addSymbolsToList(symbols);
}
final List<Symbol> symbols2 = getSymbols();
symbols2.sort((symbol1, symbol2) -> {
return symbol1.getTitle().compareTo(symbol2.getTitle());
});
symbols.addAll(symbols2);
}
public SvgSymbol addSymbolSvg(final String name) {
final SvgSymbol symbol = new SvgSymbol(name);
addSymbol(symbol);
return symbol;
}
public SvgSymbol addSymbolSvg(final String name, final String title) {
final SvgSymbol symbol = new SvgSymbol(name, title);
addSymbol(symbol);
return symbol;
}
public List<SymbolGroup> getGroups() {
return this.groups;
}
public Symbol getSymbol(final String name) {
Symbol symbol = this.symbolByName.get(name);
if (symbol == null) {
for (final SymbolGroup group : this.groups) {
symbol = group.getSymbol(name);
if (symbol != null) {
return symbol;
}
}
}
return symbol;
}
public List<Symbol> getSymbols() {
return Lists.toArray(this.symbols);
}
@Override
public String getTypeName() {
return "symbolGroup";
}
public void setGroups(final List<SymbolGroup> groups) {
this.groups = new ArrayList<>();
for (final SymbolGroup group : groups) {
groups.add(group);
}
}
public void setSymbols(final List<Symbol> symbols) {
this.symbolByName = new HashMap<>();
this.symbols = new ArrayList<>();
for (final Symbol symbol : symbols) {
addSymbolDo(symbol);
}
}
@Override
public MapEx toMap() {
final MapEx map = super.toMap();
addToMap(map, "groups", this.groups);
addToMap(map, "symbols", this.symbols);
return map;
}
}