1 21 22 25 package net.sf.launch4j.formimpl; 26 27 import java.awt.BorderLayout ; 28 import java.awt.Dimension ; 29 import java.awt.Toolkit ; 30 import java.awt.event.ActionEvent ; 31 import java.awt.event.ActionListener ; 32 import java.awt.event.WindowAdapter ; 33 import java.awt.event.WindowEvent ; 34 import java.io.File ; 35 36 import javax.swing.ImageIcon ; 37 import javax.swing.JButton ; 38 import javax.swing.JFileChooser ; 39 import javax.swing.JFrame ; 40 import javax.swing.JOptionPane ; 41 import javax.swing.JToolBar ; 42 import javax.swing.UIManager ; 43 44 import com.jgoodies.looks.Options; 45 import com.jgoodies.looks.plastic.PlasticXPLookAndFeel; 46 47 import foxtrot.Task; 48 import foxtrot.Worker; 49 50 import net.sf.launch4j.Builder; 51 import net.sf.launch4j.BuilderException; 52 import net.sf.launch4j.ExecException; 53 import net.sf.launch4j.FileChooserFilter; 54 import net.sf.launch4j.Log; 55 import net.sf.launch4j.Main; 56 import net.sf.launch4j.Util; 57 import net.sf.launch4j.binding.Binding; 58 import net.sf.launch4j.binding.BindingException; 59 import net.sf.launch4j.binding.InvariantViolationException; 60 import net.sf.launch4j.config.Config; 61 import net.sf.launch4j.config.ConfigPersister; 62 import net.sf.launch4j.config.ConfigPersisterException; 63 64 67 public class MainFrame extends JFrame { 68 private static MainFrame _instance; 69 70 private final JToolBar _toolBar; 71 private final JButton _runButton; 72 private final ConfigFormImpl _configForm; 73 private final JFileChooser _fileChooser = new FileChooser(MainFrame.class); 74 private File _outfile; 75 private boolean _saved = false; 76 77 public static void createInstance() { 78 try { 79 Toolkit.getDefaultToolkit().setDynamicLayout(true); 80 System.setProperty("sun.awt.noerasebackground","true"); 81 82 Options.setDefaultIconSize(new Dimension (16, 16)); Options.setUseNarrowButtons(false); 85 Options.setPopupDropShadowEnabled(true); 86 87 UIManager.setLookAndFeel(new PlasticXPLookAndFeel()); 88 _instance = new MainFrame(); 89 } catch (Exception e) { 90 System.err.println(e); 91 } 92 } 93 94 public static MainFrame getInstance() { 95 return _instance; 96 } 97 98 public MainFrame() { 99 showConfigName(null); 100 setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 101 addWindowListener(new MainFrameListener()); 102 setGlassPane(new GlassPane(this)); 103 _fileChooser.setFileFilter(new FileChooserFilter( 104 Messages.getString("MainFrame.config.files"), 105 new String [] {".xml", ".cfg"})); 106 107 _toolBar = new JToolBar (); 108 _toolBar.setFloatable(false); 109 _toolBar.setRollover(true); 110 addButton("images/new.png", Messages.getString("MainFrame.new.config"), 111 new NewActionListener()); 112 addButton("images/open.png", Messages.getString("MainFrame.open.config"), 113 new OpenActionListener()); 114 addButton("images/save.png", Messages.getString("MainFrame.save.config"), 115 new SaveActionListener()); 116 _toolBar.addSeparator(); 117 addButton("images/build.png", Messages.getString("MainFrame.build.wrapper"), 118 new BuildActionListener()); 119 _runButton = addButton("images/run.png", 120 Messages.getString("MainFrame.test.wrapper"), 121 new RunActionListener()); 122 setRunEnabled(false); 123 _toolBar.addSeparator(); 124 addButton("images/info.png", Messages.getString("MainFrame.about.launch4j"), 125 new AboutActionListener()); 126 127 _configForm = new ConfigFormImpl(); 128 getContentPane().setLayout(new BorderLayout ()); 129 getContentPane().add(_toolBar, BorderLayout.NORTH); 130 getContentPane().add(_configForm, BorderLayout.CENTER); 131 pack(); 132 Dimension scr = Toolkit.getDefaultToolkit().getScreenSize(); 133 Dimension fr = getSize(); 134 fr.height += 100; 135 setBounds((scr.width - fr.width) / 2, (scr.height - fr.height) / 2, 136 fr.width, fr.height); 137 setVisible(true); 138 } 139 140 private JButton addButton(String iconPath, String tooltip, ActionListener l) { 141 ImageIcon icon = new ImageIcon (MainFrame.class.getClassLoader() 142 .getResource(iconPath)); 143 JButton b = new JButton (icon); 144 b.setToolTipText(tooltip); 145 b.addActionListener(l); 146 _toolBar.add(b); 147 return b; 148 } 149 150 public void info(String text) { 151 JOptionPane.showMessageDialog(this, 152 text, 153 Main.getName(), 154 JOptionPane.INFORMATION_MESSAGE); 155 } 156 157 public void warn(String text) { 158 JOptionPane.showMessageDialog(this, 159 text, 160 Main.getName(), 161 JOptionPane.WARNING_MESSAGE); 162 } 163 164 public void warn(InvariantViolationException e) { 165 Binding b = e.getBinding(); 166 if (b != null) { 167 b.markInvalid(); 168 } 169 warn(e.getMessage()); 170 if (b != null) { 171 e.getBinding().markValid(); 172 } 173 } 174 175 public boolean confirm(String text) { 176 return JOptionPane.showConfirmDialog(MainFrame.this, 177 text, 178 Messages.getString("MainFrame.confirm"), 179 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; 180 } 181 182 private boolean isModified() { 183 return (!_configForm.isModified()) 184 || confirm(Messages.getString("MainFrame.discard.changes")); 185 } 186 187 private boolean save() { 188 try { 190 _configForm.get(ConfigPersister.getInstance().getConfig()); 191 if (_fileChooser.showSaveDialog(MainFrame.this) == JOptionPane.YES_OPTION) { 192 File f = _fileChooser.getSelectedFile(); 193 if (!f.getPath().endsWith(".xml")) { 194 f = new File (f.getPath() + ".xml"); 195 } 196 ConfigPersister.getInstance().save(f); 197 _saved = true; 198 showConfigName(f); 199 return true; 200 } 201 return false; 202 } catch (InvariantViolationException ex) { 203 warn(ex); 204 return false; 205 } catch (BindingException ex) { 206 warn(ex.getMessage()); 207 return false; 208 } catch (ConfigPersisterException ex) { 209 warn(ex.getMessage()); 210 return false; 211 } 212 } 213 214 private void showConfigName(File config) { 215 setTitle(Main.getName() + " - " + (config != null ? config.getName() 216 : Messages.getString("MainFrame.untitled"))); 217 } 218 219 private void setRunEnabled(boolean enabled) { 220 if (!enabled) { 221 _outfile = null; 222 } 223 _runButton.setEnabled(enabled); 224 } 225 226 private void clearConfig() { 227 ConfigPersister.getInstance().createBlank(); 228 _configForm.clear(ConfigPersister.getInstance().getConfig()); 229 } 230 231 private class MainFrameListener extends WindowAdapter { 232 public void windowOpened(WindowEvent e) { 233 clearConfig(); 234 } 235 236 public void windowClosing(WindowEvent e) { 237 if (isModified()) { 238 System.exit(0); 239 } 240 } 241 } 242 243 private class NewActionListener implements ActionListener { 244 public void actionPerformed(ActionEvent e) { 245 if (isModified()) { 246 clearConfig(); 247 } 248 _saved = false; 249 showConfigName(null); 250 setRunEnabled(false); 251 } 252 } 253 254 private class OpenActionListener implements ActionListener { 255 public void actionPerformed(ActionEvent e) { 256 try { 257 if (isModified() && _fileChooser.showOpenDialog(MainFrame.this) 258 == JOptionPane.YES_OPTION) { 259 final File f = _fileChooser.getSelectedFile(); 260 if (f.getPath().endsWith(".xml")) { 261 ConfigPersister.getInstance().load(f); 262 _saved = true; 263 } else { 264 ConfigPersister.getInstance().loadVersion1(f); 265 _saved = false; 266 } 267 _configForm.put(ConfigPersister.getInstance().getConfig()); 268 showConfigName(f); 269 setRunEnabled(false); 270 } 271 } catch (ConfigPersisterException ex) { 272 warn(ex.getMessage()); 273 } 274 } 275 } 276 277 private class SaveActionListener implements ActionListener { 278 public void actionPerformed(ActionEvent e) { 279 save(); 280 } 281 } 282 283 private class BuildActionListener implements ActionListener { 284 public void actionPerformed(ActionEvent e) { 285 final Log log = Log.getSwingLog(_configForm.getLogTextArea()); 286 try { 287 if ((!_saved || _configForm.isModified()) 288 && !save()) { 289 return; 290 } 291 log.clear(); 292 ConfigPersister.getInstance().getConfig().checkInvariants(); 293 Builder b = new Builder(log); 294 _outfile = b.build(); 295 setRunEnabled(ConfigPersister.getInstance().getConfig() 296 .getHeaderType() == Config.GUI_HEADER && (Util.WINDOWS_OS || !ConfigPersister.getInstance() 298 .getConfig().isDontWrapJar())); 299 } catch (InvariantViolationException ex) { 300 setRunEnabled(false); 301 ex.setBinding(_configForm.getBinding(ex.getProperty())); 302 warn(ex); 303 } catch (BuilderException ex) { 304 setRunEnabled(false); 305 log.append(ex.getMessage()); 306 } 307 } 308 } 309 310 private class RunActionListener implements ActionListener { 311 public void actionPerformed(ActionEvent e) { 312 try { 313 getGlassPane().setVisible(true); 314 Worker.post(new Task() { 315 public Object run() throws ExecException { 316 Log log = Log.getSwingLog(_configForm.getLogTextArea()); 317 log.clear(); 318 String path = _outfile.getPath(); 319 if (Util.WINDOWS_OS) { 320 log.append(Messages.getString("MainFrame.executing") + path); 321 Util.exec(path, log); 322 } else { 323 log.append(Messages.getString("MainFrame.jar.integrity.test") 324 + path); 325 Util.exec("java -jar " + path, log); 326 } 327 return null; 328 } 329 }); 330 } catch (Exception ex) { 331 } finally { 333 getGlassPane().setVisible(false); 334 } 335 }; 336 } 337 338 private class AboutActionListener implements ActionListener { 339 public void actionPerformed(ActionEvent e) { 340 info(Main.getDescription() 341 + "The following projects are used by launch4j...\n\n" 342 + "MinGW binutils (http://www.mingw.org/)\n" 343 + "Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/)\n" 344 + "Commons Logging (http://jakarta.apache.org/commons/logging/)\n" 345 + "XStream (http://xstream.codehaus.org/)\n" 346 + "JGoodies Forms (http://www.jgoodies.com/freeware/forms/)\n" 347 + "JGoodies Looks (http://www.jgoodies.com/freeware/looks/)\n" 348 + "Foxtrot (http://foxtrot.sourceforge.net/)\n" 349 + "Nuvola Icon Theme (http://www.icon-king.com)"); 350 } 351 } 352 } 353 | Popular Tags |