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 }