001 /* 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: 2002-9-6 005 * Time: 15:53:23 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.Dimension; 013 import EVolve.Scene; 014 import javax.swing.*; 015 import javax.swing.event.*; 016 import java.awt.*; 017 import java.awt.event.*; 018 import java.util.ArrayList; 019 020 public class SynchronousOverlapper extends OverlapVisualization{ 021 private final String name = "SynchronousOverlapper"; 022 private Visualization overlappedVisualization; 023 private JList availableList,overlappableList; 024 private DefaultListModel modelList; 025 private ArrayList candidates; 026 private boolean shift_ctrl_pressed; 027 028 public SynchronousOverlapper() { 029 super(); 030 colorList = new ArrayList(); 031 dialog = null; 032 overlappedVisualization = null; 033 candidates = new ArrayList(); 034 modelList = new DefaultListModel(); 035 xMax = 0; 036 } 037 038 public String getName() { 039 return name; 040 } 041 042 public void createDialog() { 043 shift_ctrl_pressed = false; 044 colorList.clear(); 045 visualizationList.clear(); 046 modelList.removeAllElements(); 047 dialog = new JDialog(Scene.getFrame(), "Overlap Visualizations...", true); 048 dialog.setBounds(new Rectangle(500,400)); 049 050 Box boxMain = new Box(BoxLayout.Y_AXIS); 051 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), 052 "Choose Visualizations to be overlapped")); 053 dialog.getContentPane().add(boxMain,BorderLayout.CENTER); 054 055 Box boxLabels = new Box(BoxLayout.X_AXIS); 056 boxLabels.add(new JLabel("Available visualizations:")); 057 boxLabels.add(Box.createHorizontalStrut(130)); 058 boxLabels.add(new JLabel("Overlappable visualizations:")); 059 060 JPanel boxLists = new JPanel(new GridLayout(1,2,25,2)); 061 DefaultListModel modelAvail = new DefaultListModel(); 062 availableList = new JList(modelAvail); 063 ArrayList arr = Scene.getVisualizationManager().getVisualizationList(); 064 for (int i=0; i<arr.size(); i++) { 065 modelAvail.addElement((((Visualization)arr.get(i)).getName())); 066 } 067 availableList.addListSelectionListener(new ListSelectionListener() { 068 public void valueChanged(ListSelectionEvent e){ 069 updateOverlappableList(); 070 } 071 }); 072 073 overlappableList = new JList(modelList); 074 overlappableList.addKeyListener(new KeyListener(){ 075 public void keyPressed(KeyEvent e) { 076 if ((e.getKeyCode() == KeyEvent.VK_SHIFT) || (e.getKeyCode()==KeyEvent.VK_CONTROL)) { 077 shift_ctrl_pressed = true; 078 } 079 } 080 public void keyReleased(KeyEvent e) { 081 if ((e.getKeyCode() == KeyEvent.VK_SHIFT) || (e.getKeyCode()==KeyEvent.VK_CONTROL)) { 082 shift_ctrl_pressed = false; 083 } 084 } 085 public void keyTyped(KeyEvent e) { } 086 }); 087 overlappableList.addListSelectionListener(new ListSelectionListener() { 088 public void valueChanged(ListSelectionEvent e){ 089 if ((!shift_ctrl_pressed)&&(!e.getValueIsAdjusting()) && overlappableList.isFocusOwner()) 090 selectColor(); 091 } 092 }); 093 JScrollPane scrollPane1 = new JScrollPane(availableList); 094 JScrollPane scrollPane2 = new JScrollPane(overlappableList); 095 boxLists.add(scrollPane1); 096 boxLists.add(scrollPane2); 097 098 boxMain.add(Box.createVerticalStrut(-65)); 099 boxMain.add(boxLabels); 100 boxMain.add(Box.createVerticalStrut(-65)); 101 boxMain.add(boxLists); 102 boxMain.add(Box.createVerticalStrut(10)); 103 104 Box boxOkCancel = new Box(BoxLayout.X_AXIS); 105 JButton buttonOK = new JButton("OK"); 106 JButton buttonCancel = new JButton("Cancel"); 107 108 buttonOK.addActionListener(new ActionListener(){ 109 public void actionPerformed(ActionEvent e){ 110 onOK(); 111 } 112 }); 113 buttonCancel.addActionListener(new ActionListener(){ 114 public void actionPerformed(ActionEvent e){ 115 onCancel(); 116 } 117 }); 118 119 boxOkCancel.add(Box.createHorizontalStrut(180)); 120 boxOkCancel.add(buttonOK); 121 boxOkCancel.add(Box.createHorizontalStrut(20)); 122 boxOkCancel.add(buttonCancel); 123 124 dialog.getContentPane().add(boxOkCancel,BorderLayout.SOUTH); 125 //dialog.setResizable(false); 126 } 127 128 private void selectColor() { 129 int index = overlappableList.getSelectedIndex(); 130 131 if (index != -1) { 132 Color newColor = JColorChooser.showDialog(Scene.getFrame(), "Choose a color", Color.black); 133 if (newColor != null) { 134 colorList.add(index+1,newColor); 135 colorList.remove(index+2); 136 modelList.removeAllElements(); 137 for (int i=0; i<candidates.size(); i++) { 138 if (colorList.get(i+1) == null) 139 modelList.addElement(((Visualization)candidates.get(i)).getName()); 140 else 141 modelList.addElement("<html><font color=#" + getColorHex((Color)colorList.get(i+1)) + ">" 142 +((Visualization)candidates.get(i)).getName() +" </font></html>" ); 143 } 144 overlappableList.setSelectedIndex(index); 145 } else { 146 newColor = Color.black; 147 } 148 } 149 } 150 151 private void updateOverlappableList() { 152 ArrayList arr = Scene.getVisualizationManager().getVisualizationList(); 153 overlappedVisualization = (Visualization)arr.get(availableList.getSelectedIndex()); 154 155 candidates.clear(); 156 colorList.clear(); 157 overlappableList.removeAll(); 158 modelList.removeAllElements(); 159 colorList.add(null); 160 for (int i=0; i<arr.size(); i++) { 161 Visualization visual =(Visualization)arr.get(i); 162 if (visual.getVisualizationID() == overlappedVisualization.getVisualizationID()) continue; 163 if (isOverlapable(visual)) { 164 modelList.addElement(visual.getName()); 165 colorList.add(null); 166 candidates.add(visual); 167 } 168 } 169 } 170 171 private void onOK() { 172 int[] indexes = overlappableList.getSelectedIndices(); 173 visualizationList.clear(); 174 175 if (indexes.length == 0) { 176 Scene.showErrorMessage("Please select visualizations to be linked"); 177 return; 178 } 179 180 visualizationList.add(overlappedVisualization); 181 for (int i=0; i<indexes.length; i++) { 182 visualizationList.add(candidates.get(indexes[i])); 183 } 184 185 ArrayList newColorList = new ArrayList(); 186 newColorList.add(null); 187 for (int i=0; i<modelList.size(); i++) { 188 for (int j=0; j<indexes.length;j++) { 189 if (i==indexes[j]) { 190 newColorList.add(colorList.get(i+1)); 191 break; 192 } 193 } 194 } 195 colorList = newColorList; 196 dialog.setVisible(false); 197 noEntityAvailable = false; 198 overlappedVisualize(); 199 } 200 201 private void onCancel() { 202 dialog.setVisible(false); 203 } 204 205 public boolean isOverlapable(Visualization visualToBeOverlapped) { 206 for (int i=0; i<2; i++) { 207 if ((overlappedVisualization.getLinkableDimension(i) == null)|| 208 (visualToBeOverlapped.getLinkableDimension(i) == null)) 209 { 210 if ((overlappedVisualization.getDimension()[i] instanceof ReferenceDimension) || 211 visualToBeOverlapped.getDimension()[i] instanceof ReferenceDimension) 212 return false; 213 214 if (!overlappedVisualization.getDimension()[i].getName().equals(visualToBeOverlapped.getDimension()[i].getName())) 215 return false; 216 217 } else { 218 if (overlappedVisualization.getDimension()[i].getDataFilter().getTargetType() != 219 visualToBeOverlapped.getDimension()[i].getDataFilter().getTargetType()) 220 return false; 221 } 222 } 223 224 if ((visualToBeOverlapped.getSubjectDefinition().getName().equals(overlappedVisualization.getSubjectDefinition().getName())) && 225 (visualToBeOverlapped.getFactory().getName().equals(overlappedVisualization.getFactory().getName()))) 226 return false; 227 228 return true; 229 } 230 231 public void overlappedVisualize() { 232 maxEntity[0] = null; 233 maxEntity[1] = null; 234 xMax = 0; 235 if (((Visualization)visualizationList.get(0)).getDimension()[0] instanceof ReferenceDimension) 236 maxEntity[0] = Scene.getDataManager().getEntity()[((Visualization)visualizationList.get(0)).getDimension()[0].getDataFilter().getTargetType()]; 237 if (((Visualization)visualizationList.get(0)).getDimension()[1] instanceof ReferenceDimension) 238 maxEntity[1] = Scene.getDataManager().getEntity()[((Visualization)visualizationList.get(0)).getDimension()[1].getDataFilter().getTargetType()]; 239 240 if (window instanceof EVolve.Window) { 241 Scene.getUIManager().removeWindow(window); 242 window = null; 243 } 244 245 Scene.getVisualizationManager().prepareForLinkedViz(visualizationList,0); 246 Scene.visualize(); 247 248 unifyVisualizations(); 249 250 newOverlappedVisualization(this); 251 252 sort(); 253 enableSortMenu(); 254 } 255 256 private void unifyVisualizations() { 257 for (int i=0; i<visualizationList.size(); i++) { 258 Visualization visual = (Visualization)visualizationList.get(i); 259 for (int j=0; j<maxEntity.length; j++) { 260 Dimension dim = visual.getDimension()[j]; 261 if (dim instanceof ReferenceDimension) { 262 ((ReferenceDimension)dim).linkEntities(maxEntity[j]); 263 ((ReferenceDimension)dim).visualize(); 264 } 265 } 266 // recoloring with the selected color scheme 267 AutoImage image = visual.getImage(); 268 Color newColor = (Color)colorList.get(i); 269 int w = image.getW(); 270 int h = image.getH(); 271 272 if (newColor == null) continue; 273 for (int j=0; j<w; j++) { 274 for (int k=0; k<h; k++) { 275 if (image.getColor(j,k) != null) 276 image.setColor(j,k,newColor); 277 } 278 } 279 280 } 281 } 282 }