2 Launch4j (http://launch4j.sourceforge.net/)
3 Cross-platform Java application wrapper for creating Windows native executables.
5 Copyright (C) 2004, 2006 Grzegorz Kowal
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.
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.
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
23 * Created on May 10, 2005
25 package net.sf.launch4j.formimpl;
27 import java.awt.Color;
28 import java.awt.event.ActionEvent;
29 import java.awt.event.ActionListener;
32 import javax.swing.JFileChooser;
33 import javax.swing.JRadioButton;
34 import javax.swing.JTextArea;
35 import javax.swing.JTextField;
36 import javax.swing.event.ChangeEvent;
37 import javax.swing.event.ChangeListener;
39 import net.sf.launch4j.FileChooserFilter;
40 import net.sf.launch4j.binding.Binding;
41 import net.sf.launch4j.binding.Bindings;
42 import net.sf.launch4j.binding.IValidatable;
43 import net.sf.launch4j.binding.Validator;
44 import net.sf.launch4j.config.Config;
45 import net.sf.launch4j.config.ConfigPersister;
46 import net.sf.launch4j.config.Splash;
47 import net.sf.launch4j.config.VersionInfo;
48 import net.sf.launch4j.form.ConfigForm;
51 * @author Copyright (C) 2005 Grzegorz Kowal
53 public class ConfigFormImpl extends ConfigForm {
54 private final JFileChooser _fileChooser = new JFileChooser();
55 private final Bindings _bindings = new Bindings();
57 public ConfigFormImpl() {
58 _tab.setTitleAt(0, Messages.getString("tab.basic"));
59 _tab.setTitleAt(1, Messages.getString("tab.header"));
60 _tab.setTitleAt(2, Messages.getString("tab.jre"));
61 _tab.setTitleAt(3, Messages.getString("tab.splash"));
62 _tab.setTitleAt(4, Messages.getString("tab.version"));
64 _logSeparator.setText(Messages.getString("log"));
65 _outfileLabel.setText(Messages.getString("outfile"));
66 _outfileField.setToolTipText(Messages.getString("outfileTip"));
67 _errorTitleLabel.setText(Messages.getString("errorTitle"));
68 _errorTitleField.setToolTipText(Messages.getString("errorTitleTip"));
69 _customProcNameCheck.setText(Messages.getString("customProcName"));
70 _stayAliveCheck.setText(Messages.getString("stayAlive"));
71 _iconLabel.setText(Messages.getString("icon"));
72 _iconField.setToolTipText(Messages.getString("iconTip"));
73 _jarLabel.setText(Messages.getString("jar"));
74 _jarField.setToolTipText(Messages.getString("jarTip"));
75 _dontWrapJarCheck.setText(Messages.getString("dontWrapJar"));
76 _jarArgsLabel.setText(Messages.getString("jarArgs"));
77 _jarArgsField.setToolTipText(Messages.getString("jarArgsTip"));
78 _optionsLabel.setText(Messages.getString("options"));
79 _chdirLabel.setText(Messages.getString("chdir"));
80 _chdirField.setToolTipText(Messages.getString("chdirTip"));
82 _headerTypeLabel.setText(Messages.getString("headerType"));
83 _guiHeaderRadio.setText(Messages.getString("gui"));
84 _consoleHeaderRadio.setText(Messages.getString("console"));
85 _headerObjectsCheck.setText(Messages.getString("objectFiles"));
86 _libsCheck.setText(Messages.getString("libs"));
87 _linkerOptionsSeparator.setText(Messages.getString("linkerOptions"));
88 _jrePathLabel.setText(Messages.getString("jrePath"));
89 _jrePathField.setToolTipText(Messages.getString("jrePathTip"));
90 _jreMinLabel.setText(Messages.getString("jreMin"));
91 _jreMaxLabel.setText(Messages.getString("jreMax"));
92 _jvmArgsTextLabel.setText(Messages.getString("jvmArgs"));
93 _jvmArgsTextArea.setToolTipText(Messages.getString("jvmArgsTip"));
94 _initialHeapSizeLabel.setText(Messages.getString("initialHeapSize"));
95 _maxHeapSizeLabel.setText(Messages.getString("maxHeapSize"));
96 _addVarsLabel.setText(Messages.getString("addVariables"));
97 _addVarsLabel.setToolTipText(Messages.getString("addVariablesTip"));
98 _exeDirRadio.setToolTipText(Messages.getString("exeDirVarTip"));
99 _exeFileRadio.setToolTipText(Messages.getString("exeFileVarTip"));
100 _otherVarRadio.setText(Messages.getString("other"));
101 _otherVarRadio.setToolTipText(Messages.getString("otherTip"));
102 _otherVarField.setToolTipText(Messages.getString("otherVarTip"));
103 _addVarButton.setText(Messages.getString("add"));
104 _addVarButton.setToolTipText(Messages.getString("addVariablesTip"));
106 _splashCheck.setText(Messages.getString("enableSplash"));
107 _splashFileLabel.setText(Messages.getString("splashFile"));
108 _splashFileField.setToolTipText(Messages.getString("splashFileTip"));
109 _waitForWindowLabel.setText(Messages.getString("waitForWindow"));
110 _waitForWindowCheck.setText(Messages.getString("waitForWindowText"));
111 _timeoutLabel.setText(Messages.getString("timeout"));
112 _timeoutField.setToolTipText(Messages.getString("timeoutTip"));
113 _timeoutErrCheck.setText(Messages.getString("timeoutErr"));
114 _timeoutErrCheck.setToolTipText(Messages.getString("timeoutErrTip"));
116 _versionInfoCheck.setText(Messages.getString("addVersionInfo"));
117 _fileVersionLabel.setText(Messages.getString("fileVersion"));
118 _fileVersionField.setToolTipText(Messages.getString("fileVersionTip"));
119 _addVersionInfoSeparator.setText(Messages.getString("additionalInfo"));
120 _productVersionLabel.setText(Messages.getString("productVersion"));
121 _productVersionField.setToolTipText(Messages.getString("productVersionTip"));
122 _fileDescriptionLabel.setText(Messages.getString("fileDescription"));
123 _fileDescriptionField.setToolTipText(Messages.getString("fileDescriptionTip"));
124 _copyrightLabel.setText(Messages.getString("copyright"));
125 _txtFileVersionLabel.setText(Messages.getString("txtFileVersion"));
126 _txtFileVersionField.setToolTipText(Messages.getString("txtFileVersionTip"));
127 _txtProductVersionLabel.setText(Messages.getString("txtProductVersion"));
128 _txtProductVersionField.setToolTipText(Messages.getString("txtProductVersionTip"));
129 _productNameLabel.setText(Messages.getString("productName"));
130 _originalFilenameLabel.setText(Messages.getString("originalFilename"));
131 _originalFilenameField.setToolTipText(Messages.getString("originalFilenameTip"));
132 _internalNameLabel.setText(Messages.getString("internalName"));
133 _internalNameField.setToolTipText(Messages.getString("internalNameTip"));
134 _companyNameLabel.setText(Messages.getString("companyName"));
136 _dontWrapJarCheck.addChangeListener(new DontWrapJarChangeListener());
138 _outfileButton.addActionListener(new BrowseActionListener(
139 _outfileField, new FileChooserFilter("Windows executables (.exe)", ".exe")));
140 _jarButton.addActionListener(new BrowseActionListener(
141 _jarField, new FileChooserFilter("Jar files", ".jar")));
142 _iconButton.addActionListener(new BrowseActionListener(
143 _iconField, new FileChooserFilter("Icon files (.ico)", ".ico")));
144 _splashFileButton.addActionListener(new BrowseActionListener(
145 _splashFileField, new FileChooserFilter("Bitmap files (.bmp)", ".bmp")));
147 ActionListener al = new VariableActionListener();
148 _exeDirRadio.addActionListener(al);
149 _exeFileRadio.addActionListener(al);
150 _otherVarRadio.addActionListener(al);
151 _exeDirRadio.setSelected(true);
152 al.actionPerformed(null);
153 _addVarButton.addActionListener(new AddVariableActionListener());
155 _guiHeaderRadio.addChangeListener(new HeaderTypeChangeListener());
156 _headerObjectsCheck.addActionListener(new HeaderObjectsActionListener());
157 _libsCheck.addActionListener(new LibsActionListener());
159 _bindings.add("outfile", _outfileField)
160 .add("dontWrapJar", _dontWrapJarCheck)
161 .add("jar", _jarField)
162 .add("icon", _iconField)
163 .add("jarArgs", _jarArgsField)
164 .add("errTitle", _errorTitleField)
165 .add("chdir", _chdirField)
166 .add("customProcName", _customProcNameCheck)
167 .add("stayAlive", _stayAliveCheck)
168 .add("headerType", new JRadioButton[] {_guiHeaderRadio, _consoleHeaderRadio})
169 .add("headerObjects", "customHeaderObjects", _headerObjectsCheck, _headerObjectsTextArea)
170 .add("libs", "customLibs", _libsCheck, _libsTextArea)
171 .add("jre.path", _jrePathField)
172 .add("jre.minVersion", _jreMinField)
173 .add("jre.maxVersion", _jreMaxField)
174 .add("jre.initialHeapSize", _initialHeapSizeField)
175 .add("jre.maxHeapSize", _maxHeapSizeField)
176 .add("jre.args", _jvmArgsTextArea)
177 .addOptComponent("splash", Splash.class, _splashCheck)
178 .add("splash.file", _splashFileField)
179 .add("splash.waitForWindow", _waitForWindowCheck, true)
180 .add("splash.timeout", _timeoutField, "60")
181 .add("splash.timeoutErr", _timeoutErrCheck, true)
182 .addOptComponent("versionInfo", VersionInfo.class, _versionInfoCheck)
183 .add("versionInfo.fileVersion", _fileVersionField)
184 .add("versionInfo.productVersion", _productVersionField)
185 .add("versionInfo.fileDescription", _fileDescriptionField)
186 .add("versionInfo.internalName", _internalNameField)
187 .add("versionInfo.originalFilename", _originalFilenameField)
188 .add("versionInfo.productName", _productNameField)
189 .add("versionInfo.txtFileVersion", _txtFileVersionField)
190 .add("versionInfo.txtProductVersion", _txtProductVersionField)
191 .add("versionInfo.companyName", _companyNameField)
192 .add("versionInfo.copyright", _copyrightField);
195 private class DontWrapJarChangeListener implements ChangeListener {
196 public void stateChanged(ChangeEvent e) {
197 boolean dontWrap = _dontWrapJarCheck.isSelected();
198 _jarLabel.setText(dontWrap ? Messages.getString("jarPath")
199 : Messages.getString("jar"));
200 _jarField.setToolTipText(dontWrap ? Messages.getString("jarPathTip")
201 : Messages.getString("jarTip"));
202 _jarButton.setEnabled(!dontWrap);
206 private class BrowseActionListener implements ActionListener {
207 private final JTextField _field;
208 private final FileChooserFilter _filter;
210 public BrowseActionListener(JTextField field, FileChooserFilter filter) {
215 public void actionPerformed(ActionEvent e) {
216 if (!_field.isEnabled()) {
219 _fileChooser.setFileFilter(_filter);
220 _fileChooser.setSelectedFile(new File(""));
221 int result = _field.equals(_outfileField)
222 ? _fileChooser.showSaveDialog(MainFrame.getInstance())
223 : _fileChooser.showOpenDialog(MainFrame.getInstance());
224 if (result == JFileChooser.APPROVE_OPTION) {
225 _field.setText(_fileChooser.getSelectedFile().getPath());
230 private class HeaderTypeChangeListener implements ChangeListener {
231 public void stateChanged(ChangeEvent e) {
232 Config c = ConfigPersister.getInstance().getConfig();
233 c.setHeaderType(_guiHeaderRadio.isSelected() ? Config.GUI_HEADER : Config.CONSOLE_HEADER);
234 if (!_headerObjectsCheck.isSelected()) {
235 Binding b = getBinding("headerObjects");
241 private class HeaderObjectsActionListener implements ActionListener {
242 public void actionPerformed(ActionEvent e) {
243 if (!_headerObjectsCheck.isSelected()) {
244 ConfigPersister.getInstance().getConfig().setHeaderObjects(null);
245 Binding b = getBinding("headerObjects");
246 b.put(ConfigPersister.getInstance().getConfig());
251 private class LibsActionListener implements ActionListener {
252 public void actionPerformed(ActionEvent e) {
253 if (!_libsCheck.isSelected()) {
254 ConfigPersister.getInstance().getConfig().setLibs(null);
255 Binding b = getBinding("libs");
256 b.put(ConfigPersister.getInstance().getConfig());
261 private class VariableActionListener implements ActionListener {
262 public void actionPerformed(ActionEvent e) {
263 _otherVarField.setEnabled(_otherVarRadio.isSelected());
267 private class AddVariableActionListener implements ActionListener {
268 private final Color _validColor = _otherVarField.getBackground();
270 public void actionPerformed(ActionEvent e) {
271 final int pos = _jvmArgsTextArea.getCaretPosition();
272 if (_exeDirRadio.isSelected()) {
273 _jvmArgsTextArea.insert("-Dlaunch4j.exedir=\"%EXEDIR%\"\n", pos);
274 } else if (_exeFileRadio.isSelected()) {
275 _jvmArgsTextArea.insert("-Dlaunch4j.exefile=\"%EXEFILE%\"\n", pos);
277 final String var = _otherVarField.getText()
278 .replaceAll("\"", "")
279 .replaceAll("%", "");
280 if (Validator.isEmpty(var)) {
281 signalViolation("specifyVar");
284 final String prop = var.replaceAll(" ", ".")
285 .replaceAll("_", ".")
287 _jvmArgsTextArea.insert("-Denv." + prop + "=\"%" + var + "%\"\n", pos);
291 private void signalViolation(String code) {
292 _otherVarField.setBackground(Binding.INVALID_COLOR);
293 MainFrame.getInstance().warn(Messages.getString(code));
294 _otherVarField.setBackground(_validColor);
295 _otherVarField.requestFocusInWindow();
299 public void clear(IValidatable bean) {
300 _bindings.clear(bean);
303 public void put(IValidatable bean) {
307 public void get(IValidatable bean) {
311 public boolean isModified() {
312 return _bindings.isModified();
315 public JTextArea getLogTextArea() {
319 public Binding getBinding(String property) {
320 return _bindings.getBinding(property);