KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > launch4j > formimpl > MainFrame


1 /*
2     Launch4j (http://launch4j.sourceforge.net/)
3     Cross-platform Java application wrapper for creating Windows native executables.
4
5     Copyright (C) 2004, 2006 Grzegorz Kowal
6
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */

21
22 /*
23  * Created on 2005-05-09
24  */

25 package net.sf.launch4j.formimpl;
26
27 import java.awt.BorderLayout JavaDoc;
28 import java.awt.Dimension JavaDoc;
29 import java.awt.Toolkit JavaDoc;
30 import java.awt.event.ActionEvent JavaDoc;
31 import java.awt.event.ActionListener JavaDoc;
32 import java.awt.event.WindowAdapter JavaDoc;
33 import java.awt.event.WindowEvent JavaDoc;
34 import java.io.File JavaDoc;
35
36 import javax.swing.ImageIcon JavaDoc;
37 import javax.swing.JButton JavaDoc;
38 import javax.swing.JFileChooser JavaDoc;
39 import javax.swing.JFrame JavaDoc;
40 import javax.swing.JOptionPane JavaDoc;
41 import javax.swing.JToolBar JavaDoc;
42 import javax.swing.UIManager JavaDoc;
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 /**
65  * @author Copyright (C) 2005 Grzegorz Kowal
66  */

67 public class MainFrame extends JFrame JavaDoc {
68     private static MainFrame _instance;
69
70     private final JToolBar JavaDoc _toolBar;
71     private final JButton JavaDoc _runButton;
72     private final ConfigFormImpl _configForm;
73     private final JFileChooser JavaDoc _fileChooser = new FileChooser(MainFrame.class);
74     private File JavaDoc _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             // JGoodies
83
Options.setDefaultIconSize(new Dimension JavaDoc(16, 16)); // menu icons
84
Options.setUseNarrowButtons(false);
85             Options.setPopupDropShadowEnabled(true);
86
87             UIManager.setLookAndFeel(new PlasticXPLookAndFeel());
88             _instance = new MainFrame();
89         } catch (Exception JavaDoc 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 JavaDoc[] {".xml", ".cfg"}));
106
107         _toolBar = new JToolBar JavaDoc();
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 JavaDoc());
129         getContentPane().add(_toolBar, BorderLayout.NORTH);
130         getContentPane().add(_configForm, BorderLayout.CENTER);
131         pack();
132         Dimension JavaDoc scr = Toolkit.getDefaultToolkit().getScreenSize();
133         Dimension JavaDoc 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 JavaDoc addButton(String JavaDoc iconPath, String JavaDoc tooltip, ActionListener JavaDoc l) {
141         ImageIcon JavaDoc icon = new ImageIcon JavaDoc(MainFrame.class.getClassLoader()
142                 .getResource(iconPath));
143         JButton JavaDoc b = new JButton JavaDoc(icon);
144         b.setToolTipText(tooltip);
145         b.addActionListener(l);
146         _toolBar.add(b);
147         return b;
148     }
149     
150     public void info(String JavaDoc text) {
151         JOptionPane.showMessageDialog(this,
152                                     text,
153                                     Main.getName(),
154                                     JOptionPane.INFORMATION_MESSAGE);
155     }
156
157     public void warn(String JavaDoc 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 JavaDoc 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         // XXX
189
try {
190             _configForm.get(ConfigPersister.getInstance().getConfig());
191             if (_fileChooser.showSaveDialog(MainFrame.this) == JOptionPane.YES_OPTION) {
192                 File JavaDoc f = _fileChooser.getSelectedFile();
193                 if (!f.getPath().endsWith(".xml")) {
194                     f = new File JavaDoc(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 JavaDoc 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 JavaDoc {
232         public void windowOpened(WindowEvent JavaDoc e) {
233             clearConfig();
234         }
235
236         public void windowClosing(WindowEvent JavaDoc e) {
237             if (isModified()) {
238                 System.exit(0);
239             }
240         }
241     }
242
243     private class NewActionListener implements ActionListener JavaDoc {
244         public void actionPerformed(ActionEvent JavaDoc 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 JavaDoc {
255         public void actionPerformed(ActionEvent JavaDoc e) {
256             try {
257                 if (isModified() && _fileChooser.showOpenDialog(MainFrame.this)
258                                     == JOptionPane.YES_OPTION) {
259                     final File JavaDoc 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 JavaDoc {
278         public void actionPerformed(ActionEvent JavaDoc e) {
279             save();
280         }
281     }
282     
283     private class BuildActionListener implements ActionListener JavaDoc {
284         public void actionPerformed(ActionEvent JavaDoc 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 // TODO fix console app test
297
&& (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 JavaDoc {
311         public void actionPerformed(ActionEvent JavaDoc e) {
312             try {
313                 getGlassPane().setVisible(true);
314                 Worker.post(new Task() {
315                     public Object JavaDoc run() throws ExecException {
316                         Log log = Log.getSwingLog(_configForm.getLogTextArea());
317                         log.clear();
318                         String JavaDoc 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 JavaDoc ex) {
331                 // XXX errors logged by exec
332
} finally {
333                 getGlassPane().setVisible(false);
334             }
335         };
336     }
337
338     private class AboutActionListener implements ActionListener JavaDoc {
339         public void actionPerformed(ActionEvent JavaDoc 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