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 }