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 }