blob: 8eeefe6c5dfdb920069ccaad60e7fb14bbe8b0a2 [file] [log] [blame]
package net.sf.taverna.t2.workbench.ui.views.contextualviews.activity;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import net.sf.taverna.t2.lang.observer.Observable;
import net.sf.taverna.t2.lang.observer.Observer;
import net.sf.taverna.t2.workbench.MainWindow;
import net.sf.taverna.t2.workbench.edits.EditManager;
import net.sf.taverna.t2.workbench.edits.EditManager.DataFlowRedoEvent;
import net.sf.taverna.t2.workbench.edits.EditManager.DataFlowUndoEvent;
import net.sf.taverna.t2.workbench.edits.EditManager.EditManagerEvent;
import net.sf.taverna.t2.workbench.file.FileManager;
import net.sf.taverna.t2.workbench.helper.HelpEnabledDialog;
import net.sf.taverna.t2.workbench.ui.actions.activity.ActivityConfigurationAction;
import net.sf.taverna.t2.workflowmodel.CompoundEdit;
import net.sf.taverna.t2.workflowmodel.Dataflow;
import net.sf.taverna.t2.workflowmodel.Edit;
import net.sf.taverna.t2.workflowmodel.EditException;
import net.sf.taverna.t2.workflowmodel.Edits;
import net.sf.taverna.t2.workflowmodel.EditsRegistry;
import net.sf.taverna.t2.workflowmodel.Processor;
import net.sf.taverna.t2.workflowmodel.processor.activity.Activity;
import org.apache.log4j.Logger;
public class ActivityConfigurationDialog<A extends Activity, B extends Object>
extends HelpEnabledDialog {
private A activity;
private ActivityConfigurationPanel<A, B> panel;
protected Dataflow owningDataflow;
protected Processor owningProcessor;
private Observer<EditManagerEvent> observer;
protected static Logger logger = Logger
.getLogger(ActivityConfigurationDialog.class);
Dimension minimalSize = null;
Dimension buttonPanelSize = null;
JPanel buttonPanel;
protected JButton applyButton;
public ActivityConfigurationDialog(A a, ActivityConfigurationPanel<A, B> p) {
super(MainWindow.getMainWindow(), "Configuring " + a.getClass().getSimpleName(), false, null);
this.activity = a;
this.panel = p;
owningDataflow = FileManager.getInstance().getCurrentDataflow();
owningProcessor = findProcessor(owningDataflow, a);
this.setTitle(getRelativeName(owningDataflow, activity));
this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setLayout(new BorderLayout());
add(panel, BorderLayout.CENTER);
buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
applyButton = new JButton(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
// For the moment it always does an apply as what should be
// happening is that the apply button only becomes available
// when the configuration has changed. However, many
// configuration panels are not set up to detected changes
// if (panel.isConfigurationChanged()) {
if (checkPanelValues()) {
applyConfiguration();
}
// } else {
// logger.info("Ignoring apply");
// }
}
});
applyButton.setText("Apply");
buttonPanel.add(applyButton);
JButton closeButton = new JButton(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
closeDialog();
}
});
closeButton.setText("Close");
buttonPanel.add(closeButton);
buttonPanel.setBorder(new EmptyBorder(5, 20, 5, 5));
add(buttonPanel, BorderLayout.SOUTH);
this.addWindowListener(new WindowAdapter() {
public void windowOpened(WindowEvent e) {
ActivityConfigurationDialog.this.requestFocusInWindow();
ActivityConfigurationDialog.this.panel.whenOpened();
}
public void windowClosing(WindowEvent e) {
closeDialog();
}
});
this.pack();
minimalSize = this.getSize();
this.setLocationRelativeTo(null);
this.setResizable(true);
this.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
int newWidth = Math.max(getWidth(), minimalSize.width);
int newHeight = Math.max(getHeight(), minimalSize.height);
ActivityConfigurationDialog.this.setSize(new Dimension(newWidth, newHeight));
}
});
observer = new Observer<EditManagerEvent>() {
public void notify(Observable<EditManagerEvent> sender,
EditManagerEvent message) throws Exception {
logger.info("sender is a "
+ sender.getClass().getCanonicalName());
logger.info("message is a "
+ message.getClass().getCanonicalName());
Edit edit = message.getEdit();
logger.info(edit.getClass().getCanonicalName());
considerEdit(message, edit);
}
};
EditManager.getInstance().addObserver(observer);
}
private boolean checkPanelValues() {
boolean result = false;
try {
this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
result = panel.checkValues();
}
finally {
this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
return result;
}
private void considerEdit(EditManagerEvent message, Edit edit) {
boolean result = false;
if (edit instanceof CompoundEdit) {
for (Edit subEdit : ((CompoundEdit) edit).getChildEdits()) {
considerEdit(message, subEdit);
}
} else {
Object subject = edit.getSubject();
if (subject == owningProcessor) {
// panel.reevaluate();
setTitle(getRelativeName(owningDataflow, activity));
} else if (subject == owningDataflow) {
if (!owningDataflow.getProcessors().contains(owningProcessor)) {
ActivityConfigurationAction.clearDialog(activity);
}
} else if (subject == activity) {
if (message instanceof DataFlowUndoEvent) {
logger.info("undo of activity edit found");
panel.refreshConfiguration();
} else if (message instanceof DataFlowRedoEvent) {
logger.info("redo of activity edit found");
panel.refreshConfiguration();
}
}
}
}
protected void configureActivity(B configurationBean) {
configureActivity(owningDataflow, activity, configurationBean);
}
public void configureActivity(Dataflow df, Activity a, Object bean) {
configureActivityStatic(df, a, bean);
}
public static void configureActivityStatic(Dataflow df, Activity a, Object bean) {
Edits edits = EditsRegistry.getEdits();
Edit<?> configureActivityEdit = edits.getConfigureActivityEdit(a, bean);
try {
List<Edit<?>> editList = new ArrayList<Edit<?>>();
editList.add(configureActivityEdit);
Processor p = findProcessor(df, a);
if (p != null && p.getActivityList().size() == 1) {
editList.add(edits.getMapProcessorPortsForActivityEdit(p));
}
EditManager.getInstance().doDataflowEdit(df,
new CompoundEdit(editList));
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
logger.error(e);
} catch (EditException e) {
logger.error(e);
}
}
protected static Processor findProcessor(Dataflow df, Activity activity) {
for (Processor processor : df.getProcessors()) {
if (processor.getActivityList().contains(activity))
return processor;
}
return null;
}
public static String getRelativeName(Dataflow df, Activity activity) {
String result = "";
if (df != null) {
result += df.getLocalName();
Processor p = findProcessor(df, activity);
if (p != null) {
result += (":" + p.getLocalName());
}
}
return result;
}
public boolean closeDialog() {
if (panel.isConfigurationChanged()) {
String relativeName = getRelativeName(owningDataflow, activity);
if (checkPanelValues()) {
int answer = JOptionPane.showConfirmDialog(this,
"Do you want to save the configuration of " + relativeName,
relativeName, JOptionPane.YES_NO_CANCEL_OPTION);
if (answer == JOptionPane.YES_OPTION) {
applyConfiguration();
} else if (answer == JOptionPane.CANCEL_OPTION) {
return false;
}
} else {
int answer = JOptionPane.showConfirmDialog(this,
"Do you want to still want to close?",
relativeName, JOptionPane.YES_NO_OPTION);
if (answer == JOptionPane.NO_OPTION) {
return false;
}
}
}
ActivityConfigurationAction.clearDialog(activity);
return true;
}
private void applyConfiguration() {
panel.noteConfiguration();
configureActivity(panel.getConfiguration());
panel.refreshConfiguration();
}
public void dispose() {
super.dispose();
EditManager.getInstance().removeObserver(observer);
}
}