/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.gui.settings;
import net.codjo.mad.client.request.FieldsList;
import net.codjo.mad.client.request.RequestException;
import net.codjo.mad.client.request.Result;
import net.codjo.mad.gui.request.DetailDataSource;
import net.codjo.mad.gui.request.ListDataSource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
/**
* Modele du Tree des axes avec les poches qui ont des formules.
*
* @version $Revision: 1.1 $
*/
public class ClassificationsEditorTreeModel implements TreeModel {
private ListDataSource sleeveDataSource = new ListDataSource();
private List<Classification> classificationList = new ArrayList<Classification>();
private Map<String, String> toBeReplaced = new HashMap<String, String>();
private Collection<String> sleeveListForStyle = new ArrayList<String>();
void init(String editingSleeveCode, ListDataSource sonDataSource,
DetailDataSource fatherDataSource) throws RequestException {
Map<String, Sleeve> axeSleeveMap = new HashMap<String, Sleeve>();
String classificationType = fatherDataSource.getFieldValue("classificationType");
int axeId = Integer.valueOf(fatherDataSource.getFieldValue("classificationId"));
sleeveDataSource.setLoadFactoryId("selectAllSleeve");
Map<String, String> selectorMap = new HashMap<String, String>();
selectorMap.put("classificationType", classificationType);
selectorMap.put("classificationId", "" + axeId);
FieldsList fieldsList = new FieldsList(selectorMap);
sleeveDataSource.setSelector(fieldsList);
sleeveDataSource.setColumns(new String[]{
"classificationId", "sleeveRowId", "classificationName", "sleeveCode",
"sleeveName", "terminalElement", "formula"
});
sleeveDataSource.load();
Classification classification = new Classification();
Result resultSet = sleeveDataSource.getLoadResult();
for (int i = 0; i < resultSet.getRowCount(); i++) {
int classificationId = Integer.valueOf(resultSet.getValue(i, "classificationId"));
String formulaValue = resultSet.getValue(i, "formula");
String sleeveCode = resultSet.getValue(i, "sleeveCode");
String sleeveName = resultSet.getValue(i, "sleeveName");
String sleeveRowId = resultSet.getValue(i, "sleeveRowId");
String terminalElement = resultSet.getValue(i, "terminalElement");
String classificationName = resultSet.getValue(i, "classificationName");
if (classification.getId() != classificationId && classification.getId() != 0) {
classificationList.add(classification);
classification = new Classification();
axeSleeveMap.clear();
}
classification.setId(classificationId);
classification.setName(classificationName);
Sleeve sleeve = createSleeve(sleeveCode, classificationId, sleeveRowId, sleeveName,
classificationName, terminalElement, formulaValue);
addSleeveToClassification(axeSleeveMap, sleeve, classification);
}
if (classification.getId() != 0) {
classificationList.add(classification);
}
}
public Collection getSleeveListForStyle() {
return sleeveListForStyle;
}
public Map<String, String> getToBeReplaced() {
return toBeReplaced;
}
public List getClassificationList() {
return classificationList;
}
public void addTreeModelListener(TreeModelListener treeModelListener) {
}
public void removeTreeModelListener(TreeModelListener treeModelListener) {
}
public void valueForPathChanged(TreePath path, Object newValue) {
}
public Object getRoot() {
return "Axes";
}
public Object getChild(Object parent, int index) {
Object result;
if (parent instanceof Classification) {
result = ((Classification)parent).getSleeveList().get(index);
}
else if (parent instanceof Sleeve) {
Sleeve sleeve = (Sleeve)parent;
result = sleeve.get(index);
}
else {
result = classificationList.get(index);
}
return result;
}
public int getChildCount(Object parent) {
int result;
if (parent instanceof Classification) {
result = ((Classification)parent).getSleeveList().size();
}
else if (parent instanceof Sleeve) {
Sleeve sleeve = (Sleeve)parent;
result = sleeve.getSleeveList().size();
}
else {
result = classificationList.size();
}
return result;
}
public boolean isLeaf(Object node) {
if (node instanceof Classification) {
Classification classification = (Classification)node;
return classification.getSleeveList().size() == 0;
}
if (node instanceof Sleeve) {
Sleeve sleeve = (Sleeve)node;
return sleeve.isTerminalElement() || sleeve.getSleeveList().isEmpty();
}
return false;
}
@SuppressWarnings({"SuspiciousMethodCalls"})
public int getIndexOfChild(Object parent, Object child) {
int result;
if (parent instanceof Classification) {
result = ((Classification)parent).getSleeveList().indexOf(child);
}
else if (parent instanceof Sleeve) {
Sleeve sleeve = (Sleeve)parent;
result = sleeve.getSleeveList().indexOf(child);
}
else {
result = classificationList.indexOf(child);
}
return result;
}
private static String getLogicalName(Sleeve memorySleeve) {
return memorySleeve.getClassificationName()
+ "$"
+ memorySleeve.getSleeveName();
}
private static String getPhysicalAlias(Sleeve memorySleeve) {
return "INC_$$"
+ memorySleeve.getClassificationId()
+ "$"
+ memorySleeve.getSleeveRowId();
}
private static Sleeve createSleeve(String sleeveCode,
int classificationId,
String sleeveRowId,
String sleeveName,
String classificationName,
String terminalElement, String formulaValue) {
Sleeve sleeve = new Sleeve();
sleeve.setSleeveCode(sleeveCode);
sleeve.setClassificationId(classificationId);
sleeve.setSleeveRowId(sleeveRowId);
sleeve.setSleeveName(sleeveName);
sleeve.setClassificationName(classificationName);
sleeve.setTerminalElement(Boolean.valueOf(terminalElement));
sleeve.setFormula(formulaValue);
return sleeve;
}
private void addSleeveToClassification(Map<String, Sleeve> axeSleeveMap, Sleeve sleeve,
Classification classification) {
axeSleeveMap.put(sleeve.getIndex(), sleeve);
if (sleeve.getLevel() == 1) {
classification.addSleeve(sleeve);
}
else {
Sleeve parent = axeSleeveMap.get(sleeve.getParentIndex());
parent.addSleeve(sleeve);
}
String sleeveLogicName = getLogicalName(sleeve);
toBeReplaced.put(getPhysicalAlias(sleeve), sleeveLogicName);
sleeveListForStyle.add(sleeveLogicName);
}
public static class Sleeve {
private int classificationId;
private String sleeveRowId;
private String classificationName;
private String sleeveCode;
private String sleeveName;
private boolean terminalElement;
private List<Sleeve> sleeveList = new ArrayList<Sleeve>();
private String sleeveFormula;
public void addSleeve(Sleeve sleeve) {
sleeveList.add(sleeve);
}
public List getSleeveList() {
return sleeveList;
}
public Sleeve get(int index) {
return sleeveList.get(index);
}
public String getClassificationName() {
return classificationName;
}
public void setClassificationName(String classificationName) {
this.classificationName = classificationName;
}
public int getClassificationId() {
return classificationId;
}
public void setClassificationId(int classificationId) {
this.classificationId = classificationId;
}
public String getSleeveCode() {
return sleeveCode;
}
public void setSleeveCode(String sleeveCode) {
this.sleeveCode = sleeveCode;
}
public String getSleeveName() {
return sleeveName;
}
public void setSleeveName(String sleeveName) {
this.sleeveName = sleeveName;
}
public boolean isTerminalElement() {
return terminalElement;
}
public void setTerminalElement(boolean terminalElement) {
this.terminalElement = terminalElement;
}
public String getIndex() {
int dashIndex = sleeveCode.indexOf('-');
return sleeveCode.substring(dashIndex + 1);
}
public String getSleeveRowId() {
return sleeveRowId;
}
public void setSleeveRowId(String sleeveRowId) {
this.sleeveRowId = sleeveRowId;
}
public String getParentIndex() {
String index = getIndex();
int lastDotIndex = index.lastIndexOf('.');
if (lastDotIndex != -1) {
return index.substring(0, lastDotIndex);
}
else {
return "";
}
}
public int getLevel() {
int dashIndex = sleeveCode.indexOf('-');
return Integer.parseInt(sleeveCode.substring(0, dashIndex));
}
@Override
public String toString() {
return sleeveName;
}
public String getFormula() {
return sleeveFormula;
}
public void setFormula(String newFormula) {
sleeveFormula = newFormula;
}
}
public static class Classification {
private int id;
private String name;
private List<Sleeve> sleeveList = new ArrayList<Sleeve>();
public void addSleeve(Sleeve sleeve) {
sleeveList.add(sleeve);
}
public List getSleeveList() {
return sleeveList;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
}