/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.dataprocess.gui.launcher.configuration; import net.codjo.dataprocess.client.RepositoryClientHelper; import net.codjo.dataprocess.client.TreatmentClientHelper; import net.codjo.dataprocess.common.DataProcessConstants; import net.codjo.dataprocess.common.codec.TreatmentModelCodec; import net.codjo.dataprocess.common.context.DataProcessContext; import net.codjo.dataprocess.common.model.ArgList; import net.codjo.dataprocess.common.model.ArgModel; import net.codjo.dataprocess.common.model.ArgModelHelper; import net.codjo.dataprocess.common.model.ExecutionListModel; import net.codjo.dataprocess.common.model.TreatmentModel; import net.codjo.dataprocess.common.model.UserTreatment; import net.codjo.dataprocess.common.util.CommonUtils; import net.codjo.dataprocess.gui.util.GuiUtils; import net.codjo.mad.client.request.RequestException; import net.codjo.mad.gui.framework.LocalGuiContext; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.DefaultListSelectionModel; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; /** * */ public class ConfigurationDialog extends JDialog { private JScrollPane trtScrollPane = new JScrollPane(); private JScrollPane trtConfigScrollPane = new JScrollPane(); private JList guiTreatmentList = new JList(); private JPanel mainPanel = new JPanel(); private JPanel topPanel = new JPanel(); private JPanel leftPanel = new JPanel(); private JPanel rightPanel = new JPanel(); private JPanel bottomPanel = new JPanel(); private BorderLayout borderLayout = new BorderLayout(); private BorderLayout mainBorderLayout = new BorderLayout(); private JLabel execListLabel = new JLabel(" Liste de traitements: "); private JLabel repositoryLabel = new JLabel("R�f�rentiel: "); private JLabel execListTitleLabel = new JLabel(); private JLabel repositoryNameLabel = new JLabel(); private ExecutionListModel execList; private DefaultListModel guiTreatmentModel = new DefaultListModel(); private ConfigurationTable trtConfigurationTable = new ConfigurationTable(0, 0, true); private int repositoryId; private LocalGuiContext ctxt; private JButton quitButton = new JButton(); private Map<String, String> localContext = new HashMap<String, String>(); private boolean modified = false; private List<String> exclude; private Map<String, TreatmentModel> treatmentModelMap = new HashMap<String, TreatmentModel>(); private DataProcessContext dataProcessContext; public ConfigurationDialog(LocalGuiContext ctxt, int repositoryId, DataProcessContext dataProcessContext, ExecutionListModel execList, UserTreatment currUsrTrt, List<String> exclude) { super(ctxt.getMainFrame(), "Configuration des param�tres", true); this.execList = execList; this.repositoryId = repositoryId; this.ctxt = ctxt; this.exclude = exclude; this.dataProcessContext = dataProcessContext; dataProcessContext.putAllInMap(localContext); initGui(); selectUserTreatment(currUsrTrt); } private void initGui() { setSize(900, 500); initTopPanel(); initLeftPanel(); initRightPanel(); initBottomPanel(); initMainPanel(); getContentPane().setLayout(borderLayout); getContentPane().add(mainPanel, BorderLayout.CENTER); InputMap inputMap = mainPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); inputMap.put(KeyStroke.getKeyStroke("ESCAPE"), "cancel"); mainPanel.getActionMap().put("cancel", new AbstractAction() { public void actionPerformed(ActionEvent evt) { quitCommand(); } }); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent evt) { quitCommand(); } }); if (guiTreatmentList.getModel().getSize() != 0) { guiTreatmentList.setSelectedIndex(0); } trtConfigurationTable.getModel().addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent evt) { modified = true; } }); } private void initTopPanel() { topPanel.setLayout(new FlowLayout(FlowLayout.LEADING)); execListTitleLabel.setText(execList.getName()); String repositoryName = ""; try { repositoryName = RepositoryClientHelper.getRepositoryName(ctxt, Integer.toString(repositoryId)); } catch (RequestException ex) { GuiUtils.showErrorDialog(this, getClass(), "Erreur interne", ex); } repositoryNameLabel.setText(repositoryName); execListTitleLabel.setFont(execListTitleLabel.getFont().deriveFont(Font.BOLD)); repositoryNameLabel.setFont(repositoryNameLabel.getFont().deriveFont(Font.BOLD)); topPanel.add(repositoryLabel); topPanel.add(repositoryNameLabel); topPanel.add(execListLabel); topPanel.add(execListTitleLabel); topPanel.setBorder(new EtchedBorder(EtchedBorder.RAISED, Color.white, new Color(134, 134, 134))); } private void initLeftPanel() { initGuiTreatmentList(); leftPanel.setLayout(new BorderLayout()); TitledBorder leftTitledBorder = new TitledBorder(" Traitements "); leftPanel.setBorder(leftTitledBorder); leftPanel.add(trtScrollPane, BorderLayout.CENTER); guiTreatmentList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); trtScrollPane.getViewport().add(guiTreatmentList, null); guiTreatmentList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { if (!evt.getValueIsAdjusting()) { guiTreatmentListSelectionned(); } } }); } private void initRightPanel() { trtConfigurationTable.initConfigurationTableModel(); rightPanel.setLayout(new BorderLayout()); TitledBorder rightTitledBorder = new TitledBorder(" Param�tres "); rightPanel.setBorder(rightTitledBorder); trtConfigScrollPane.getViewport().add(trtConfigurationTable, null); rightPanel.add(trtConfigScrollPane, BorderLayout.CENTER); } private void initBottomPanel() { quitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { quitCommand(); } }); quitButton.setIcon(UIManager.getIcon("dataprocess.exit")); GuiUtils.setMaxSize(quitButton, 36, 25); bottomPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); bottomPanel.add(quitButton); } private void quitCommand() { if (!modified) { dispose(); return; } updateLocalContext(); int result = JOptionPane.showConfirmDialog(this, "Voulez vous prendre en compte les modifications ?", "Demande de confirmation", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (result == JOptionPane.CANCEL_OPTION) { return; } if (result == JOptionPane.YES_OPTION) { actionQuit(); } else { dispose(); } } private void selectUserTreatment(UserTreatment currUsrTrt) { if (currUsrTrt != null) { for (int i = 0; i < guiTreatmentList.getModel().getSize(); i++) { UserTreatment usrTrt = (UserTreatment)guiTreatmentList.getModel().getElementAt(i); if (currUsrTrt.equals(usrTrt)) { guiTreatmentList.setSelectedIndex(i); break; } } } } private void actionQuit() { dataProcessContext.putAll(localContext); dispose(); } private void initMainPanel() { mainPanel.setLayout(mainBorderLayout); mainPanel.add(topPanel, BorderLayout.NORTH); mainPanel.add(leftPanel, BorderLayout.WEST); mainPanel.add(rightPanel, BorderLayout.CENTER); mainPanel.add(bottomPanel, BorderLayout.SOUTH); } private void initGuiTreatmentList() { guiTreatmentList.setModel(guiTreatmentModel); guiTreatmentList.setSelectionModel(new DefaultListSelectionModel()); guiTreatmentList.setCellRenderer(new ConfigurationDialog.TrtListCellRenderer()); List<UserTreatment> sortedList = execList.getSortedTreatmentList(); for (int i = 0; i < sortedList.size(); i++) { UserTreatment usrTrt = sortedList.get(i); guiTreatmentModel.add(i, usrTrt); } } private void updateArgumentTable(TreatmentModel treatmentModel) { int rowNumber = treatmentModel.getArguments().getArgs().size(); DefaultTableModel model = (DefaultTableModel)trtConfigurationTable.getModel(); trtConfigurationTable.removeAllRows(); if (rowNumber != 0) { List<ArgModel> arguments = treatmentModel.getArguments().getArgs(); List<String> variables = new ArrayList<String>(); for (ArgModel argument : arguments) { if (!argument.isFunctionValue()) { add(model, variables, argument.getValue().trim()); } else { List<String> params = argument.getFunctionParams(); for (String param : params) { add(model, variables, param); } } } } trtConfigurationTable.setModel(model); } private void add(DefaultTableModel model, List<String> variables, String value) { if (ArgModelHelper.isGlobalValue(value)) { if (!exclude.contains(value)) { String data = ArgModelHelper.getGlobalValue(value); addToModel(data, data, variables, model); } } else if (ArgModelHelper.isLocalValue(value)) { value = ArgModelHelper.getLocalValue(value); addToModel(CommonUtils.localify(repositoryId, execList.getName(), value), DataProcessConstants.LOCAL_VISIBILITY + value, variables, model); } } private void addToModel(String data, String view, List<String> variables, DefaultTableModel tableModel) { Object[] objectsTable = new Object[]{view, localContext.get(data)}; if (!variables.contains(view)) { tableModel.addRow(objectsTable); variables.add(view); } } private void guiTreatmentListSelectionned() { updateLocalContext(); UserTreatment userTreatment = getCurrentTreatmentModel(); try { updateArgumentTable(getTreatmentModel(userTreatment.getId())); } catch (RequestException ex) { GuiUtils.showErrorDialog(this, getClass(), "Traitement inexistant", ex); } } private TreatmentModel getTreatmentModel(String treatmentId) throws RequestException { TreatmentModel treatmentModel = treatmentModelMap.get(treatmentId); if (treatmentModel == null) { String treatmentModelXml = TreatmentClientHelper.getTreatmentModel(ctxt, String.valueOf(repositoryId), treatmentId); treatmentModel = TreatmentModelCodec.decode(treatmentModelXml); treatmentModelMap.put(treatmentId, treatmentModel); } return treatmentModel; } private UserTreatment getCurrentTreatmentModel() { return (UserTreatment)guiTreatmentList.getModel().getElementAt(guiTreatmentList.getSelectedIndex()); } private void updateLocalContext() { ArgList argList = trtConfigurationTable.getArglist(); List<ArgModel> arguments = argList.getArgs(); for (ArgModel argument : arguments) { String name = argument.getName(); String value = argument.getValue(); if (name.startsWith(DataProcessConstants.LOCAL_VISIBILITY)) { name = CommonUtils.localify(repositoryId, execList.getName(), name.substring( DataProcessConstants.LOCAL_VISIBILITY.length()).trim()); } localContext.put(name, (value == null) ? "" : value); } } private class TrtListCellRenderer implements ListCellRenderer { private DefaultListCellRenderer renderer = new DefaultListCellRenderer(); public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel)renderer.getListCellRendererComponent(list, getRendererValue(value), index, isSelected, cellHasFocus); UserTreatment usrTrt = (UserTreatment)value; try { TreatmentModel trtMod = getTreatmentModel(usrTrt.getId()); if (trtMod.isConfigurable(exclude)) { label.setFont(label.getFont().deriveFont(Font.BOLD)); } } catch (RequestException e) { ; } return label; } private Object getRendererValue(Object value) { UserTreatment usrt = (UserTreatment)value; return usrt.getId() + " "; } } }