001 /*
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: 2002-9-4
005 * Time: 13:50:04
006 * To change template for new class use
007 * Code Style | Class Templates options (Tools | IDE Options).
008 */
009 package EVolve.util;
010
011 import EVolve.visualization.*;
012 import EVolve.visualization.XYViz.XYVisualization;
013 import EVolve.Scene;
014 import javax.swing.*;
015 import java.util.ArrayList;
016 import java.awt.*;
017 import java.awt.event.*;
018
019 public class LinkedVisualizationRunner {
020 private ArrayList[] linkedDimension;
021 private JDialog dialog;
022 private List availableList;
023 private List linkableList;
024 private ArrayList linkableViz;
025 private JComboBox comboDimension;
026 private int dimension;
027
028
029 public LinkedVisualizationRunner() {
030 linkedDimension = new ArrayList[3];
031 for (int i=0;i<linkedDimension.length;i++) linkedDimension[i] = new ArrayList();
032 linkableViz = new ArrayList();
033 }
034
035 public void createDialog() {
036 dialog = new JDialog(Scene.getFrame(), "Unifying Visualizations...", true);
037 dialog.setBounds(new Rectangle(500,400));
038
039 Box boxMain = new Box(BoxLayout.Y_AXIS);
040 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
041 "Choose Visualizations to be unified"));
042 dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
043
044 Box boxLabels = new Box(BoxLayout.X_AXIS);
045 boxLabels.add(new JLabel("Available visualizations:"));
046 boxLabels.add(Box.createHorizontalStrut(195));
047 boxLabels.add(new JLabel("Unifiable visualizations:"));
048
049 Box boxLinkDimension = new Box(BoxLayout.Y_AXIS);
050 boxLinkDimension.setBounds(new Rectangle(20,300));
051 comboDimension = new JComboBox();
052 comboDimension.setEnabled(false);
053
054
055 boxLinkDimension.add(Box.createVerticalStrut(40));
056 boxLinkDimension.add(new JLabel("Choose unified dimension "));
057 boxLinkDimension.add(Box.createVerticalStrut(10));
058 boxLinkDimension.add(comboDimension);
059 comboDimension.setBounds(new Rectangle(20,20));
060 boxLinkDimension.add(Box.createVerticalStrut(205));
061 comboDimension.addActionListener(new ActionListener() {
062 public void actionPerformed(ActionEvent e) {
063 updateLinkableList();
064 }
065 });
066
067
068 Box boxLists = new Box(BoxLayout.X_AXIS);
069 availableList = new List(6,false);
070 ArrayList arr = Scene.getVisualizationManager().getVisualizationList();
071 for (int i=0; i<arr.size(); i++) {
072 availableList.add((((Visualization)arr.get(i)).getName()));
073 }
074 availableList.addItemListener(new ItemListener() {
075 public void itemStateChanged(ItemEvent e){
076 updateComboDimension();
077 }
078 });
079 linkableList = new java.awt.List(6,true);
080 boxLists.add(availableList);
081 boxLists.add(Box.createHorizontalStrut(10));
082 boxLists.add(boxLinkDimension);
083 boxLists.add(Box.createHorizontalStrut(10));
084 boxLists.add(linkableList);
085
086 boxMain.add(boxLabels);
087 boxMain.add(boxLists);
088
089 Box boxOkCancel = new Box(BoxLayout.X_AXIS);
090 JButton buttonOK = new JButton("OK");
091 JButton buttonCancel = new JButton("Cancel");
092
093 buttonOK.addActionListener(new ActionListener(){
094 public void actionPerformed(ActionEvent e){
095 onOK();
096 }
097 });
098 buttonCancel.addActionListener(new ActionListener(){
099 public void actionPerformed(ActionEvent e){
100 onCancel();
101 }
102 });
103 boxOkCancel.add(Box.createHorizontalStrut(180));
104 boxOkCancel.add(buttonOK);
105 boxOkCancel.add(Box.createHorizontalStrut(20));
106 boxOkCancel.add(buttonCancel);
107
108 dialog.getContentPane().add(boxOkCancel,BorderLayout.SOUTH);
109 }
110
111 private void updateComboDimension() {
112 int index = availableList.getSelectedIndex();
113
114 if (index == -1) return;
115 Visualization visual = (Visualization) Scene.getVisualizationManager().getVisualizationList().get(index);
116 int[] flags = getLinkableDimension(visual);
117
118 comboDimension.removeAllItems();
119 for (int i=0; i<flags.length; i++) {
120 switch (i) {
121 case 0:
122 if (flags[i] == 1)
123 comboDimension.addItem("X-Axis");
124 break;
125 case 1:
126 if (flags[i] == 1)
127 comboDimension.addItem("Y-Axis");
128 break;
129 case 2:
130 if (flags[i] == 1)
131 comboDimension.addItem("Z-Axis");
132 break;
133 }
134 }
135 if (comboDimension.getItemCount() != 0) {
136 comboDimension.setSelectedIndex(0);
137 comboDimension.setEnabled(true);
138 } else {
139 comboDimension.setEnabled(false);
140 linkableList.removeAll();
141 }
142 }
143
144 private void updateLinkableList() {
145 int index = availableList.getSelectedIndex();
146 Visualization visual = (Visualization) Scene.getVisualizationManager().getVisualizationList().get(index);
147
148 String selectedItem = (String)comboDimension.getSelectedItem();
149 if (selectedItem.charAt(0) == 'X') {
150 dimension = 0;
151 } else if (selectedItem.charAt(0) == 'Y') {
152 dimension = 1;
153 } else {
154 dimension = 2;
155 }
156 linkableList.removeAll();
157 getLinkableVisualization(visual,dimension);
158 for (int i=0; i<linkableViz.size(); i++) {
159 linkableList.add(((Visualization)linkableViz.get(i)).getName());
160 }
161 }
162
163 private int[] getLinkableDimension(Visualization visual) {
164 int[] returnVal = new int[visual.getDimension().length];
165
166 for (int i=0; i<returnVal.length; i++) {
167 if (visual.getLinkableDimension(i) != null )
168 returnVal[i] = 1;
169 else
170 returnVal[i] = 0;
171 }
172 return returnVal;
173 }
174
175 private void getLinkableVisualization(Visualization visual,int dimension) {
176 ArrayList arr = Scene.getVisualizationManager().getVisualizationList();
177
178 linkableViz.clear();
179 for (int i=0; i< arr.size(); i++) {
180 if (i == availableList.getSelectedIndex()) continue;
181 Visualization visual2 = (Visualization)arr.get(i);
182 if (isLinkable(visual,visual2,dimension)) linkableViz.add(visual2);
183 }
184 }
185
186 public void onOK() {
187 int[] indexes = linkableList.getSelectedIndexes();
188
189 if (indexes.length == 0) {
190 Scene.showErrorMessage("Please select visualizations to be linked");
191 return;
192 }
193
194 Visualization[] viz= new Visualization[indexes.length +1];
195
196 viz[0] = (Visualization)Scene.getVisualizationManager().getVisualizationList().get(availableList.getSelectedIndex());
197 for (int i=0; i<indexes.length; i++) {
198 viz[i+1] = (Visualization)linkableViz.get(indexes[i]);
199 }
200 dialog.setVisible(false);
201 newLinkedVisualization(dimension,viz);
202 runLinkedVisualization();
203 }
204
205 public void onCancel() {
206 dialog.setVisible(false);
207 }
208
209 public void showWindow() {
210 createDialog();
211 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight());
212 }
213
214 public void newLinkedVisualization(int dim, Visualization[] viz) {
215 LinkedVisualization linkedViz = null;
216 int linkingNo = -1;
217
218 for (int j =0; j< viz.length; j++) {
219 for (int i = 0; i < linkedDimension[dim].size(); i++) {
220 linkedViz = (LinkedVisualization) linkedDimension[dim].get(i);
221 if (linkedViz.exists(viz[j])) {
222 linkingNo = i;
223 j = viz.length +1;
224 break;
225 }
226 }
227 }
228
229 if (linkingNo == -1) {
230 linkedViz = new LinkedVisualization(dim);
231 linkedDimension[dim].add(linkedViz);
232 }
233
234 linkedViz.addVisualization(viz);
235 linkedViz.setRepaint(true);
236 }
237
238 public boolean isLinkable(Visualization visualLinked,Visualization visualLinking,int dim) {
239 int typeLinked, typeLinking;
240 ReferenceDimension linkableDim = visualLinked.getLinkableDimension(dim);
241
242 if ((visualLinked.getLinkableDimension(dim) == null)||
243 (visualLinking.getLinkableDimension(dim) == null)) return false;
244
245 typeLinked = linkableDim.getDataFilter().getTargetType();
246
247 if (visualLinking.getDimension().length<dim+1)
248 return false;
249 else
250 typeLinking = visualLinking.getLinkableDimension(dim).getDataFilter().getTargetType();
251
252 if ((visualLinking.getSubjectDefinition().getName().equals(visualLinked.getSubjectDefinition().getName())) &&
253 (visualLinking.getFactory().getName().equals(visualLinked.getFactory().getName())) &&
254 (visualLinking.getDimension()[0].getName().equals(visualLinked.getDimension()[0].getName())) &&
255 (visualLinking.getDimension()[1].getName().equals(visualLinked.getDimension()[1].getName())) &&
256 (visualLinking.getVisualizationID()==visualLinked.getVisualizationID()))
257 return false;
258
259 if ((!(visualLinking instanceof XYVisualization))||(!(visualLinked instanceof XYVisualization)))
260 return false;
261
262 return (typeLinked == typeLinking ? true : false);
263 }
264
265 public void runLinkedVisualization() {
266 for (int i=0; i<linkedDimension.length; i++) {
267 for (int j=0; j<linkedDimension[i].size(); j++) {
268 LinkedVisualization linkedVisualization = (LinkedVisualization)linkedDimension[i].get(j);
269 if (linkedVisualization.getRepaint()) {// need repaint
270 linkedVisualization.visualize();
271 }
272 }
273 }
274 }
275
276 public void unregisterLinkedViz(Visualization viz) {
277 for (int i=0; i<linkedDimension.length; i++) {
278 for (int j=0; j<linkedDimension[i].size(); j++) {
279 LinkedVisualization linkedVisualization = (LinkedVisualization)linkedDimension[i].get(j);
280 linkedVisualization.unregisterViz(viz);
281 }
282 }
283 }
284 }