/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.segmentation.gui.editor;
import net.codjo.expression.help.FunctionHelp;
import net.codjo.gui.toolkit.waiting.WaitingPanel;
import net.codjo.mad.client.request.FieldsList;
import net.codjo.mad.client.request.RequestException;
import net.codjo.mad.client.request.RequestSender;
import net.codjo.mad.client.request.Result;
import net.codjo.mad.client.request.ResultManager;
import net.codjo.mad.client.request.Row;
import net.codjo.mad.client.request.SelectRequest;
import net.codjo.segmentation.gui.preference.PreferenceGui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.log4j.Logger;
/**
* Frame contenant le Panel d'edition d'expression.
*
* @author Palmont
*/
class EditorWindow extends JInternalFrame {
private static final Logger LOG = Logger.getLogger(EditorWindow.class.getName());
private BorderLayout borderLayout = new BorderLayout();
private EditorMainPanelLogic editor = null;
private JButton okButton;
private JButton cancelButton;
private final String classificationId;
private final String sleeveRowId;
private String oldExpression;
EditorWindow(PreferenceGui preference, final SegmentationEditorAction.EditorManager editorManager,
String classificationId, String sleeveRowId) {
this.classificationId = classificationId;
this.sleeveRowId = sleeveRowId;
// Liste des colonnes
Map<String, String> fieldsMap = getColumns(preference);
// Liste des fonctions
List<FunctionHelp> functionsList = preference.getAllFunctionsHelp();
setGlassPane(new WaitingPanel());
editor = new EditorMainPanelLogic(fieldsMap, functionsList, (WaitingPanel)getGlassPane());
editor.getEditorMainPanelGui().getExpressionTextPane().getDocument()
.addDocumentListener(new ExpressionListener());
jbInit();
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
boolean mustModifyFormula = isFormulaIsUsedByIncludes();
if (mustModifyFormula && editorManager.editorOk(getExpression())) {
closeFrame();
}
}
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
closeFrame();
}
});
}
private boolean isFormulaIsUsedByIncludes() {
try {
ResultManager resultManager = findIncludes();
Collection results = resultManager.getResults();
if (results == null) {
return true;
}
for (Object result : results) {
List<Row> list = ((Result)result).getRows();
if (list == null) {
return true;
}
StringBuffer includesInfo = new StringBuffer();
for (Row row : list) {
String classificationName = row.getFieldValue("classificationName");
String sleeveName = row.getFieldValue("sleeveName");
if (isCycleExists(row, sleeveName, classificationName)) {
return false;
}
includesInfo.append("'").append(sleeveName).append("' de l'axe '")
.append(classificationName).append("'\n");
}
int answer =
JOptionPane.showConfirmDialog(this,
"Cette poche est utilis�e dans les poches :\n"
+ includesInfo
+ "Etes-vous certain de vouloir la modifier ?",
"Confirmation", JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (answer == JOptionPane.NO_OPTION) {
return false;
}
}
}
catch (RequestException e) {
LOG.error("Erreur lors du contr�le des alias", e);
}
return true;
}
private boolean isCycleExists(Row row, String sleeveName, String classificationName) {
String includeStringForCurrentSleeve = "INC_$$" + row.getFieldValue("classificationId") + "$" + row
.getFieldValue("sleeveRowId");
String includeStringForAliasSleeve = "INC_$$" + classificationId + "$" + sleeveRowId;
if (getExpression().contains(includeStringForCurrentSleeve)
&& row.getFieldValue("formula").contains(includeStringForAliasSleeve)) {
JOptionPane.showMessageDialog(this,
"Vous venez de cr�er une r�f�rence cyclique avec la poche '"
+ sleeveName + "' de l'axe '" + classificationName
+ "'.",
"Erreur",
JOptionPane.ERROR_MESSAGE);
return true;
}
return false;
}
private ResultManager findIncludes() throws RequestException {
SelectRequest selectAlias = new SelectRequest();
selectAlias.setPage(1, Integer.MAX_VALUE);
selectAlias.setId("selectAliasSleeves");
FieldsList selector = new FieldsList();
selector.addField("classificationId", classificationId);
selector.addField("sleeveRowId", sleeveRowId);
selectAlias.setSelector(selector);
RequestSender requestHelper = new RequestSender();
return requestHelper.send(selectAlias);
}
private void closeFrame() {
try {
setClosed(true);
}
catch (PropertyVetoException e) {
;
}
setVisible(false);
dispose();
}
public void setExpression(String expression) {
oldExpression = expression;
editor.setExpression(expression);
}
public EditorMainPanelLogic getEditorMainPanelLogic() {
return editor;
}
private Map<String, String> getColumns(PreferenceGui preference) {
Map<String, String> fieldsMap = new HashMap<String, String>();
List<Object> tablesList = new ArrayList<Object>();
tablesList.addAll(preference.getTables());
for (Object aTablesList : tablesList) {
String tableName = (String)aTablesList;
fieldsMap = fillFieldsMap(preference, fieldsMap, tableName);
}
return fieldsMap;
}
private Map<String, String> fillFieldsMap(PreferenceGui preference, Map<String, String> fieldsMap2,
String tableName) {
for (Object columns : preference.getColumnsFor(tableName)) {
String fieldSql = (String)columns;
String label = preference.getColumnLabelFor(tableName, fieldSql);
if (!PreferenceGui.VAR_TABLE.equals(tableName)) {
fieldSql = new StringBuilder("SRC_").append(tableName).append("$").append(fieldSql)
.toString();
}
fieldsMap2.put(fieldSql, label);
}
return fieldsMap2;
}
private void jbInit() {
// Fix pour l'h�ritage de la couleur de fond
setContentPane(new JPanel());
setSize(1000, 600);
setLocation(100, 100);
setClosable(false);
setResizable(true);
setTitle("Param�trage des expressions");
setVisible(true);
getContentPane().setLayout(borderLayout);
getContentPane().add(editor.getEditorMainPanelGui(), BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
okButton = new JButton("Valider");
okButton.setName("editor.okButton");
okButton.setEnabled(false);
cancelButton = new JButton("Annuler");
cancelButton.setName("editor.cancelButton");
buttonPanel.add(okButton, 0);
buttonPanel.add(cancelButton, 1);
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
}
public String getExpression() {
return editor.getExpression();
}
/**
* Listener charg� d'activer le bouton valider si l'expression change et de le d�sactiver sinon.
*/
private class ExpressionListener implements DocumentListener {
public void insertUpdate(DocumentEvent event) {
enableOkButton();
}
public void removeUpdate(DocumentEvent event) {
enableOkButton();
}
public void changedUpdate(DocumentEvent event) {
enableOkButton();
}
private void enableOkButton() {
String expression = getExpression();
if (expression.equals(oldExpression)) {
okButton.setEnabled(false);
}
else {
okButton.setEnabled(true);
}
}
}
}