1
28 package demo.view.uml;
29
30 import y.base.Node;
31 import y.base.NodeList;
32 import y.geom.YPoint;
33 import y.view.Graph2D;
34 import y.view.HitInfo;
35 import y.view.NodeLabel;
36 import y.view.NodeRealizer;
37 import y.view.ViewMode;
38
39 import java.beans.PropertyChangeEvent;
40 import java.beans.PropertyChangeListener;
41
42
51 class UmlClassLabelEditMode extends ViewMode {
52
53
60 public void mouseClicked(double x, double y) {
61 final HitInfo hitInfo = getHitInfo(x, y);
62 final NodeRealizer singleClickedNode = getSingleClickedNode(hitInfo);
63 if (singleClickedNode != null) {
64 if (UmlClassLabelSupport.selectListItemAt(singleClickedNode, x, y)) {
65 view.updateView();
66 }
67 }
68
69 final NodeLabel doubleClickedLabel = getDoubleClickedLabel(hitInfo, x, y);
70 if (doubleClickedLabel != null && !UmlClassLabelSupport.isCaptionLabel(doubleClickedLabel)) {
71 editLabel(doubleClickedLabel);
73 }
74 }
75
76
79 private NodeLabel getDoubleClickedLabel(final HitInfo hitInfo, final double x, final double y) {
80 if (lastClickEvent != null && lastClickEvent.getClickCount() == 2) {
81 if (hitInfo.hasHitNodeLabels()) {
82 return hitInfo.getHitNodeLabel();
83 } else if (hitInfo.hasHitNodes()) {
84 final NodeRealizer realizer = view.getGraph2D().getRealizer(hitInfo.getHitNode());
85 for (int i = realizer.labelCount(); i-- > 0; ) {
86 final NodeLabel label = realizer.getLabel(i);
87 if (label.contains(x, y)) {
88 return label;
89 }
90 }
91 }
92 }
93 return null;
94 }
95
96
99 private NodeRealizer getSingleClickedNode(final HitInfo hitInfo) {
100 if (hitInfo.hasHitNodeLabels()) {
101 return hitInfo.getHitNodeLabel().getRealizer();
102 } else if (hitInfo.hasHitNodes()) {
103 return view.getGraph2D().getRealizer(hitInfo.getHitNode());
104 } else {
105 return null;
106 }
107 }
108
109
112 private void editLabel(final NodeLabel label) {
113 if (!UmlClassLabelSupport.isCaptionLabel(label)) {
114 final YPoint location = label.getTextLocation();
115 view.openLabelEditor(label, location.getX(), location.getY(), new LabelChangeHandler(), true, false);
116 }
117 }
118
119
123 private class LabelChangeHandler implements PropertyChangeListener {
124 public void propertyChange(PropertyChangeEvent e) {
125 final Object source = e.getSource();
126 if (source instanceof NodeLabel) {
127 final Graph2D graph = getGraph2D();
128 final NodeLabel label = (NodeLabel) source;
129 final Node node = label.getNode();
130 final NodeRealizer realizer = graph.getRealizer(node);
131
132 graph.firePreEvent();
134 graph.backupRealizers(new NodeList(node).nodes());
135 graph.backupRealizers(node.edges());
136 try {
137 if ("".equals(e.getNewValue())) {
138 label.setText(" ");
140 final UmlClassAnimation animation = new UmlClassRemoveItemButton.RemoveItemAnimation(view, realizer, true);
141 animation.play();
142 } else {
143 label.setText((String) e.getNewValue());
145 UmlClassLabelSupport.updateLabelText(realizer, label);
146 UmlClassLabelSupport.selectLabel(realizer, label);
147 UmlClassLabelSupport.updateRealizerSize(realizer);
148 }
149 } finally {
150 graph.firePostEvent();
151 }
152 }
153 }
154 }
155 }