001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Jan 16, 2003
005     * Time: 8:39:52 PM
006     */
007    
008    package EVolve.util;
009    
010    import EVolve.Scene;
011    import EVolve.visualization.*;
012    import EVolve.visualization.Dimension;
013    import javax.swing.*;
014    import java.util.*;
015    import java.io.*;
016    import java.awt.*;
017    import java.awt.event.*;
018    
019    public class VisualizationSerializer {
020        private static VisualizationSerializer instance = null;
021        private JDialog dialog;
022        private JCheckBox checkSelection;
023        private JTextField textConfigureName, textSelectionName;
024        private JTextField textConfigureFile, textSelectionFile;
025        private JButton buttonConfigure, buttonSelection;
026        private JButton buttonSave, buttonCancel;
027        private FileWriter fileConfigure, fileSelection;
028    
029        private VisualizationSerializer() {
030            dialog = null;
031        }
032    
033        public static VisualizationSerializer v() {
034            if (instance == null) instance = new VisualizationSerializer();
035            return instance;
036        }
037    
038        public void readSetting() {
039    
040        }
041    
042        public void showSavingDialog() {
043            if (dialog == null) {
044                createDialog();
045            } else {
046                if (Scene.getFilter().getSelection().length == 0) {
047                    checkSelection.setSelected(false);
048                    textSelectionName.setEnabled(false);
049                    textSelectionFile.setEnabled(false);
050                    buttonSelection.setEnabled(false);
051                }
052                dialog.setVisible(true);
053            }
054        }
055    
056        private void createDialog() {
057            Box boxMain = new Box(BoxLayout.Y_AXIS);
058    
059            dialog = new JDialog(Scene.getFrame(), "Setting Saving...", true);
060            dialog.setBounds(new Rectangle(500,250));
061    
062    
063            boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
064                    "Save configuration and selections"));
065            dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
066    
067            //***********************************
068            Box boxConfigureName = new Box(BoxLayout.X_AXIS);
069            boxConfigureName.add(new JLabel("Configuration name:"));
070            textConfigureName = new JTextField(12);
071            boxConfigureName.add(Box.createHorizontalStrut(25));
072            boxConfigureName.add(textConfigureName);
073    
074            Box boxConfig = new Box(BoxLayout.X_AXIS);
075            boxConfig.add(new JLabel("Choose configure file:"));
076            textConfigureFile = new JTextField(12);
077            boxConfig.add(Box.createHorizontalStrut(20));
078            boxConfig.add(textConfigureFile,BorderLayout.CENTER);
079            buttonConfigure = new JButton("...");
080            buttonConfigure.addActionListener(new ActionListener(){
081                public void actionPerformed(ActionEvent e) {
082                    JFileChooser fc = selectFile();
083                    if (fc == null) return;
084                    textConfigureFile.setText(fc.getSelectedFile().getPath());
085                }
086            });
087            boxConfig.add(buttonConfigure,BorderLayout.EAST);
088    
089            //*****************************
090            Box boxChk = new Box(BoxLayout.X_AXIS);
091            checkSelection = new JCheckBox("Saving Filters & colors also");
092            checkSelection.setMnemonic(KeyEvent.VK_F);
093            checkSelection.addActionListener(new ActionListener() {
094                public void actionPerformed(ActionEvent e) {
095                    boolean enable = checkSelection.isSelected();
096                    if (Scene.getFilter().getSelection().length == 0) {
097                        Scene.showErrorMessage("No active selection exists!");
098                        checkSelection.setSelected(false);
099                    } else {
100                        buttonSelection.setEnabled(enable);
101                        textSelectionFile.setEnabled(enable);
102                        textSelectionName.setEnabled(enable);
103                    }
104                }
105            });
106            boxChk.add(checkSelection);
107            JLabel note = new JLabel("(If checked, the configuration file can ONLY be applied to " +
108                          " the current data source.)");
109            note.setFont(new Font("Dialog",Font.ITALIC|Font.BOLD,9));
110            boxChk.add(note);
111    
112            //***********************************
113            Box boxSelectionName = new Box(BoxLayout.X_AXIS);
114            boxSelectionName.add(new JLabel("Selection name:"));
115            boxSelectionName.add(Box.createHorizontalStrut(25));
116            textSelectionName = new JTextField(12);
117            boxSelectionName.add(textSelectionName);
118    
119            Box boxSelection = new Box(BoxLayout.X_AXIS);
120            boxSelection.add(new JLabel("Choose selection file:"));
121            textSelectionFile = new JTextField(12);
122            boxSelection.add(Box.createHorizontalStrut(20));
123            boxSelection.add(textSelectionFile,BorderLayout.CENTER);
124            buttonSelection = new JButton("...");
125            buttonSelection.addActionListener(new ActionListener() {
126                public void actionPerformed(ActionEvent e) {
127                    JFileChooser fc = selectFile();
128                    if (fc == null) return;
129                    textSelectionFile.setText(fc.getSelectedFile().getPath());
130                }
131            });
132            boxSelection.add(buttonSelection,BorderLayout.EAST);
133    
134            //***********************************
135            Box boxSaveCancel = new Box(BoxLayout.X_AXIS);
136            buttonSave = new JButton("Save");
137            buttonSave.addActionListener(new ActionListener() {
138                public void actionPerformed(ActionEvent e) {
139                    if (!validate()) return;
140                    dialogSave();
141                }
142            });
143    
144            buttonCancel = new JButton("Cancel");
145            buttonCancel.addActionListener(new ActionListener() {
146                public void actionPerformed(ActionEvent e) {
147                    dialog.setVisible(false);
148                }
149            });
150            boxMain.add(Box.createHorizontalStrut(40));
151            boxSaveCancel.add(buttonSave);
152            boxSaveCancel.add(Box.createHorizontalStrut(25));
153            boxSaveCancel.add(buttonCancel);
154    
155            boxMain.add(boxConfigureName);
156            boxMain.add(Box.createVerticalStrut(5));
157            boxMain.add(boxConfig);
158            boxMain.add(Box.createVerticalStrut(15));
159            boxMain.add(boxChk);
160            boxMain.add(Box.createVerticalStrut(8));
161            boxMain.add(boxSelectionName);
162            boxMain.add(Box.createVerticalStrut(5));
163            boxMain.add(boxSelection);
164            boxMain.add(Box.createVerticalStrut(25));
165            boxMain.add(boxSaveCancel);
166    
167            textSelectionName.setEnabled(false);
168            textSelectionFile.setEnabled(false);
169            buttonSelection.setEnabled(false);
170            dialog.getContentPane().add(boxMain);
171            dialog.setResizable(false);
172            dialog.pack();
173            Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight());
174        }
175    
176        private JFileChooser selectFile() {
177            JFileChooser fc = new JFileChooser();
178            if (fc.showSaveDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
179                return fc;
180            }
181            return null;
182        }
183    
184        private void dialogSave() {
185            saveConfiguration();
186            if (checkSelection.isSelected())
187                saveSelection();
188            dialog.setVisible(false);
189        }
190    
191        private boolean validate() {
192            if ((textConfigureFile.getText() == null) || (textConfigureName.getText() == null)) {
193                Scene.showErrorMessage("User must name the configuration to be saved and choose a file!");
194                return false;
195            }
196    
197            if (checkSelection.isSelected() &&
198                ((textSelectionFile.getText() == null) || (textSelectionName.getText() == null))) {
199                Scene.showErrorMessage("User must name the filters to be saved and select a file to save them!");
200                return false;
201            }
202    
203            return true;
204        }
205    
206        private void saveConfiguration() {
207            ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
208            if (vizList.size() == 0) {
209                Scene.showErrorMessage("Nothing to be saved!");
210                return;
211            }
212    
213            try {
214                fileConfigure = new FileWriter(textConfigureFile.getText().trim(),false);
215            } catch (IOException ioe) {
216                Scene.showErrorMessage("Can not access file \""+textConfigureFile.getText()+"\"");
217                return;
218            }
219    
220            try {
221                String configureName = textConfigureName.getText().trim();
222                fileConfigure.write(Scene.VERSION+"\n");
223                fileConfigure.write(configureName+"\n");
224                fileConfigure.write("Datasource:"+(checkSelection.isSelected() ? Scene.getCurrentDataFilename() : ";")+"\n");
225                fileConfigure.write("Selection:"+(checkSelection.isSelected() ? textSelectionFile.getText() : ";")+"\n");
226                for (int i = 0; i<vizList.size(); i++) {
227                    Visualization visual = (Visualization)vizList.get(i);
228                    HashMap config = visual.getCurrentConfigure();
229                    fileConfigure.write(visual.getFactory().getFactoryName()+"\n");
230                    fileConfigure.write(visual.getSubjectDefinition().getName()+"\n");
231                    Dimension[] dim = (Dimension[])config.get("Dimension");
232                    for (int j=0;j<dim.length;j++) {
233                        fileConfigure.write(dim[j].getDataFilter().getName()+"\n");
234                    }
235                    for (int j=dim.length; j<3; j++) fileConfigure.write(";not using this dimension\n");
236                    if (config.get("Predictor") != null)
237                        fileConfigure.write(((PredictorFactory)config.get("Predictor")).getName()+"\n");
238                    else
239                        fileConfigure.write(";not using predictor\n");
240                    if (config.get("Interval") != null)
241                        fileConfigure.write((config.get("Interval")).toString()+"\n");
242                    else
243                        fileConfigure.write(";not using interval\n");
244                    fileConfigure.write(visual.getWindow().getTitle()+"\n");
245                    Rectangle rect = visual.getWindow().getBounds();
246                    fileConfigure.write(new Integer(rect.x).toString() + "\n");
247                    fileConfigure.write(new Integer(rect.y).toString() + "\n");
248                    fileConfigure.write(new Integer(rect.width).toString() + "\n");
249                    fileConfigure.write(new Integer(rect.height).toString() + "\n");
250                    fileConfigure.write((String)config.get("Options")+"\n");
251                }
252                Scene.getUIManager().refreshMenu(textConfigureFile.getText(),configureName);
253                fileConfigure.flush();
254                fileConfigure.close();
255            } catch (IOException e) {
256                Scene.showErrorMessage("Error occurred when trying to save configuration!");
257            }
258    
259        }
260    
261        private void saveSelection() {
262            try {
263                fileSelection = new FileWriter(textSelectionFile.getText().trim(),false);
264            } catch (IOException ioe) {
265                Scene.showErrorMessage("Can not access file \""+textSelectionFile.getText()+"\"");
266                return;
267            }
268            Scene.getFilter().saveSelection(fileSelection,textSelectionName.getText().trim());
269        }
270    
271        public void loadConfiguration() {
272            RandomAccessFile configFile;
273            JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastConfigDir());
274            String configureName = null,filename = null, dataFile, selFile;
275    
276            if(fc.showOpenDialog(Scene.getFrame()) != JFileChooser.APPROVE_OPTION) return;
277    
278            try {
279                filename = fc.getSelectedFile().getPath();
280                Scene.getUIManager().setLastConfigDir(filename);
281                configFile = new RandomAccessFile(filename, "r");
282                String version = configFile.readLine().trim();
283                if (!version.equals(Scene.VERSION)) throw (new IOException());
284                configureName = configFile.readLine().trim();
285                dataFile = configFile.readLine().trim();
286                selFile = configFile.readLine().trim();
287                loadDataAndSelection(dataFile,selFile);
288                configFile.close();
289            } catch (Exception e) {
290                Scene.showErrorMessage("Error occurred, possible causes:\n" +
291                                       "1. Configure file format and/or selection file format is wrong\n" +
292                                       "2. Applying filters on a wrong data source.");
293                return;
294            }
295            Scene.getUIManager().refreshMenu(filename,configureName);
296        }
297    
298        public void loadDataAndSelection(String dataFile, String selFile) throws Exception{
299            try {
300                String datasource = dataFile.substring(dataFile.indexOf(':')+1);
301                if (datasource.charAt(0)!= ';') {
302                    // autoload data source
303                    if (!Scene.getCurrentDataFilename().equals(datasource)) {
304                        Scene.setDataFilename(datasource);
305                        Scene.autoLoadDataSource();
306                        Scene.setDataFilename(null);
307                    }
308                    String selection = selFile.substring(selFile.indexOf(':')+1);
309                    RandomAccessFile file = new RandomAccessFile(selection,"r");
310                    Scene.getFilter().loadSelection(file);
311                }
312            } catch (IOException e) {
313                Scene.showErrorMessage("Error occurred when trying to load selections and data source.");
314            }
315    
316        }
317    }