001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Jan 19, 2003
005     * Time: 7:47:48 PM
006     */
007    
008    package EVolve.util;
009    
010    import EVolve.Scene;
011    import EVolve.data.ElementDefinition;
012    import EVolve.visualization.Visualization;
013    import javax.swing.*;
014    import java.io.*;
015    import java.awt.event.*;
016    import java.awt.*;
017    import java.util.*;
018    
019    public class SceneSetting {
020        private static SceneSetting instance = null;
021        private JDialog settingDialog, pathDialog;
022        private JTextField[] path;
023        private JTextField textClassPath, textSourcePath, textVizConfigPath, textVizResultPath, textDefaultDataPath ;
024        private JButton buttonSave, buttonCancel;
025        private String iniFilename;
026        private final String optionFilename = "EVolve.ini";
027        private ArrayList additionClassPath, sourcePath;
028        private String[] tags = {"[Default Data Path]","[Default Viz result path]","[Default Viz Config path]",
029                                 "[Additional class path]","[Source file path]"};
030        private JButton[] buttonDir;
031    
032    
033        private SceneSetting() {
034            iniFilename = "." + File.separatorChar + optionFilename;
035            path = new JTextField[5];
036            path[0] = textDefaultDataPath = new JTextField(12);
037            path[1] = textVizResultPath = new JTextField(12);
038            path[2] = textVizConfigPath = new JTextField(12);
039            path[3] = textClassPath = new JTextField(12);
040            path[4] = textSourcePath = new JTextField(12);
041            buttonDir = new JButton[path.length];
042            for (int i=0; i<buttonDir.length; i++) {
043                buttonDir[i] = new JButton("...");
044                buttonDir[i].setName(String.valueOf(i));
045                buttonDir[i].addActionListener(new ActionListener() {
046                    public void actionPerformed(ActionEvent e) {
047                        addPath();
048                    }
049                });
050            }
051            additionClassPath = new ArrayList();
052            sourcePath = new ArrayList();
053        }
054    
055        public static SceneSetting v() {
056            if (instance == null)
057                instance = new SceneSetting();
058            return instance;
059        }
060    
061        public void initialScene() {
062            String line;
063            RandomAccessFile iniFile;
064            File file = new File(iniFilename);
065            if (!file.exists()) return;
066    
067            try {
068                iniFile = new RandomAccessFile(file,"r");
069                line = iniFile.readLine();
070                /** ini file is organized as:
071                 *  [Default Data Path]
072                 *  [Viz result path]
073                 *  [Viz Config path]
074                 *  [Additional class path]
075                 *  [Source file path]
076                 */
077                while (line!=null) {
078                    line = iniFile.readLine();
079                    if (line.length() != 0) {
080                        textDefaultDataPath.setText(line);
081                    }
082    
083                    line = iniFile.readLine(); //skip one tag
084                    line = iniFile.readLine();
085                    if (line.length() != 0) {
086                        textVizResultPath.setText(line);
087                    }
088    
089                    line = iniFile.readLine(); //skip one tag
090                    line = iniFile.readLine();
091                    if (line.length() != 0) {
092                        textVizConfigPath.setText(line);
093                    }
094    
095                    line = iniFile.readLine(); //skip one tag
096                    line = iniFile.readLine();
097                    if (line.length() != 0) {
098                        additionClassPath.clear();
099                        textClassPath.setText(line);
100                        StringTokenizer token = new StringTokenizer(line+File.pathSeparator,File.pathSeparator);
101                        while (token.hasMoreTokens()) {
102                            additionClassPath.add(token.nextToken());
103                        }
104                    }
105    
106                    line = iniFile.readLine(); //skip one tag
107                    line = iniFile.readLine();
108                    if (line.length() != 0) {
109                        sourcePath.clear();
110                        textSourcePath.setText(line);
111                        StringTokenizer token = new StringTokenizer(line+File.pathSeparator,File.pathSeparator);
112                        while (token.hasMoreTokens()) {
113                            sourcePath.add(token.nextToken());
114                        }
115                    }
116                    line = iniFile.readLine();
117                }
118            } catch (IOException e) {
119                Scene.showErrorMessage("Unable to read EVolve setting file \""+optionFilename+"\"");
120                return;
121            }
122            Scene.getUIManager().setLastConfigDir(textVizConfigPath.getText());
123            Scene.getUIManager().setLastDataDir(textDefaultDataPath.getText());
124            Scene.getUIManager().setLastResultDir(textVizResultPath.getText());
125        }
126    
127        public void showPathDialog() {
128            Box boxMain = new Box(BoxLayout.Y_AXIS);
129            pathDialog = new JDialog(Scene.getFrame(), "Set path...", true);
130            pathDialog.setSize(600,300);
131    
132            for (int i=0; i<tags.length; i++) {
133                String prompt = tags[i].substring(1,tags[i].length()-1) + ":";
134                boxMain.add(createPathItem(prompt, path[i],buttonDir[i]));
135                boxMain.add(Box.createVerticalStrut(20));
136            }
137    
138            Box boxSaveCancel = new Box(BoxLayout.X_AXIS);
139            buttonSave = new JButton("Save");
140            buttonSave.addActionListener(new ActionListener() {
141                public void actionPerformed(ActionEvent e) {
142                    save();
143                }
144            });
145    
146            buttonCancel = new JButton("Cancel");
147            buttonCancel.addActionListener(new ActionListener() {
148                public void actionPerformed(ActionEvent e) {
149                    pathDialog.setVisible(false);
150                }
151            });
152            boxSaveCancel.add(Box.createHorizontalStrut(40));
153            boxSaveCancel.add(buttonSave);
154            boxSaveCancel.add(Box.createHorizontalStrut(25));
155            boxSaveCancel.add(buttonCancel);
156    
157            boxMain.add(boxSaveCancel);
158            pathDialog.getContentPane().add(boxMain);
159            //pathDialog.pack();
160            Scene.getUIManager().showDialog(pathDialog, pathDialog.getWidth(), pathDialog.getHeight());
161        }
162    
163        private Box createPathItem(String prompt, JTextField item, JButton button) {
164            Box itemBox = new Box(BoxLayout.X_AXIS);
165    
166            itemBox.add(new JLabel(prompt));
167            itemBox.add(Box.createHorizontalStrut(15));
168            itemBox.add(item);
169            itemBox.add(Box.createHorizontalStrut(10));
170            itemBox.add(button);
171            return itemBox;
172        }
173    
174        private void save() {
175            try {
176                FileWriter writer = new FileWriter(iniFilename);
177                for (int i=0; i<tags.length; i++) {
178                    writer.write(tags[i]+"\n");
179                    writer.write(path[i].getText()+"\n");
180    
181                }
182                writer.flush();
183                writer.close();
184            } catch (IOException e) {
185                Scene.showErrorMessage("Unable to write changes to file EVolve.ini");
186            }
187            pathDialog.setVisible(false);
188            initialScene();
189        }
190    
191        public void showCurrentSetting() {
192            createSettingDialog();
193        }
194    
195        private void createSettingDialog() {
196            Box boxMain = new Box(BoxLayout.Y_AXIS);
197            String setting;
198            int index;
199    
200            settingDialog = new JDialog(Scene.getFrame(), "Current Setting", true);
201            settingDialog.setSize(500,500);
202    
203            // show data source and its path
204            setting = Scene.getCurrentDataFilename();
205            index = setting.lastIndexOf(File.separatorChar);
206            if (index == -1) { // have not loaded date yet
207                boxMain.add(createInfoItem("Data source name:", "N/A"));
208                boxMain.add(Box.createVerticalStrut(20));
209                boxMain.add(createInfoItem("Data source path:", "N/A"));
210            } else {
211                boxMain.add(createInfoItem("Data source name:", setting.substring(index+1)));
212                boxMain.add(Box.createVerticalStrut(20));
213                boxMain.add(createInfoItem("Data source path:", setting.substring(0,index)));
214            }
215            boxMain.add(Box.createVerticalStrut(20));
216    
217            // show path info
218            for (int i=0; i<tags.length; i++) {
219                String prompt = tags[i].substring(1,tags[i].length()-1) + ":";
220                boxMain.add(createInfoItem(prompt, path[i].getText()));
221                boxMain.add(Box.createVerticalStrut(20));
222            }
223    
224            // show current visualization info
225            HashMap config = readVizSetting();
226            if (config != null) {
227                boxMain.add(createInfoItem("Visualization: ", (String)config.get("Name")));
228                boxMain.add(createInfoItem("Subject: ",((ElementDefinition)config.get("Subject")).getName()));
229                EVolve.visualization.Dimension[] dims = (EVolve.visualization.Dimension[])config.get("Dimension");
230                for (int i=0; i<dims.length; i++)
231                    boxMain.add(createInfoItem("Dimension "+(char)(88+i)+" ",dims[i].getName()));
232                boxMain.add(createInfoItem("Interval",config.get("Interval").toString()));
233            } else {
234                boxMain.add(createInfoItem("Visualization: ", "N/A"));
235                boxMain.add(createInfoItem("Subject: ","N/A"));
236                for (int i=0; i<3; i++)
237                    boxMain.add(createInfoItem("Dimension "+(char)(88+i)+" ","N/A"));
238                boxMain.add(createInfoItem("Interval","N/A"));
239            }
240    
241    
242            // create button box
243            JButton buttonOK = new JButton("OK");
244            buttonOK.addActionListener(new ActionListener() {
245                public void actionPerformed(ActionEvent e) {
246                    settingDialog.setVisible(false);
247                }
248            });
249            JPanel panelButton = new JPanel(new BorderLayout());
250            //paneButton.add(Box.createHorizontalStrut(settingDialog.getWidth()/2 - 10));
251            panelButton.add(buttonOK,BorderLayout.CENTER);
252            boxMain.add(panelButton);
253    
254            settingDialog.getContentPane().add(boxMain);
255            //settingDialog.pack();
256            Scene.getUIManager().showDialog(settingDialog, settingDialog.getWidth(), settingDialog.getHeight());
257        }
258    
259        private Box createInfoItem(String prompt, String info) {
260            Box item = new Box(BoxLayout.X_AXIS);
261            item.add(new JLabel(prompt));
262            item.add(Box.createHorizontalStrut(15));
263            item.add(new JTextField(info));
264            return item;
265        }
266    
267        private void addPath() {
268            int activeButtonId = 0;
269            for (int i=0; i<buttonDir.length; i++) {
270                if (buttonDir[i].isFocusOwner()) {
271                    activeButtonId = i;
272                    break;
273                }
274            }
275            JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastDataDir());
276            String newPath;
277    
278            fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
279    
280            if(fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
281                newPath = fc.getSelectedFile().getAbsolutePath();
282                switch (activeButtonId) {
283                    case 3:
284                    case 4:
285                        String oldPath = path[activeButtonId].getText();
286                        if (oldPath.length() != 0)
287                            newPath = oldPath + File.pathSeparator + newPath;
288                    case 0:
289                    case 1:
290                    case 2:
291                        path[activeButtonId].setText(newPath);
292                        break;
293                }
294            }
295    
296        }
297    
298        public ArrayList getAdditionalClassPath() {
299            return additionClassPath;
300        }
301    
302        public ArrayList getSourcePath() {
303            return sourcePath;
304        }
305    
306        private HashMap readVizSetting() {
307            ArrayList list = Scene.getVisualizationManager().getVisualizationList();
308    
309            Visualization visual = null;
310            for (int i=0; i<list.size();i++) {
311                visual = (Visualization)list.get(i);
312                if (visual.getWindow().isSelected()) break;
313            }
314    
315            if (visual != null)
316                return visual.getCurrentConfigure();
317            else
318                return null;
319       }
320    
321    }