001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Feb 14, 2003 005 * Time: 7:44:18 PM 006 */ 007 008 package EVolve.visualization.XYViz.RefRefViz; 009 010 import java.awt.*; 011 import java.awt.event.*; 012 import java.util.*; 013 import javax.swing.*; 014 import EVolve.Scene; 015 import EVolve.data.Entity; 016 import EVolve.exceptions.NoDataPlotException; 017 import EVolve.util.painters.RelationshipPainter; 018 import EVolve.util.painters.placements.*; 019 import EVolve.util.xmlutils.datastructures.SerializedVisualization; 020 import EVolve.visualization.AutoImage; 021 import EVolve.visualization.AutoShapeImage; 022 import EVolve.visualization.AxesPanel; 023 024 public class RelationshipViz extends CorrelationViz{ 025 protected static int SELECT_OPTION = SELECT_X_AXIS|SELECT_Y_AXIS; 026 private static JMenuItem selectionMenu[] = null; 027 private JTextField textThreshold; 028 private int threshold=10; 029 private ArrayList menuList; 030 private JMenuItem itemReArrange; 031 private JMenu menuChangePlacement; 032 private JMenuItem itemSelectX, itemSelectY; 033 private JComboBox comboPlacement; 034 private Placement selectedPlacement; 035 private Placement[] placementList; 036 037 public RelationshipViz() { 038 super(); 039 menuList = new ArrayList(); 040 } 041 042 private void createPlacements() { 043 placementList = new Placement[2]; 044 placementList[0] = new RectPlacement(10); 045 placementList[1] = new RoundPlacement(10); 046 selectedPlacement = placementList[0]; 047 } 048 049 protected Component createPanel() { 050 Component returnVal = super.createPanel(); 051 canvas.setPanelFlag(AxesPanel.Null); 052 canvas.setZoomingSize(50,50); 053 flipMagnifier = false; 054 addMagnifier(canvas,flipMagnifier); 055 056 return returnVal; 057 } 058 059 protected JPanel createConfigurationPanel() { 060 JPanel panelBottom = new JPanel(new GridLayout(2,2)); 061 062 panelBottom.add(new JLabel("Threshold: ")); 063 064 textThreshold = new JTextField(String.valueOf(threshold), 10); 065 panelBottom.add(textThreshold); 066 067 createPlacements(); 068 panelBottom.add(new JLabel("Placement: ")); 069 comboPlacement = new JComboBox(); 070 for (int i = 0; i < placementList.length; i++) { 071 comboPlacement.addItem(placementList[i].getName()); 072 } 073 panelBottom.add(comboPlacement); 074 075 JPanel configurationPanel = new JPanel(new FlowLayout()); 076 configurationPanel.add(panelBottom); 077 078 return configurationPanel; 079 } 080 081 protected void updateConfiguration() { 082 try { 083 threshold = Integer.parseInt(textThreshold.getText()); 084 selectedPlacement = placementList[comboPlacement.getSelectedIndex()]; 085 super.updateConfiguration(); 086 087 } catch (Exception e) { 088 Scene.showErrorMessage("Threshold must be an integer"); 089 configure(); 090 } 091 } 092 093 public void restoreConfiguration(SerializedVisualization config) { 094 super.restoreConfiguration(config); 095 threshold = Integer.parseInt(config.Threshold); 096 textThreshold.setText(String.valueOf(threshold)); 097 autoInterval = -1; 098 interval = -1; 099 100 for (int i=0; i<placementList.length; i++) { 101 if (placementList[i].getName().equals(config.PlacementName)) { 102 selectedPlacement = placementList[i]; 103 comboPlacement.setSelectedIndex(i); 104 break; 105 } 106 } 107 } 108 109 public SerializedVisualization getCurrentConfiguration() { 110 SerializedVisualization data = super.getCurrentConfiguration(); 111 112 data.Threshold = String.valueOf(threshold); 113 data.PlacementName = selectedPlacement.getName(); 114 115 return data; 116 } 117 118 protected void installPainter() { 119 painter = new RelationshipPainter(); 120 } 121 122 public void preVisualize() { 123 super.preVisualize(); 124 image = new AutoShapeImage(); 125 } 126 127 public void visualize() { 128 ((RelationshipPainter)painter).updatePainterParameters(value,threshold); 129 painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10); 130 xAxis.selectComparator(comboSortSchemes[0].getSelectedItem().toString()); 131 yAxis.selectComparator(comboSortSchemes[1].getSelectedItem().toString()); 132 sort(); 133 } 134 135 public void sort() { 136 try { 137 AutoImage sorted = image.getSortedImage(xAxis,yAxis); 138 selectedPlacement.categorize(sorted, yAxis.getDataFilter().getTargetType()); 139 selectedPlacement.initialPlacement(sorted); 140 canvas.setImage(sorted.getImage()); 141 canvas.repaint(); 142 } catch (NoDataPlotException e) { 143 Scene.showErrorMessage(e.getMessage()); 144 } 145 } 146 147 public String mouseMove(int x, int y) { 148 int X = canvas.getImageX(x); 149 int Y = canvas.getImageY(y); 150 if (image != null) { 151 EVolve.util.painters.shapes.Shape entityShape = ((AutoShapeImage)image).getEntityShapes(X,Y); 152 if (entityShape != null) { 153 Entity entity; 154 if (entityShape.getEntityType() == xAxis.getDataFilter().getTargetType()) { 155 entity = xAxis.getEntityFromInt((int)entityShape.getEntityID()); 156 } else { 157 entity = yAxis.getEntityFromInt((int)entityShape.getEntityID()); 158 } 159 Scene.setStatus(entity.getName()); 160 } else 161 Scene.setStatus(" "); 162 } else { 163 Scene.setStatus(" "); 164 } 165 return null; 166 } 167 168 public Object clone() { 169 RelationshipViz o = (RelationshipViz)super.clone(); 170 171 o.menuList = new ArrayList(); 172 173 return o; 174 } 175 176 public JMenuItem[] createSelectionMenuItem() { 177 if (selectionMenu != null) return selectionMenu; 178 179 itemSelectX = new JCheckBoxMenuItem("Occurred Entities of Object One"); 180 itemSelectX.setMnemonic(KeyEvent.VK_O); 181 itemSelectX.addActionListener(new ActionListener() { 182 public void actionPerformed(ActionEvent e) { 183 boolean selected = itemSelectX.isSelected(); 184 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_X_AXIS); 185 } 186 }); 187 itemSelectX.setSelected(true); 188 189 itemSelectY = new JCheckBoxMenuItem("Occurred Entities of Object Two"); 190 itemSelectY.setMnemonic(KeyEvent.VK_T); 191 itemSelectY.addActionListener(new ActionListener() { 192 public void actionPerformed(ActionEvent e) { 193 boolean selected = itemSelectY.isSelected(); 194 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_Y_AXIS); 195 } 196 }); 197 itemSelectY.setSelected(true); 198 199 selectionMenu = new JMenuItem[2]; 200 selectionMenu[0] = itemSelectX; 201 selectionMenu[1] = itemSelectY; 202 203 return selectionMenu; 204 } 205 206 public void makeSelection() { 207 preMakeSelection(); 208 if (selectionName==null) return; 209 210 if (SELECT_OPTION == 0) { 211 Scene.showErrorMessage("Nothing will be selected, please check Selection menu."); 212 return; 213 } 214 215 int x1 = canvas.getStartX(); 216 int x2 = canvas.getEndX(); 217 int y1 = canvas.getStartY(); 218 int y2 = canvas.getEndY(); 219 220 int[] selection = null; 221 HashMap entities = ((RelationshipPainter)painter).getEntitiesInBox(x1,y1,x2,y2); 222 int xComparator = xAxis.getSelectedComparatorIndex(), yComparator = yAxis.getSelectedComparatorIndex(); 223 xAxis.selectComparator(1); 224 yAxis.selectComparator(1); 225 switch (SELECT_OPTION & 0xf0f0) { 226 case SELECT_X_AXIS: // select occurred entities of object one 227 ArrayList idList = (ArrayList)entities.get(new Integer(xAxis.getDataFilter().getTargetType())) ; 228 selection = new int[idList.size()]; 229 for (int i=0; i<idList.size(); i++) { 230 selection[i] = ((Long)idList.get(i)).intValue(); 231 } 232 xAxis.makeSelection(selectionName,subjectDefinition.getType(),selection); 233 break; 234 case 0x0000: // x axis is not seletcted 235 break; 236 } 237 238 switch (SELECT_OPTION & 0x0f0f) { 239 case SELECT_Y_AXIS: //select occurred entities of object two 240 ArrayList idList = (ArrayList)entities.get(new Integer(yAxis.getDataFilter().getTargetType())) ; 241 selection = new int[idList.size()]; 242 for (int i=0; i<idList.size(); i++) { 243 selection[i] = ((Long)idList.get(i)).intValue(); 244 } 245 yAxis.makeSelection(selectionName,subjectDefinition.getType(),selection); 246 break; 247 case 0x0000: 248 break; 249 } 250 xAxis.selectComparator(xComparator); 251 yAxis.selectComparator(yComparator); 252 } 253 254 protected ArrayList createOptionalMenu() { 255 if (menuList.size() > 0) return null; 256 257 menuList.clear(); 258 itemReArrange = new JMenuItem("Rearrange"); 259 itemReArrange.setMnemonic(KeyEvent.VK_R); 260 itemReArrange.addActionListener(new ActionListener() { 261 public void actionPerformed(ActionEvent e) { 262 String newSize = (String)JOptionPane.showInputDialog(Scene.getFrame(), 263 "Input new threshold:", 264 "Rearrange", 265 JOptionPane.QUESTION_MESSAGE, null, null, String.valueOf(threshold)); 266 threshold = Integer.parseInt(newSize); 267 canvas.scaleImage(false); 268 sortValues(); 269 //((RelationshipPainter)painter).updatePainterParameters(value,threshold); 270 painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10); 271 sort(); 272 } 273 }); 274 275 menuChangePlacement = new JMenu("Change Placement"); 276 menuChangePlacement.setMnemonic(KeyEvent.VK_F); 277 for (int i = 0; i < placementList.length; i++) { 278 JMenuItem item = new JMenuItem(placementList[i].getName()); 279 item.addActionListener(new ActionListener() { 280 public void actionPerformed(ActionEvent e) { 281 for (int j=0; j<placementList.length; j++) { 282 if (placementList[j].getName().equals(((JMenuItem)e.getSource()).getActionCommand())) { 283 selectedPlacement = placementList[j]; 284 sort(); 285 break; 286 } 287 } 288 } 289 }); 290 menuChangePlacement.add(item); 291 } 292 menuList.add(itemReArrange); 293 menuList.add(menuChangePlacement); 294 return menuList; 295 } 296 297 private void sortValues() { 298 int newValues[][] = new int[value.length][value[0].length]; 299 300 for (int i=0; i<value.length; i++) { 301 for (int j=0; j<value[i].length; j++) { 302 int x, y; 303 x = xAxis.getSortedIndex(i); 304 y = yAxis.getSortedIndex(j); 305 if ((x!=-1)&&(y!=-1)) { 306 newValues[x][y] = value[i][j]; 307 } 308 } 309 } 310 311 ((RelationshipPainter)painter).updatePainterParameters(newValues,threshold); 312 } 313 314 public void updateMenu() { 315 super.updateMenu(); 316 itemScale.setSelected(false); 317 } 318 }