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    }