| PopupModeDemo.java |
1 /****************************************************************************
2 * This demo file is part of yFiles for Java 2.14.
3 * Copyright (c) 2000-2017 by yWorks GmbH, Vor dem Kreuzberg 28,
4 * 72070 Tuebingen, Germany. All rights reserved.
5 *
6 * yFiles demo files exhibit yFiles for Java functionalities. Any redistribution
7 * of demo files in source code or binary form, with or without
8 * modification, is not permitted.
9 *
10 * Owners of a valid software license for a yFiles for Java version that this
11 * demo is shipped with are allowed to use the demo source code as basis
12 * for their own yFiles for Java powered applications. Use of such programs is
13 * governed by the rights and conditions as set out in the yFiles for Java
14 * license agreement.
15 *
16 * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19 * NO EVENT SHALL yWorks BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 ***************************************************************************/
28 package demo.view.viewmode;
29
30 import demo.view.DemoBase;
31 import y.base.Node;
32 import y.base.Edge;
33 import y.view.EditMode;
34 import y.view.NodeRealizer;
35 import y.view.PopupMode;
36 import y.view.YLabel;
37
38 import javax.swing.AbstractAction;
39 import javax.swing.JOptionPane;
40 import javax.swing.JPopupMenu;
41 import java.awt.event.ActionEvent;
42 import java.awt.EventQueue;
43 import java.beans.PropertyChangeEvent;
44 import java.beans.PropertyChangeListener;
45 import java.util.Locale;
46
47 /**
48 * Demonstrates how to display context sensitive popup menus
49 * in the view.
50 * <p>
51 * This demo does also show how to write an action that opens
52 * an inline text editor in the view to modify the label of a node.
53 * </p>
54 * <p>
55 * To activate the popup menus right click either on a node or
56 * the view background.
57 * </p>
58 * @see <a href="http://docs.yworks.com/yfiles/doc/api/index.html#/dguide/mvc_controller#label_editor" target="_blank">Section User Interaction</a> in the yFiles for Java Developer's Guide
59 */
60 public class PopupModeDemo extends DemoBase
61 {
62
63 protected EditMode createEditMode() {
64 EditMode editMode = super.createEditMode();
65 //add a popup child mode to editMode (one that listens to the right mouse click
66 //and pops up context sensitive menus)
67 editMode.setPopupMode( new DemoPopupMode() );
68 loadGraph("resource/popup.graphml");
69 return editMode;
70 }
71
72 class DemoPopupMode extends PopupMode
73 {
74 /** Popup menu for a hit edge */
75 public JPopupMenu getEdgePopup(Edge e)
76 {
77 JPopupMenu pm = new JPopupMenu();
78 pm.add(new ShowEdgeInfo(e));
79 return pm;
80 }
81
82 /** Popup menu for a hit node */
83 public JPopupMenu getNodePopup(Node v)
84 {
85 JPopupMenu pm = new JPopupMenu();
86 pm.add(new ShowNodeInfo(v));
87 pm.add(new EditLabel(v));
88 return pm;
89 }
90
91 /** Popup menu for a paper (plain background) hit */
92 public JPopupMenu getPaperPopup(double x, double y)
93 {
94 JPopupMenu pm = new JPopupMenu();
95 pm.add(new Zoom(view, 0.8));
96 pm.add(new Zoom(view, 1.2));
97 pm.add(new FitContent(view));
98 return pm;
99 }
100
101 /** Popup menu for a paper hit if things are selected */
102 public JPopupMenu getSelectionPopup(double x, double y)
103 {
104 JPopupMenu pm = new JPopupMenu();
105 pm.add(new DeleteSelection(view));
106 return pm;
107 }
108 }
109
110 /**
111 * Action that displays an information dialog for an edge.
112 */
113 class ShowEdgeInfo extends AbstractAction
114 {
115 Edge e;
116
117 ShowEdgeInfo(Edge e )
118 {
119 super("Edge Info");
120 this.e = e;
121 }
122
123 public void actionPerformed(ActionEvent e)
124 {
125 JOptionPane.showMessageDialog(
126 view,
127 "Edge from \"" + this.e.source() +
128 "\" to \"" + this.e.target() + "\".");
129 }
130 }
131
132 /**
133 * Action that displays an information dialog for a node.
134 */
135 class ShowNodeInfo extends AbstractAction
136 {
137 Node v;
138
139 ShowNodeInfo(Node v)
140 {
141 super("Node Info");
142 this.v = v;
143 }
144
145 public void actionPerformed(ActionEvent e)
146 {
147 JOptionPane.showMessageDialog(view,
148 "Label text of node is " +
149 view.getGraph2D().getLabelText(v) +
150 "\n\n(Guess you knew that already :-)");
151 }
152 }
153
154 /**
155 * Action that opens a text editor for the label of a node
156 * <p>
157 * The inlined label editor allows to enter multiple lines of
158 * label text for a node. The "Enter" or "Return" key starts
159 * a new line of text. To terminate the label editor click
160 * the mouse somewhere outside of the label editor box.
161 */
162 class EditLabel extends AbstractAction
163 {
164 Node v;
165
166 EditLabel(Node v)
167 {
168 super("Edit Label");
169 this.v = v;
170 }
171
172 public void actionPerformed(ActionEvent e)
173 {
174
175 final NodeRealizer r = view.getGraph2D().getRealizer(v);
176 final YLabel label = r.getLabel();
177
178
179 // optional property change listener, that gets invoked
180 // after the label editor has changed the value of the
181 // label text. what this listener does is to adapt the size
182 // of the node to the new label text
183 PropertyChangeListener pcl = new PropertyChangeListener()
184 {
185 public void propertyChange(PropertyChangeEvent pce)
186 {
187 r.setSize(label.getWidth()+10,label.getHeight()+10);
188 }
189 };
190
191 view.openLabelEditor(label,
192 label.getBox().getX(),
193 label.getBox().getY(),
194 pcl, //optional propertyChangeListener
195 true //optional single line mode activated
196 );
197 }
198 }
199
200 public static void main(String[] args) {
201 EventQueue.invokeLater(new Runnable() {
202 public void run() {
203 Locale.setDefault(Locale.ENGLISH);
204 initLnF();
205 (new PopupModeDemo()).start("Popup Mode Demo");
206 }
207 });
208 }
209 }
210
211
212
213