/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.airavata.xbaya.gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JToolBar;
import javax.swing.border.Border;
import org.apache.airavata.common.utils.SwingUtil;
import org.apache.airavata.xbaya.XBayaEngine;
import org.apache.airavata.xbaya.graph.GraphException;
import org.apache.airavata.xbaya.interpretor.XBayaExecutionState;
import org.apache.airavata.xbaya.wf.Workflow;
import com.amazonaws.transform.MapEntry;
public class XBayaToolBar implements XBayaComponent {
private XBayaEngine engine;
private JToolBar toolbar;
private JButton play;
private JButton step;
private JButton stop;
private Map<String,List<ToolbarButton>> toolbarButtons = new HashMap<String,List<ToolbarButton>>();
private static Map<String,Integer> groupOrder;
/**
* IMAGES_STOP_JPEG
*/
public static final String IMAGES_STOP_JPEG = "stop.jpeg";
/**
* IMAGES_PAUSE_JPEG
*/
public static final String IMAGES_PAUSE_JPEG = "pause.jpeg";
/**
* IMAGES_PLAY_JPEG
*/
public static final String IMAGES_PLAY_JPEG = "play.jpeg";
/**
* IMAGES_STEP_JPEG
*/
private static final String IMAGES_STEP_JPEG = "step.gif";
private AbstractAction playAction;
private AbstractAction stepAction;
private AbstractAction stopAction;
private ImageIcon PLAY_ICON;
private ImageIcon PAUSE_ICON;
/**
* Creates a toolbar.
*
* @param client
*/
public XBayaToolBar(XBayaEngine client) {
this.engine = client;
init();
}
/**
* Returns the toolbar.
*
* @return The toolbar
*/
public JComponent getSwingComponent() {
return this.toolbar;
}
private void init() {
this.toolbar = new JToolBar();
this.toolbar.setFloatable(false);
Border border = BorderFactory.createEtchedBorder();
this.toolbar.setBorder(border);
JButton addNodeButton = new JButton("Add Node");
addNodeButton.addActionListener(new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent event) {
try {
XBayaToolBar.this.engine.getGUI().addNode();
} catch (RuntimeException e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
} catch (Error e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
}
}
});
JButton removeNodeButton = new JButton("Remove Node");
removeNodeButton.addActionListener(new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent event) {
try {
XBayaToolBar.this.engine.getGUI().getGraphCanvas().removeSelectedNode();
} catch (GraphException e) {
// Should not happen
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
} catch (RuntimeException e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
} catch (Error e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
}
}
});
JButton connectEdgeButton = new JButton("Connect/Disconnect");
connectEdgeButton.addActionListener(new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent event) {
try {
XBayaToolBar.this.engine.getGUI().getGraphCanvas().addOrRemoveEdge();
} catch (RuntimeException e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
} catch (Error e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
}
}
});
this.play = new JButton();
PAUSE_ICON = SwingUtil.createImageIcon(IMAGES_PAUSE_JPEG);
PLAY_ICON = SwingUtil.createImageIcon(IMAGES_PLAY_JPEG);
this.playAction = new AbstractAction(null, PAUSE_ICON) {
/**
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e1) {
try {
Workflow workflow = engine.getWorkflow();
XBayaExecutionState executionState = workflow.getExecutionState();
if (executionState == XBayaExecutionState.RUNNING || executionState == XBayaExecutionState.STEP) {
workflow.setExecutionState(XBayaExecutionState.PAUSED);
play.setIcon(PLAY_ICON);
} else if (executionState == XBayaExecutionState.PAUSED) {
workflow.setExecutionState(XBayaExecutionState.RUNNING);
play.setIcon(PAUSE_ICON);
} else {
throw new IllegalStateException("Unknown state :" + executionState);
}
} catch (RuntimeException e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
} catch (Error e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
}
}
};
this.play.setAction(this.playAction);
this.step = new JButton();
this.stepAction = new AbstractAction(null, SwingUtil.createImageIcon(IMAGES_STEP_JPEG)) {
/**
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e2) {
try {
if (engine.getWorkflow().getExecutionState() == XBayaExecutionState.PAUSED) {
engine.getWorkflow().setExecutionState(XBayaExecutionState.STEP);
} else {
throw new IllegalStateException("Unknown state :" + engine.getWorkflow().getExecutionState());
}
} catch (RuntimeException e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
} catch (Error e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
}
}
};
this.step.setAction(stepAction);
this.stop = new JButton();
this.stopAction = new AbstractAction(null, SwingUtil.createImageIcon(IMAGES_STOP_JPEG)) {
/**
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e1) {
try {
if (engine.getWorkflow().getExecutionState() != XBayaExecutionState.NONE
|| engine.getWorkflow().getExecutionState() != XBayaExecutionState.STOPPED) {
engine.getWorkflow().setExecutionState(XBayaExecutionState.STOPPED);
} else {
throw new IllegalStateException("Unknown state :" + engine.getWorkflow().getExecutionState());
}
} catch (RuntimeException e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
} catch (Error e) {
XBayaToolBar.this.engine.getGUI().getErrorWindow().error(ErrorMessages.UNEXPECTED_ERROR, e);
}
}
};
this.stop.setAction(stopAction);
// this.toolbar.add(addNodeButton);
// this.toolbar.add(removeNodeButton);
// this.toolbar.addSeparator();
// this.toolbar.add(connectEdgeButton);
}
public ToolbarButton addToolbarButton(String group, String caption, Icon icon, String description, ActionListener onClick, int order){
ToolbarButton toolbarButton = new ToolbarButton(icon, caption, description, order);
toolbarButton.setButtonClickListener(onClick);
getToolBarButtonList(group).add(toolbarButton);
rearrangeToolbarButtons();
return toolbarButton;
}
private void sortButtons(List<ToolbarButton> buttons){
ToolbarButton[] buttonList=buttons.toArray(new ToolbarButton[]{});
ToolbarButton temp;
for (int i=0;i<buttonList.length-1;i++) {
for(int j=i+1;j<buttonList.length;j++){
if (buttonList[i].getOrder()!=-1){
if (buttonList[i].getOrder()>buttonList[j].getOrder()){
temp=buttonList[i];
buttonList[i]=buttonList[j];
buttonList[j]=temp;
}
}
}
}
buttons.clear();
buttons.addAll(Arrays.asList(buttonList));
}
private void rearrangeToolbarButtons(){
toolbar.removeAll();
String[] groupIds = getSortedGroupIdList();
Map<String, List<ToolbarButton>> tempToolbarButtons=new HashMap<String, List<ToolbarButton>>();
tempToolbarButtons.putAll(toolbarButtons);
for (String groupId : groupIds) {
tempToolbarButtons.remove(groupId);
if (toolbarButtons.containsKey(groupId) && toolbarButtons.get(groupId)!=null) {
List<ToolbarButton> buttons = toolbarButtons.get(groupId);
addButtonsToToolbar(buttons);
}
}
for (String groupId : tempToolbarButtons.keySet()) {
List<ToolbarButton> buttons = tempToolbarButtons.get(groupId);
addButtonsToToolbar(buttons);
}
}
private void addButtonsToToolbar(List<ToolbarButton> buttons) {
sortButtons(buttons);
for (ToolbarButton button : buttons) {
toolbar.add(button);
}
toolbar.addSeparator();
}
private String[] getSortedGroupIdList() {
String[] groupIds = getGroupOrder().keySet().toArray(new String[]{});
for(int i=0;i<groupIds.length-1;i++){
for(int j=i+1;j<groupIds.length;j++){
if (getGroupOrder().get(groupIds[i])>getGroupOrder().get(groupIds[j])){
String temp=groupIds[i];
groupIds[i]=groupIds[j];
groupIds[j]=temp;
}
}
}
return groupIds;
}
/**
* Returns the playAction.
*
* @return The playAction
*/
public AbstractAction getPlayAction() {
return this.playAction;
}
/**
* Returns the stepAction.
*
* @return The stepAction
*/
public AbstractAction getStepAction() {
return this.stepAction;
}
/**
* Returns the stopAction.
*
* @return The stopAction
*/
public AbstractAction getStopAction() {
return this.stopAction;
}
private List<ToolbarButton> getToolBarButtonList(String group){
if (!toolbarButtons.containsKey(group)){
toolbarButtons.put(group, new ArrayList<ToolbarButton>());
}
return toolbarButtons.get(group);
}
public static void setGroupOrder(String groupId, int order){
getGroupOrder().put(groupId, order);
}
public static Map<String,Integer> getGroupOrder() {
if (groupOrder==null){
groupOrder=new HashMap<String, Integer>();
}
return groupOrder;
}
}