/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.dataprocess.gui.launcher.result.table;
import net.codjo.dataprocess.common.DataProcessConstants;
import net.codjo.dataprocess.common.model.ExecutionListModel;
import net.codjo.dataprocess.common.model.UserTreatment;
import net.codjo.dataprocess.gui.launcher.ExecutionListProgress;
import net.codjo.dataprocess.gui.util.GuiUtils;
import net.codjo.gui.toolkit.util.StandardDialog;
import net.codjo.workflow.common.message.Arguments;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
/**
*
*/
public class ResultPanel extends JPanel {
private TreatmentResultList treatmentResultList = new TreatmentResultList();
private ResultTableModel resultTableModel;
private JTable table;
private JPopupMenu popupMenu = new JPopupMenu();
public ResultPanel() {
popupMenu.add(new ShowDetails());
resultTableModel = new ResultTableModel(treatmentResultList);
table = new JTable(resultTableModel);
table.getTableHeader().setReorderingAllowed(false);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setDefaultRenderer(String.class, new ResultTableCellRenderer());
TableColumnModel columnModel = table.getColumnModel();
setColumnPreferredWidth(columnModel.getColumn(0), 300);
setColumnPreferredWidth(columnModel.getColumn(1), 75);
this.setLayout(new BorderLayout());
this.add(new JScrollPane(table), BorderLayout.CENTER);
table.addMouseListener(new MyMouseAdapter());
}
public void buildTreatmentResult(ExecutionListModel executionListModel) {
List<UserTreatment> trtList = executionListModel.getSortedTreatmentList();
for (UserTreatment usrTrt : trtList) {
treatmentResultList.add(new TreatmentResult(usrTrt.getId(), usrTrt.getTitle()));
}
resultTableModel.fireTableChanged();
}
public void updateTreatmentResult(Arguments auditArguments,
PropertyChangeSupport propertyChangeListeners) {
String treatmentId = auditArguments.get(DataProcessConstants.MESSAGE_PROP_TREATMENT_ID);
String status = auditArguments.get(DataProcessConstants.MESSAGE_PROP_STATUS);
String error = auditArguments.get(DataProcessConstants.MESSAGE_PROP_ERROR);
TreatmentResult treatmentResult = treatmentResultList.getTreatmentResultById(treatmentId);
if (treatmentResult != null) {
treatmentResult.setStartProcessing();
if (DataProcessConstants.STATUS_ERROR.equals(status)) {
treatmentResult.setProcessingError(error);
}
else if (DataProcessConstants.STATUS_INFORMATION.equals(status)) {
String info = auditArguments.get(DataProcessConstants.MESSAGE_INFORMATION);
treatmentResult.setMessage(info);
String title = treatmentResult.getTitle();
if (title == null) {
title = "(inconnu)";
}
propertyChangeListeners.firePropertyChange(ExecutionListProgress.INFO_EVENT, "",
title + " : " + info);
}
else {
treatmentResult.setEndProcessing();
}
informationChanged();
}
}
private static void setColumnPreferredWidth(TableColumn column, int preferredWidth) {
if (preferredWidth != 0) {
column.setMinWidth(50);
column.setMaxWidth(1000);
column.setPreferredWidth(preferredWidth);
column.setWidth(column.getPreferredWidth());
}
}
private static Object[] getAllSelectedDataRows(JTable jTable) {
int[] idx = jTable.getSelectedRows();
List<Object> rows = new ArrayList<Object>();
for (int anIdx : idx) {
rows.add(jTable.getValueAt(anIdx, -1));
}
return rows.toArray();
}
private void showTreatmentDetails() {
if (table.getSelectedRowCount() != 0) {
TreatmentResult treatmentResult = (TreatmentResult)getAllSelectedDataRows(table)[0];
String state;
switch (treatmentResult.getState()) {
case TreatmentResult.OK:
state = "OK";
break;
case TreatmentResult.NOT_STARTED:
state = "Pas d�marr�";
break;
case TreatmentResult.STARTED:
state = "En cours...";
break;
default:
state = "ERREUR";
}
String result = treatmentResult.getTitle() + " : " + state + "\n\n" + treatmentResult
.getMessage();
JFrame parentFrame = (JFrame)SwingUtilities.getWindowAncestor(this);
StandardDialog standardDialog = new StandardDialog(parentFrame,
"D�tails du r�sultat du traitement");
standardDialog.getCancelButton().setVisible(false);
JScrollPane jScrollPane = new JScrollPane();
JTextArea textArea = new JTextArea(result);
textArea.setEditable(false);
textArea.setLineWrap(true);
jScrollPane.getViewport().add(textArea, null);
standardDialog.setContentPane(jScrollPane);
GuiUtils.setMaxSize(standardDialog, 400, 300);
standardDialog.pack();
centerWindow(standardDialog);
standardDialog.setVisible(true);
}
}
private static void centerWindow(Component cp) {
if (cp == null) {
throw new IllegalArgumentException();
}
Dimension containerSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = cp.getSize();
if (frameSize.height > containerSize.height) {
frameSize.height = containerSize.height;
cp.setSize(frameSize);
}
if (frameSize.width > containerSize.width) {
frameSize.width = containerSize.width;
cp.setSize(frameSize);
}
cp.setLocation((containerSize.width - frameSize.width) / 2,
(containerSize.height - frameSize.height) / 2);
}
public void informationChanged() {
resultTableModel.fireTableChanged();
}
private void maybeShowPopup(MouseEvent ev) {
if (ev.isPopupTrigger()) {
popupMenu.show(ev.getComponent(), ev.getX(), ev.getY());
}
}
private void tableMousePressed(MouseEvent ev) {
if (SwingUtilities.isRightMouseButton(ev)) {
int row = table.rowAtPoint(ev.getPoint());
if (row != -1) {
table.setRowSelectionInterval(row, row);
}
maybeShowPopup(ev);
}
}
private class MyMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent ev) {
tableMousePressed(ev);
}
@Override
public void mouseClicked(MouseEvent evt) {
if (evt.getClickCount() == 2) {
showTreatmentDetails();
}
}
@Override
public void mouseReleased(MouseEvent ev) {
maybeShowPopup(ev);
}
}
private class ShowDetails extends AbstractAction {
ShowDetails() {
putValue(NAME, "D�tail du r�sultat du traitement");
putValue(SHORT_DESCRIPTION, "D�tail du r�sultat du traitement");
}
public void actionPerformed(ActionEvent arg0) {
showTreatmentDetails();
}
}
}