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    }