package org.enhydra.jawe.components.graph; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.MouseInfo; import java.awt.Point; import java.awt.PointerInfo; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToolBar; import javax.swing.JViewport; import javax.swing.SwingConstants; import javax.swing.ToolTipManager; import org.enhydra.jawe.ActionBase; import org.enhydra.jawe.BarFactory; import org.enhydra.jawe.JaWEAction; import org.enhydra.jawe.JaWEComponent; import org.enhydra.jawe.JaWEComponentView; import org.enhydra.jawe.JaWEManager; import org.enhydra.jawe.Utils; import org.enhydra.jawe.XMLElementChoiceButton; import org.enhydra.jawe.base.controller.JaWEType; import org.enhydra.jawe.base.controller.JaWETypes; import org.enhydra.jawe.components.graph.actions.SetActivityMode; import org.enhydra.jawe.components.graph.actions.SetEndMode; import org.enhydra.jawe.components.graph.actions.SetParticipantMode; import org.enhydra.jawe.components.graph.actions.SetParticipantModeFreeTextExpression; import org.enhydra.jawe.components.graph.actions.SetSelectMode; import org.enhydra.jawe.components.graph.actions.SetStartMode; import org.enhydra.jawe.components.graph.actions.SetTransitionMode; import org.enhydra.shark.xpdl.elements.Activity; import org.enhydra.shark.xpdl.elements.Participant; import org.enhydra.shark.xpdl.elements.Transition; /** * Container for displaying menubar, toolbar, process graphs ... * * @author Sasa Bojanic */ public class GraphControllerPanel extends JPanel implements JaWEComponentView { protected GraphController controller; // various things needed for initializing and further work protected JScrollPane graphScrollPane; protected JToolBar toolbar; protected XMLElementChoiceButton showParticipantChoiceButton; protected XMLElementChoiceButton asChoiceButton; public GraphControllerPanel(GraphController controller) { this.controller = controller; } public void configure() { } public void init() { setBorder(BorderFactory.createEtchedBorder()); setLayout(new BorderLayout()); JPanel toolbars = new JPanel(); toolbars.setLayout(new BorderLayout()); // creating toolbars toolbar = BarFactory.createToolbar("defaultToolbar", controller); toolbar.setFloatable(false); // creating working component graphScrollPane = createWorkingComponent(); JToolBar toolbox = createToolbox(); toolbox.setOrientation(SwingConstants.VERTICAL); toolbox.setFloatable(false); add(toolbar, BorderLayout.NORTH); toolbars.add(toolbox, BorderLayout.CENTER); add(toolbars, BorderLayout.WEST); add(graphScrollPane, BorderLayout.CENTER); } public JaWEComponent getJaWEComponent() { return controller; } public JComponent getDisplay() { return this; } protected JToolBar createToolbox() { String toolbarName = "toolbox"; String actionOrder = controller.getSettings().getToolbarActionOrder(toolbarName); JaWETypes jts = JaWEManager.getInstance().getJaWEController().getJaWETypes(); // set tooltip delay to 100ms ToolTipManager.sharedInstance().setInitialDelay(100); JToolBar toolbar = new JToolBar(); toolbar.setRollover(true); String[] act = Utils.tokenize(actionOrder, BarFactory.ACTION_DELIMITER); for (int j = 0; j < act.length; j++) { if (act[j].equals(BarFactory.ACTION_SEPARATOR)) { toolbar.addSeparator(); } else if (act[j].equals("SetSelectMode")) { JaWEAction ja = new JaWEAction(); ja.setAction(new SetSelectMode(controller)); ja.setIcon(((GraphSettings) controller.getSettings()).getSelectionIcon()); ja.setLangDepName(controller.getSettings().getLanguageDependentString("SelectionKey")); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction("SetSelectMode", ja); } else if (act[j].equals("SetParticipantModeCommonExpression")) { JaWEAction ja = new JaWEAction(); try { String clsName = "org.enhydra.jawe.components.graph.actions.SetParticipantModeCommonExpression"; ActionBase action = (ActionBase) Class.forName(clsName).getConstructor(new Class[]{ GraphController.class }).newInstance(new Object[]{ controller }); ja.setAction(action); } catch (Exception ex) { } ja.setIcon(((GraphSettings) controller.getSettings()).getCommonExpresionParticipantIcon()); ja.setLangDepName(controller.getSettings().getLanguageDependentString("CommonExpressionParticipantKey")); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction("SetParticipantModeCommonExpression", ja); } else if (act[j].equals("SetParticipantModeFreeTextExpression")) { JaWEAction ja = new JaWEAction(); ja.setAction(new SetParticipantModeFreeTextExpression(controller)); ja.setIcon(((GraphSettings) controller.getSettings()).getFreeTextParticipantIcon()); ja.setLangDepName(controller.getSettings().getLanguageDependentString("FreeTextExpressionParticipantKey")); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction("SetParticipantModeFreeTextExpression", ja); } //CUSTOM else if (act[j].equals("SetStartMode")) { JaWEAction ja = new JaWEAction(); ja.setAction(new SetStartMode(controller)); ja.setIcon(((GraphSettings) controller.getSettings()).getBubbleStartIcon()); ja.setLangDepName(controller.getSettings().getLanguageDependentString("StartBubbleKey")); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction("SetStartMode", ja); } else if (act[j].equals("SetEndMode")) { JaWEAction ja = new JaWEAction(); ja.setAction(new SetEndMode(controller)); ja.setIcon(((GraphSettings) controller.getSettings()).getBubbleEndIcon()); ja.setLangDepName(controller.getSettings().getLanguageDependentString("EndBubbleKey")); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction("SetEndMode", ja); //END CUSTOM } else if (act[j].startsWith("SetParticipantMode")) { String type = act[j].substring("SetParticipantMode".length()); if (type.equals("*")) { List parTypes = jts.getTypes(Participant.class); for (int i = 0; i < parTypes.size(); i++) { JaWEType jt = (JaWEType) parTypes.get(i); JaWEAction ja = new JaWEAction(); ja.setAction(new SetParticipantMode(controller, jt.getTypeId())); ja.setIcon(jt.getIcon()); ja.setLangDepName(jt.getDisplayName()); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction(jt.getTypeId(), ja); } } else if (!(type.equals("SetParticipantModeCommonExpression") || type.equals("SetParticipantModeFreeTextExpression"))) { JaWEType jt = jts.getType(type); if (jt == null) { continue; } JaWEAction ja = new JaWEAction(); ja.setAction(new SetParticipantMode(controller, jt.getTypeId())); ja.setIcon(jt.getIcon()); ja.setLangDepName(jt.getDisplayName()); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction(jt.getTypeId(), ja); } } else if (act[j].startsWith("SetActivityMode")) { String type = act[j].substring("SetActivityMode".length()); if (type.equals("*")) { List actTypes = jts.getTypes(Activity.class); for (int i = 0; i < actTypes.size(); i++) { JaWEType jt = (JaWEType) actTypes.get(i); JaWEAction ja = new JaWEAction(); ja.setAction(new SetActivityMode(controller, jt.getTypeId())); ja.setIcon(jt.getIcon()); ja.setLangDepName(jt.getDisplayName()); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction(jt.getTypeId(), ja); } } else { JaWEType jt = jts.getType(type); if (jt == null) { continue; } JaWEAction ja = new JaWEAction(); ja.setAction(new SetActivityMode(controller, jt.getTypeId())); ja.setIcon(jt.getIcon()); ja.setLangDepName(jt.getDisplayName()); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction(jt.getTypeId(), ja); } } else if (act[j].startsWith("SetTransitionMode")) { String type = act[j].substring("SetTransitionMode".length()); if (type.equals("*")) { List traTypes = jts.getTypes(Transition.class); for (int i = 0; i < traTypes.size(); i++) { JaWEType jt = (JaWEType) traTypes.get(i); JaWEAction ja = new JaWEAction(); ja.setAction(new SetTransitionMode(controller, jt.getTypeId())); ja.setIcon(jt.getIcon()); ja.setLangDepName(jt.getDisplayName()); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction(jt.getTypeId(), ja); } } else { JaWEType jt = jts.getType(type); if (jt == null) { continue; } JaWEAction ja = new JaWEAction(); ja.setAction(new SetTransitionMode(controller, jt.getTypeId())); ja.setIcon(jt.getIcon()); ja.setLangDepName(jt.getDisplayName()); JButton b = BarFactory.createToolbarButton(ja, controller); decorateToolboxButton(b, ja); toolbar.add(b); controller.getSettings().addAction(jt.getTypeId(), ja); } } } toolbar.setName(controller.getSettings().getLanguageDependentString(toolbarName + BarFactory.LABEL_POSTFIX)); return toolbar; } protected void decorateToolboxButton(final JButton b, final JaWEAction ja) { b.setText(ja.getLangDepName()); b.setFont(new Font("sansserif",Font.PLAIN,10)); b.setHorizontalTextPosition(SwingConstants.CENTER); b.setVerticalTextPosition(SwingConstants.BOTTOM); b.setMinimumSize(new Dimension(70, 40)); b.setMaximumSize(new Dimension(70, 40)); b.setPreferredSize(new Dimension(70, 40)); // make it draggable b.addMouseListener(new MouseAdapter() { boolean pressed = false; @Override public void mousePressed(MouseEvent e) { pressed = true; } @Override public void mouseExited(MouseEvent e) { if (pressed) { ja.getAction().actionPerformed(null); } } @Override public void mouseReleased(MouseEvent e) { Graph graph = controller.getSelectedGraph(); PointerInfo pointerInfo = MouseInfo.getPointerInfo(); Point location = graph.getLocationOnScreen(); int pointerX = (int)pointerInfo.getLocation().getX(); int pointerY = (int)pointerInfo.getLocation().getY(); int graphX = (int)graph.getParent().getLocationOnScreen().getX(); int x = (int)pointerX - (int)location.getX(); int y = (int)pointerY - (int)location.getY(); if (pressed && x > 0 && pointerX > graphX) { if (graph.isEditable()) { GraphMarqueeHandler marquee = (GraphMarqueeHandler)graph.getMarqueeHandler(); int status = marquee.getStatus(); if (status == JaWEGraphUI.INSERT_PARTICIPANT) { marquee.insertParticipant(); } else if (status == JaWEGraphUI.INSERT_ELEMENT) { marquee.insertElement((Point) graph.fromScreen(new Point(x, y))); } else if (status == JaWEGraphUI.INSERT_TRANSITION_START) { JaWEGraphUI ui = (JaWEGraphUI)graph.getUI(); ui.insertTransitionStart(x, y); } // reset to selection mode for non-transitions if (status != JaWEGraphUI.INSERT_TRANSITION_START) { marquee.setSelectionMode(); } } } pressed = false; } }); } protected JScrollPane createWorkingComponent() { JScrollPane lGraphScrollPane = new JScrollPane(); JViewport port = lGraphScrollPane.getViewport(); port.setScrollMode(JViewport.BLIT_SCROLL_MODE); // Harald Meister: set bigger scroll-amounts, especially useful for // mouse-wheel-scolling in large workflows lGraphScrollPane.getVerticalScrollBar().setUnitIncrement(20); lGraphScrollPane.getHorizontalScrollBar().setUnitIncrement(40); return lGraphScrollPane; } public void graphSelected(Graph graph) { graphScrollPane.setViewportView(graph); } public void enableDisableButtons() { } }