/** * */ package agg.gui.animation; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Iterator; import java.util.List; import java.util.Vector; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import agg.xt_basis.Arc; import agg.xt_basis.Graph; import agg.xt_basis.Node; import agg.xt_basis.Type; import agg.xt_basis.TypeGraph; /** * @author olga * */ public class AnimationParamDialog //extends JPanel { protected final JDialog dialog; protected final JComboBox kindField; protected JTextField stepField, delayField, plusField; protected boolean changed; protected final Vector<String> kinds; protected JComboBox targetEdgeTypesField; protected final Vector<String> targetEdgeTypeNames; protected final JLabel text; protected AnimationParam param; public AnimationParamDialog(final AnimationParam parameter) { super(); this.dialog = new JDialog(new JFrame(), " Node Animation Parameter "); this.dialog.setModal(false); this.dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { AnimationParamDialog.this.dialog.setVisible(false); } }); this.param = parameter; this.text = new JLabel(" "); this.kinds = NodeAnimation.getAnimationKindsAsString(); this.kindField = new JComboBox(this.kinds); this.targetEdgeTypeNames = new Vector<String> (); final JPanel content = initDialog(); if (this.param.kind == NodeAnimation.JUMP || this.param.kind == NodeAnimation.CROSS || this.param.kind == NodeAnimation.COMBI_CROSS) { this.stepField.setEditable(false); } this.dialog.getContentPane().add(content); this.dialog.validate(); this.dialog.setSize(300, 200); this.dialog.pack(); } public AnimationParamDialog( final AnimationParam parameter, final Type nodeType, final Graph typeGraph) { super(); this.dialog = new JDialog(new JFrame(), " Node Animation Parameter "); this.dialog.setModal(false); this.dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { AnimationParamDialog.this.dialog.setVisible(false); } }); this.param = parameter; this.text = new JLabel(" "); this.kinds = NodeAnimation.getAnimationKindsAsString(); this.kindField = new JComboBox(this.kinds); this.targetEdgeTypeNames = new Vector<String> (); if (typeGraph instanceof TypeGraph) { final List<Node> list = typeGraph.getNodes(nodeType); if (list != null && list.size() == 1) { final Node n = list.get(0); final Iterator<Arc> outarcs = n.getOutgoingArcsSet().iterator(); while (outarcs.hasNext()) { final Arc arc = outarcs.next(); if (arc.isInheritance()) { getNameOfParentEdge((Node)arc.getTarget()); } else { String tname = arc.getType().getName(); if ("".equals(tname)) tname = "[unnamed"; if (!this.targetEdgeTypeNames.contains(tname)) this.targetEdgeTypeNames.add(tname); } } } this.targetEdgeTypesField = new JComboBox(this.targetEdgeTypeNames); } final JPanel content = initDialog(); if (this.param.kind == NodeAnimation.JUMP || this.param.kind == NodeAnimation.CROSS || this.param.kind == NodeAnimation.COMBI_CROSS) { this.stepField.setEditable(false); } this.dialog.getContentPane().add(content); this.dialog.validate(); this.dialog.setSize(300, 200); this.dialog.pack(); } private void getNameOfParentEdge(Node n) { final Iterator<Arc> outarcs = n.getOutgoingArcsSet().iterator(); while (outarcs.hasNext()) { final Arc arc = outarcs.next(); if (arc.isInheritance()) { getNameOfParentEdge((Node)arc.getTarget()); } else { String tname = arc.getType().getName(); if ("".equals(tname)) tname = "[unnamed"; if (!this.targetEdgeTypeNames.contains(tname)) this.targetEdgeTypeNames.add(tname); } } } public boolean isVisible() { return this.dialog.isVisible(); } public void setVisible(boolean b) { this.dialog.setVisible(b); } public void showParameterDialog(int x, int y) { this.dialog.setLocation(x, y); this.dialog.setVisible(true); this.dialog.toFront(); this.changed = false; } public boolean hasChanged() { return this.changed; } public void unsetChanged() { this.changed = false; } private JPanel initDialog() { final JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(new TitledBorder(" Please set values ")); // panel.add(text, BorderLayout.NORTH); final JPanel p = new JPanel(new GridLayout(0,1)); final JPanel p1 = makeKindField(this.param.getKind()); p.add(p1); final JPanel p2 = makeStepField(this.param.getStep()); p.add(p2); final JPanel p3 = makeDelayField(this.param.getDelay()); p.add(p3); final JPanel p4 = makeEndPlusField(this.param.getEndPlus()); p.add(p4); if (this.targetEdgeTypesField != null && !this.targetEdgeTypeNames.isEmpty()) { String paramTargetEdgeTypeName = this.targetEdgeTypeNames.get(0); if (this.param.getTargetEdgeTypeName() != null) { paramTargetEdgeTypeName = this.param.getTargetEdgeTypeName(); } else { this.param.setTargetEdgeTypeName(paramTargetEdgeTypeName); } final JPanel p5 = makeTargetEdgeTypesField(paramTargetEdgeTypeName); p.add(p5); } final JPanel pClose = makeCloseButton(); panel.add(p, BorderLayout.CENTER); panel.add(pClose, BorderLayout.SOUTH); return panel; } private JPanel makeKindField(String value) { final JPanel p1 = new JPanel(new GridLayout(0, 1)); p1.setBorder(new TitledBorder("")); final JLabel l1 = new JLabel("Animation kind"); this.kindField.setSelectedItem(value); this.kindField.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { String kind = (String) e.getItem(); if (kind.equals("JUMP")) { AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || (AnimationParamDialog.this.param.kind != NodeAnimation.JUMP); AnimationParamDialog.this.param.kind = NodeAnimation.JUMP; AnimationParamDialog.this.stepField.setEditable(false); } else if (kind.equals("WORM")) { AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || (AnimationParamDialog.this.param.kind != NodeAnimation.WORM); AnimationParamDialog.this.param.kind = NodeAnimation.WORM; AnimationParamDialog.this.stepField.setEditable(true); } else if (kind.equals("CROSS")) { AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || (AnimationParamDialog.this.param.kind != NodeAnimation.CROSS); AnimationParamDialog.this.param.kind = NodeAnimation.CROSS; AnimationParamDialog.this.stepField.setEditable(false); } else if (kind.equals("COMBI_CROSS")) { AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || (AnimationParamDialog.this.param.kind != NodeAnimation.COMBI_CROSS); AnimationParamDialog.this.param.kind = NodeAnimation.COMBI_CROSS; AnimationParamDialog.this.stepField.setEditable(false); } } } }); p1.add(l1); p1.add(this.kindField); return p1; } private JPanel makeCloseButton() { final JPanel p = new JPanel(new GridLayout(1, 0)); final JButton close = new JButton("Close"); p.add(close, BorderLayout.CENTER); close.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getAnimationParameter(); AnimationParamDialog.this.dialog.setVisible(false); } }); p.add(new JLabel(" ")); p.add(close); p.add(new JLabel(" ")); final JPanel p1 = new JPanel(new BorderLayout()); p1.add(p, BorderLayout.SOUTH); return p1; } public AnimationParam getAnimationParameter() { this.param.setKind((String) this.kindField.getSelectedItem()); this.param.setStep(this.stepField.getText()); this.param.setDelay(this.delayField.getText()); this.param.setEndPlus(this.plusField.getText()); this.param.setTargetEdgeTypeName((String) this.targetEdgeTypesField.getSelectedItem()); return this.param; } private JPanel makeStepField(final String value) { final JPanel p = new JPanel(new BorderLayout()); p.setBorder(new TitledBorder(" Animation step size ")); final JLabel l = new JLabel("Points: "); this.stepField = new JTextField(value, 5); this.stepField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (!((JTextField) e.getSource()).getText().equals("")) { try { Integer nb = Integer.valueOf(((JTextField) e.getSource()) .getText()); if (nb.intValue() >= 0) { AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || (AnimationParamDialog.this.param.step != nb.intValue()); AnimationParamDialog.this.param.step = nb.intValue(); } else { AnimationParamDialog.this.stepField.setText(value); } } catch (NumberFormatException ex) { AnimationParamDialog.this.stepField.setText(value); } } } }); p.add(l, BorderLayout.CENTER); p.add(this.stepField, BorderLayout.EAST); return p; } private JPanel makeDelayField(final String value) { final JPanel p = new JPanel(new BorderLayout()); p.setBorder(new TitledBorder(" Animation delay time ")); final JLabel l = new JLabel(" Milliseconds: "); this.delayField = new JTextField(value, 5); this.delayField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (!((JTextField) e.getSource()).getText().equals("")) { try { Integer nb = Integer.valueOf(((JTextField) e.getSource()) .getText()); if (nb.intValue() >= 0) { AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || (nb.intValue() != AnimationParamDialog.this.param.delay); AnimationParamDialog.this.param.delay = nb.intValue(); } else { AnimationParamDialog.this.delayField.setText(value); } } catch (NumberFormatException ex) { AnimationParamDialog.this.delayField.setText(value); } } } }); p.add(l, BorderLayout.CENTER); p.add(this.delayField, BorderLayout.EAST); return p; } private JPanel makeEndPlusField(final String value) { final JPanel p = new JPanel(new BorderLayout()); p.setBorder(new TitledBorder(" End position offset ")); final JLabel l = new JLabel(" Points: "); this.plusField = new JTextField(value, 5); this.plusField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (!((JTextField) e.getSource()).getText().equals("")) { try { Integer nb = Integer.valueOf(((JTextField) e.getSource()) .getText()); AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || (nb.intValue() != AnimationParamDialog.this.param.plus); AnimationParamDialog.this.param.plus = nb.intValue(); } catch (NumberFormatException ex) { AnimationParamDialog.this.plusField.setText(value); } } } }); p.add(l, BorderLayout.CENTER); p.add(this.plusField, BorderLayout.EAST); return p; } private JPanel makeTargetEdgeTypesField(String value) { final JPanel p1 = new JPanel(new GridLayout(0, 1)); p1.setBorder(new TitledBorder("")); final JLabel l1 = new JLabel("Edge Type"); this.targetEdgeTypesField.setSelectedItem(value); this.targetEdgeTypesField.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { String tname = (String) e.getItem(); AnimationParamDialog.this.changed = AnimationParamDialog.this.changed || !AnimationParamDialog.this.param.targetEdgeTypeName.equals(tname); AnimationParamDialog.this.param.setTargetEdgeTypeName(tname); } } }); p1.add(l1); p1.add(this.targetEdgeTypesField); return p1; } }