001    package nl.cwi.sen1.tide;
002    
003    import java.awt.BorderLayout;
004    import java.awt.Color;
005    import java.io.File;
006    import java.io.FileInputStream;
007    import java.io.FileOutputStream;
008    import java.io.IOException;
009    import java.io.InputStream;
010    import java.io.OutputStream;
011    import java.util.Properties;
012    
013    import javax.swing.JDesktopPane;
014    import javax.swing.JFileChooser;
015    import javax.swing.JOptionPane;
016    import javax.swing.JPanel;
017    import javax.swing.JScrollPane;
018    
019    import nl.cwi.sen1.gui.CloseAbortedException;
020    import nl.cwi.sen1.gui.Studio;
021    import nl.cwi.sen1.gui.StudioImplWithPredefinedLayout;
022    import nl.cwi.sen1.gui.StudioWithPredefinedLayout;
023    import nl.cwi.sen1.gui.component.StudioComponentImpl;
024    import nl.cwi.sen1.tide.tool.ToolManager;
025    import nl.cwi.sen1.tide.tool.prefeditor.PreferencesEditorFactory;
026    import nl.cwi.sen1.tide.tool.proclist.ProcessList;
027    import nl.cwi.sen1.tide.tool.ruleinspector.RuleInspectorFactory;
028    import nl.cwi.sen1.tide.tool.srcviewer.SourceViewerFactory;
029    import nl.cwi.sen1.tide.tool.stackviewer.StackViewerFactory;
030    import nl.cwi.sen1.tide.tool.support.DebugTool;
031    import nl.cwi.sen1.tide.tool.support.DebugToolListener;
032    import aterm.ATerm;
033    import aterm.ATermFactory;
034    
035    public class TideControl extends JPanel implements TideControlTif, Runnable {
036    
037        private static ATermFactory factory;
038    
039        private TideControlBridge bridge;
040    
041        private DebugTool debugTool;
042    
043        private Studio studio;
044    
045        private JDesktopPane desktop;
046    
047        private ProcessList processList;
048    
049        private ToolManager manager;
050    
051        protected Thread debugToolThread;
052    
053        protected Thread tideControlThread;
054    
055            private TideMainFrame plugin;
056    
057        public TideControl(Studio studio, TideMainFrame plugin) {
058            this.studio = studio;
059            this.plugin = plugin;
060            nl.cwi.sen1.tide.tool.support.Port.initialize(studio.getATermFactory());
061            nl.cwi.sen1.tide.tool.support.Expr.initialize(studio.getATermFactory());
062    
063            TideControl.factory = studio.getATermFactory();
064    
065            setBackground(Color.white);
066    
067            bridge = new TideControlBridge(factory, this);
068            debugTool = new DebugTool(factory);
069    
070            Properties defaults;
071            try {
072                defaults = loadProperties();
073                createTools(defaults);
074                createProcessList();
075    
076                setLayout(new BorderLayout());
077    
078                StudioComponentImpl comp = new StudioComponentImpl("Processes", new JScrollPane(
079                                processList)) {
080                                    public void requestClose() throws CloseAbortedException {
081                                            throw new CloseAbortedException();
082                                    }
083                };
084                
085                            ((StudioWithPredefinedLayout) studio).addComponent(
086                        comp,
087                        StudioImplWithPredefinedLayout.TOP_LEFT);
088    
089                studio.connect("tide-control", bridge);
090                studio.connect("debug-tool", debugTool);
091    
092                // startChildThreads();
093            } catch (IOException e) {
094                e.printStackTrace();
095            }
096        }
097    
098        // private void startChildThreads() {
099        // debugToolThread = new Thread(debugTool);
100        // debugToolThread.setName("DebugTool");
101        // debugToolThread.run();
102        //
103        // tideControlThread = new Thread(bridge);
104        // tideControlThread.setName("TideControlBridge");
105        // tideControlThread.run();
106        // }
107    
108        private void createProcessList() {
109            processList = new ProcessList(manager);
110            debugTool.addDebugToolListener(processList);
111        }
112    
113        private Properties loadProperties() throws IOException {
114            String resource = "/resources/tide-defaults.properties";
115            InputStream stream = getClass().getResourceAsStream(resource);
116    
117            Properties defaults = new Properties();
118            defaults.load(stream);
119            return defaults;
120        }
121    
122        private void createTools(Properties defaults) {
123            manager = new ToolManager(studio, defaults);
124    
125            manager.registerProcessTool(new RuleInspectorFactory(manager));
126            manager.registerProcessTool(new SourceViewerFactory(manager));
127            manager.registerProcessTool(new StackViewerFactory(manager));
128    
129            manager.registerTool(new PreferencesEditorFactory(manager));
130        }
131    
132        public void recTerminate(ATerm arg) {
133            bridge.stopRunning();
134            //debugTool.stopRunning();
135            plugin.closeTide();
136        }
137    
138        public void loadPreferences() {
139            JFileChooser chooser = new JFileChooser();
140            chooser.setSelectedFile(new File(PreferenceSet.PREFS_FILE));
141            int option = chooser.showOpenDialog(this);
142            if (option == JFileChooser.APPROVE_OPTION) {
143                File file = chooser.getSelectedFile();
144                if (file != null) {
145                    try {
146                        InputStream stream = new FileInputStream(file);
147                        manager.getPreferences().loadPreferences(stream);
148                    } catch (IOException e) {
149                        JOptionPane
150                                .showInternalMessageDialog(desktop,
151                                        "Could not load preferences: "
152                                                + e.getMessage(),
153                                        "Preferences Load Error",
154                                        JOptionPane.ERROR_MESSAGE);
155                    }
156                }
157            }
158        }
159    
160        public void savePreferences() {
161            JFileChooser chooser = new JFileChooser();
162            chooser.setSelectedFile(new File(PreferenceSet.PREFS_FILE));
163            int option = chooser.showSaveDialog(this);
164            if (option == JFileChooser.APPROVE_OPTION) {
165                File file = chooser.getSelectedFile();
166                if (file != null) {
167                    try {
168                        OutputStream stream = new FileOutputStream(file);
169                        manager.getPreferences().savePreferences(stream);
170                    } catch (IOException e) {
171                        JOptionPane
172                                .showInternalMessageDialog(desktop,
173                                        "Could not save preferences: "
174                                                + e.getMessage(),
175                                        "Preferences Save Error",
176                                        JOptionPane.ERROR_MESSAGE);
177                    }
178                }
179            }
180        }
181    
182        public static ATermFactory getFactory() {
183            return factory;
184        }
185    
186        public TideControlBridge getBridge() {
187            return bridge;
188        }
189    
190        public ToolManager getManager() {
191            return manager;
192        }
193    
194        public void postEvent(ATerm term) {
195            getBridge().postEvent(term);
196        }
197    
198        public void addDebugToolListener(DebugToolListener l) {
199            debugTool.addDebugToolListener(l);
200        }
201    
202        public void run() {
203            bridge.run();
204        }
205    }