/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.gui.results;
import net.codjo.gui.toolkit.util.ErrorDialog;
import net.codjo.mad.client.request.FieldsList;
import net.codjo.mad.client.request.RequestException;
import net.codjo.mad.common.structure.StructureReader;
import net.codjo.mad.gui.framework.GuiContext;
import net.codjo.mad.gui.request.Column;
import net.codjo.mad.gui.request.DataLink;
import net.codjo.mad.gui.request.JoinKeys;
import net.codjo.mad.gui.request.Preference;
import net.codjo.mad.gui.request.RequestComboBox;
import net.codjo.mad.gui.request.RequestTable;
import net.codjo.mad.gui.request.event.DataSourceAdapter;
import net.codjo.mad.gui.request.event.DataSourceEvent;
import net.codjo.mad.gui.request.factory.RequetorFactory;
import net.codjo.mad.gui.request.factory.SelectFactory;
import net.codjo.mad.gui.structure.StructureCache;
import net.codjo.segmentation.gui.preference.PreferenceGui;
import net.codjo.segmentation.gui.preference.PreferenceGuiManagerFactory;
import net.codjo.xml.XmlException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JTextField;
/**
* Classe permettant de Manipuler les listener sur SegmentationResultWindowGui.
*/
public class SegmentationResultWindowLogic {
private final SegmentationResultWindowGui gui;
private GuiContext guiContext;
private Map<String, JTextField> customFields = new HashMap<String, JTextField>();
public SegmentationResultWindowLogic(GuiContext context, String label)
throws Exception {
this.guiContext = context;
gui = new SegmentationResultWindowGui(label, context);
RequestComboBox axisCombo = gui.getAxeFilter();
axisCombo.setColumns(new String[]{"classificationId", "classificationName"});
axisCombo.setRendererFieldName("classificationName");
axisCombo.setModelFieldName("classificationId");
axisCombo.setSelectFactoryId("selectAllClassificationByFamily");
RequestComboBox familyCombo = gui.getFamilyFilter();
familyCombo.setColumns(new String[]{"familyId"});
familyCombo.setRendererFieldName("familyId");
familyCombo.setModelFieldName("familyId");
familyCombo.setSelectFactoryId("selectAllFamily");
JoinKeys joinKeys = new JoinKeys();
joinKeys.addAssociation("familyId", "classificationType");
DataLink dataLink = new DataLink(familyCombo.getDataSource(), axisCombo.getDataSource(), joinKeys);
dataLink.setLoadPolicy(DataLink.Policy.AFTER_FATHER);
dataLink.start();
familyCombo.load();
setNames();
gui.getClassificationResultToolBar().init(guiContext, gui.getClassificationResultTable());
gui.getClassificationResultTable().getDataSource()
.addDataSourceListener(new ClassificationResultDataSourceAdaptor());
gui.getGoButton().addActionListener(new GoButtonActionListener());
gui.getAxeFilter().addActionListener(new AxisActionListener());
}
private void setNames() {
gui.getAxeFilter().setName("axeFilter");
gui.getFamilyFilter().setName("familyFilter");
gui.getAnomalyFilter().setName("anomalyFilter");
gui.getGoButton().setName("goButton");
}
public GuiContext getGuiContext() {
return guiContext;
}
public void addCustomFilterField(String label, String fieldName, JTextField component) {
customFields.put(fieldName, component);
gui.addCustomField(label, component, 0.0);
}
public void addGoButton() {
getGui().addGoButton();
}
public SegmentationResultWindowGui getGui() {
return gui;
}
private boolean isValidAxeSelected() {
return (gui.getAxeFilter().getDataSource().getSelectedRow() != null);
}
private void initRequestTable() throws RequestException, IOException, XmlException {
String familyId = gui.getFamilyFilter().getDataSource().getSelectedRow().getFieldValue("familyId");
PreferenceGui preferenceGui = getPreferenceGuiManager(guiContext, familyId);
Map<String, String> resultColumns = preferenceGui.getResultColumns();
List<Column> columns = new ArrayList<Column>();
for (Map.Entry<String, String> entry : resultColumns.entrySet()) {
columns.add(new Column(entry.getValue(), entry.getKey()));
}
Preference preference = new Preference();
preference.setColumns(columns);
preference.setSelectAllId("getSegmentationResult");
if (preferenceGui.getResultRequetor() != null && !"".equals(preferenceGui.getResultRequetor())) {
preference.setRequetor(new RequetorFactory(preferenceGui.getResultRequetor()));
}
else {
preference.setRequetor(null);
}
preference.setId("classificationResultTable");
gui.getClassificationResultTable().setPreference(preference);
gui.getClassificationResultToolBar().init(guiContext, gui.getClassificationResultTable());
}
private void loadRequestTableWithFilter() throws RequestException, IOException, XmlException {
String familyId = gui.getFamilyFilter().getDataSource().getSelectedRow().getFieldValue("familyId");
String axeId = gui.getAxeFilter().getDataSource().getSelectedRow().getFieldValue("classificationId");
gui.getClassificationResultTable().getDataSource()
.setLoadFactory(new SelectFactory("getSegmentationResult"));
FieldsList fieldsList = new FieldsList("familyId", familyId);
fieldsList.addField("segmentationId", axeId);
String anomaly = getGui().getAnomalyFilter().getText();
fieldsList.addField("anomaly", "".equals(anomaly) ? "-1" : anomaly);
for (Map.Entry<String, JTextField> entry : customFields.entrySet()) {
fieldsList.addField(entry.getKey(), entry.getValue().getText());
}
gui.getClassificationResultTable().setSelector(fieldsList);
gui.getClassificationResultTable().setCurrentPage(1);
gui.getClassificationResultTable().load();
}
private PreferenceGui getPreferenceGuiManager(GuiContext ctxt, String familyId)
throws IOException, XmlException, RequestException {
StructureCache structureCache = (StructureCache)ctxt.getProperty(StructureCache.STRUCTURE_CACHE);
StructureReader madReader = structureCache.getStructureReader();
return new PreferenceGuiManagerFactory(madReader).getPreferenceGuiManager().getPreference(familyId);
}
private class AxisActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
gui.getGoButton().setEnabled(gui.getAxeFilter().getDataSource().getSelectedRow() != null);
gui.getClassificationResultTable().getPreference().setRequetor(null);
if (isValidAxeSelected()) {
try {
initRequestTable();
}
catch (Exception exception) {
ErrorDialog.show(guiContext.getDesktopPane(), "Erreur au chargement des r�sultats",
exception);
}
}
else {
RequestTable classificationTable = gui.getClassificationResultTable();
classificationTable.getDataSource().clear();
gui.getClassificationResultToolBar().init(guiContext, gui.getClassificationResultTable());
}
}
}
private class GoButtonActionListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
try {
loadRequestTableWithFilter();
}
catch (Exception e1) {
ErrorDialog.show(guiContext.getDesktopPane(), "Erreur au chargement des r�sultats", e1);
}
}
}
private class ClassificationResultDataSourceAdaptor extends DataSourceAdapter {
@Override
public void beforeLoadEvent(DataSourceEvent event) {
super.beforeLoadEvent(event);
if (!"getSegmentationResult".equals(event.getDataSource().getLoadFactory().getId())) {
gui.getAnomalyFilter().setText("");
for (Map.Entry<String, JTextField> entry : customFields.entrySet()) {
entry.getValue().setText("");
}
}
}
}
}