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