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 }