1
28 package demo.view.hierarchy;
29
30 import y.base.Node;
31 import y.base.NodeList;
32 import y.view.Graph2D;
33 import y.view.Graph2DView;
34 import y.view.Graph2DViewActions;
35 import y.view.hierarchy.HierarchyManager;
36
37 import javax.swing.ActionMap;
38 import javax.swing.InputMap;
39 import javax.swing.JPopupMenu;
40 import javax.swing.KeyStroke;
41 import javax.swing.JMenuItem;
42 import javax.swing.JMenu;
43 import java.awt.event.ActionEvent;
44 import java.awt.event.InputEvent;
45 import java.awt.event.KeyEvent;
46 import java.awt.EventQueue;
47 import java.util.HashSet;
48 import java.util.Locale;
49 import java.util.Set;
50
51
66 public class GroupNavigationDemo extends GroupingDemo {
67 private static final String ENTER_GROUP_ACTION = "ENTER_GROUP_ACTION";
68 private static final String NAVIGATE_TO_PARENT_ACTION = "NAVIGATE_TO_PARENT_ACTION";
69
70
71 protected void registerViewActions() {
72 super.registerViewActions();
73
74 ActionMap actionMap = view.getCanvasComponent().getActionMap();
76 actionMap.put(ENTER_GROUP_ACTION, new EnterGroupAction(ENTER_GROUP_ACTION, view));
77 actionMap.put(NAVIGATE_TO_PARENT_ACTION, new NavigateToParentAction(NAVIGATE_TO_PARENT_ACTION, view));
78 InputMap inputMap = view.getCanvasComponent().getInputMap();
79 inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, InputEvent.CTRL_MASK), ENTER_GROUP_ACTION);
80 inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, InputEvent.CTRL_MASK), NAVIGATE_TO_PARENT_ACTION);
81 }
82
83 static {
84 actionNames.put(ENTER_GROUP_ACTION, "Enter Group");
85 actionNames.put(NAVIGATE_TO_PARENT_ACTION, "Navigate to Parent");
86 }
87
88 protected boolean isUndoRedoEnabled() {
89 return false;
90 }
91
92 protected boolean isClipboardEnabled() {
93 return false;
94 }
95
96 protected void populateGroupingPopup(JPopupMenu pm, double x, double y, final Node node, boolean selected) {
97 super.populateGroupingPopup(pm, x, y, node, selected);
98 pm.addSeparator();
99 JMenuItem item = new JMenuItem(new EnterGroupAction(ENTER_GROUP_ACTION, view){
103 protected Node getGroupOrFolderNode(Graph2D g) {
104 if(node != null) {
105 return node;
106 }
107 return super.getGroupOrFolderNode(g);
108 }
109 });
110 item.setText("Enter Group");
111 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, InputEvent.CTRL_MASK));
112 if((node != null && !getHierarchyManager().isNormalNode(node)) || selected) {
113 item.setEnabled(true);
114 }
115 pm.add(item);
116 registerAction(pm, NAVIGATE_TO_PARENT_ACTION, view.getGraph2D() != getHierarchyManager().getRootGraph());
118 }
119
120 protected void populateGroupingMenu(JMenu hierarchyMenu) {
121 super.populateGroupingMenu(hierarchyMenu);
122 hierarchyMenu.addSeparator();
123 registerAction(hierarchyMenu, ENTER_GROUP_ACTION, true);
125 registerAction(hierarchyMenu, NAVIGATE_TO_PARENT_ACTION, true);
126 }
127
128
131 public static void main(String[] args) {
132 EventQueue.invokeLater(new Runnable() {
133 public void run() {
134 Locale.setDefault(Locale.ENGLISH);
135 initLnF();
136 (new GroupNavigationDemo()).start();
137 }
138 });
139 }
140
141 private final Set openGroupNodes = new HashSet();
143
149 class EnterGroupAction extends Graph2DViewActions.AbstractGroupingAction {
150 public EnterGroupAction(String name, Graph2DView view) {
151 super(name, view);
152 }
153
154
157 protected Node getGroupOrFolderNode(Graph2D g) {
158 NodeList selectedNodes = new NodeList(g.selectedNodes());
159 if (selectedNodes.size() == 1) {
160 return selectedNodes.firstNode();
161 } else {
162 return null;
163 }
164 }
165
166 public void actionPerformed(ActionEvent e) {
167 Graph2DView view = getView(e);
168 Graph2D g = view.getGraph2D();
169 Node groupNode = getGroupOrFolderNode(g);
170 if (groupNode != null) {
171 enterGroup(groupNode, view);
172 }
173 }
174
175
180 public void enterGroup(Node groupOrFolderNode, Graph2DView view) {
181 Graph2D graph = view.getGraph2D();
182 HierarchyManager hierarchyManager = getHierarchyManager(graph);
183 if (hierarchyManager.isNormalNode(groupOrFolderNode)) {
184 return;
186 }
187
188 if (hierarchyManager.isGroupNode(groupOrFolderNode)) {
190 openGroupNodes.add(groupOrFolderNode);
192 preNodeStateChange(groupOrFolderNode, graph);
193 getHierarchyManager(graph).closeGroup(groupOrFolderNode);
194 postNodeStateChange(groupOrFolderNode, graph);
195 }
196
197 Graph2D folderGraph = (Graph2D) hierarchyManager.getInnerGraph(groupOrFolderNode);
198 view.setGraph2D(folderGraph);
200
201 view.fitContent();
203 view.getGraph2D().updateViews();
204 }
205 }
206
207
213 class NavigateToParentAction extends Graph2DViewActions.AbstractGroupingAction {
214 public NavigateToParentAction(String name, Graph2DView view) {
215 super(name, view);
216 }
217
218 public void actionPerformed(ActionEvent e) {
219 Graph2DView view = getView(e);
220 Graph2D g = view.getGraph2D();
221 HierarchyManager hm = getHierarchyManager(g);
222 if (g == hm.getRootGraph()) {
223 return;
225 }
226 navigateToParent(view);
227 }
228
229
232 public void navigateToParent(Graph2DView view) {
233 Graph2D graph = view.getGraph2D();
234 HierarchyManager hierarchyManager = getHierarchyManager(graph);
235
236 Node folderNode = hierarchyManager.getAnchorNode(graph);
238
239 Graph2D parentGraph = (Graph2D) hierarchyManager.getParentGraph(graph);
240 this.view.setGraph2D(parentGraph);
242
243 if (openGroupNodes.contains(folderNode)) {
245 preNodeStateChange(folderNode, graph);
246 getHierarchyManager(graph).openFolder(folderNode);
247 postNodeStateChange(folderNode, graph);
248 }
249 openGroupNodes.remove(folderNode);
250
251 view.fitContent();
252 view.getGraph2D().setSelected(folderNode, true);
253 view.getGraph2D().updateViews();
254 }
255 }
256 }
257