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    }