1 package org.opentrafficsim.editor;
2
3 import java.awt.event.ActionEvent;
4 import java.util.LinkedList;
5
6 import javax.swing.AbstractAction;
7 import javax.swing.Action;
8 import javax.swing.KeyStroke;
9
10
11
12
13
14
15
16
17
18 public class Navigation
19 {
20
21
22 private final OtsEditor editor;
23
24
25 private final int maxNavigate;
26
27
28 private XsdTreeNode candidateBackNode;
29
30
31 private final LinkedList<XsdTreeNode> backNode = new LinkedList<>();
32
33
34 private String candidateBackAttribute;
35
36
37 private final LinkedList<String> backAttribute = new LinkedList<>();
38
39
40 private XsdTreeNode coupledNode;
41
42
43
44
45
46
47 public Navigation(final OtsEditor editor, final int maxNavigate)
48 {
49 this.editor = editor;
50 this.maxNavigate = maxNavigate;
51 clear();
52 }
53
54
55
56
57 public void clear()
58 {
59 this.goBackAction.setEnabled(false);
60 this.goBackAction.putValue(Action.NAME, "Go back");
61 this.goToCoupledNodeAction.setEnabled(false);
62 this.goToCoupledNodeAction.putValue(Action.NAME, "Go to coupled item");
63 }
64
65
66
67
68
69
70
71
72 public void setCoupledNode(final XsdTreeNode toNode, final XsdTreeNode fromNode, final String fromAttribute)
73 {
74 if (toNode == null)
75 {
76 this.goToCoupledNodeAction.setEnabled(false);
77 this.goToCoupledNodeAction.putValue(Action.NAME, "Go to coupled item");
78 }
79 else
80 {
81 this.goToCoupledNodeAction.setEnabled(true);
82 this.goToCoupledNodeAction.putValue(Action.NAME,
83 "Go to " + (fromAttribute != null ? fromNode.getAttributeValueOrDefault(fromAttribute)
84 : (fromNode.isIdentifiable() ? fromNode.getId() : fromNode.getValueOrDefault())));
85 }
86 this.coupledNode = toNode;
87 this.candidateBackNode = fromNode;
88 this.candidateBackAttribute = fromAttribute;
89 }
90
91
92
93
94
95 public Action getGoBackAction()
96 {
97 return this.goBackAction;
98 }
99
100
101 private final Action goBackAction = new AbstractAction()
102 {
103 {
104 putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("pressed F3"));
105 }
106
107 @Override
108 public void actionPerformed(final ActionEvent e)
109 {
110 Navigation.this.editor.show(Navigation.this.backNode.pollLast(), Navigation.this.backAttribute.pollLast());
111 if (Navigation.this.backNode.isEmpty())
112 {
113 putValue(NAME, "Go back");
114 setEnabled(false);
115 }
116 else
117 {
118 XsdTreeNode back = Navigation.this.backNode.peekLast();
119 Navigation.this.goBackAction.putValue(NAME,
120 "Go back to " + back.getNodeName() + (back.isIdentifiable() ? " " + back.getId() : ""));
121 Navigation.this.goBackAction.setEnabled(true);
122 }
123 }
124 };
125
126
127
128
129
130 public Action getGotoCoupledNodeAction()
131 {
132 return this.goToCoupledNodeAction;
133 }
134
135
136 private final Action goToCoupledNodeAction = new AbstractAction()
137 {
138 {
139 putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("pressed F4"));
140 }
141
142 @Override
143 public void actionPerformed(final ActionEvent e)
144 {
145 if (Navigation.this.coupledNode != null)
146 {
147 Navigation.this.backNode.add(Navigation.this.candidateBackNode);
148 Navigation.this.backAttribute.add(Navigation.this.candidateBackAttribute);
149 while (Navigation.this.backNode.size() > Navigation.this.maxNavigate)
150 {
151 Navigation.this.backNode.remove();
152 Navigation.this.backAttribute.remove();
153 }
154 XsdTreeNode back = Navigation.this.backNode.peekLast();
155 Navigation.this.goBackAction.putValue(NAME,
156 "Go back to " + back.getNodeName() + (back.isIdentifiable() ? " " + back.getId() : ""));
157 Navigation.this.goBackAction.setEnabled(Navigation.this.backNode.peekLast() != null);
158 Navigation.this.editor.show(Navigation.this.coupledNode, null);
159 }
160 }
161 };
162
163 }