From 5eaf884b88377d14faa1df7aa570d5b84bf81426 Mon Sep 17 00:00:00 2001 From: Matt Jenkins Date: Sun, 7 Apr 2024 16:04:02 +0100 Subject: [PATCH] Updated launch4j --- launch4j/.classpath | 35 +- launch4j/.gitignore | 2 - launch4j/.project | 34 +- .../org.eclipse.core.resources.prefs | 4 +- .../.settings/org.eclipse.core.runtime.prefs | 4 +- launch4j/.settings/org.eclipse.jdt.core.prefs | 198 ++- launch4j/.settings/org.eclipse.m2e.core.prefs | 4 + launch4j/.vscode/c_cpp_properties.json | 21 + launch4j/.vscode/tasks.json | 17 + launch4j/LICENSE.txt | 58 +- launch4j/build.xml | 154 +- launch4j/demo/ConsoleApp/.gitignore | 1 - launch4j/demo/ConsoleApp/ConsoleApp.jar | 4 +- launch4j/demo/ConsoleApp/build.xml | 114 +- .../net/sf/launch4j/example/ConsoleApp.java | 144 +- launch4j/demo/ExitCodeApp/.gitignore | 2 - launch4j/demo/ExitCodeApp/pom.xml | 147 +- launch4j/demo/LICENSE.txt | 60 +- launch4j/demo/SimpleApp/.gitignore | 1 - launch4j/demo/SimpleApp/SimpleApp.jar | 4 +- launch4j/demo/SimpleApp/build.xml | 104 +- launch4j/demo/SimpleApp/l4j/SimpleApp.xml | 37 +- .../net/sf/launch4j/example/SimpleApp.java | 390 ++--- launch4j/head/LICENSE.txt | 50 +- launch4j/head/consolehead.o | Bin 1528 -> 1796 bytes launch4j/head/guihead.o | Bin 5311 -> 5335 bytes launch4j/head/head.o | Bin 27792 -> 27178 bytes launch4j/head_jni_BETA/LICENSE.txt | 50 +- launch4j/head_jni_BETA/head.o | Bin 23327 -> 27178 bytes launch4j/head_jni_BETA/jniconsolehead.o | Bin 2015 -> 2023 bytes launch4j/head_jni_BETA/jniguihead.o | Bin 5580 -> 5588 bytes launch4j/head_src/LICENSE.txt | 52 +- launch4j/head_src/consolehead/.gitignore | 2 - launch4j/head_src/consolehead/Makefile.win | 32 +- launch4j/head_src/consolehead/consolehead.c | 194 +-- launch4j/head_src/consolehead/consolehead.dev | 11 +- launch4j/head_src/guihead/.gitignore | 2 - launch4j/head_src/guihead/Makefile.win | 32 +- launch4j/head_src/guihead/guihead.c | 482 +++--- launch4j/head_src/guihead/guihead.dev | 11 +- launch4j/head_src/guihead/guihead.h | 88 +- launch4j/head_src/head.c | 427 +++-- launch4j/head_src/head.h | 40 +- .../head_src/jniconsolehead_BETA/.gitignore | 2 - .../head_src/jniconsolehead_BETA/Makefile.win | 6 +- .../jniconsolehead_BETA/jniconsolehead.c | 2 +- .../jniconsolehead_BETA/jniconsolehead.dev | 2 +- launch4j/head_src/jniguihead_BETA/.gitignore | 2 - .../head_src/jniguihead_BETA/Makefile.win | 6 +- .../head_src/jniguihead_BETA/jniguihead.c | 2 +- .../head_src/jniguihead_BETA/jniguihead.dev | 2 +- .../head_src/jniguihead_BETA/jniguihead.h | 86 +- launch4j/head_src/makefile | 13 + launch4j/head_src/resource.h | 147 +- launch4j/launch4j | 14 +- launch4j/launch4j.jar | 4 +- launch4j/launch4jc | 8 + launch4j/lib/JGoodies.Looks.LICENSE.txt | 31 - launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt | 1008 ++++++------ launch4j/lib/XStream.LICENSE.txt | 55 +- launch4j/lib/ant.LICENSE.txt | 402 ++--- launch4j/lib/ant.jar | 4 +- launch4j/lib/commons-beanutils.jar | 4 +- launch4j/lib/commons.LICENSE.txt | 250 ++- launch4j/lib/flatlaf.LICENSE.txt | 201 +++ launch4j/lib/flatlaf.jar | 3 + launch4j/lib/foxtrot.LICENSE.txt | 25 - launch4j/lib/foxtrot.jar | 3 - launch4j/lib/jgoodies-looks.jar | 3 - launch4j/lib/xstream.jar | 4 +- launch4j/manifest/uac.exe.manifest | 22 +- launch4j/maven/.classpath | 48 +- launch4j/maven/assembly/assemble-dist.xml | 26 +- launch4j/maven/assembly/assemble-linux.xml | 106 +- launch4j/maven/assembly/assemble-linux64.xml | 106 +- launch4j/maven/assembly/assemble-mac.xml | 106 +- launch4j/maven/assembly/assemble-win32.xml | 106 +- launch4j/maven/assembly/src.xml | 110 +- launch4j/maven/maven-readme.txt | 16 +- launch4j/maven/pom.xml | 45 +- launch4j/sign4j/README.txt | 18 - launch4j/sign4j/sign4j.c | 259 --- launch4j/src/LICENSE.txt | 58 +- launch4j/src/launch4j.properties | 4 +- launch4j/src/net/sf/launch4j/Builder.java | 434 ++--- .../src/net/sf/launch4j/BuilderException.java | 104 +- .../src/net/sf/launch4j/ExecException.java | 132 +- .../net/sf/launch4j/FileChooserFilter.java | 152 +- .../sf/launch4j/KanjiEscapeOutputStream.java | 172 +- launch4j/src/net/sf/launch4j/Log.java | 210 +-- launch4j/src/net/sf/launch4j/Main.java | 190 +-- launch4j/src/net/sf/launch4j/Messages.java | 156 +- launch4j/src/net/sf/launch4j/RcBuilder.java | 835 +++++----- launch4j/src/net/sf/launch4j/Util.java | 440 ++--- .../src/net/sf/launch4j/ant/AntClassPath.java | 126 +- .../src/net/sf/launch4j/ant/AntConfig.java | 262 +-- launch4j/src/net/sf/launch4j/ant/AntJre.java | 126 +- .../src/net/sf/launch4j/ant/Launch4jTask.java | 324 ++-- .../src/net/sf/launch4j/ant/Messages.java | 110 +- .../net/sf/launch4j/ant/StringWrapper.java | 138 +- .../net/sf/launch4j/ant/messages.properties | 70 +- .../sf/launch4j/ant/messages_es.properties | 35 - .../src/net/sf/launch4j/binding/Binding.java | 124 +- .../sf/launch4j/binding/BindingException.java | 104 +- .../src/net/sf/launch4j/binding/Bindings.java | 666 ++++---- .../net/sf/launch4j/binding/IValidatable.java | 88 +- .../binding/InvariantViolationException.java | 134 +- .../sf/launch4j/binding/JComboBoxBinding.java | 238 +-- .../net/sf/launch4j/binding/JListBinding.java | 243 +-- .../launch4j/binding/JRadioButtonBinding.java | 292 ++-- .../sf/launch4j/binding/JTextAreaBinding.java | 256 +-- .../binding/JTextComponentBinding.java | 216 +-- .../binding/JToggleButtonBinding.java | 216 +-- .../src/net/sf/launch4j/binding/Messages.java | 156 +- .../launch4j/binding/OptComponentBinding.java | 244 +-- .../launch4j/binding/OptJTextAreaBinding.java | 292 ++-- .../net/sf/launch4j/binding/Validator.java | 504 +++--- .../sf/launch4j/binding/messages.properties | 104 +- .../launch4j/binding/messages_es.properties | 51 - .../src/net/sf/launch4j/config/CharsetID.java | 220 +-- .../src/net/sf/launch4j/config/ClassPath.java | 184 +-- .../src/net/sf/launch4j/config/Config.java | 852 +++++----- .../sf/launch4j/config/ConfigPersister.java | 476 +++--- .../config/ConfigPersisterException.java | 102 +- .../net/sf/launch4j/config/Describable.java | 36 +- launch4j/src/net/sf/launch4j/config/Jre.java | 486 +++--- .../net/sf/launch4j/config/JreVersion.java | 248 +-- .../net/sf/launch4j/config/LanguageID.java | 264 +-- .../net/sf/launch4j/config/LdDefaults.java | 225 ++- .../src/net/sf/launch4j/config/Messages.java | 156 +- launch4j/src/net/sf/launch4j/config/Msg.java | 221 ++- .../sf/launch4j/config/SingleInstance.java | 148 +- .../src/net/sf/launch4j/config/Splash.java | 206 +-- .../net/sf/launch4j/config/VersionInfo.java | 394 ++--- .../sf/launch4j/config/messages.properties | 298 ++-- .../sf/launch4j/config/messages_es.properties | 75 - .../src/net/sf/launch4j/form/BasicForm.java | 567 +++---- .../net/sf/launch4j/form/ClassPathForm.java | 387 ++--- .../src/net/sf/launch4j/form/ConfigForm.java | 264 +-- .../sf/launch4j/form/EnvironmentVarsForm.java | 254 +-- .../src/net/sf/launch4j/form/HeaderForm.java | 384 ++--- .../src/net/sf/launch4j/form/JreForm.java | 604 ++++--- .../src/net/sf/launch4j/form/JreForm.jfrm | Bin 20189 -> 19263 bytes .../src/net/sf/launch4j/form/Messages.java | 110 +- .../net/sf/launch4j/form/MessagesForm.java | 366 ++--- .../net/sf/launch4j/form/MessagesForm.jfrm | Bin 9184 -> 9155 bytes .../sf/launch4j/form/SingleInstanceForm.java | 282 ++-- .../src/net/sf/launch4j/form/SplashForm.java | 333 ++-- .../net/sf/launch4j/form/VersionInfoForm.java | 506 +++--- .../net/sf/launch4j/form/messages.properties | 320 ++-- .../sf/launch4j/form/messages_es.properties | 117 -- .../formimpl/AbstractAcceptListener.java | 150 +- .../sf/launch4j/formimpl/BasicFormImpl.java | 201 ++- .../formimpl/BrowseActionListener.java | 158 +- .../launch4j/formimpl/ClassPathFormImpl.java | 444 ++--- .../sf/launch4j/formimpl/ConfigFormImpl.java | 200 +-- .../formimpl/EnvironmentVarsFormImpl.java | 100 +- .../net/sf/launch4j/formimpl/FileChooser.java | 132 +- .../sf/launch4j/formimpl/HeaderFormImpl.java | 234 +-- .../net/sf/launch4j/formimpl/JreFormImpl.java | 336 ++-- .../net/sf/launch4j/formimpl/MainFrame.java | 705 ++++---- .../net/sf/launch4j/formimpl/Messages.java | 110 +- .../launch4j/formimpl/MessagesFormImpl.java | 116 +- .../formimpl/SingleInstanceFormImpl.java | 108 +- .../sf/launch4j/formimpl/SplashFormImpl.java | 122 +- .../formimpl/VersionInfoFormImpl.java | 138 +- .../sf/launch4j/formimpl/messages.properties | 152 +- .../launch4j/formimpl/messages_es.properties | 56 - .../src/net/sf/launch4j/messages.properties | 90 +- .../net/sf/launch4j/messages_es.properties | 44 - launch4j/w32api/MinGW.LICENSE.txt | 50 +- launch4j/w32api/crt2.o | Bin 2195 -> 14751 bytes launch4j/w32api/libadvapi32.a | Bin 410156 -> 411604 bytes launch4j/w32api/libgcc.a | Bin 53694 -> 3130938 bytes launch4j/w32api/libkernel32.a | Bin 655198 -> 1000246 bytes launch4j/w32api/libmingw32.a | Bin 6802 -> 49098 bytes launch4j/{w32api_jni => w32api}/libmingwex.a | Bin launch4j/{w32api_jni => w32api}/libmoldname.a | Bin launch4j/w32api/libmsvcrt.a | Bin 503692 -> 581866 bytes launch4j/w32api/libshell32.a | Bin 141600 -> 147680 bytes launch4j/w32api/libuser32.a | Bin 472426 -> 477726 bytes launch4j/w32api_jni/MinGW.LICENSE.txt | 25 - launch4j/w32api_jni/crt2.o | Bin 14751 -> 0 bytes launch4j/w32api_jni/libadvapi32.a | Bin 411604 -> 0 bytes launch4j/w32api_jni/libgcc.a | Bin 3130938 -> 0 bytes launch4j/w32api_jni/libkernel32.a | Bin 1000246 -> 0 bytes launch4j/w32api_jni/libmingw32.a | Bin 49098 -> 0 bytes launch4j/w32api_jni/libmsvcrt.a | Bin 581866 -> 0 bytes launch4j/w32api_jni/libshell32.a | Bin 147680 -> 0 bytes launch4j/w32api_jni/libuser32.a | Bin 477726 -> 0 bytes launch4j/web/changelog.html | 970 +++++------ launch4j/web/docs.html | 1458 ++++++++--------- launch4j/web/index.html | 252 +-- launch4j/web/links.html | 130 +- .../web/{style.css => style-13112022.css} | 7 +- 195 files changed, 14718 insertions(+), 15130 deletions(-) delete mode 100644 launch4j/.gitignore create mode 100644 launch4j/.settings/org.eclipse.m2e.core.prefs create mode 100644 launch4j/.vscode/c_cpp_properties.json create mode 100644 launch4j/.vscode/tasks.json delete mode 100644 launch4j/demo/ConsoleApp/.gitignore delete mode 100644 launch4j/demo/ExitCodeApp/.gitignore delete mode 100644 launch4j/demo/SimpleApp/.gitignore delete mode 100644 launch4j/head_src/consolehead/.gitignore delete mode 100644 launch4j/head_src/guihead/.gitignore delete mode 100644 launch4j/head_src/jniconsolehead_BETA/.gitignore delete mode 100644 launch4j/head_src/jniguihead_BETA/.gitignore create mode 100644 launch4j/head_src/makefile create mode 100755 launch4j/launch4jc delete mode 100644 launch4j/lib/JGoodies.Looks.LICENSE.txt create mode 100644 launch4j/lib/flatlaf.LICENSE.txt create mode 100644 launch4j/lib/flatlaf.jar delete mode 100644 launch4j/lib/foxtrot.LICENSE.txt delete mode 100644 launch4j/lib/foxtrot.jar delete mode 100644 launch4j/lib/jgoodies-looks.jar delete mode 100644 launch4j/sign4j/README.txt delete mode 100644 launch4j/sign4j/sign4j.c delete mode 100644 launch4j/src/net/sf/launch4j/ant/messages_es.properties delete mode 100644 launch4j/src/net/sf/launch4j/binding/messages_es.properties delete mode 100644 launch4j/src/net/sf/launch4j/config/messages_es.properties delete mode 100644 launch4j/src/net/sf/launch4j/form/messages_es.properties delete mode 100644 launch4j/src/net/sf/launch4j/formimpl/messages_es.properties delete mode 100644 launch4j/src/net/sf/launch4j/messages_es.properties rename launch4j/{w32api_jni => w32api}/libmingwex.a (100%) rename launch4j/{w32api_jni => w32api}/libmoldname.a (100%) delete mode 100644 launch4j/w32api_jni/MinGW.LICENSE.txt delete mode 100644 launch4j/w32api_jni/crt2.o delete mode 100644 launch4j/w32api_jni/libadvapi32.a delete mode 100644 launch4j/w32api_jni/libgcc.a delete mode 100644 launch4j/w32api_jni/libkernel32.a delete mode 100644 launch4j/w32api_jni/libmingw32.a delete mode 100644 launch4j/w32api_jni/libmsvcrt.a delete mode 100644 launch4j/w32api_jni/libshell32.a delete mode 100644 launch4j/w32api_jni/libuser32.a rename launch4j/web/{style.css => style-13112022.css} (91%) diff --git a/launch4j/.classpath b/launch4j/.classpath index 2082e35..e158f9a 100644 --- a/launch4j/.classpath +++ b/launch4j/.classpath @@ -1,18 +1,17 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/launch4j/.gitignore b/launch4j/.gitignore deleted file mode 100644 index c3dca1b..0000000 --- a/launch4j/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -/target diff --git a/launch4j/.project b/launch4j/.project index 0607fa0..1c1309d 100644 --- a/launch4j/.project +++ b/launch4j/.project @@ -1,17 +1,17 @@ - - - launch4j - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - + + + launch4j + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/launch4j/.settings/org.eclipse.core.resources.prefs b/launch4j/.settings/org.eclipse.core.resources.prefs index 99f26c0..4824b80 100644 --- a/launch4j/.settings/org.eclipse.core.resources.prefs +++ b/launch4j/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,2 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/launch4j/.settings/org.eclipse.core.runtime.prefs b/launch4j/.settings/org.eclipse.core.runtime.prefs index 5a0ad22..c522e1f 100644 --- a/launch4j/.settings/org.eclipse.core.runtime.prefs +++ b/launch4j/.settings/org.eclipse.core.runtime.prefs @@ -1,2 +1,2 @@ -eclipse.preferences.version=1 -line.separator=\n +eclipse.preferences.version=1 +line.separator=\n diff --git a/launch4j/.settings/org.eclipse.jdt.core.prefs b/launch4j/.settings/org.eclipse.jdt.core.prefs index c52892e..b37c761 100644 --- a/launch4j/.settings/org.eclipse.jdt.core.prefs +++ b/launch4j/.settings/org.eclipse.jdt.core.prefs @@ -1,81 +1,117 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.6 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/launch4j/.settings/org.eclipse.m2e.core.prefs b/launch4j/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..14b697b --- /dev/null +++ b/launch4j/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/launch4j/.vscode/c_cpp_properties.json b/launch4j/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..6112e5c --- /dev/null +++ b/launch4j/.vscode/c_cpp_properties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**", + "c:\\Program Files (x86)\\Dev-Cpp\\MinGW32\\include\\**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "cStandard": "gnu89", + "cppStandard": "gnu++98", + "intelliSenseMode": "windows-gcc-x86", + "compilerPath": "c:\\Program Files (x86)\\Dev-Cpp\\MinGW32\\bin\\gcc.exe" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/launch4j/.vscode/tasks.json b/launch4j/.vscode/tasks.json new file mode 100644 index 0000000..27bda68 --- /dev/null +++ b/launch4j/.vscode/tasks.json @@ -0,0 +1,17 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "make", + "targetName": "all", + "makeFileRelativePath": "head_src\\makefile", + "problemMatcher": [], + "label": "make: all", + "detail": "./head_src\\makefile", + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} \ No newline at end of file diff --git a/launch4j/LICENSE.txt b/launch4j/LICENSE.txt index 38af528..4c824e1 100644 --- a/launch4j/LICENSE.txt +++ b/launch4j/LICENSE.txt @@ -1,30 +1,30 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2017 Grzegorz Kowal -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2021 Grzegorz Kowal +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/launch4j/build.xml b/launch4j/build.xml index 9264ea9..3948303 100644 --- a/launch4j/build.xml +++ b/launch4j/build.xml @@ -1,77 +1,77 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch4j/demo/ConsoleApp/.gitignore b/launch4j/demo/ConsoleApp/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/launch4j/demo/ConsoleApp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/launch4j/demo/ConsoleApp/ConsoleApp.jar b/launch4j/demo/ConsoleApp/ConsoleApp.jar index 14b8319..1b72533 100644 --- a/launch4j/demo/ConsoleApp/ConsoleApp.jar +++ b/launch4j/demo/ConsoleApp/ConsoleApp.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:590ea97379013c8b186810a1a81e2001f8f63d042b0f02789a31f99a270c590d -size 2099 +oid sha256:0a5b4ecbc5cf61e6b214d4da2c8c3d559376cff6fe3dbcce2fa5b31d93e12d55 +size 2101 diff --git a/launch4j/demo/ConsoleApp/build.xml b/launch4j/demo/ConsoleApp/build.xml index b53d77f..20912d9 100644 --- a/launch4j/demo/ConsoleApp/build.xml +++ b/launch4j/demo/ConsoleApp/build.xml @@ -1,57 +1,57 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java b/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java index 57dd324..eb7b3d9 100644 --- a/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java +++ b/launch4j/demo/ConsoleApp/src/net/sf/launch4j/example/ConsoleApp.java @@ -1,72 +1,72 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.example; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ConsoleApp { - public static void main(String[] args) { - StringBuffer sb = new StringBuffer("Hello World!\n\nJava version: "); - sb.append(System.getProperty("java.version")); - sb.append("\nJava home: "); - sb.append(System.getProperty("java.home")); - sb.append("\nCurrent dir: "); - sb.append(System.getProperty("user.dir")); - if (args.length > 0) { - sb.append("\nArgs: "); - for (int i = 0; i < args.length; i++) { - sb.append(args[i]); - sb.append(' '); - } - } - sb.append("\n\nEnter a line of text, 'quit' or Ctrl-C to stop.\n\n>"); - System.out.print(sb.toString()); - try { - BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); - String line; - while ((line = is.readLine()) != null && !line.equalsIgnoreCase("quit")) { - System.out.print("You wrote: " + line + "\n\n>"); - } - is.close(); - System.exit(123); - } catch (IOException e) { - System.err.print(e); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.example; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ConsoleApp { + public static void main(String[] args) { + StringBuffer sb = new StringBuffer("Hello World!\n\nJava version: "); + sb.append(System.getProperty("java.version")); + sb.append("\nJava home: "); + sb.append(System.getProperty("java.home")); + sb.append("\nCurrent dir: "); + sb.append(System.getProperty("user.dir")); + if (args.length > 0) { + sb.append("\nArgs: "); + for (int i = 0; i < args.length; i++) { + sb.append(args[i]); + sb.append(' '); + } + } + sb.append("\n\nEnter a line of text, 'quit' or Ctrl-C to stop.\n\n>"); + System.out.print(sb.toString()); + try { + BufferedReader is = new BufferedReader(new InputStreamReader(System.in)); + String line; + while ((line = is.readLine()) != null && !line.equalsIgnoreCase("quit")) { + System.out.print("You wrote: " + line + "\n\n>"); + } + is.close(); + System.exit(123); + } catch (IOException e) { + System.err.print(e); + } + } +} diff --git a/launch4j/demo/ExitCodeApp/.gitignore b/launch4j/demo/ExitCodeApp/.gitignore deleted file mode 100644 index c3dca1b..0000000 --- a/launch4j/demo/ExitCodeApp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -/target diff --git a/launch4j/demo/ExitCodeApp/pom.xml b/launch4j/demo/ExitCodeApp/pom.xml index cc7a008..c1be1f7 100644 --- a/launch4j/demo/ExitCodeApp/pom.xml +++ b/launch4j/demo/ExitCodeApp/pom.xml @@ -1,72 +1,75 @@ - - 4.0.0 - net.sf.launch4j.example - ExitCodeApp - 1.0 - ExitCodeApp - jar - - - UTF-8 - - - - src - - - src - - **/*.java - - - - - - maven-compiler-plugin - 3.1 - - 1.6 - 1.6 - - - - com.akathist.maven.plugins.launch4j - launch4j-maven-plugin - 1.7.6 - - - l4j - package - launch4j - - console - target/ExitCodeApp.exe - target/ExitCodeApp-1.0.jar - ExitCodeApp - - net.sf.launch4j.example.ExitCodeApp - false - anything - - - 1.5.0 - - - 1.0.0.0 - 1.0 - Simple app for testing exit code. - Copyright (C) 2015 GK - 3.9.0.0 - 3.9 - ExitCodeApp - ExitCodeApp - ExitCodeApp.exe - - - - - - - - \ No newline at end of file + + 4.0.0 + net.sf.launch4j.example + ExitCodeApp + 1.0 + ExitCodeApp + jar + + + UTF-8 + + + + src + + + src + + **/*.java + + + + + + maven-compiler-plugin + 3.1 + + 1.8 + 1.8 + + + + com.akathist.maven.plugins.launch4j + launch4j-maven-plugin + 1.7.22 + + + l4j + package + + launch4j + + + console + target/ExitCodeApp.exe + target/ExitCodeApp-1.0.jar + ExitCodeApp + + net.sf.launch4j.example.ExitCodeApp + false + anything + + + %JAVA_HOME%;%PATH% + 1.8.0 + + + 1.0.0.0 + 1.0 + Simple app for testing exit code. + Copyright (C) 2022 GK + 3.9.0.0 + 3.9 + ExitCodeApp + ExitCodeApp + ExitCodeApp.exe + + + + + + + + \ No newline at end of file diff --git a/launch4j/demo/LICENSE.txt b/launch4j/demo/LICENSE.txt index b778408..c5cd21c 100644 --- a/launch4j/demo/LICENSE.txt +++ b/launch4j/demo/LICENSE.txt @@ -1,30 +1,30 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2015 Grzegorz Kowal -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2015 Grzegorz Kowal +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/launch4j/demo/SimpleApp/.gitignore b/launch4j/demo/SimpleApp/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/launch4j/demo/SimpleApp/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/launch4j/demo/SimpleApp/SimpleApp.jar b/launch4j/demo/SimpleApp/SimpleApp.jar index 22316c6..cba980f 100644 --- a/launch4j/demo/SimpleApp/SimpleApp.jar +++ b/launch4j/demo/SimpleApp/SimpleApp.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6317805991aa6bb8094a2e7c39dd2604f804d761a7cca231c07b9906e43a91e1 -size 5942 +oid sha256:0cff2a0a0c80b5659376bfa6b1f7a668d99fde30306c98aeea2e50c21ebc7482 +size 5945 diff --git a/launch4j/demo/SimpleApp/build.xml b/launch4j/demo/SimpleApp/build.xml index 9b6aae0..458a40d 100644 --- a/launch4j/demo/SimpleApp/build.xml +++ b/launch4j/demo/SimpleApp/build.xml @@ -1,52 +1,52 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch4j/demo/SimpleApp/l4j/SimpleApp.xml b/launch4j/demo/SimpleApp/l4j/SimpleApp.xml index eacd757..8e2f603 100644 --- a/launch4j/demo/SimpleApp/l4j/SimpleApp.xml +++ b/launch4j/demo/SimpleApp/l4j/SimpleApp.xml @@ -1,19 +1,20 @@ - - gui - SimpleApp.jar - true - ../SimpleApp.exe - SimpleApp - . - SimpleApp.ico - true - - 1.6.0 - - - splash.bmp - true - 60 - true - + + gui + SimpleApp.jar + true + ../SimpleApp.exe + SimpleApp + . + SimpleApp.ico + true + + %JAVA_HOME%;%PATH% + 1.8.0 + + + splash.bmp + true + 60 + true + \ No newline at end of file diff --git a/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java b/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java index 1b6fc5d..8008cf6 100644 --- a/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java +++ b/launch4j/demo/SimpleApp/src/net/sf/launch4j/example/SimpleApp.java @@ -1,195 +1,195 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.example; - -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import javax.swing.AbstractAction; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.UIManager; - -public class SimpleApp extends JFrame { - public SimpleApp(String[] args) { - super("Java Application"); - - if (args.length == 1 && "throw".equals(args[0])) { - throw new IllegalStateException("Exception thrown from SimpleApp."); - } - - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - setBounds (screenSize.width / 4, screenSize.height / 4, screenSize.width / 2, screenSize.height / 2); - - addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - System.exit(0); - }}); - - initializeMenu(); - initializeTextArea(args); - setVisible(true); - } - - public static void setLAF() { - JFrame.setDefaultLookAndFeelDecorated(true); - Toolkit.getDefaultToolkit().setDynamicLayout(true); - System.setProperty("sun.awt.noerasebackground","true"); - try { - UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); - } catch (Exception e) { - System.err.println("Failed to set LookAndFeel"); - } - } - - public static void main(String[] args) { - setLAF(); - new SimpleApp(args); - } - - private final void initializeMenu() { - JMenu menu = new JMenu("Exit with code"); - - menu.add(new JMenuItem(new AbstractAction("Exit with code 0") { - @Override - public void actionPerformed(ActionEvent e) { - System.exit(0); - } - })); - - menu.add(new JMenuItem(new AbstractAction("Exit with code 100 and restart the application") { - @Override - public void actionPerformed(ActionEvent e) { - System.exit(100); - } - })); - - JMenuBar mb = new JMenuBar(); - mb.setOpaque(true); - mb.add(menu); - setJMenuBar(mb); - } - - private final void initializeTextArea(String[] args) { - JTextArea textArea = new JTextArea(); - textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); - textArea.setEditable(false); - - JScrollPane scrollPane = new JScrollPane(); - scrollPane.setViewportView(textArea); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - getContentPane().add(scrollPane); - - textArea.setText(getMainProperties(args)); - textArea.append(getAllProperties()); - textArea.append(getEnvironmentVariables()); - } - - private final String getMainProperties(String[] args) { - StringBuffer sb = new StringBuffer("Java version: "); - sb.append(System.getProperty("java.version")); - sb.append("\nJava home: "); - sb.append(System.getProperty("java.home")); - sb.append("\nCurrent dir: "); - sb.append(System.getProperty("user.dir")); - sb.append("\nCommand line args: {"); - - for (int i = 0; i < args.length; i++) { - if (i > 0) - { - sb.append(' '); - } - sb.append(args[i]); - } - - sb.append("}\n"); - - final int mb = 1024 * 1024; - sb.append("Free memory (MB): "); - sb.append(Runtime.getRuntime().freeMemory() / mb); - sb.append("\nTotal memory (MB): "); - sb.append(Runtime.getRuntime().totalMemory() / mb); - sb.append("\nMax memory (MB): "); - sb.append(Runtime.getRuntime().maxMemory() / mb); - sb.append("\n"); - - return sb.toString(); - } - - private final String getAllProperties() { - StringBuffer sb = new StringBuffer("\n========== All properties ==========\n"); - - List keys = new ArrayList(); - keys.addAll(System.getProperties().stringPropertyNames()); - Collections.sort(keys); - - for (String key : keys) { - sb.append(key); - sb.append(": "); - sb.append(System.getProperty(key)); - sb.append("\n"); - } - - return sb.toString(); - } - - private final String getEnvironmentVariables() { - StringBuffer sb = new StringBuffer("\n========== Environment variables ==========\n"); - - List keys = new ArrayList(); - keys.addAll(System.getenv().keySet()); - Collections.sort(keys); - - for (String key : keys) { - sb.append(key); - sb.append(": "); - sb.append(System.getenv(key)); - sb.append("\n"); - } - - return sb.toString(); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.example; + +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.swing.AbstractAction; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.UIManager; + +public class SimpleApp extends JFrame { + public SimpleApp(String[] args) { + super("Java Application"); + + if (args.length == 1 && "throw".equals(args[0])) { + throw new IllegalStateException("Exception thrown from SimpleApp."); + } + + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + setBounds (screenSize.width / 4, screenSize.height / 4, screenSize.width / 2, screenSize.height / 2); + + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + System.exit(0); + }}); + + initializeMenu(); + initializeTextArea(args); + setVisible(true); + } + + public static void setLAF() { + JFrame.setDefaultLookAndFeelDecorated(true); + Toolkit.getDefaultToolkit().setDynamicLayout(true); + System.setProperty("sun.awt.noerasebackground","true"); + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + System.err.println("Failed to set LookAndFeel"); + } + } + + public static void main(String[] args) { + setLAF(); + new SimpleApp(args); + } + + private final void initializeMenu() { + JMenu menu = new JMenu("Exit with code"); + + menu.add(new JMenuItem(new AbstractAction("Exit with code 0") { + @Override + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + })); + + menu.add(new JMenuItem(new AbstractAction("Exit with code 100 and restart the application") { + @Override + public void actionPerformed(ActionEvent e) { + System.exit(100); + } + })); + + JMenuBar mb = new JMenuBar(); + mb.setOpaque(true); + mb.add(menu); + setJMenuBar(mb); + } + + private final void initializeTextArea(String[] args) { + JTextArea textArea = new JTextArea(); + textArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); + textArea.setEditable(false); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setViewportView(textArea); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + getContentPane().add(scrollPane); + + textArea.setText(getMainProperties(args)); + textArea.append(getAllProperties()); + textArea.append(getEnvironmentVariables()); + } + + private final String getMainProperties(String[] args) { + StringBuffer sb = new StringBuffer("Java version: "); + sb.append(System.getProperty("java.version")); + sb.append("\nJava home: "); + sb.append(System.getProperty("java.home")); + sb.append("\nCurrent dir: "); + sb.append(System.getProperty("user.dir")); + sb.append("\nCommand line args: {"); + + for (int i = 0; i < args.length; i++) { + if (i > 0) + { + sb.append(' '); + } + sb.append(args[i]); + } + + sb.append("}\n"); + + final int mb = 1024 * 1024; + sb.append("Free memory (MB): "); + sb.append(Runtime.getRuntime().freeMemory() / mb); + sb.append("\nTotal memory (MB): "); + sb.append(Runtime.getRuntime().totalMemory() / mb); + sb.append("\nMax memory (MB): "); + sb.append(Runtime.getRuntime().maxMemory() / mb); + sb.append("\n"); + + return sb.toString(); + } + + private final String getAllProperties() { + StringBuffer sb = new StringBuffer("\n========== All properties ==========\n"); + + List keys = new ArrayList(); + keys.addAll(System.getProperties().stringPropertyNames()); + Collections.sort(keys); + + for (String key : keys) { + sb.append(key); + sb.append(": "); + sb.append(System.getProperty(key)); + sb.append("\n"); + } + + return sb.toString(); + } + + private final String getEnvironmentVariables() { + StringBuffer sb = new StringBuffer("\n========== Environment variables ==========\n"); + + List keys = new ArrayList(); + keys.addAll(System.getenv().keySet()); + Collections.sort(keys); + + for (String key : keys) { + sb.append(key); + sb.append(": "); + sb.append(System.getenv(key)); + sb.append("\n"); + } + + return sb.toString(); + } +} diff --git a/launch4j/head/LICENSE.txt b/launch4j/head/LICENSE.txt index e95c830..824d75c 100644 --- a/launch4j/head/LICENSE.txt +++ b/launch4j/head/LICENSE.txt @@ -1,26 +1,26 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2015 Grzegorz Kowal - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or other -dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2015 Grzegorz Kowal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Except as contained in this notice, the name(s) of the above copyright holders +shall not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/launch4j/head/consolehead.o b/launch4j/head/consolehead.o index 60bb62f661a1e53054e4e459fd711e588809d5a7..d32234433bf7247f85a0d6c789026e77eda55cb6 100644 GIT binary patch literal 1796 zcma)6-Afcv6hE`Ou2!a2o0VlvGE#v}_5~&yo0}hqWTX-FGEKYV?!@lQGIJLeF)(DQ zMI_&P2`cI>=%JTBo)#i3sE7IsdPqo&2!fuXI_KV5oymeO%x`|@oZq?U%)NK+h*S$S znj-)*XAwzdMv-y;Z;+w$lA6+){%;A7#G$jIUUpr-3`?yU)1-5P6ZW90Lkdc9zWAYI zL0<|r8GLqyg?~G~sJ}ypy8^-(T5m!D7x4LxoCr9n?g!M>dyP^Hq=WvV$>gM+GP>8b zr#fWEaGCBf(@M)MW5{|wpEZ*@Gi__{`k;0_oG&k4nECki+UF*m^b?g^h3T%gLTh~C zv=V7Ue>tM?(A-&RZYVTelwi4qVzMvx968JlNu^3-|2qnjU5<&w-X~}jx;iV*06U+X zQkuR!BrH!Uk%fq2Vw4vs_Xs^Vp5phy(qn`n)+jvm*-Lj3Fli6IXbv8^j|O*iC$#P+rV?x2{UUTqw(_>Kw3)LmTPB?jG?F0 zB=>7M-LyCZr~w&5;J-I;QV0|LG5mK19l5`1eD?+Y(qYN_5q)#{?+S{Br5;~&mG1Ls z4cE|4)2;-^anFq6J1lJq20bh8y=g^7t+gLV=YR(F90E=AuMn=!+62%tBX*kS2%r@K zxF`%nT2&fXI1-RYbD5LOIG&Gt@{W<$9dFC3SyzKuIXB&B7kybo%K;4;bV|jj&hwz^ z5Y>&Mkt{G@Eo~z2m=>E@&7xDyPlL*D$U+{(ekqfalb{+IZNkxW#{Wn(?~)z05{~X> z@Y@ZR5NB~9tEWL5Bs-VWt<;EV8K>f%pk-}6HO8Ud2eI4tq$z$_rCdN=Kb2uNHHLL76lmM zC?=(tUSb>z_fi5_MffBl#z*m$0JxjVs!SEse|;LDo?39-uwWoO2ymHn&h~<7jLio< z0~sKfzFDIR-siaoUz0fdho8QGq3{k@9vf!UUM#tuAn|-M#^aUxI%!$dpOrj0$+_`2 z$n-zjK!1&$=T!C1Mh#aD&4zyu(rd#Ay-YHO<#@PUk^l>^cm8aoU3(u(ohv--vEQ`vI~M|YX( zFvH3vSYA)4#iD6wDl=^BWY2bO55NJ;-;0k7htcd}es2QgB+a&5 z+tl;AnoVh(R|=|OaReYi0wNIpaZQ2M z(eh46L-1BG7TxnWQi8ALx;5pfZXT4YI-9Z!1=Y%C3`?I#kAPy@YIf4LO;B7TXQ}42 hiqg3s9I5{SX=8T+u^nsELBR@#_lbGNoHy4!X4 z_OOFMfXNgi)WgtRSGBF-PwoD*t4NrGv>!wHfRrWhEW_r&)Zk480Oxa zTL?}J_$H(G3JANfLCkC-dhf|HGS=N~te7Gz^Lr`2j~5pgEzQedt9p8jzuDeEFn5+> zv4-i1f%|V?^|3<@(}mk_1|aJ{+&lT!Fsz+f*Z}i)e z^3!}nWw)XKOKwB-o-Q+FZlFRnr8Miy->e*8MS-*hYe7)@wgU6ri#k9Y>J6w)qo&28 znqEZW`9XlXVvXQ^0l|AWQ|%3&MrE#3z3G_;Tsi(C!f%*rm(!#o z5Ef4gO=|nhTD<7t;F1pgIVFa$-lcj`aw5%tP-6(>!=g;^3|X{vJ{ZzWFqR%Eo^Z4 z=7IF~TB^g712?QgW~F(^7<;$~p7>iylS>HCjGaM6UO1dVf+) zXro(d8=bu()V^d|(XvKV*Ik0)el-EIy|uL|u(kcEL)!x3y4`gR)5*7eO`C`zHP;K?M>|pq;qkMdq9ott>?M@K?{9#Dc>L_L&Hc$n@7U;lAQAIzpa32}yNgmp z@DMWhDCgD#2_KIGeVucyKw@k+knlSIB<6b&sD|tQ0z_-!XY)YYIQk#ZV;nt#jEml< zfGBf*mI4x1jsely_}K}d5Jwk*>Nxr(5MAcV*=s<;-VBh4<91roY;Ah9>Pfaq27v!g&Ff|EdvoI7W87l3wh?q@(@j;`3~6I=Hg z5Z#;o%vWaFs{#`1QEhXZfS%yGZ9pQsjW%ksb^CzCj{OeMEp)NP5mP`-9K8h;;^-rwJsjNyqO-!!?gP<#=x1fPPYAzj zY_t|g_^1IAK6U_ogO3OU2_H>BVr;984g!g>PurXfB&?)?gcTh~#5Zc|0T*b^^zLcQOBRF`v7b zHTEvD>}+%~J6+5{7bClvw2L|AV5E$pq-qQb+hqAg^o#c}c>MTrR;LV0gSwnnm_#={J*I2%NW&9MQq*jE zR80)3k=;xhQjAU&7fm&;h|40AP#=(!Drvvioa6e)oOexTzIjWROC}{o>7v_;doFqn z`T3Sq68|%j%nR;8wNshT*ddK0DKxQ%j@~Lwgl9VNPb zLxhGrMH*rC&RPBC)hVcz9+iI%GAGQZhV$4!?c6tY%U$Qk3$xWM)J*;={Hu G%>EC7c9vQI literal 5311 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 RqrTQ$6VaUQ_tGlje*t>u%E15t literal 27792 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 SPr=3XUm6pbUr<(VTmK7d6rCyn diff --git a/launch4j/head_jni_BETA/LICENSE.txt b/launch4j/head_jni_BETA/LICENSE.txt index e95c830..824d75c 100644 --- a/launch4j/head_jni_BETA/LICENSE.txt +++ b/launch4j/head_jni_BETA/LICENSE.txt @@ -1,26 +1,26 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2015 Grzegorz Kowal - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or other -dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2015 Grzegorz Kowal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Except as contained in this notice, the name(s) of the above copyright holders +shall not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/launch4j/head_jni_BETA/head.o b/launch4j/head_jni_BETA/head.o index bd99219f2de6e3caaa59a9c24054691298a4df00..29d1e7f1988e353688066549fd1df0deb6829a18 100644 GIT binary patch literal 27178 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 RqrTQ$6VaUQ_tGlje*t>u%E15t literal 23327 zcmcIseSDNhwVsebmozjHQc5Ysm4+57qy!=bgf<~rJ_CV-0JYGtBnw$cvgzhszT{&u zS=;S)wQ8eQMcay3uKo5F4OK8Ll(e-fAlF907A@7JK}Cv`ev$i}bKaSKH=+91-QRC_ zpZ7Uu&YU?jbKZGpCn-s}Lec9&iBdZlrKRLrzD*Wm`IvB%QsYvTdT_E_XZ2IcttPC> zt@c`8hu-C2ftt{kySlN_Da&wP*f>mj!DNFM`zy6#OtLcU735Y2eO1;5pOzc}Sdy!+ z7`ceVtG&MtMt8rwwwDi9lgcOHv*GK7du&xsc2xMCg`zS7tWP*gqD;k>>^U++9bHY!&hd;|=9wlbw9(X<@a zN42dZ!b(NoTDG*DnSDJN3u6!EwZ≫`_UH^z_6+8Snf^AnJ0FJi0X}&Dq?hGa2N@ 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%0D%e}!XQ&Bo{ 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 XcaUyVL3+S@m37%S{$cfF);IqLW8+)P diff --git a/launch4j/head_src/LICENSE.txt b/launch4j/head_src/LICENSE.txt index a08f808..efbfaa0 100644 --- a/launch4j/head_src/LICENSE.txt +++ b/launch4j/head_src/LICENSE.txt @@ -1,26 +1,26 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2015 Grzegorz Kowal - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or other -dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2015 Grzegorz Kowal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +Except as contained in this notice, the name(s) of the above copyright holders +shall not be used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/launch4j/head_src/consolehead/.gitignore b/launch4j/head_src/consolehead/.gitignore deleted file mode 100644 index b566d3b..0000000 --- a/launch4j/head_src/consolehead/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/consolehead.exe -/consolehead.layout diff --git a/launch4j/head_src/consolehead/Makefile.win b/launch4j/head_src/consolehead/Makefile.win index 349e4c0..71cd1c0 100644 --- a/launch4j/head_src/consolehead/Makefile.win +++ b/launch4j/head_src/consolehead/Makefile.win @@ -1,30 +1,28 @@ # Project: consolehead -# Makefile created by Dev-C++ 4.9.9.2 +# Makefile created by Dev-C++ 5.7.1 -CPP = g++.exe -CC = gcc.exe -WINDRES = windres.exe -RES = -OBJ = ../../head/consolehead.o ../../head/head.o $(RES) -LINKOBJ = ../../head/consolehead.o ../../head/head.o $(RES) -LIBS = -L"C:/Dev-Cpp/lib" -n -s -INCS = -I"C:/Dev-Cpp/include" -CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -BIN = consolehead.exe -CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 -CFLAGS = $(INCS) -fexpensive-optimizations -O3 -RM = rm -f +CPP = g++.exe +CC = gcc.exe +WINDRES = windres.exe +OBJ = ../../head/consolehead.o ../../head/head.o +LINKOBJ = ../../head/consolehead.o ../../head/head.o +LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -n -s +INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" +CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" +BIN = consolehead.exe +CXXFLAGS = $(CXXINCS) -Os +CFLAGS = $(INCS) -Os +RM = rm.exe -f .PHONY: all all-before all-after clean clean-custom -all: all-before consolehead.exe all-after - +all: all-before $(BIN) all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) -# $(CC) $(LINKOBJ) -o "consolehead.exe" $(LIBS) + $(CC) $(LINKOBJ) -o $(BIN) $(LIBS) ../../head/consolehead.o: consolehead.c $(CC) -c consolehead.c -o ../../head/consolehead.o $(CFLAGS) diff --git a/launch4j/head_src/consolehead/consolehead.c b/launch4j/head_src/consolehead/consolehead.c index 1846a56..297cd11 100644 --- a/launch4j/head_src/consolehead/consolehead.c +++ b/launch4j/head_src/consolehead/consolehead.c @@ -1,97 +1,97 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -#include "../resource.h" -#include "../head.h" - -extern FILE* hLog; - -BOOL restartOnCrash = FALSE; - -int main(int argc, char* argv[]) -{ - setConsoleFlag(); - LPTSTR cmdLine = GetCommandLine(); - - if (*cmdLine == '"') - { - if (*(cmdLine = strchr(cmdLine + 1, '"') + 1)) - { - cmdLine++; - } - } - else if ((cmdLine = strchr(cmdLine, ' ')) != NULL) - { - cmdLine++; - } - else - { - cmdLine = ""; - } - - int result = prepare(cmdLine); - - if (result == ERROR_ALREADY_EXISTS) - { - char errMsg[BIG_STR] = {0}; - loadString(INSTANCE_ALREADY_EXISTS_MSG, errMsg); - msgBox(errMsg); - closeLogFile(); - return 2; - } - - if (result != TRUE) - { - signalError(); - return 1; - } - - restartOnCrash = loadBool(RESTART_ON_CRASH); - DWORD dwExitCode; - - do - { - dwExitCode = 0; - - if (!execute(TRUE, &dwExitCode)) - { - signalError(); - break; - } - - if (restartOnCrash && dwExitCode != 0) - { - debug("Exit code:\t%d, restarting the application!\n", dwExitCode); - } - } while (restartOnCrash && dwExitCode != 0); - - debug("Exit code:\t%d\n", dwExitCode); - closeLogFile(); - return (int) dwExitCode; -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include "../resource.h" +#include "../head.h" + +extern FILE* hLog; + +BOOL restartOnCrash = FALSE; + +int main(int argc, char* argv[]) +{ + setConsoleFlag(); + LPTSTR cmdLine = GetCommandLine(); + + if (*cmdLine == '"') + { + if (*(cmdLine = strchr(cmdLine + 1, '"') + 1)) + { + cmdLine++; + } + } + else if ((cmdLine = strchr(cmdLine, ' ')) != NULL) + { + cmdLine++; + } + else + { + cmdLine = ""; + } + + int result = prepare(cmdLine, FALSE); + + if (result == ERROR_ALREADY_EXISTS) + { + char errMsg[BIG_STR] = {0}; + loadString(INSTANCE_ALREADY_EXISTS_MSG, errMsg); + msgBox(errMsg); + closeLogFile(); + return 2; + } + + if (result != TRUE) + { + signalError(); + return 1; + } + + restartOnCrash = loadBool(RESTART_ON_CRASH); + DWORD dwExitCode; + + do + { + dwExitCode = 0; + + if (!execute(TRUE, &dwExitCode)) + { + signalError(); + break; + } + + if (restartOnCrash && dwExitCode != 0) + { + debug("Exit code:\t%d, restarting the application!\n", dwExitCode); + } + } while (restartOnCrash && dwExitCode != 0); + + debug("Exit code:\t%d\n", dwExitCode); + closeLogFile(); + return (int) dwExitCode; +} diff --git a/launch4j/head_src/consolehead/consolehead.dev b/launch4j/head_src/consolehead/consolehead.dev index 3dce2dc..7387e43 100644 --- a/launch4j/head_src/consolehead/consolehead.dev +++ b/launch4j/head_src/consolehead/consolehead.dev @@ -3,7 +3,7 @@ FileName=consolehead.dev Name=consolehead UnitCount=4 Type=1 -Ver=1 +Ver=2 ObjFiles= Includes= Libs= @@ -22,12 +22,14 @@ OverrideOutputName=consolehead.exe HostApplication= Folders= CommandLine= -UseCustomMakefile=1 +UseCustomMakefile=0 CustomMakefile=Makefile.win IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 -CompilerSettings=0000000001001000000100 +CompilerSettings=000000d000000000000001000 +LogOutput= +LogOutputEnabled=0 [Unit1] FileName=consolehead.c @@ -47,7 +49,7 @@ Build=1 LanguageID=1033 CharsetID=1252 CompanyName= -FileVersion= +FileVersion=0.1.1.1 FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= @@ -56,6 +58,7 @@ OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 +SyncProduct=0 [Unit2] FileName=..\resource.h diff --git a/launch4j/head_src/guihead/.gitignore b/launch4j/head_src/guihead/.gitignore deleted file mode 100644 index 5ddac15..0000000 --- a/launch4j/head_src/guihead/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/guihead.exe -/guihead.layout diff --git a/launch4j/head_src/guihead/Makefile.win b/launch4j/head_src/guihead/Makefile.win index 30cee56..89d960a 100644 --- a/launch4j/head_src/guihead/Makefile.win +++ b/launch4j/head_src/guihead/Makefile.win @@ -1,30 +1,28 @@ # Project: guihead -# Makefile created by Dev-C++ 4.9.9.2 +# Makefile created by Dev-C++ 5.7.1 -CPP = g++.exe -CC = gcc.exe -WINDRES = windres.exe -RES = -OBJ = ../../head/guihead.o ../../head/head.o $(RES) -LINKOBJ = ../../head/guihead.o ../../head/head.o $(RES) -LIBS = -L"C:/Dev-Cpp/lib" -mwindows -n -s -INCS = -I"C:/Dev-Cpp/include" -CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -BIN = guihead.exe -CXXFLAGS = $(CXXINCS) -fexpensive-optimizations -O3 -CFLAGS = $(INCS) -fexpensive-optimizations -O3 -RM = rm -f +CPP = g++.exe +CC = gcc.exe +WINDRES = windres.exe +OBJ = ../../head/guihead.o ../../head/head.o +LINKOBJ = ../../head/guihead.o ../../head/head.o +LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -mwindows -n -s +INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" +CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" +BIN = guihead.exe +CXXFLAGS = $(CXXINCS) -Os +CFLAGS = $(INCS) -Os +RM = rm.exe -f .PHONY: all all-before all-after clean clean-custom -all: all-before guihead.exe all-after - +all: all-before $(BIN) all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) -# $(CC) $(LINKOBJ) -o "guihead.exe" $(LIBS) + $(CC) $(LINKOBJ) -o $(BIN) $(LIBS) ../../head/guihead.o: guihead.c $(CC) -c guihead.c -o ../../head/guihead.o $(CFLAGS) diff --git a/launch4j/head_src/guihead/guihead.c b/launch4j/head_src/guihead/guihead.c index 6d165a2..04e829d 100644 --- a/launch4j/head_src/guihead/guihead.c +++ b/launch4j/head_src/guihead/guihead.c @@ -1,241 +1,241 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - Sylvain Mina (single instance patch) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -#include "../resource.h" -#include "../head.h" -#include "guihead.h" - -extern FILE* hLog; -extern PROCESS_INFORMATION processInformation; - -HWND hWnd; -DWORD dwExitCode = 0; -BOOL stayAlive = FALSE; -BOOL splash = FALSE; -BOOL splashTimeoutErr; -BOOL waitForWindow; -BOOL restartOnCrash = FALSE; -int splashTimeout = DEFAULT_SPLASH_TIMEOUT; - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - int result = prepare(lpCmdLine); - - if (result == ERROR_ALREADY_EXISTS) - { - HWND handle = getInstanceWindow(); - ShowWindow(handle, SW_SHOW); - SetForegroundWindow(handle); - closeLogFile(); - return 2; - } - - if (result != TRUE) - { - signalError(); - return 1; - } - - splash = loadBool(SHOW_SPLASH) - && strstr(lpCmdLine, "--l4j-no-splash") == NULL; - restartOnCrash = loadBool(RESTART_ON_CRASH); - - // if we should restart on crash, we must also stay alive to check for crashes - stayAlive = restartOnCrash || - (loadBool(GUI_HEADER_STAYS_ALIVE) - && strstr(lpCmdLine, "--l4j-dont-wait") == NULL); - - if (splash || stayAlive) - { - hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "", - WS_POPUP | SS_BITMAP, - 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); - if (splash) - { - char timeout[10] = {0}; - if (loadString(SPLASH_TIMEOUT, timeout)) - { - splashTimeout = atoi(timeout); - if (splashTimeout <= 0 || splashTimeout > MAX_SPLASH_TIMEOUT) - { - splashTimeout = DEFAULT_SPLASH_TIMEOUT; - } - } - splashTimeout = splashTimeout * 1000; // to millis - splashTimeoutErr = loadBool(SPLASH_TIMEOUT_ERR) - && strstr(lpCmdLine, "--l4j-no-splash-err") == NULL; - waitForWindow = loadBool(SPLASH_WAITS_FOR_WINDOW); - HANDLE hImage = LoadImage(hInstance, // handle of the instance containing the image - MAKEINTRESOURCE(SPLASH_BITMAP), // name or identifier of image - IMAGE_BITMAP, // type of image - 0, // desired width - 0, // desired height - LR_DEFAULTSIZE); - if (hImage == NULL) - { - signalError(); - return 1; - } - SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage); - RECT rect; - GetWindowRect(hWnd, &rect); - int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; - int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; - SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); - ShowWindow(hWnd, nCmdShow); - UpdateWindow (hWnd); - } - } - - do - { - if (splash || stayAlive) - { - if (!SetTimer (hWnd, ID_TIMER, TIMER_PROC_INTERVAL, TimerProc)) - { - signalError(); - return 1; - } - } - - if (!execute(FALSE, &dwExitCode)) - { - signalError(); - return 1; - } - - if (!(splash || stayAlive)) - { - debug("Exit code:\t0\n"); - closeProcessHandles(); - closeLogFile(); - return 0; - } - - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - if (restartOnCrash && dwExitCode != 0) - { - debug("Exit code:\t%d, restarting the application!\n", dwExitCode); - } - - closeProcessHandles(); - } while (restartOnCrash && dwExitCode != 0); - - debug("Exit code:\t%d\n", dwExitCode); - closeLogFile(); - return dwExitCode; -} - -HWND getInstanceWindow() -{ - char windowTitle[STR]; - char instWindowTitle[STR] = {0}; - if (loadString(INSTANCE_WINDOW_TITLE, instWindowTitle)) - { - HWND handle = FindWindowEx(NULL, NULL, NULL, NULL); - while (handle != NULL) - { - GetWindowText(handle, windowTitle, STR - 1); - if (strstr(windowTitle, instWindowTitle) != NULL) - { - return handle; - } - else - { - handle = FindWindowEx(NULL, handle, NULL, NULL); - } - } - } - return NULL; -} - -BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) -{ - DWORD processId; - GetWindowThreadProcessId(hwnd, &processId); - if (processInformation.dwProcessId == processId) - { - LONG styles = GetWindowLong(hwnd, GWL_STYLE); - if ((styles & WS_VISIBLE) != 0) - { - splash = FALSE; - ShowWindow(hWnd, SW_HIDE); - return FALSE; - } - } - return TRUE; -} - -VOID CALLBACK TimerProc( - HWND hwnd, // handle of window for timer messages - UINT uMsg, // WM_TIMER message - UINT idEvent, // timer identifier - DWORD dwTime) // current system time -{ - if (splash) - { - if (splashTimeout == 0) - { - splash = FALSE; - ShowWindow(hWnd, SW_HIDE); - if (waitForWindow && splashTimeoutErr) - { - KillTimer(hwnd, ID_TIMER); - signalError(); - PostQuitMessage(0); - } - } - else - { - splashTimeout -= TIMER_PROC_INTERVAL; - if (waitForWindow) - { - EnumWindows(enumwndfn, 0); - } - } - } - - GetExitCodeProcess(processInformation.hProcess, &dwExitCode); - if (dwExitCode != STILL_ACTIVE - || !(splash || stayAlive)) - { - KillTimer(hWnd, ID_TIMER); - PostQuitMessage(0); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + Sylvain Mina (single instance patch) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include "../resource.h" +#include "../head.h" +#include "guihead.h" + +extern FILE* hLog; +extern PROCESS_INFORMATION processInformation; + +HWND hWnd; +DWORD dwExitCode = 0; +BOOL stayAlive = FALSE; +BOOL splash = FALSE; +BOOL splashTimeoutErr; +BOOL waitForWindow; +BOOL restartOnCrash = FALSE; +int splashTimeout = DEFAULT_SPLASH_TIMEOUT; + +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + int result = prepare(lpCmdLine, FALSE); + + if (result == ERROR_ALREADY_EXISTS) + { + HWND handle = getInstanceWindow(); + ShowWindow(handle, SW_SHOW); + SetForegroundWindow(handle); + closeLogFile(); + return 2; + } + + if (result != TRUE) + { + signalError(); + return 1; + } + + splash = loadBool(SHOW_SPLASH) + && strstr(lpCmdLine, "--l4j-no-splash") == NULL; + restartOnCrash = loadBool(RESTART_ON_CRASH); + + // if we should restart on crash, we must also stay alive to check for crashes + stayAlive = restartOnCrash || + (loadBool(GUI_HEADER_STAYS_ALIVE) + && strstr(lpCmdLine, "--l4j-dont-wait") == NULL); + + if (splash || stayAlive) + { + hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, "STATIC", "", + WS_POPUP | SS_BITMAP, + 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); + if (splash) + { + char timeout[10] = {0}; + if (loadString(SPLASH_TIMEOUT, timeout)) + { + splashTimeout = atoi(timeout); + if (splashTimeout <= 0 || splashTimeout > MAX_SPLASH_TIMEOUT) + { + splashTimeout = DEFAULT_SPLASH_TIMEOUT; + } + } + splashTimeout = splashTimeout * 1000; // to millis + splashTimeoutErr = loadBool(SPLASH_TIMEOUT_ERR) + && strstr(lpCmdLine, "--l4j-no-splash-err") == NULL; + waitForWindow = loadBool(SPLASH_WAITS_FOR_WINDOW); + HANDLE hImage = LoadImage(hInstance, // handle of the instance containing the image + MAKEINTRESOURCE(SPLASH_BITMAP), // name or identifier of image + IMAGE_BITMAP, // type of image + 0, // desired width + 0, // desired height + LR_DEFAULTSIZE); + if (hImage == NULL) + { + signalError(); + return 1; + } + SendMessage(hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage); + RECT rect; + GetWindowRect(hWnd, &rect); + int x = (GetSystemMetrics(SM_CXSCREEN) - (rect.right - rect.left)) / 2; + int y = (GetSystemMetrics(SM_CYSCREEN) - (rect.bottom - rect.top)) / 2; + SetWindowPos(hWnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); + ShowWindow(hWnd, nCmdShow); + UpdateWindow (hWnd); + } + } + + do + { + if (splash || stayAlive) + { + if (!SetTimer (hWnd, ID_TIMER, TIMER_PROC_INTERVAL, TimerProc)) + { + signalError(); + return 1; + } + } + + if (!execute(FALSE, &dwExitCode)) + { + signalError(); + return 1; + } + + if (!(splash || stayAlive)) + { + debug("Exit code:\t0\n"); + closeProcessHandles(); + closeLogFile(); + return 0; + } + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + if (restartOnCrash && dwExitCode != 0) + { + debug("Exit code:\t%d, restarting the application!\n", dwExitCode); + } + + closeProcessHandles(); + } while (restartOnCrash && dwExitCode != 0); + + debug("Exit code:\t%d\n", dwExitCode); + closeLogFile(); + return dwExitCode; +} + +HWND getInstanceWindow() +{ + char windowTitle[STR]; + char instWindowTitle[STR] = {0}; + if (loadString(INSTANCE_WINDOW_TITLE, instWindowTitle)) + { + HWND handle = FindWindowEx(NULL, NULL, NULL, NULL); + while (handle != NULL) + { + GetWindowText(handle, windowTitle, STR - 1); + if (strstr(windowTitle, instWindowTitle) != NULL) + { + return handle; + } + else + { + handle = FindWindowEx(NULL, handle, NULL, NULL); + } + } + } + return NULL; +} + +BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam) +{ + DWORD processId; + GetWindowThreadProcessId(hwnd, &processId); + if (processInformation.dwProcessId == processId) + { + LONG styles = GetWindowLong(hwnd, GWL_STYLE); + if ((styles & WS_VISIBLE) != 0) + { + splash = FALSE; + ShowWindow(hWnd, SW_HIDE); + return FALSE; + } + } + return TRUE; +} + +VOID CALLBACK TimerProc( + HWND hwnd, // handle of window for timer messages + UINT uMsg, // WM_TIMER message + UINT idEvent, // timer identifier + DWORD dwTime) // current system time +{ + if (splash) + { + if (splashTimeout == 0) + { + splash = FALSE; + ShowWindow(hWnd, SW_HIDE); + if (waitForWindow && splashTimeoutErr) + { + KillTimer(hwnd, ID_TIMER); + signalError(); + PostQuitMessage(0); + } + } + else + { + splashTimeout -= TIMER_PROC_INTERVAL; + if (waitForWindow) + { + EnumWindows(enumwndfn, 0); + } + } + } + + GetExitCodeProcess(processInformation.hProcess, &dwExitCode); + if (dwExitCode != STILL_ACTIVE + || !(splash || stayAlive)) + { + KillTimer(hWnd, ID_TIMER); + PostQuitMessage(0); + } +} diff --git a/launch4j/head_src/guihead/guihead.dev b/launch4j/head_src/guihead/guihead.dev index 7c30088..de4fe97 100644 --- a/launch4j/head_src/guihead/guihead.dev +++ b/launch4j/head_src/guihead/guihead.dev @@ -3,7 +3,7 @@ FileName=guihead.dev Name=guihead UnitCount=5 Type=0 -Ver=1 +Ver=2 ObjFiles= Includes= Libs= @@ -22,12 +22,14 @@ OverrideOutputName=guihead.exe HostApplication= Folders= CommandLine= -UseCustomMakefile=1 +UseCustomMakefile=0 CustomMakefile=Makefile.win IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 -CompilerSettings=0000000001001000000100 +CompilerSettings=000000d000000000000001000 +LogOutput= +LogOutputEnabled=0 [Unit1] FileName=guihead.c @@ -66,6 +68,7 @@ OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0 +SyncProduct=0 [Unit4] FileName=..\head.h @@ -95,7 +98,7 @@ Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 -BuildCmd= +BuildCmd=$(CC) -c head.c -o ../../head/head.o $(CFLAGS) [Unit5] FileName=..\resource.h diff --git a/launch4j/head_src/guihead/guihead.h b/launch4j/head_src/guihead/guihead.h index e8208d3..4732c73 100644 --- a/launch4j/head_src/guihead/guihead.h +++ b/launch4j/head_src/guihead/guihead.h @@ -1,44 +1,44 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -#define ID_TIMER 1 -#define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ -#define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ -#define TIMER_PROC_INTERVAL 100 /* interval in ms between calls to EnumWindows */ - -HWND getInstanceWindow(); - -BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); - -VOID CALLBACK TimerProc( - HWND hwnd, // handle of window for timer messages - UINT uMsg, // WM_TIMER message - UINT idEvent, // timer identifier - DWORD dwTime // current system time -); +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#define ID_TIMER 1 +#define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ +#define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ +#define TIMER_PROC_INTERVAL 100 /* interval in ms between calls to EnumWindows */ + +HWND getInstanceWindow(); + +BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); + +VOID CALLBACK TimerProc( + HWND hwnd, // handle of window for timer messages + UINT uMsg, // WM_TIMER message + UINT idEvent, // timer identifier + DWORD dwTime // current system time +); diff --git a/launch4j/head_src/head.c b/launch4j/head_src/head.c index bc13caa..62d176a 100644 --- a/launch4j/head_src/head.c +++ b/launch4j/head_src/head.c @@ -2,7 +2,7 @@ Launch4j (http://launch4j.sourceforge.net/) Cross-platform Java application wrapper for creating Windows native executables. - Copyright (c) 2004, 2015 Grzegorz Kowal, + Copyright (c) 2004, 2019 Grzegorz Kowal, Ian Roberts (jdk preference patch) Sylvain Mina (single instance patch) @@ -37,6 +37,7 @@ FILE* hLog; BOOL debugAll = FALSE; BOOL console = FALSE; BOOL wow64 = FALSE; +BOOL jniHeader = FALSE; char oldPwd[_MAX_PATH]; PROCESS_INFORMATION processInformation; @@ -51,16 +52,15 @@ struct struct { - int runtimeBits; int foundJava; - BOOL bundledJreAsFallback; + BOOL requiresJdk; + BOOL requires64Bit; BOOL corruptedJreFound; char originalJavaMinVer[STR]; char originalJavaMaxVer[STR]; char javaMinVer[STR]; char javaMaxVer[STR]; char foundJavaVer[STR]; - char foundJavaKey[_MAX_PATH]; char foundJavaHome[_MAX_PATH]; } search; @@ -71,8 +71,9 @@ struct char args[MAX_ARGS]; } launcher; -BOOL initGlobals() +BOOL initGlobals(BOOL jni) { + jniHeader = jni; hModule = GetModuleHandle(NULL); if (hModule == NULL) @@ -82,9 +83,9 @@ BOOL initGlobals() strcpy(error.title, LAUNCH4j); - search.runtimeBits = INIT_RUNTIME_BITS; - search.foundJava = NO_JAVA_FOUND; - search.bundledJreAsFallback = FALSE; + search.foundJava = JAVA_NOT_FOUND; + search.requiresJdk = FALSE; + search.requires64Bit = FALSE; search.corruptedJreFound = FALSE; return TRUE; @@ -141,7 +142,7 @@ void setWow64Flag() fnIsWow64Process(GetCurrentProcess(), &wow64); } - debug("WOW64:\t\t%s\n", wow64 ? "yes" : "no"); + debug("WOW64:\t\t%s\n", wow64 ? "Yes" : "No"); } void setConsoleFlag() @@ -464,28 +465,23 @@ void regSearch(const char* keyName, const int searchType) debug("Check:\t\t%s\n", fullKeyName); formatJavaVersion(version, originalVersion); - if (strcmp(version, search.javaMinVer) >= 0 - && (!*search.javaMaxVer || strcmp(version, search.javaMaxVer) <= 0) - && strcmp(version, search.foundJavaVer) > 0 - && isJavaHomeValid(fullKeyName, searchType)) + if (isJavaVersionGood(version, wow64KeyMask) + && isRegistryJavaHomeValid(fullKeyName, searchType)) { strcpy(search.foundJavaVer, version); - strcpy(search.foundJavaKey, fullKeyName); search.foundJava = searchType; debug("Match:\t\t%s\n", version); - } - else - { - debug("Ignore:\t\t%s\n", version); + break; } + debug("Ignore:\t\t%s\n", version); versionSize = _MAX_PATH; } RegCloseKey(hKey); } -BOOL isJavaHomeValid(const char* keyName, const int searchType) +BOOL isRegistryJavaHomeValid(const char* keyName, const int searchType) { BOOL valid = FALSE; HKEY hKey; @@ -531,6 +527,7 @@ BOOL isLauncherPathValid(const char* path) { struct _stat statBuf; char launcherPath[_MAX_PATH] = {0}; + char javacPath[_MAX_PATH] = {0}; BOOL result = FALSE; if (*path) @@ -538,6 +535,15 @@ BOOL isLauncherPathValid(const char* path) strcpy(launcherPath, path); appendLauncher(launcherPath); result = _stat(launcherPath, &statBuf) == 0; + debug("Check launcher:\t%s %s\n", launcherPath, result ? "(OK)" : "(not found)"); + + if (result && search.requiresJdk) + { + strcpy(javacPath, path); + appendPath(javacPath, "bin\\javac.exe"); + result = _stat(javacPath, &statBuf) == 0; + debug("Check javac:\t%s %s\n", javacPath, result ? "(OK)" : "(not found)"); + } if (!result) { @@ -546,120 +552,73 @@ BOOL isLauncherPathValid(const char* path) } } - debug("Check launcher:\t%s %s\n", launcherPath, result ? "(OK)" : "(not found)"); return result; } -void regSearchWow(const char* keyName, const int searchType) +void regSearchWow(const char* keyName) { - if (search.runtimeBits == INIT_RUNTIME_BITS) + if (search.foundJava != JAVA_NOT_FOUND) { - search.runtimeBits = loadInt(RUNTIME_BITS); + return; } - switch (search.runtimeBits) + if (wow64 && !jniHeader) { - case USE_64_BIT_RUNTIME: - if (wow64) - { - regSearch(keyName, searchType | KEY_WOW64_64KEY); - } - break; - - case USE_64_AND_32_BIT_RUNTIME: - if (wow64) - { - regSearch(keyName, searchType | KEY_WOW64_64KEY); + regSearch(keyName, JAVA_FOUND | KEY_WOW64_64KEY); - if ((search.foundJava & KEY_WOW64_64KEY) != NO_JAVA_FOUND) - { - break; - } - } + if ((search.foundJava & KEY_WOW64_64KEY) != JAVA_NOT_FOUND) + { + return; + } + } - regSearch(keyName, searchType); - break; - - case USE_32_AND_64_BIT_RUNTIME: - regSearch(keyName, searchType); - - if (search.foundJava != NO_JAVA_FOUND - && (search.foundJava & KEY_WOW64_64KEY) == NO_JAVA_FOUND) - { - break; - } - - if (wow64) - { - regSearch(keyName, searchType | KEY_WOW64_64KEY); - } - break; - - case USE_32_BIT_RUNTIME: - regSearch(keyName, searchType); - break; - - default: - debug("Runtime bits:\tFailed to load.\n"); - break; + if (!search.requires64Bit) + { + regSearch(keyName, JAVA_FOUND); } } -void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, - const int jdkPreference) +BOOL findRegistryJavaHome(char* path) { - if (jdkPreference == JDK_ONLY || jdkPreference == PREFER_JDK) - { - regSearchWow(sdkKeyName, FOUND_SDK); - if (jdkPreference != JDK_ONLY) - { - regSearchWow(jreKeyName, FOUND_JRE); - } + debugAll("findRegistryJavaHome()\n"); + if (!search.requiresJdk) + { + regSearchWow("SOFTWARE\\JavaSoft\\Java Runtime Environment"); } - else - { - // jdkPreference == JRE_ONLY or PREFER_JRE - regSearchWow(jreKeyName, FOUND_JRE); - if (jdkPreference != JRE_ONLY) - { - regSearchWow(sdkKeyName, FOUND_SDK); - } - } -} - -BOOL findJavaHome(char* path, const int jdkPreference) -{ - debugAll("findJavaHome()\n"); - regSearchJreSdk("SOFTWARE\\JavaSoft\\Java Runtime Environment", - "SOFTWARE\\JavaSoft\\Java Development Kit", - jdkPreference); + regSearchWow("SOFTWARE\\JavaSoft\\Java Development Kit"); // Java 9 support - regSearchJreSdk("SOFTWARE\\JavaSoft\\JRE", - "SOFTWARE\\JavaSoft\\JDK", - jdkPreference); + if (!search.requiresJdk) + { + regSearchWow("SOFTWARE\\JavaSoft\\JRE"); + } + regSearchWow("SOFTWARE\\JavaSoft\\JDK"); // IBM Java 1.8 - if (search.foundJava == NO_JAVA_FOUND) + if (search.foundJava == JAVA_NOT_FOUND) { - regSearchJreSdk("SOFTWARE\\IBM\\Java Runtime Environment", - "SOFTWARE\\IBM\\Java Development Kit", - jdkPreference); + if (!search.requiresJdk) + { + regSearchWow("SOFTWARE\\IBM\\Java Runtime Environment"); + } + regSearchWow("SOFTWARE\\IBM\\Java Development Kit"); } // IBM Java 1.7 and earlier - if (search.foundJava == NO_JAVA_FOUND) + if (search.foundJava == JAVA_NOT_FOUND) { - regSearchJreSdk("SOFTWARE\\IBM\\Java2 Runtime Environment", - "SOFTWARE\\IBM\\Java Development Kit", - jdkPreference); + if (!search.requiresJdk) + { + regSearchWow("SOFTWARE\\IBM\\Java2 Runtime Environment"); + } + regSearchWow("SOFTWARE\\IBM\\Java Development Kit"); } - if (search.foundJava != NO_JAVA_FOUND) + if (search.foundJava != JAVA_NOT_FOUND) { strcpy(path, search.foundJavaHome); debug("Runtime used:\t%s (%s-bit)\n", search.foundJavaVer, - (search.foundJava & KEY_WOW64_64KEY) != NO_JAVA_FOUND ? "64" : "32"); + (search.foundJava & KEY_WOW64_64KEY) != JAVA_NOT_FOUND ? "64" : "32"); return TRUE; } @@ -911,51 +870,90 @@ void setWorkingDirectory(const char *exePath, const int pathLen) } } -BOOL bundledJreSearch(const char *exePath, const int pathLen) +void removeChar(char *src, const char toRemove) { - debugAll("bundledJreSearch()\n"); - char tmpPath[_MAX_PATH] = {0}; - BOOL is64BitJre = loadBool(BUNDLED_JRE_64_BIT); + char* dst = src; - if (!wow64 && is64BitJre) + do + { + if (*src != toRemove) + { + *dst++ = *src; + } + } while (*src++ != 0); +} + +BOOL pathJreSearch(const char *exePath, const int pathLen) +{ + debugAll("pathJreSearch()\n"); + char jrePathSpec[_MAX_PATH] = {0}; + + if (!wow64 && search.requires64Bit) { - debug("Bundled JRE:\tCannot use 64-bit runtime on 32-bit OS.\n"); + debug("JRE:\t\tCannot use 64-bit runtime on 32-bit OS.\n"); return FALSE; } - if (loadString(JRE_PATH, tmpPath)) + if (loadString(JRE_PATH, jrePathSpec)) { char jrePath[MAX_ARGS] = {0}; - expandVars(jrePath, tmpPath, exePath, pathLen); - debug("Bundled JRE:\t%s\n", jrePath); + expandVars(jrePath, jrePathSpec, exePath, pathLen); + debug("JRE paths:\t%s\n", jrePath); + char* path = strtok(jrePath, ";"); + + while (path != NULL) + { + char pathNoBin[_MAX_PATH] = {0}; + char *lastBackslash = strrchr(path, '\\'); + char *lastSlash = strrchr(path, '/'); - if (jrePath[0] == '\\' || jrePath[1] == ':') - { - // Absolute - strcpy(launcher.cmd, jrePath); - } - else - { - // Relative - strncpy(launcher.cmd, exePath, pathLen); - appendPath(launcher.cmd, jrePath); - } + if (lastBackslash != NULL && strcasecmp(lastBackslash, "\\bin") == 0) + { + strncpy(pathNoBin, path, lastBackslash - path); + } + else if (lastSlash != NULL && strcasecmp(lastSlash, "/bin") == 0) + { + strncpy(pathNoBin, path, lastSlash - path); + } + else + { + strcpy(pathNoBin, path); + } + + removeChar(pathNoBin, '"'); - if (isLauncherPathValid(launcher.cmd)) - { - search.foundJava = is64BitJre ? FOUND_BUNDLED | KEY_WOW64_64KEY : FOUND_BUNDLED; - strcpy(search.foundJavaHome, launcher.cmd); - return TRUE; - } + if (*pathNoBin == '\\' || (*pathNoBin != '\0' && *(pathNoBin + 1) == ':')) + { + // Absolute + strcpy(launcher.cmd, pathNoBin); + } + else + { + // Relative + strncpy(launcher.cmd, exePath, pathLen); + launcher.cmd[pathLen] = 0; + appendPath(launcher.cmd, pathNoBin); + } + + BOOL is64Bit; + if (isLauncherPathValid(launcher.cmd) && isPathJavaVersionGood(launcher.cmd, &is64Bit)) + { + search.foundJava = is64Bit ? JAVA_FOUND | KEY_WOW64_64KEY : JAVA_FOUND; + strcpy(search.foundJavaHome, launcher.cmd); + return TRUE; + } + + path = strtok(NULL, ";"); + } } return FALSE; } -BOOL installedJreSearch() +BOOL registryJreSearch() { - debugAll("installedJreSearch()\n"); - return *search.javaMinVer && findJavaHome(launcher.cmd, loadInt(JDK_PREFERENCE)); + debugAll("registryJreSearch()\n"); + return *search.javaMinVer && findRegistryJavaHome(launcher.cmd); } void createJreSearchError() @@ -972,12 +970,9 @@ void createJreSearchError() strcat(error.msg, search.originalJavaMaxVer); } - if (search.runtimeBits == USE_64_BIT_RUNTIME - || search.runtimeBits == USE_32_BIT_RUNTIME) + if (search.requires64Bit) { - strcat(error.msg, " ("); - strcat(error.msg, search.runtimeBits == USE_64_BIT_RUNTIME ? "64" : "32"); - strcat(error.msg, "-bit)"); + strcat(error.msg, " (64-bit)"); } if (search.corruptedJreFound) @@ -995,7 +990,7 @@ void createJreSearchError() } else { - loadString(BUNDLED_JRE_ERR, error.msg); + loadString(JRE_NOT_FOUND_ERR, error.msg); } } @@ -1004,7 +999,10 @@ BOOL jreSearch(const char *exePath, const int pathLen) debugAll("jreSearch()\n"); BOOL result = TRUE; - search.bundledJreAsFallback = loadBool(BUNDLED_JRE_AS_FALLBACK); + search.requiresJdk = loadBool(REQUIRES_JDK); + debug("Requires JDK:\t%s\n", search.requiresJdk ? "Yes" : "No"); + search.requires64Bit = loadBool(REQUIRES_64_BIT); + debug("Requires 64-Bit: %s\n", search.requires64Bit ? "Yes" : "No"); loadString(JAVA_MIN_VER, search.originalJavaMinVer); formatJavaVersion(search.javaMinVer, search.originalJavaMinVer); debug("Java min ver:\t%s\n", search.javaMinVer); @@ -1012,21 +1010,11 @@ BOOL jreSearch(const char *exePath, const int pathLen) formatJavaVersion(search.javaMaxVer, search.originalJavaMaxVer); debug("Java max ver:\t%s\n", search.javaMaxVer); - if (search.bundledJreAsFallback) + if (!pathJreSearch(exePath, pathLen)) { - if (!installedJreSearch()) - { - result = bundledJreSearch(exePath, pathLen); - } + result = registryJreSearch(); } - else - { - if (!bundledJreSearch(exePath, pathLen)) - { - result = installedJreSearch(); - } - } - + if (!result) { createJreSearchError(); @@ -1209,9 +1197,9 @@ void setCommandLineArgs(const char *lpCmdLine) } } -int prepare(const char *lpCmdLine) +int prepare(const char *lpCmdLine, BOOL jni) { - if (!initGlobals()) + if (!initGlobals(jni)) { return FALSE; } @@ -1230,6 +1218,7 @@ int prepare(const char *lpCmdLine) return FALSE; } + debug("JNI:\t\t%s\n", jniHeader ? "Yes" : "No"); setWow64Flag(); // Set default error message, title and optional support web site url. @@ -1333,3 +1322,131 @@ const char* getLauncherArgs() return launcher.args; } +/* read java version output and save version string in version */ +void getVersionFromOutput(HANDLE outputRd, char *version, int versionLen, BOOL *is64Bit) +{ + CHAR chBuf[BIG_STR] = {0}, *bptr = chBuf; + DWORD dwRead, remain = sizeof(chBuf); + BOOL bSuccess = FALSE; + + while (remain > 0) { + bSuccess = ReadFile(outputRd, bptr, remain, &dwRead, NULL); + if (! bSuccess || dwRead == 0) break; + bptr += dwRead; + remain -= dwRead; + } + debugAll("Java version output: %s\n", chBuf); + *version = '\0'; + const char *verStartPtr = strchr(chBuf, '"'); + if (verStartPtr == NULL) + { + debug("Cannot get version string: cannot find quote\n"); + return; + } + const char *verEndPtr = strchr(++verStartPtr, '"'); + if (verEndPtr == NULL) + { + debug("Cannot get version string: missing end quote\n"); + return; + } + size_t len = verEndPtr - verStartPtr; + if (len >= versionLen) { + debug("Cannot get version string: data too large\n"); + return; + } + memcpy(version, verStartPtr, len); + version[len] = '\0'; + *is64Bit = strstr(chBuf, "64-Bit") != NULL || strstr(chBuf, "64-bit") != NULL; +} + +/* create a child process with cmdline and set stderr/stdout to outputWr */ +BOOL CreateChildProcess(char *cmdline, HANDLE outputWr) +{ + PROCESS_INFORMATION piProcInfo; + STARTUPINFO siStartInfo; + BOOL bSuccess = FALSE; + + ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); + ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); + siStartInfo.cb = sizeof(STARTUPINFO); + siStartInfo.hStdError = outputWr; + siStartInfo.hStdOutput = outputWr; + siStartInfo.dwFlags |= STARTF_USESTDHANDLES; + + debugAll("Create process: %s\n", cmdline); + bSuccess = CreateProcess(NULL, cmdline, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &siStartInfo, &piProcInfo); + if (!bSuccess) + { + debug("Cannot create process %s\n", cmdline); + } + else + { + CloseHandle(piProcInfo.hProcess); + CloseHandle(piProcInfo.hThread); + } + CloseHandle(outputWr); + return bSuccess; +} + +BOOL isJavaVersionGood(const char *version, BOOL is64Bit) +{ + BOOL result = (!*search.javaMinVer || strcmp(version, search.javaMinVer) >= 0) + && (!*search.javaMaxVer || strcmp(version, search.javaMaxVer) <= 0) + && (!search.requires64Bit || is64Bit) + && (!jniHeader || !is64Bit); + debug("Version string: %s / %s-Bit (%s)\n", version, is64Bit ? "64" : "32", result ? "OK" : "Ignore"); + return result; +} + +/* + * Run /bin/java(w) -version. Return TRUE if version is good. + */ +BOOL isPathJavaVersionGood(const char *path, BOOL *is64Bit) +{ + SECURITY_ATTRIBUTES saAttr; + HANDLE outputRd = NULL; + HANDLE outputWr = NULL; + + debugAll("Check Java Version: %s min=%s max=%s\n", path, search.javaMinVer, search.javaMaxVer); + + saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); + saAttr.bInheritHandle = TRUE; + saAttr.lpSecurityDescriptor = NULL; + + // Create a pipe for the child process's STDOUT. + if (!CreatePipe(&outputRd, &outputWr, &saAttr, 0)) + { + debug("Cannot create pipe\n"); + return FALSE; + } + // Ensure the read handle to the pipe for STDOUT is not inherited. + if (!SetHandleInformation(outputRd, HANDLE_FLAG_INHERIT, 0)) + { + debug("Cannot set handle information\n"); + CloseHandle(outputRd); + CloseHandle(outputWr); + return FALSE; + } + // create child process + char cmdline[MAX_ARGS] = {0}; + char launcherPath[_MAX_PATH] = {0}; + strcpy(launcherPath, path); + appendLauncher(launcherPath); + snprintf(cmdline, MAX_ARGS, "\"%s\" -version", launcherPath); + if (!CreateChildProcess(cmdline, outputWr)) + { + debug("Cannot run java(w) -version\n"); + CloseHandle(outputRd); + return FALSE; + } + char version[STR] = {0}, formattedVersion[STR] = {0}; + + getVersionFromOutput(outputRd, version, sizeof(version), is64Bit); + CloseHandle(outputRd); + if (*version != '\0') + { + formatJavaVersion(formattedVersion, version); + return isJavaVersionGood(formattedVersion, *is64Bit); + } + return FALSE; +} diff --git a/launch4j/head_src/head.h b/launch4j/head_src/head.h index 2d56a2d..4986f84 100644 --- a/launch4j/head_src/head.h +++ b/launch4j/head_src/head.h @@ -54,25 +54,12 @@ #include #define LAUNCH4j "Launch4j" -#define VERSION "3.12" +#define VERSION "3.50" #define JRE_VER_MAX_DIGITS_PER_PART 3 -#define NO_JAVA_FOUND 0 -#define FOUND_JRE 1 -#define FOUND_SDK 2 -#define FOUND_BUNDLED 4 - -#define JRE_ONLY 0 -#define PREFER_JRE 1 -#define PREFER_JDK 2 -#define JDK_ONLY 3 - -#define USE_64_BIT_RUNTIME 1 -#define USE_64_AND_32_BIT_RUNTIME 2 -#define USE_32_AND_64_BIT_RUNTIME 3 -#define USE_32_BIT_RUNTIME 4 -#define INIT_RUNTIME_BITS 9 +#define JAVA_NOT_FOUND 0 +#define JAVA_FOUND 1 #define KEY_WOW64_64KEY 0x0100 @@ -97,7 +84,7 @@ typedef void (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); -BOOL initGlobals(); +BOOL initGlobals(BOOL jni); FILE* openLogFile(const char* exePath, const int pathLen); void closeLogFile(); BOOL initializeLogging(const char *lpCmdLine, const char* exePath, const int pathLen); @@ -110,12 +97,10 @@ BOOL regQueryValue(const char* regPath, unsigned char* buffer, unsigned long bufferLength); void formatJavaVersion(char* version, const char* originalVersion); void regSearch(const char* keyName, const int searchType); -BOOL isJavaHomeValid(const char* keyName, const int searchType); +BOOL isRegistryJavaHomeValid(const char* keyName, const int searchType); BOOL isLauncherPathValid(const char* path); -void regSearchWow(const char* keyName, const int searchType); -void regSearchJreSdk(const char* jreKeyName, const char* sdkKeyName, - const int jdkPreference); -BOOL findJavaHome(char* path, const int jdkPreference); +void regSearchWow(const char* keyName); +BOOL findRegistryJavaHome(char* path); int getExePath(char* exePath); void appendPath(char* basepath, const char* path); void appendLauncher(char* jrePath); @@ -127,8 +112,9 @@ void appendHeapSize(char *dst, const int megabytesID, const int percentID, void setJvmOptions(char *jvmOptions, const char *exePath); BOOL createMutex(); void setWorkingDirectory(const char *exePath, const int pathLen); -BOOL bundledJreSearch(const char *exePath, const int pathLen); -BOOL installedJreSearch(); +void removeChar(char *src, const char toRemove); +BOOL pathJreSearch(const char *exePath, const int pathLen); +BOOL registryJreSearch(); void createJreSearchError(); BOOL jreSearch(const char *exePath, const int pathLen); BOOL appendToPathVar(const char* path); @@ -136,11 +122,15 @@ BOOL appendJreBinToPathVar(); void setEnvironmentVariables(const char *exePath, const int pathLen); void setMainClassAndClassPath(const char *exePath, const int pathLen); void setCommandLineArgs(const char *lpCmdLine); -int prepare(const char *lpCmdLine); +int prepare(const char *lpCmdLine, BOOL jni); void closeProcessHandles(); BOOL execute(const BOOL wait, DWORD *dwExitCode); const char* getJavaHome(); const char* getMainClass(); const char* getLauncherArgs(); +void getVersionFromOutput(HANDLE outputRd, char *version, int versionLen, BOOL *is64Bit); +BOOL CreateChildProcess(char *cmdline, HANDLE outputWr); +BOOL isJavaVersionGood(const char* version, BOOL is64Bit); +BOOL isJavaPathVersionGood(const char *path, BOOL *is64Bit); #endif // _LAUNCH4J_HEAD__INCLUDED_ diff --git a/launch4j/head_src/jniconsolehead_BETA/.gitignore b/launch4j/head_src/jniconsolehead_BETA/.gitignore deleted file mode 100644 index 1c252a6..0000000 --- a/launch4j/head_src/jniconsolehead_BETA/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/jniconsolehead.exe -/jniconsolehead.layout diff --git a/launch4j/head_src/jniconsolehead_BETA/Makefile.win b/launch4j/head_src/jniconsolehead_BETA/Makefile.win index b2357ac..7e3d79f 100644 --- a/launch4j/head_src/jniconsolehead_BETA/Makefile.win +++ b/launch4j/head_src/jniconsolehead_BETA/Makefile.win @@ -6,9 +6,9 @@ CC = gcc.exe WINDRES = windres.exe OBJ = ../../head_jni_BETA/jniconsolehead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o LINKOBJ = ../../head_jni_BETA/jniconsolehead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o -LIBS = -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib" -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -n -s -INCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" -CXXINCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" +LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -n -s +INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include/win32" +CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include/win32" BIN = jniconsolehead.exe CXXFLAGS = $(CXXINCS) -Os CFLAGS = $(INCS) -Os diff --git a/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.c b/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.c index 0e7f6dd..22261ef 100644 --- a/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.c +++ b/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.c @@ -56,7 +56,7 @@ int main(int argc, char* argv[]) cmdLine = ""; } - int result = prepare(cmdLine); + int result = prepare(cmdLine, TRUE); if (result == ERROR_ALREADY_EXISTS) { diff --git a/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.dev b/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.dev index 0b585a5..2bfbe14 100644 --- a/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.dev +++ b/launch4j/head_src/jniconsolehead_BETA/jniconsolehead.dev @@ -5,7 +5,7 @@ UnitCount=6 Type=1 Ver=2 ObjFiles= -Includes="C:\Program Files (x86)\Java\jdk 1.4\include";"C:\Program Files (x86)\Java\jdk 1.4\include\win32" +Includes="c:\Program Files\AdoptOpenJDK\jdk-8.0.282.8-hotspot\include";"c:\Program Files\AdoptOpenJDK\jdk-8.0.282.8-hotspot\include\win32" Libs= PrivateResource= ResourceIncludes= diff --git a/launch4j/head_src/jniguihead_BETA/.gitignore b/launch4j/head_src/jniguihead_BETA/.gitignore deleted file mode 100644 index 033e91b..0000000 --- a/launch4j/head_src/jniguihead_BETA/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/jniguihead.exe -/jniguihead.layout diff --git a/launch4j/head_src/jniguihead_BETA/Makefile.win b/launch4j/head_src/jniguihead_BETA/Makefile.win index 8bdac72..ed48593 100644 --- a/launch4j/head_src/jniguihead_BETA/Makefile.win +++ b/launch4j/head_src/jniguihead_BETA/Makefile.win @@ -6,9 +6,9 @@ CC = gcc.exe WINDRES = windres.exe OBJ = ../../head_jni_BETA/jniguihead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o LINKOBJ = ../../head_jni_BETA/jniguihead.o ../../head_jni_BETA/head.o ../../head_jni_BETA/jnihead.o -LIBS = -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib" -L"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -mwindows -n -s -INCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" -CXXINCS = -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/mingw32/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Users/GMan/Dev-Cpp 5.7.1/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" -I"C:/Program Files (x86)/Java/jdk 1.4/include" -I"C:/Program Files (x86)/Java/jdk 1.4/include/win32" +LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc -mwindows -n -s +INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include/win32" +CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include" -I"c:/Program Files/AdoptOpenJDK/jdk-8.0.282.8-hotspot/include/win32" BIN = jniguihead.exe CXXFLAGS = $(CXXINCS) -Os CFLAGS = $(INCS) -Os diff --git a/launch4j/head_src/jniguihead_BETA/jniguihead.c b/launch4j/head_src/jniguihead_BETA/jniguihead.c index 0259a27..9551404 100644 --- a/launch4j/head_src/jniguihead_BETA/jniguihead.c +++ b/launch4j/head_src/jniguihead_BETA/jniguihead.c @@ -50,7 +50,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow) { - int result = prepare(lpCmdLine); + int result = prepare(lpCmdLine, TRUE); if (result == ERROR_ALREADY_EXISTS) { diff --git a/launch4j/head_src/jniguihead_BETA/jniguihead.dev b/launch4j/head_src/jniguihead_BETA/jniguihead.dev index a2667ed..4dfbfb2 100644 --- a/launch4j/head_src/jniguihead_BETA/jniguihead.dev +++ b/launch4j/head_src/jniguihead_BETA/jniguihead.dev @@ -5,7 +5,7 @@ UnitCount=7 Type=0 Ver=2 ObjFiles= -Includes="C:\Program Files (x86)\Java\jdk 1.4\include";"C:\Program Files (x86)\Java\jdk 1.4\include\win32" +Includes="c:\Program Files\AdoptOpenJDK\jdk-8.0.282.8-hotspot\include";"c:\Program Files\AdoptOpenJDK\jdk-8.0.282.8-hotspot\include\win32" Libs= PrivateResource= ResourceIncludes= diff --git a/launch4j/head_src/jniguihead_BETA/jniguihead.h b/launch4j/head_src/jniguihead_BETA/jniguihead.h index ebef396..2fc71e3 100644 --- a/launch4j/head_src/jniguihead_BETA/jniguihead.h +++ b/launch4j/head_src/jniguihead_BETA/jniguihead.h @@ -1,43 +1,43 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2007 Grzegorz Kowal - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -#define ID_TIMER 1 -#define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ -#define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ - -HWND getInstanceWindow(); - -BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); - -VOID CALLBACK TimerProc( - HWND hwnd, // handle of window for timer messages - UINT uMsg, // WM_TIMER message - UINT idEvent, // timer identifier - DWORD dwTime // current system time -); +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2007 Grzegorz Kowal + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#define ID_TIMER 1 +#define DEFAULT_SPLASH_TIMEOUT 60 /* 60 seconds */ +#define MAX_SPLASH_TIMEOUT 60 * 15 /* 15 minutes */ + +HWND getInstanceWindow(); + +BOOL CALLBACK enumwndfn(HWND hwnd, LPARAM lParam); + +VOID CALLBACK TimerProc( + HWND hwnd, // handle of window for timer messages + UINT uMsg, // WM_TIMER message + UINT idEvent, // timer identifier + DWORD dwTime // current system time +); diff --git a/launch4j/head_src/makefile b/launch4j/head_src/makefile new file mode 100644 index 0000000..1220bb5 --- /dev/null +++ b/launch4j/head_src/makefile @@ -0,0 +1,13 @@ +MAKE = mingw32-make.exe + +all: + $(MAKE) -C guihead -f Makefile.win all + $(MAKE) -C consolehead -f Makefile.win all + $(MAKE) -C jniguihead_BETA -f Makefile.win all + $(MAKE) -C jniconsolehead_BETA -f Makefile.win all + +clean: + $(MAKE) -C guihead -f Makefile.win clean + $(MAKE) -C consolehead -f Makefile.win clean + $(MAKE) -C jniguihead_BETA -f Makefile.win clean + $(MAKE) -C jniconsolehead_BETA -f Makefile.win clean diff --git a/launch4j/head_src/resource.h b/launch4j/head_src/resource.h index 829923d..cf53579 100644 --- a/launch4j/head_src/resource.h +++ b/launch4j/head_src/resource.h @@ -1,75 +1,72 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2014 Grzegorz Kowal - Ian Roberts (jdk preference patch) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - Except as contained in this notice, the name(s) of the above copyright holders - shall not be used in advertising or otherwise to promote the sale, use or other - dealings in this Software without prior written authorization. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -// ICON -#define APP_ICON 1 - -// BITMAP -#define SPLASH_BITMAP 1 - -// RCDATA -#define JRE_PATH 1 -#define JAVA_MIN_VER 2 -#define JAVA_MAX_VER 3 -#define SHOW_SPLASH 4 -#define SPLASH_WAITS_FOR_WINDOW 5 -#define SPLASH_TIMEOUT 6 -#define SPLASH_TIMEOUT_ERR 7 -#define CHDIR 8 -#define SET_PROC_NAME 9 -#define ERR_TITLE 10 -#define GUI_HEADER_STAYS_ALIVE 11 -#define JVM_OPTIONS 12 -#define CMD_LINE 13 -#define JAR 14 -#define MAIN_CLASS 15 -#define CLASSPATH 16 -#define WRAPPER 17 -#define JDK_PREFERENCE 18 -#define ENV_VARIABLES 19 -#define PRIORITY_CLASS 20 -#define DOWNLOAD_URL 21 -#define SUPPORT_URL 22 -#define MUTEX_NAME 23 -#define INSTANCE_WINDOW_TITLE 24 -#define INITIAL_HEAP_SIZE 25 -#define INITIAL_HEAP_PERCENT 26 -#define MAX_HEAP_SIZE 27 -#define MAX_HEAP_PERCENT 28 -#define BUNDLED_JRE_64_BIT 29 -#define RUNTIME_BITS 30 -#define RESTART_ON_CRASH 31 -#define BUNDLED_JRE_AS_FALLBACK 32 - -#define STARTUP_ERR 101 -#define BUNDLED_JRE_ERR 102 -#define JRE_VERSION_ERR 103 -#define LAUNCHER_ERR 104 -#define INSTANCE_ALREADY_EXISTS_MSG 105 +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2014 Grzegorz Kowal + Ian Roberts (jdk preference patch) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + Except as contained in this notice, the name(s) of the above copyright holders + shall not be used in advertising or otherwise to promote the sale, use or other + dealings in this Software without prior written authorization. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +// ICON +#define APP_ICON 1 + +// BITMAP +#define SPLASH_BITMAP 1 + +// RCDATA +#define JRE_PATH 1 +#define JAVA_MIN_VER 2 +#define JAVA_MAX_VER 3 +#define SHOW_SPLASH 4 +#define SPLASH_WAITS_FOR_WINDOW 5 +#define SPLASH_TIMEOUT 6 +#define SPLASH_TIMEOUT_ERR 7 +#define CHDIR 8 +#define ERR_TITLE 10 +#define GUI_HEADER_STAYS_ALIVE 11 +#define JVM_OPTIONS 12 +#define CMD_LINE 13 +#define JAR 14 +#define MAIN_CLASS 15 +#define CLASSPATH 16 +#define WRAPPER 17 +#define REQUIRES_JDK 18 +#define ENV_VARIABLES 19 +#define PRIORITY_CLASS 20 +#define DOWNLOAD_URL 21 +#define SUPPORT_URL 22 +#define MUTEX_NAME 23 +#define INSTANCE_WINDOW_TITLE 24 +#define INITIAL_HEAP_SIZE 25 +#define INITIAL_HEAP_PERCENT 26 +#define MAX_HEAP_SIZE 27 +#define MAX_HEAP_PERCENT 28 +#define REQUIRES_64_BIT 29 +#define RESTART_ON_CRASH 31 + +#define STARTUP_ERR 101 +#define JRE_NOT_FOUND_ERR 102 +#define JRE_VERSION_ERR 103 +#define LAUNCHER_ERR 104 +#define INSTANCE_ALREADY_EXISTS_MSG 105 diff --git a/launch4j/launch4j b/launch4j/launch4j index 7d65191..6bb71fd 100755 --- a/launch4j/launch4j +++ b/launch4j/launch4j @@ -1,7 +1,7 @@ -#!/bin/sh -LAUNCH4J="$(dirname "$0")"/launch4j.jar -if [ -n "$JAVA_HOME" ]; then - $JAVA_HOME/bin/java -jar "$LAUNCH4J" "$@" -else - java -jar "$LAUNCH4J" "$@" -fi +#!/bin/sh +LAUNCH4J="$(dirname "$0")"/launch4j.jar +if [ -n "$JAVA_HOME" ]; then + $JAVA_HOME/bin/java -jar "$LAUNCH4J" "$@" +else + java -jar "$LAUNCH4J" "$@" +fi diff --git a/launch4j/launch4j.jar b/launch4j/launch4j.jar index 722e53d..edbbb1a 100644 --- a/launch4j/launch4j.jar +++ b/launch4j/launch4j.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a69034740a0d8973cd65750cd690226146b217f402489d00111d5f2e7610d17 -size 199603 +oid sha256:c82fa95a0584dfb61fbae57966ad5ef37739158254faf4961173e81900574d8b +size 196743 diff --git a/launch4j/launch4jc b/launch4j/launch4jc new file mode 100755 index 0000000..e862c35 --- /dev/null +++ b/launch4j/launch4jc @@ -0,0 +1,8 @@ +#!/bin/sh +LAUNCH4J="$(dirname "$0")"/launch4j.jar +if [ -n "$JAVA_HOME" ]; then + $JAVA_HOME/bin/java -Djava.awt.headless=true -jar "$LAUNCH4J" "$@" +else + java -Djava.awt.headless=true -jar "$LAUNCH4J" "$@" +fi + diff --git a/launch4j/lib/JGoodies.Looks.LICENSE.txt b/launch4j/lib/JGoodies.Looks.LICENSE.txt deleted file mode 100644 index a70977e..0000000 --- a/launch4j/lib/JGoodies.Looks.LICENSE.txt +++ /dev/null @@ -1,31 +0,0 @@ - - The BSD License for the JGoodies Looks - ====================================== - -Copyright (c) 2001-2014 JGoodies Software GmbH. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - o Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - o Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - o Neither the name of JGoodies Software GmbH nor the names of - its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt b/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt index b1e3f5a..cbee875 100644 --- a/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt +++ b/launch4j/lib/Nuvola.Icon.Theme.LICENSE.txt @@ -1,504 +1,504 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/launch4j/lib/XStream.LICENSE.txt b/launch4j/lib/XStream.LICENSE.txt index 4848b3e..96047d8 100644 --- a/launch4j/lib/XStream.LICENSE.txt +++ b/launch4j/lib/XStream.LICENSE.txt @@ -1,27 +1,28 @@ -(BSD Style License) - -Copyright (c) 2003-2004, Joe Walnes -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of -conditions and the following disclaimer. Redistributions in binary form must reproduce -the above copyright notice, this list of conditions and the following disclaimer in -the documentation and/or other materials provided with the distribution. - -Neither the name of XStream nor the names of its contributors may be used to endorse -or promote products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY -WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. +(BSD Style License) + +Copyright (c) 2003-2006, Joe Walnes +Copyright (c) 2006-2019, XStream Committers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer. Redistributions in binary form must reproduce +the above copyright notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. + +Neither the name of XStream nor the names of its contributors may be used to endorse +or promote products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/launch4j/lib/ant.LICENSE.txt b/launch4j/lib/ant.LICENSE.txt index 261eeb9..29f81d8 100644 --- a/launch4j/lib/ant.LICENSE.txt +++ b/launch4j/lib/ant.LICENSE.txt @@ -1,201 +1,201 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/launch4j/lib/ant.jar b/launch4j/lib/ant.jar index bb35823..cc9ff6a 100644 --- a/launch4j/lib/ant.jar +++ b/launch4j/lib/ant.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2a0a134303854e52e39baf14547305ba259c35849704095041684720a563a65a -size 1927228 +oid sha256:0715478af585ea80a18985613ebecdc7922122d45b2c3c970ff9b352cddb75fc +size 2276652 diff --git a/launch4j/lib/commons-beanutils.jar b/launch4j/lib/commons-beanutils.jar index ba49450..a9685df 100644 --- a/launch4j/lib/commons-beanutils.jar +++ b/launch4j/lib/commons-beanutils.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:24bcaa20ccbdc7c856ce0c0aea144566943403e2e9f27bd9779cda1d76823ef4 -size 188671 +oid sha256:7d938c81789028045c08c065e94be75fc280527620d5bd62b519d5838532368a +size 246918 diff --git a/launch4j/lib/commons.LICENSE.txt b/launch4j/lib/commons.LICENSE.txt index fdb6475..75b5248 100644 --- a/launch4j/lib/commons.LICENSE.txt +++ b/launch4j/lib/commons.LICENSE.txt @@ -1,50 +1,202 @@ -/* - ============================================================================ - The Apache Software License, Version 1.1 - ============================================================================ - - Copyright (C) @year@ The Apache Software Foundation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modifica- - tion, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. - - 4. The names "Apache Cocoon" and "Apache Software Foundation" must not be - used to endorse or promote products derived from this software without - prior written permission. For written permission, please contact - apache@apache.org. - - 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This software consists of voluntary contributions made by many individuals - on behalf of the Apache Software Foundation and was originally created by - Stefano Mazzocchi . For more information on the Apache - Software Foundation, please see . - -*/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/launch4j/lib/flatlaf.LICENSE.txt b/launch4j/lib/flatlaf.LICENSE.txt new file mode 100644 index 0000000..29f81d8 --- /dev/null +++ b/launch4j/lib/flatlaf.LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/launch4j/lib/flatlaf.jar b/launch4j/lib/flatlaf.jar new file mode 100644 index 0000000..418eb92 --- /dev/null +++ b/launch4j/lib/flatlaf.jar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:135d8d5ac39fec29d9b3ff52cb30726d3f976b0698615be32534fd7924f29ec7 +size 497932 diff --git a/launch4j/lib/foxtrot.LICENSE.txt b/launch4j/lib/foxtrot.LICENSE.txt deleted file mode 100644 index 5fa4019..0000000 --- a/launch4j/lib/foxtrot.LICENSE.txt +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2002, Simone Bordet & Marco Cravero -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted -provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - - Neither the name of Foxtrot nor the names of the contributors may be used - to endorse or promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/launch4j/lib/foxtrot.jar b/launch4j/lib/foxtrot.jar deleted file mode 100644 index 0460567..0000000 --- a/launch4j/lib/foxtrot.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cdce2f57b9679040b37c65ab6d4196a3c8e30c8dc9a59c126bce7b543a32eeb -size 25676 diff --git a/launch4j/lib/jgoodies-looks.jar b/launch4j/lib/jgoodies-looks.jar deleted file mode 100644 index 177ee47..0000000 --- a/launch4j/lib/jgoodies-looks.jar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:536fb1e76cf49c76ca336368b1d133294bc48358be6fc5160087a60d38599227 -size 401436 diff --git a/launch4j/lib/xstream.jar b/launch4j/lib/xstream.jar index 47f526a..806d226 100644 --- a/launch4j/lib/xstream.jar +++ b/launch4j/lib/xstream.jar @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:81bc96cd5de2519bac50b8a7d13e6cb52d81315c576dc4304817089eb8bde934 -size 261710 +oid sha256:3277849961aa9eb055f8771810450086d38cc2e407eeb8346d0239ea0218a453 +size 627848 diff --git a/launch4j/manifest/uac.exe.manifest b/launch4j/manifest/uac.exe.manifest index 3041fbc..7b29e98 100644 --- a/launch4j/manifest/uac.exe.manifest +++ b/launch4j/manifest/uac.exe.manifest @@ -1,12 +1,12 @@ - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/launch4j/maven/.classpath b/launch4j/maven/.classpath index 9f62fb5..dce4d96 100644 --- a/launch4j/maven/.classpath +++ b/launch4j/maven/.classpath @@ -1,24 +1,24 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/launch4j/maven/assembly/assemble-dist.xml b/launch4j/maven/assembly/assemble-dist.xml index 20f2c17..27c6f27 100644 --- a/launch4j/maven/assembly/assemble-dist.xml +++ b/launch4j/maven/assembly/assemble-dist.xml @@ -1,14 +1,14 @@ - - distribution-libs - - dir - - false - - - - false - - + + distribution-libs + + dir + + false + + + + false + + \ No newline at end of file diff --git a/launch4j/maven/assembly/assemble-linux.xml b/launch4j/maven/assembly/assemble-linux.xml index 94d4cf9..d199505 100644 --- a/launch4j/maven/assembly/assemble-linux.xml +++ b/launch4j/maven/assembly/assemble-linux.xml @@ -1,53 +1,53 @@ - - - - workdir-linux - - jar - - false - - - bin/bin-linux - ${finalName}-workdir-linux/bin - - - ${finalName}-workdir-linux - - w32api/**/* - w32api_jni/**/* - head/**/* - head_jni_BETA/**/* - - - - + + + + workdir-linux + + jar + + false + + + bin/bin-linux + ${finalName}-workdir-linux/bin + + + ${finalName}-workdir-linux + + w32api/**/* + w32api_jni/**/* + head/**/* + head_jni_BETA/**/* + + + + diff --git a/launch4j/maven/assembly/assemble-linux64.xml b/launch4j/maven/assembly/assemble-linux64.xml index d116be7..aae7cba 100644 --- a/launch4j/maven/assembly/assemble-linux64.xml +++ b/launch4j/maven/assembly/assemble-linux64.xml @@ -1,53 +1,53 @@ - - - - workdir-linux64 - - jar - - false - - - bin/bin-linux64 - ${finalName}-workdir-linux64/bin - - - ${finalName}-workdir-linux64 - - w32api/**/* - w32api_jni/**/* - head/**/* - head_jni_BETA/**/* - - - - + + + + workdir-linux64 + + jar + + false + + + bin/bin-linux64 + ${finalName}-workdir-linux64/bin + + + ${finalName}-workdir-linux64 + + w32api/**/* + w32api_jni/**/* + head/**/* + head_jni_BETA/**/* + + + + diff --git a/launch4j/maven/assembly/assemble-mac.xml b/launch4j/maven/assembly/assemble-mac.xml index e813f72..db73176 100644 --- a/launch4j/maven/assembly/assemble-mac.xml +++ b/launch4j/maven/assembly/assemble-mac.xml @@ -1,53 +1,53 @@ - - - - workdir-mac - - jar - - false - - - bin/bin-macosx-x86 - ${finalName}-workdir-mac/bin - - - ${finalName}-workdir-mac - - w32api/**/* - w32api_jni/**/* - head/**/* - head_jni_BETA/**/* - - - - + + + + workdir-mac + + jar + + false + + + bin/bin-macosx-x86 + ${finalName}-workdir-mac/bin + + + ${finalName}-workdir-mac + + w32api/**/* + w32api_jni/**/* + head/**/* + head_jni_BETA/**/* + + + + diff --git a/launch4j/maven/assembly/assemble-win32.xml b/launch4j/maven/assembly/assemble-win32.xml index 4680f89..e5ab6b5 100644 --- a/launch4j/maven/assembly/assemble-win32.xml +++ b/launch4j/maven/assembly/assemble-win32.xml @@ -1,53 +1,53 @@ - - - - workdir-win32 - - jar - - false - - - bin/bin-win32 - ${finalName}-workdir-win32/bin - - - ${finalName}-workdir-win32 - - w32api/**/* - w32api_jni/**/* - head/**/* - head_jni_BETA/**/* - - - - + + + + workdir-win32 + + jar + + false + + + bin/bin-win32 + ${finalName}-workdir-win32/bin + + + ${finalName}-workdir-win32 + + w32api/**/* + w32api_jni/**/* + head/**/* + head_jni_BETA/**/* + + + + diff --git a/launch4j/maven/assembly/src.xml b/launch4j/maven/assembly/src.xml index c930835..5da8fc6 100644 --- a/launch4j/maven/assembly/src.xml +++ b/launch4j/maven/assembly/src.xml @@ -1,55 +1,55 @@ - - - - src - - tar.gz - zip - - - - - README* - LICENSE* - NOTICE* - TODO - pom.xml - - - - src - - **/.*.swp - - - - + + + + src + + tar.gz + zip + + + + + README* + LICENSE* + NOTICE* + TODO + pom.xml + + + + src + + **/.*.swp + + + + diff --git a/launch4j/maven/maven-readme.txt b/launch4j/maven/maven-readme.txt index c977ad8..0ce83de 100644 --- a/launch4j/maven/maven-readme.txt +++ b/launch4j/maven/maven-readme.txt @@ -1,8 +1,8 @@ -Run once the Ant target switch-to-maven, it will reconfigure the project to use maven. - -*** Creation of Distribution Release *** -Windows: mvn -P dist,win32 clean package - -Linux: mvn -P dist,linux clean package - -MacOsX: mvn -P dist,macosx-x86 clean package +Run once the Ant target switch-to-maven, it will reconfigure the project to use maven. + +*** Creation of Distribution Release *** +Windows: mvn -P dist,win32 clean package + +Linux: mvn -P dist,linux clean package + +MacOsX: mvn -P dist,macosx-x86 clean package diff --git a/launch4j/maven/pom.xml b/launch4j/maven/pom.xml index e53dd05..5347600 100644 --- a/launch4j/maven/pom.xml +++ b/launch4j/maven/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 net.sf.launch4j @@ -115,11 +116,6 @@ - - foxtrot - foxtrot - 2.0 - com.jgoodies jgoodies-common @@ -131,9 +127,9 @@ 1.2.1 - com.jgoodies - looks - 2.2.2 + com.formdev + flatlaf + 1.0 com.thoughtworks.xstream @@ -143,7 +139,7 @@ org.apache.ant ant - 1.9.15 + 1.10.9 @@ -161,10 +157,10 @@ maven-compiler-plugin - 3.1 + 3.8.1 - 1.6 - 1.6 + 1.8 + 1.8 @@ -321,7 +317,10 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9.1 + 3.2.0 + + none + attach-javadocs @@ -381,12 +380,12 @@ bin-win32 - + com.akathist.maven.plugins.launch4j launch4j-maven-plugin - 1.6 + 1.7.25 launch4j @@ -404,7 +403,7 @@ false - 1.6.0 + 1.8.0 ${versionNumber} @@ -427,7 +426,7 @@ - dist + dist @@ -435,7 +434,7 @@ maven-clean-plugin 2.6 - + ${basedir}/bin @@ -450,7 +449,7 @@ launch4j.exe - + ${basedir} @@ -505,8 +504,8 @@ - - + + - + \ No newline at end of file diff --git a/launch4j/sign4j/README.txt b/launch4j/sign4j/README.txt deleted file mode 100644 index a05b644..0000000 --- a/launch4j/sign4j/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -sign4j version 3.0 ------------------- - -sign4j is a very simple utility to digitally sign executables containing an appended jar file, like those created by launch4j. - -It works by first signing a temporary file to detect the size of the applied signature, and by then adding that size to a counter in the ZIP_END_HEADER of the embedded jar, so as to pretend that the signature is a comment belonging to it. That way the jar remains formally correct, and java accepts it. - -This manipulation must be done atomically with the signing process, because doing it before would invalidate the jar file, while doing it later would break the signature. That's why the whole command line of your signing tool must be passed to sign4j, which will do the job. - -Any signing tool can be used, as long as the name of the output file can be recognized among its parameters. This is currently done by either using an -out option if present, or taking the last filename with an exe suffix after all supplied options. - -If the involved tool is able to remove a previous signature before adding the new one (as is normally the case) the initial test can be performed on the target executable itself, avoiding the creation of a temporary file. You can use the option --onthespot to signal that to sign4j. - -The option --strict can be used to suppress the use of double quotes around parameters that strictly don't need them. The option --verbose shows diagnostics about intermediary steps of the process. - -This utility can also be used to sign normal executables, but then it will remember you that the file can be signed directly. - -Please send comments to bramfeld@diogen.de diff --git a/launch4j/sign4j/sign4j.c b/launch4j/sign4j/sign4j.c deleted file mode 100644 index 4918011..0000000 --- a/launch4j/sign4j/sign4j.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - sign4j.c: a simple utility to sign executables created by Launch4j - - Copyright (c) 2012 Servoy - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include -#include -#include -#ifdef _WIN32 -#include -#include -#else -#include -#include -#endif -#include -#include - -#define ZIP_END_HEADER "\x50\x4B\x05\x06" -#define END_HEADER_SIZE 22 -#define MAX_COMMENT_SIZE 0xFFFF -#define SWAP_BLOCK_SIZE (4 * 1024 * 1024) -#define TEST_FILE_NAME "sign4j_temporary.exe" -#define SIGN4J_VERSION "3.0" - -#ifndef _WIN32 -#define O_BINARY 0 -#define _O_SHORT_LIVED 0 -#define _S_IREAD S_IREAD -#define _S_IWRITE S_IWRITE -#define stricmp strcasecmp -#endif - -typedef unsigned char byte; - -char command[4096]; -byte* image = 0; - -void usage (void); -void quit (int rsn); -void clear (void); - -int main (int argc, char* argv[]) -{ - char bfr[2]; - char* inf; - char* outf; - char* trg; - byte* lmt; - long lng, ext, off, blck, sgm; - int fd, td; - int fnd, spt, unq, vrb, qts, cmn; - int i, j, n; - byte* p; - - inf = outf = 0, fnd = spt = unq = vrb = 0; - for (i = 1; i < argc && argv[i][0] == '-'; i++) - if (! strcmp (argv[i], "--onthespot")) - spt = 1; - else if (! strcmp (argv[i], "--strict")) - unq = 1; - else if (! strcmp (argv[i], "--verbose")) - vrb = 1; - j = i; - for (i = j + 1; i < argc; i++) - if (! strcmp (argv[i], "-in") && i < argc - 1) - inf = argv[++i], fnd = 1; - else if (! strcmp (argv[i], "-out") && i < argc - 1) - outf = argv[++i], fnd = 1; - else if (argv[i][0] == '-' || (argv[i][0] == '/' && strlen (argv[i]) < 5)) - (! fnd ? (inf = outf = 0) : 0); - else if (! fnd && (n = strlen (argv[i])) > 4 && ! stricmp (argv[i] + n - 4, ".exe")) - inf = outf = argv[i]; - if (! inf || ! outf) - usage (); - atexit (clear); - - if ((fd = open (inf, O_RDONLY | O_BINARY)) < 0) - quit (1); - if ((lng = lseek (fd, 0, SEEK_END)) < 0) - quit (2); - blck = (lng > SWAP_BLOCK_SIZE ? SWAP_BLOCK_SIZE : lng); - if (! (image = (byte*) malloc (blck))) - quit (4); - sgm = (blck > END_HEADER_SIZE + MAX_COMMENT_SIZE ? END_HEADER_SIZE + MAX_COMMENT_SIZE : blck); - if (lseek (fd, -sgm, SEEK_END) < 0 || read (fd, image, sgm) != sgm) - quit (2); - for (p = image + sgm - END_HEADER_SIZE; p > image; p--) - if (! memcmp (p, ZIP_END_HEADER, 4) && ((p[END_HEADER_SIZE - 1] << 8) | p[END_HEADER_SIZE - 2]) == (image + sgm) - (p + END_HEADER_SIZE)) - break; - if (p > image) - { - off = lng - ((image + sgm) - (p + END_HEADER_SIZE - 2)); - cmn = (p[END_HEADER_SIZE - 1] << 8) | p[END_HEADER_SIZE - 2]; - - if (! spt && (inf == outf || ! strcmp (inf, outf))) - { - printf ("Making temporary file\n"); - if ((td = open (TEST_FILE_NAME, O_CREAT | _O_SHORT_LIVED | O_WRONLY | O_BINARY, _S_IREAD | _S_IWRITE)) < 0) - quit (5); - if (lseek (fd, 0, SEEK_SET) < 0) - quit (2); - for (ext = lng; ext > 0; ext -= blck) - { - sgm = (ext > blck ? blck : ext); - if (read (fd, image, sgm) != sgm || write (td, image, sgm) != sgm) - quit (6); - } - close (td); - trg = TEST_FILE_NAME; - } - else - trg = outf; - close (fd); - -#ifdef _WIN32 - strcpy (command, "\" "); -#else - strcpy (command, ""); -#endif - - for (i = j; i < argc; i++) - { - p = (argv[i] == outf ? trg : argv[i]); - qts = (! unq || strchr (p, 32)); - if (qts) - strcat (command, "\""); - strcat (command, p); - if (qts) - strcat (command, "\""); - strcat (command, " "); - } - -#ifdef _WIN32 - strcat (command, "\""); -#endif - - if (! vrb) -#ifdef _WIN32 - strcat (command, " > NUL"); -#else - strcat (command, " > /dev/null"); -#endif - - system (command); - - if ((td = open (trg, O_RDONLY | O_BINARY)) < 0) - quit (7); - if ((ext = lseek (td, 0, SEEK_END)) < 0) - quit (7); - close (td); - if ((cmn += ext - lng) < 0 || cmn > MAX_COMMENT_SIZE) - quit (8); - - if ((fd = open (inf, O_WRONLY | O_BINARY)) < 0) - quit (1); - if (lseek (fd, off, SEEK_SET) < 0) - quit (3); - bfr[0] = cmn & 0xFF; - bfr[1] = (cmn >> 8) & 0xFF; - if (write (fd, bfr, 2) != 2) - quit (3); - close (fd); - } - else - { - close (fd); - printf ("You don't need sign4j to sign this file\n"); - } - -#ifdef _WIN32 - strcpy (command, "\" "); -#else - strcpy (command, ""); -#endif - - for (i = j; i < argc; i++) - { - p = argv[i]; - qts = (! unq || strchr (p, 32)); - if (qts) - strcat (command, "\""); - strcat (command, p); - if (qts) - strcat (command, "\""); - strcat (command, " "); - } - -#ifdef _WIN32 - strcat (command, "\""); -#endif - - return system (command); -} - - -void usage () -{ - printf ("\nThis is sign4j version " SIGN4J_VERSION "\n\n"); - printf ("Usage: sign4j [options] \n\n"); - printf (" * options:\n"); - printf (" --onthespot avoid the creation of a temporary file (your tool must be able to sign twice)\n"); - printf (" --strict supress the use of double quotes around parameters that strictly don't need them\n"); - printf (" --verbose show diagnostics about intermediary steps of the process\n"); - printf (" * arguments must specify verbatim the command line for your signing tool\n"); - printf (" * only one file can be signed on each invocation\n"); - exit (-1); -} - -void quit (int rsn) -{ - switch (rsn) - { - case 1: puts ("Could not open file\n"); break; - case 2: puts ("Could not read file\n"); break; - case 3: puts ("Could not write file\n"); break; - case 4: puts ("Not enough memory\n"); break; - case 5: puts ("Could not open temporary\n"); break; - case 6: puts ("Could not write temporary\n"); break; - case 7: puts ("Could not read target\n"); break; - case 8: puts ("Unsupported operation\n"); break; - } - exit (-1); -} - -void clear () -{ - if (access (TEST_FILE_NAME, 0) == 0) - remove (TEST_FILE_NAME); - if (image) - free (image); -} diff --git a/launch4j/src/LICENSE.txt b/launch4j/src/LICENSE.txt index 38af528..40b4a8c 100644 --- a/launch4j/src/LICENSE.txt +++ b/launch4j/src/LICENSE.txt @@ -1,30 +1,30 @@ -Launch4j (http://launch4j.sourceforge.net/) -Cross-platform Java application wrapper for creating Windows native executables. - -Copyright (c) 2004, 2017 Grzegorz Kowal -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +Launch4j (http://launch4j.sourceforge.net/) +Cross-platform Java application wrapper for creating Windows native executables. + +Copyright (c) 2004, 2019 Grzegorz Kowal +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/launch4j/src/launch4j.properties b/launch4j/src/launch4j.properties index a14697f..5dbec29 100644 --- a/launch4j/src/launch4j.properties +++ b/launch4j/src/launch4j.properties @@ -1,2 +1,2 @@ -versionNumber=3.12.0.0 -version=3.12 +versionNumber=3.50.0.0 +version=3.50 diff --git a/launch4j/src/net/sf/launch4j/Builder.java b/launch4j/src/net/sf/launch4j/Builder.java index 644b7d6..8279f63 100644 --- a/launch4j/src/net/sf/launch4j/Builder.java +++ b/launch4j/src/net/sf/launch4j/Builder.java @@ -1,217 +1,217 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on 2005-04-24 - */ -package net.sf.launch4j; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - -import net.sf.launch4j.binding.InvariantViolationException; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Builder { - private final Log _log; - private final File _basedir; - - public Builder(Log log) { - _log = log; - _basedir = Util.getJarBasedir(); - } - - public Builder(Log log, File basedir) { - _log = log; - _basedir = basedir; - } - - /** - * @return Output file path. - */ - public File build() throws BuilderException { - final Config c = ConfigPersister.getInstance().getConfig(); - try { - c.validate(); - } catch (InvariantViolationException e) { - throw new BuilderException(e.getMessage()); - } - File rc = null; - File ro = null; - File outfile = null; - FileInputStream is = null; - FileOutputStream os = null; - final RcBuilder rcb = new RcBuilder(); - try { - if (c.isJniApplication()) { - _log.append("WARNING: Some features are not implemented in JNI headers, see documentation."); - } - - rc = rcb.build(c); - ro = Util.createTempFile("o"); - outfile = ConfigPersister.getInstance().getOutputFile(); - - Cmd resCmd = new Cmd(_basedir); - resCmd.addExe("windres") - .add(Util.WINDOWS_OS ? "--preprocessor=type" : "--preprocessor=cat") - .add("-J rc -O coff -F pe-i386") - .addAbsFile(rc) - .addAbsFile(ro); - _log.append(Messages.getString("Builder.compiling.resources")); - resCmd.exec(_log); - - Cmd ldCmd = new Cmd(_basedir); - ldCmd.addExe("ld") - .add("-mi386pe") - .add("--oformat pei-i386") - .add("--dynamicbase") - .add("--nxcompat") - .add("--no-seh") - .add(c.isGuiApplication() ? "--subsystem windows" : "--subsystem console") - .add("-s") // strip symbols - .addFiles(c.getHeaderObjects()) - .addAbsFile(ro) - .addFiles(c.getLibs()) - .add("-o") - .addAbsFile(outfile); - _log.append(Messages.getString("Builder.linking")); - ldCmd.exec(_log); - - if (!c.isDontWrapJar()) { - _log.append(Messages.getString("Builder.wrapping")); - int len; - byte[] buffer = new byte[1024]; - is = new FileInputStream(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), c.getJar())); - os = new FileOutputStream(outfile, true); - while ((len = is.read(buffer)) > 0) { - os.write(buffer, 0, len); - } - } - _log.append(Messages.getString("Builder.success") + outfile.getPath()); - return outfile; - } catch (IOException e) { - Util.delete(outfile); - _log.append(e.getMessage()); - throw new BuilderException(e); - } catch (ExecException e) { - Util.delete(outfile); - String msg = e.getMessage(); - if (msg != null && msg.indexOf("windres") != -1) { - if (e.getErrLine() != -1) { - _log.append(Messages.getString("Builder.line.has.errors", - String.valueOf(e.getErrLine()))); - _log.append(rcb.getLine(e.getErrLine())); - } else { - _log.append(Messages.getString("Builder.generated.resource.file")); - _log.append(rcb.getContent()); - } - } - throw new BuilderException(e); - } finally { - Util.close(is); - Util.close(os); - Util.delete(rc); - Util.delete(ro); - } - } -} - -class Cmd { - private final List _cmd = new ArrayList(); - private final File _basedir; - private final File _bindir; - - public Cmd(File basedir) { - _basedir = basedir; - String path = System.getProperty("launch4j.bindir"); - - if (path == null) { - _bindir = new File(basedir, "bin"); - } else { - File bindir = new File(path); - _bindir = bindir.isAbsolute() ? bindir : new File(basedir, path); - } - } - - public Cmd add(String s) { - StringTokenizer st = new StringTokenizer(s); - - while (st.hasMoreTokens()) { - _cmd.add(st.nextToken()); - } - - return this; - } - - public Cmd addAbsFile(File file) { - _cmd.add(file.getPath()); - return this; - } - - public Cmd addFile(String pathname) { - _cmd.add(new File(_basedir, pathname).getPath()); - return this; - } - - public Cmd addExe(String pathname) { - if (Util.WINDOWS_OS) { - pathname += ".exe"; - } - - _cmd.add(new File(_bindir, pathname).getPath()); - return this; - } - - public Cmd addFiles(List files) { - for (String f : files) { - addFile(f); - } - - return this; - } - - public void exec(Log log) throws ExecException { - String[] cmd = (String[]) _cmd.toArray(new String[_cmd.size()]); - Util.exec(cmd, log); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on 2005-04-24 + */ +package net.sf.launch4j; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +import net.sf.launch4j.binding.InvariantViolationException; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Builder { + private final Log _log; + private final File _basedir; + + public Builder(Log log) { + _log = log; + _basedir = Util.getJarBasedir(); + } + + public Builder(Log log, File basedir) { + _log = log; + _basedir = basedir; + } + + /** + * @return Output file path. + */ + public File build() throws BuilderException { + final Config c = ConfigPersister.getInstance().getConfig(); + try { + c.validate(); + } catch (InvariantViolationException e) { + throw new BuilderException(e.getMessage()); + } + File rc = null; + File ro = null; + File outfile = null; + FileInputStream is = null; + FileOutputStream os = null; + final RcBuilder rcb = new RcBuilder(); + try { + if (c.isJniApplication()) { + _log.append("WARNING: Some features are not implemented in JNI headers, see documentation."); + } + + rc = rcb.build(c); + ro = Util.createTempFile("o"); + outfile = ConfigPersister.getInstance().getOutputFile(); + + Cmd resCmd = new Cmd(_basedir); + resCmd.addExe("windres") + .add(Util.WINDOWS_OS ? "--preprocessor=type" : "--preprocessor=cat") + .add("-J rc -O coff -F pe-i386") + .addAbsFile(rc) + .addAbsFile(ro); + _log.append(Messages.getString("Builder.compiling.resources")); + resCmd.exec(_log); + + Cmd ldCmd = new Cmd(_basedir); + ldCmd.addExe("ld") + .add("-mi386pe") + .add("--oformat pei-i386") + .add("--dynamicbase") + .add("--nxcompat") + .add("--no-seh") + .add(c.isGuiApplication() ? "--subsystem windows" : "--subsystem console") + .add("-s") // strip symbols + .addFiles(c.getHeaderObjects()) + .addAbsFile(ro) + .addFiles(c.getLibs()) + .add("-o") + .addAbsFile(outfile); + _log.append(Messages.getString("Builder.linking")); + ldCmd.exec(_log); + + if (!c.isDontWrapJar()) { + _log.append(Messages.getString("Builder.wrapping")); + int len; + byte[] buffer = new byte[1024]; + is = new FileInputStream(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), c.getJar())); + os = new FileOutputStream(outfile, true); + while ((len = is.read(buffer)) > 0) { + os.write(buffer, 0, len); + } + } + _log.append(Messages.getString("Builder.success") + outfile.getPath()); + return outfile; + } catch (IOException e) { + Util.delete(outfile); + _log.append(e.getMessage()); + throw new BuilderException(e); + } catch (ExecException e) { + Util.delete(outfile); + String msg = e.getMessage(); + if (msg != null && msg.indexOf("windres") != -1) { + if (e.getErrLine() != -1) { + _log.append(Messages.getString("Builder.line.has.errors", + String.valueOf(e.getErrLine()))); + _log.append(rcb.getLine(e.getErrLine())); + } else { + _log.append(Messages.getString("Builder.generated.resource.file")); + _log.append(rcb.getContent()); + } + } + throw new BuilderException(e); + } finally { + Util.close(is); + Util.close(os); + Util.delete(rc); + Util.delete(ro); + } + } +} + +class Cmd { + private final List _cmd = new ArrayList(); + private final File _basedir; + private final File _bindir; + + public Cmd(File basedir) { + _basedir = basedir; + String path = System.getProperty("launch4j.bindir"); + + if (path == null) { + _bindir = new File(basedir, "bin"); + } else { + File bindir = new File(path); + _bindir = bindir.isAbsolute() ? bindir : new File(basedir, path); + } + } + + public Cmd add(String s) { + StringTokenizer st = new StringTokenizer(s); + + while (st.hasMoreTokens()) { + _cmd.add(st.nextToken()); + } + + return this; + } + + public Cmd addAbsFile(File file) { + _cmd.add(file.getPath()); + return this; + } + + public Cmd addFile(String pathname) { + _cmd.add(new File(_basedir, pathname).getPath()); + return this; + } + + public Cmd addExe(String pathname) { + if (Util.WINDOWS_OS) { + pathname += ".exe"; + } + + _cmd.add(new File(_bindir, pathname).getPath()); + return this; + } + + public Cmd addFiles(List files) { + for (String f : files) { + addFile(f); + } + + return this; + } + + public void exec(Log log) throws ExecException { + String[] cmd = (String[]) _cmd.toArray(new String[_cmd.size()]); + Util.exec(cmd, log); + } +} diff --git a/launch4j/src/net/sf/launch4j/BuilderException.java b/launch4j/src/net/sf/launch4j/BuilderException.java index 76d814d..ab679ce 100644 --- a/launch4j/src/net/sf/launch4j/BuilderException.java +++ b/launch4j/src/net/sf/launch4j/BuilderException.java @@ -1,52 +1,52 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 13, 2005 - */ -package net.sf.launch4j; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class BuilderException extends Exception { - public BuilderException() {} - - public BuilderException(Throwable t) { - super(t); - } - - public BuilderException(String msg) { - super(msg); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 13, 2005 + */ +package net.sf.launch4j; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class BuilderException extends Exception { + public BuilderException() {} + + public BuilderException(Throwable t) { + super(t); + } + + public BuilderException(String msg) { + super(msg); + } +} diff --git a/launch4j/src/net/sf/launch4j/ExecException.java b/launch4j/src/net/sf/launch4j/ExecException.java index 059b2a8..ad2f1e1 100644 --- a/launch4j/src/net/sf/launch4j/ExecException.java +++ b/launch4j/src/net/sf/launch4j/ExecException.java @@ -1,66 +1,66 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 14, 2005 - */ -package net.sf.launch4j; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ExecException extends Exception { - private final int _errLine; - - public ExecException(Throwable t, int errLine) { - super(t); - _errLine = errLine; - } - - public ExecException(Throwable t) { - this(t, -1); - } - - public ExecException(String msg, int errLine) { - super(msg); - _errLine = errLine; - } - - public ExecException(String msg) { - this(msg, -1); - } - - public int getErrLine() { - return _errLine; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 14, 2005 + */ +package net.sf.launch4j; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ExecException extends Exception { + private final int _errLine; + + public ExecException(Throwable t, int errLine) { + super(t); + _errLine = errLine; + } + + public ExecException(Throwable t) { + this(t, -1); + } + + public ExecException(String msg, int errLine) { + super(msg); + _errLine = errLine; + } + + public ExecException(String msg) { + this(msg, -1); + } + + public int getErrLine() { + return _errLine; + } +} diff --git a/launch4j/src/net/sf/launch4j/FileChooserFilter.java b/launch4j/src/net/sf/launch4j/FileChooserFilter.java index e4d8d6f..5390226 100644 --- a/launch4j/src/net/sf/launch4j/FileChooserFilter.java +++ b/launch4j/src/net/sf/launch4j/FileChooserFilter.java @@ -1,76 +1,76 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on 2004-01-15 - */ -package net.sf.launch4j; - -import java.io.File; - -import javax.swing.filechooser.FileFilter; - -/** - * @author Copyright (C) 2004 Grzegorz Kowal - */ -public class FileChooserFilter extends FileFilter { - String _description; - String[] _extensions; - - public FileChooserFilter(String description, String extension) { - _description = description; - _extensions = new String[] {extension}; - } - - public FileChooserFilter(String description, String[] extensions) { - _description = description; - _extensions = extensions; - } - - public boolean accept(File f) { - if (f.isDirectory()) { - return true; - } - String ext = Util.getExtension(f); - for (int i = 0; i < _extensions.length; i++) { - if (ext.toLowerCase().equals(_extensions[i].toLowerCase())) { - return true; - } - } - return false; - } - - public String getDescription() { - return _description; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on 2004-01-15 + */ +package net.sf.launch4j; + +import java.io.File; + +import javax.swing.filechooser.FileFilter; + +/** + * @author Copyright (C) 2004 Grzegorz Kowal + */ +public class FileChooserFilter extends FileFilter { + String _description; + String[] _extensions; + + public FileChooserFilter(String description, String extension) { + _description = description; + _extensions = new String[] {extension}; + } + + public FileChooserFilter(String description, String[] extensions) { + _description = description; + _extensions = extensions; + } + + public boolean accept(File f) { + if (f.isDirectory()) { + return true; + } + String ext = Util.getExtension(f); + for (int i = 0; i < _extensions.length; i++) { + if (ext.toLowerCase().equals(_extensions[i].toLowerCase())) { + return true; + } + } + return false; + } + + public String getDescription() { + return _description; + } +} diff --git a/launch4j/src/net/sf/launch4j/KanjiEscapeOutputStream.java b/launch4j/src/net/sf/launch4j/KanjiEscapeOutputStream.java index 9f26726..25f2ef1 100644 --- a/launch4j/src/net/sf/launch4j/KanjiEscapeOutputStream.java +++ b/launch4j/src/net/sf/launch4j/KanjiEscapeOutputStream.java @@ -1,86 +1,86 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2013 toshimm - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.sf.launch4j; - -import java.io.OutputStream; -import java.io.IOException; - -/** - * @author toshimm (2013) - * - * This class makes Japanese Kanji characters in MS932 charcode escaped - * in octal form. - */ -public class KanjiEscapeOutputStream extends OutputStream { - - protected OutputStream parent; - - public KanjiEscapeOutputStream(OutputStream out) { - this.parent = out; - } - - private final int MASK = 0x000000FF; - private boolean state = true; - - public void write(int b) throws IOException { - b = b & MASK; - - if (state) { - if (0x00 <= b && b <= 0x7f) { - this.parent.write(b); - } else { - this.octprint(b); - if ((0x81 <= b && b <= 0x9f) || (0xe0 <= b && b <= 0xfc)) { - this.state = false; - } - } - } else { - if ((0x40 <= b && b <= 0x7e) || (0x80 <= b && b <= 0xfc)) { - this.octprint(b); - } else if (0x00 <= b && b <= 0x7f) { - this.parent.write(b); - } else { - this.octprint(b); - } - this.state = true; - } - } - - private void octprint(int b) throws IOException { - String oct = "\\" + String.format("%o", b & MASK); - for (int i = 0; i < oct.length(); ++i) { - int bb = oct.charAt(i); - this.parent.write(bb); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2013 toshimm + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.sf.launch4j; + +import java.io.OutputStream; +import java.io.IOException; + +/** + * @author toshimm (2013) + * + * This class makes Japanese Kanji characters in MS932 charcode escaped + * in octal form. + */ +public class KanjiEscapeOutputStream extends OutputStream { + + protected OutputStream parent; + + public KanjiEscapeOutputStream(OutputStream out) { + this.parent = out; + } + + private final int MASK = 0x000000FF; + private boolean state = true; + + public void write(int b) throws IOException { + b = b & MASK; + + if (state) { + if (0x00 <= b && b <= 0x7f) { + this.parent.write(b); + } else { + this.octprint(b); + if ((0x81 <= b && b <= 0x9f) || (0xe0 <= b && b <= 0xfc)) { + this.state = false; + } + } + } else { + if ((0x40 <= b && b <= 0x7e) || (0x80 <= b && b <= 0xfc)) { + this.octprint(b); + } else if (0x00 <= b && b <= 0x7f) { + this.parent.write(b); + } else { + this.octprint(b); + } + this.state = true; + } + } + + private void octprint(int b) throws IOException { + String oct = "\\" + String.format("%o", b & MASK); + for (int i = 0; i < oct.length(); ++i) { + int bb = oct.charAt(i); + this.parent.write(bb); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/Log.java b/launch4j/src/net/sf/launch4j/Log.java index 369befc..5c69d04 100644 --- a/launch4j/src/net/sf/launch4j/Log.java +++ b/launch4j/src/net/sf/launch4j/Log.java @@ -1,105 +1,105 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 12, 2005 - */ -package net.sf.launch4j; - -import javax.swing.JTextArea; -import javax.swing.SwingUtilities; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public abstract class Log { - private static final Log _consoleLog = new ConsoleLog(); - private static final Log _antLog = new AntLog(); - - public abstract void clear(); - public abstract void append(String line); - - public static Log getConsoleLog() { - return _consoleLog; - } - - public static Log getAntLog() { - return _antLog; - } - - public static Log getSwingLog(JTextArea textArea) { - return new SwingLog(textArea); - } -} - -class ConsoleLog extends Log { - public void clear() { - System.out.println("\n"); - } - - public void append(String line) { - System.out.println("launch4j: " + line); - } -} - -class AntLog extends Log { - public void clear() { - System.out.println("\n"); - } - - public void append(String line) { - System.out.println(line); - } -} - -class SwingLog extends Log { - private final JTextArea _textArea; - - public SwingLog(JTextArea textArea) { - _textArea = textArea; - } - - public void clear() { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - _textArea.setText(""); - }}); - } - - public void append(final String line) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - _textArea.append(line + "\n"); - }}); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 12, 2005 + */ +package net.sf.launch4j; + +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public abstract class Log { + private static final Log _consoleLog = new ConsoleLog(); + private static final Log _antLog = new AntLog(); + + public abstract void clear(); + public abstract void append(String line); + + public static Log getConsoleLog() { + return _consoleLog; + } + + public static Log getAntLog() { + return _antLog; + } + + public static Log getSwingLog(JTextArea textArea) { + return new SwingLog(textArea); + } +} + +class ConsoleLog extends Log { + public void clear() { + System.out.println("\n"); + } + + public void append(String line) { + System.out.println("launch4j: " + line); + } +} + +class AntLog extends Log { + public void clear() { + System.out.println("\n"); + } + + public void append(String line) { + System.out.println(line); + } +} + +class SwingLog extends Log { + private final JTextArea _textArea; + + public SwingLog(JTextArea textArea) { + _textArea = textArea; + } + + public void clear() { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + _textArea.setText(""); + }}); + } + + public void append(final String line) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + _textArea.append(line + "\n"); + }}); + } +} diff --git a/launch4j/src/net/sf/launch4j/Main.java b/launch4j/src/net/sf/launch4j/Main.java index 820f4be..864eb03 100644 --- a/launch4j/src/net/sf/launch4j/Main.java +++ b/launch4j/src/net/sf/launch4j/Main.java @@ -1,95 +1,95 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j; - -import java.io.File; -import java.util.Properties; - -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.formimpl.MainFrame; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Main { - private static String _name; - private static String _description; - - public static void main(String[] args) { - try { - Properties props = Util.getProperties(); - setDescription(props); - - if (args.length == 0) { - ConfigPersister.getInstance().createBlank(); - MainFrame.createInstance(); - } else if (args.length == 1 && !args[0].startsWith("-")) { - ConfigPersister.getInstance().load(new File(args[0])); - Builder b = new Builder(Log.getConsoleLog()); - b.build(); - } else { - System.out.println(_description - + Messages.getString("Main.usage") - + ": launch4j config.xml"); - } - } catch (Exception e) { - Log.getConsoleLog().append(e.getMessage()); - System.exit(1); - } - } - - public static String getName() { - return _name; - } - - public static String getDescription() { - return _description; - } - - private static void setDescription(Properties props) { - _name = "Launch4j " + props.getProperty("version"); - _description = _name + - " (http://launch4j.sourceforge.net/)\n" + - "Cross-platform Java application wrapper" + - " for creating Windows native executables.\n\n" + - "Copyright (C) 2004, 2018 Grzegorz Kowal\n\n" + - "Launch4j comes with ABSOLUTELY NO WARRANTY.\n" + - "This is free software, licensed under the BSD License.\n" + - "This product includes software developed by the Apache Software Foundation" + - " (http://www.apache.org/)."; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j; + +import java.io.File; +import java.util.Properties; + +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.formimpl.MainFrame; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Main { + private static String _name; + private static String _description; + + public static void main(String[] args) { + try { + Properties props = Util.getProperties(); + setDescription(props); + + if (args.length == 0) { + ConfigPersister.getInstance().createBlank(); + MainFrame.createInstance(); + } else if (args.length == 1 && !args[0].startsWith("-")) { + ConfigPersister.getInstance().load(new File(args[0])); + Builder b = new Builder(Log.getConsoleLog()); + b.build(); + } else { + System.out.println(_description + + Messages.getString("Main.usage") + + ": launch4j config.xml"); + } + } catch (Exception e) { + Log.getConsoleLog().append(e.getMessage()); + System.exit(1); + } + } + + public static String getName() { + return _name; + } + + public static String getDescription() { + return _description; + } + + private static void setDescription(Properties props) { + _name = "Launch4j " + props.getProperty("version"); + _description = _name + + " (http://launch4j.sourceforge.net/)\n" + + "Cross-platform Java application wrapper" + + " for creating Windows native executables.\n\n" + + "Copyright (C) 2004, 2022 Grzegorz Kowal\n\n" + + "Launch4j comes with ABSOLUTELY NO WARRANTY.\n" + + "This is free software, licensed under the BSD License.\n" + + "This product includes software developed by the Apache Software Foundation" + + " (http://www.apache.org/)."; + } +} diff --git a/launch4j/src/net/sf/launch4j/Messages.java b/launch4j/src/net/sf/launch4j/Messages.java index 687683d..a4bcaab 100644 --- a/launch4j/src/net/sf/launch4j/Messages.java +++ b/launch4j/src/net/sf/launch4j/Messages.java @@ -1,78 +1,78 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j; - -import java.text.MessageFormat; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - private static final MessageFormat FORMATTER = new MessageFormat(""); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } - - public static String getString(String key, String arg0) { - return getString(key, new Object[] {arg0}); - } - - public static String getString(String key, String arg0, String arg1) { - return getString(key, new Object[] {arg0, arg1}); - } - - public static String getString(String key, String arg0, String arg1, String arg2) { - return getString(key, new Object[] {arg0, arg1, arg2}); - } - - public static String getString(String key, Object[] args) { - try { - FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); - return FORMATTER.format(args); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j; + +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + private static final MessageFormat FORMATTER = new MessageFormat(""); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static String getString(String key, String arg0) { + return getString(key, new Object[] {arg0}); + } + + public static String getString(String key, String arg0, String arg1) { + return getString(key, new Object[] {arg0, arg1}); + } + + public static String getString(String key, String arg0, String arg1, String arg2) { + return getString(key, new Object[] {arg0, arg1, arg2}); + } + + public static String getString(String key, Object[] args) { + try { + FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); + return FORMATTER.format(args); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/launch4j/src/net/sf/launch4j/RcBuilder.java b/launch4j/src/net/sf/launch4j/RcBuilder.java index 45f2339..fe9c26b 100644 --- a/launch4j/src/net/sf/launch4j/RcBuilder.java +++ b/launch4j/src/net/sf/launch4j/RcBuilder.java @@ -1,420 +1,415 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on 2005-04-24 - */ -package net.sf.launch4j; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.List; - -import net.sf.launch4j.config.CharsetID; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.config.Jre; -import net.sf.launch4j.config.Msg; -import net.sf.launch4j.config.Splash; -import net.sf.launch4j.config.VersionInfo; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class RcBuilder { - - // winnt.h - public static final int LANG_NEUTRAL = 0; - public static final int SUBLANG_NEUTRAL = 0; - public static final int SUBLANG_DEFAULT = 1; - public static final int SUBLANG_SYS_DEFAULT = 2; - - // MANIFEST - public static final int MANIFEST = 1; - - // ICON - public static final int APP_ICON = 1; - - // BITMAP - public static final int SPLASH_BITMAP = 1; - - // RCDATA - public static final int JRE_PATH = 1; - public static final int JAVA_MIN_VER = 2; - public static final int JAVA_MAX_VER = 3; - public static final int SHOW_SPLASH = 4; - public static final int SPLASH_WAITS_FOR_WINDOW = 5; - public static final int SPLASH_TIMEOUT = 6; - public static final int SPLASH_TIMEOUT_ERR = 7; - public static final int CHDIR = 8; - public static final int ERR_TITLE = 10; - public static final int GUI_HEADER_STAYS_ALIVE = 11; - public static final int JVM_OPTIONS = 12; - public static final int CMD_LINE = 13; - public static final int JAR = 14; - public static final int MAIN_CLASS = 15; - public static final int CLASSPATH = 16; - public static final int WRAPPER = 17; - public static final int JDK_PREFERENCE = 18; - public static final int ENV_VARIABLES = 19; - public static final int PRIORITY_CLASS = 20; - public static final int DOWNLOAD_URL = 21; - public static final int SUPPORT_URL = 22; - public static final int MUTEX_NAME = 23; - public static final int INSTANCE_WINDOW_TITLE = 24; - public static final int INITIAL_HEAP_SIZE = 25; - public static final int INITIAL_HEAP_PERCENT = 26; - public static final int MAX_HEAP_SIZE = 27; - public static final int MAX_HEAP_PERCENT = 28; - public static final int BUNDLED_JRE_64_BIT = 29; - public static final int RUNTIME_BITS = 30; - public static final int RESTART_ON_CRASH = 31; - public static final int BUNDLED_JRE_AS_FALLBACK = 32; - - public static final int STARTUP_ERR = 101; - public static final int BUNDLED_JRE_ERR = 102; - public static final int JRE_VERSION_ERR = 103; - public static final int LAUNCHER_ERR = 104; - public static final int INSTANCE_ALREADY_EXISTS_MSG = 105; - - private final StringBuffer _sb = new StringBuffer(); - - public String getContent() { - return _sb.toString(); - } - - public String getLine(int line) { - return _sb.toString().split("\n")[line - 1]; - } - - public File build(Config c) throws IOException { - _sb.append("LANGUAGE "); - _sb.append(LANG_NEUTRAL); - _sb.append(", "); - _sb.append(SUBLANG_DEFAULT); - _sb.append('\n'); - addVersionInfo(c.getVersionInfo()); - addJre(c.getJre()); - addManifest(MANIFEST, c.getManifest()); - addIcon(APP_ICON, c.getIcon()); - addText(ERR_TITLE, c.getErrTitle()); - addText(DOWNLOAD_URL, c.getDownloadUrl()); - addText(SUPPORT_URL, c.getSupportUrl()); - addText(CMD_LINE, c.getCmdLine()); - addWindowsPath(CHDIR, c.getChdir()); - addText(PRIORITY_CLASS, String.valueOf(c.getPriorityClass())); - addTrue(GUI_HEADER_STAYS_ALIVE, c.isStayAlive()); - addTrue(RESTART_ON_CRASH, c.isRestartOnCrash()); - addSplash(c.getSplash()); - addMessages(c); - - if (c.getSingleInstance() != null) { - addText(MUTEX_NAME, c.getSingleInstance().getMutexName()); - addText(INSTANCE_WINDOW_TITLE, c.getSingleInstance().getWindowTitle()); - } - - if (c.getVariables() != null && !c.getVariables().isEmpty()) { - StringBuffer vars = new StringBuffer(); - append(vars, c.getVariables(), "\t"); - addText(ENV_VARIABLES, vars.toString()); - } - - // MAIN_CLASS / JAR - addTrue(WRAPPER, !c.isDontWrapJar()); - - if (c.getClassPath() != null) { - addText(MAIN_CLASS, c.getClassPath().getMainClass()); - addWindowsPath(CLASSPATH, c.getClassPath().getPathsString()); - } - - if (c.isDontWrapJar() && c.getJar() != null) { - addWindowsPath(JAR, c.getJar().getPath()); - } - - File file = Util.createTempFile("rc"); - - if ("MS932".equals(System.getProperty("file.encoding"))) { - writeKanjiResourceFile(file); - } else { - writeResourceFile(file); - } - - return file; - } - - private void writeResourceFile(File file) throws IOException { - FileOutputStream os = null; - OutputStreamWriter osw = null; - BufferedWriter w = null; - - try { - os = new FileOutputStream(file); - osw = new OutputStreamWriter(os, "ISO-8859-1"); - w = new BufferedWriter(osw); - w.write(_sb.toString()); - } finally { - Util.close(w); - Util.close(osw); - Util.close(os); - } - } - - /** - * Handle Japanese encoding - by toshimm. - */ - private void writeKanjiResourceFile(File file) throws IOException { - FileOutputStream output = null; - KanjiEscapeOutputStream kanji = null; - OutputStreamWriter writer = null; - BufferedWriter w = null; - - try { - output = new FileOutputStream(file); - kanji = new KanjiEscapeOutputStream(output); - writer = new OutputStreamWriter(kanji); - w = new BufferedWriter(writer); - w.write(_sb.toString()); - } finally { - Util.close(w); - Util.close(writer); - Util.close(kanji); - Util.close(output); - } - } - - private void addVersionInfo(VersionInfo v) { - if (v == null) { - return; - } - - _sb.append("1 VERSIONINFO\n"); - _sb.append("FILEVERSION "); - _sb.append(v.getFileVersion().replaceAll("\\.", ", ")); - _sb.append("\nPRODUCTVERSION "); - _sb.append(v.getProductVersion().replaceAll("\\.", ", ")); - _sb.append("\nFILEFLAGSMASK 0\n" + - "FILEOS 0x40000\n" + - "FILETYPE 1\n" + - "{\n" + - " BLOCK \"StringFileInfo\"\n" + - " {\n" + - " BLOCK \""); - _sb.append(String.format("%04X%04X", v.getLanguage().getId(), CharsetID.MULTILINGUAL.getId())); - _sb.append("\"\n" + - " {\n"); - - addVerBlockValue("CompanyName", v.getCompanyName()); - addVerBlockValue("FileDescription", v.getFileDescription()); - addVerBlockValue("FileVersion", v.getTxtFileVersion()); - addVerBlockValue("InternalName", v.getInternalName()); - addVerBlockValue("LegalCopyright", v.getCopyright()); - addVerBlockValue("LegalTrademarks", v.getTrademarks()); - addVerBlockValue("OriginalFilename", v.getOriginalFilename()); - addVerBlockValue("ProductName", v.getProductName()); - addVerBlockValue("ProductVersion", v.getTxtProductVersion()); - _sb.append(" }\n }\nBLOCK \"VarFileInfo\"\n{\nVALUE \"Translation\", "); - _sb.append(String.format("0x%04X, 0x%04X", v.getLanguage().getId(), CharsetID.MULTILINGUAL.getId())); - _sb.append("\n}\n}"); - } - - private void addJre(Jre jre) { - addWindowsPath(JRE_PATH, jre.getPath()); - addTrue(BUNDLED_JRE_64_BIT, jre.getBundledJre64Bit()); - addTrue(BUNDLED_JRE_AS_FALLBACK, jre.getBundledJreAsFallback()); - addText(JAVA_MIN_VER, jre.getMinVersion()); - addText(JAVA_MAX_VER, jre.getMaxVersion()); - addText(JDK_PREFERENCE, String.valueOf(jre.getJdkPreferenceIndex())); - - addInteger(RUNTIME_BITS, jre.getRuntimeBitsIndex() + 1); - addInteger(INITIAL_HEAP_SIZE, jre.getInitialHeapSize()); - addInteger(INITIAL_HEAP_PERCENT, jre.getInitialHeapPercent()); - addInteger(MAX_HEAP_SIZE, jre.getMaxHeapSize()); - addInteger(MAX_HEAP_PERCENT, jre.getMaxHeapPercent()); - - StringBuffer options = new StringBuffer(); - - if (jre.getOptions() != null && !jre.getOptions().isEmpty()) { - addSpace(options); - append(options, jre.getOptions(), " "); - } - - addText(JVM_OPTIONS, options.toString()); - } - - private void addSplash(Splash splash) { - if (splash == null) { - return; - } - - addTrue(SHOW_SPLASH, true); - addTrue(SPLASH_WAITS_FOR_WINDOW, splash.getWaitForWindow()); - addText(SPLASH_TIMEOUT, String.valueOf(splash.getTimeout())); - addTrue(SPLASH_TIMEOUT_ERR, splash.isTimeoutErr()); - addBitmap(SPLASH_BITMAP, splash.getFile()); - } - - private void addMessages(Config c) { - Msg msg = c.getMessages(); - - if (msg == null) { - msg = new Msg(); - } - - addText(STARTUP_ERR, msg.getStartupErr()); - addText(BUNDLED_JRE_ERR, msg.getBundledJreErr()); - addText(JRE_VERSION_ERR, msg.getJreVersionErr()); - addText(LAUNCHER_ERR, msg.getLauncherErr()); - - if (c.getSingleInstance() != null) { - addText(INSTANCE_ALREADY_EXISTS_MSG, msg.getInstanceAlreadyExistsMsg()); - } - } - - private void append(StringBuffer sb, List list, String separator) { - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - - if (i < list.size() - 1) { - sb.append(separator); - } - } - } - - private void addText(int id, String text) { - if (text == null || text.equals("")) { - return; - } - - _sb.append(id); - _sb.append(" RCDATA BEGIN \""); - _sb.append(escape(text)); - _sb.append("\\0\" END\n"); - } - - private void addTrue(int id, boolean value) { - if (value) { - addText(id, "true"); - } - } - - private void addInteger(int id, Integer value) { - if (value != null) { - addText(id, value.toString()); - } - } - - /** - * Stores path in Windows format with '\' separators. - */ - private void addWindowsPath(int id, String path) { - if (path == null || path.equals("")) { - return; - } - - _sb.append(id); - _sb.append(" RCDATA BEGIN \""); - _sb.append(path.replaceAll("\\\\", "\\\\\\\\") - .replaceAll("/", "\\\\\\\\")); - _sb.append("\\0\" END\n"); - } - - private void addManifest(int id, File manifest) { - if (manifest == null || manifest.getPath().equals("")) { - return; - } - - _sb.append(id); - _sb.append(" 24 \""); - _sb.append(getPath(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), manifest))); - _sb.append("\"\n"); - } - - private void addIcon(int id, File icon) { - if (icon == null || icon.getPath().equals("")) { - return; - } - - _sb.append(id); - _sb.append(" ICON DISCARDABLE \""); - _sb.append(getPath(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), icon))); - _sb.append("\"\n"); - } - - private void addBitmap(int id, File bitmap) { - if (bitmap == null) { - return; - } - - _sb.append(id); - _sb.append(" BITMAP \""); - _sb.append(getPath(Util.getAbsoluteFile( - ConfigPersister.getInstance().getConfigPath(), bitmap))); - _sb.append("\"\n"); - } - - private String getPath(File f) { - return f.getPath().replaceAll("\\\\", "\\\\\\\\"); - } - - private void addSpace(StringBuffer sb) { - int len = sb.length(); - - if (len-- > 0 && sb.charAt(len) != ' ') { - sb.append(' '); - } - } - - private void addVerBlockValue(String key, String value) { - _sb.append(" VALUE \""); - _sb.append(key); - _sb.append("\", \""); - - if (value != null) { - _sb.append(escape(value)); - } - - _sb.append("\"\n"); - } - - private String escape(String text) { - return text.replace("\"", "\"\"") - .replace("\\", "\\\\") - .replace("\n", "\\r\\n"); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on 2005-04-24 + */ +package net.sf.launch4j; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.List; + +import net.sf.launch4j.config.CharsetID; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.config.Jre; +import net.sf.launch4j.config.Msg; +import net.sf.launch4j.config.Splash; +import net.sf.launch4j.config.VersionInfo; + +/** + * @author Copyright (C) 2022 Grzegorz Kowal + */ +public class RcBuilder { + + // winnt.h + public static final int LANG_NEUTRAL = 0; + public static final int SUBLANG_NEUTRAL = 0; + public static final int SUBLANG_DEFAULT = 1; + public static final int SUBLANG_SYS_DEFAULT = 2; + + // MANIFEST + public static final int MANIFEST = 1; + + // ICON + public static final int APP_ICON = 1; + + // BITMAP + public static final int SPLASH_BITMAP = 1; + + // RCDATA + public static final int JRE_PATH = 1; + public static final int JAVA_MIN_VER = 2; + public static final int JAVA_MAX_VER = 3; + public static final int SHOW_SPLASH = 4; + public static final int SPLASH_WAITS_FOR_WINDOW = 5; + public static final int SPLASH_TIMEOUT = 6; + public static final int SPLASH_TIMEOUT_ERR = 7; + public static final int CHDIR = 8; + public static final int ERR_TITLE = 10; + public static final int GUI_HEADER_STAYS_ALIVE = 11; + public static final int JVM_OPTIONS = 12; + public static final int CMD_LINE = 13; + public static final int JAR = 14; + public static final int MAIN_CLASS = 15; + public static final int CLASSPATH = 16; + public static final int WRAPPER = 17; + public static final int REQUIRES_JDK = 18; + public static final int ENV_VARIABLES = 19; + public static final int PRIORITY_CLASS = 20; + public static final int DOWNLOAD_URL = 21; + public static final int SUPPORT_URL = 22; + public static final int MUTEX_NAME = 23; + public static final int INSTANCE_WINDOW_TITLE = 24; + public static final int INITIAL_HEAP_SIZE = 25; + public static final int INITIAL_HEAP_PERCENT = 26; + public static final int MAX_HEAP_SIZE = 27; + public static final int MAX_HEAP_PERCENT = 28; + public static final int REQUIRES_64_BIT = 29; + public static final int RESTART_ON_CRASH = 31; + + public static final int STARTUP_ERR = 101; + public static final int JRE_NOT_FOUND_ERR = 102; + public static final int JRE_VERSION_ERR = 103; + public static final int LAUNCHER_ERR = 104; + public static final int INSTANCE_ALREADY_EXISTS_MSG = 105; + + private final StringBuffer _sb = new StringBuffer(); + + public String getContent() { + return _sb.toString(); + } + + public String getLine(int line) { + return _sb.toString().split("\n")[line - 1]; + } + + public File build(Config c) throws IOException { + _sb.append("LANGUAGE "); + _sb.append(LANG_NEUTRAL); + _sb.append(", "); + _sb.append(SUBLANG_DEFAULT); + _sb.append('\n'); + addVersionInfo(c.getVersionInfo()); + addJre(c.getJre()); + addManifest(MANIFEST, c.getManifest()); + addIcon(APP_ICON, c.getIcon()); + addText(ERR_TITLE, c.getErrTitle()); + addText(DOWNLOAD_URL, c.getDownloadUrl()); + addText(SUPPORT_URL, c.getSupportUrl()); + addText(CMD_LINE, c.getCmdLine()); + addWindowsPath(CHDIR, c.getChdir()); + addText(PRIORITY_CLASS, String.valueOf(c.getPriorityClass())); + addTrue(GUI_HEADER_STAYS_ALIVE, c.isStayAlive()); + addTrue(RESTART_ON_CRASH, c.isRestartOnCrash()); + addSplash(c.getSplash()); + addMessages(c); + + if (c.getSingleInstance() != null) { + addText(MUTEX_NAME, c.getSingleInstance().getMutexName()); + addText(INSTANCE_WINDOW_TITLE, c.getSingleInstance().getWindowTitle()); + } + + if (c.getVariables() != null && !c.getVariables().isEmpty()) { + StringBuffer vars = new StringBuffer(); + append(vars, c.getVariables(), "\t"); + addText(ENV_VARIABLES, vars.toString()); + } + + // MAIN_CLASS / JAR + addTrue(WRAPPER, !c.isDontWrapJar()); + + if (c.getClassPath() != null) { + addText(MAIN_CLASS, c.getClassPath().getMainClass()); + addWindowsPath(CLASSPATH, c.getClassPath().getPathsString()); + } + + if (c.isDontWrapJar() && c.getJar() != null) { + addWindowsPath(JAR, c.getJar().getPath()); + } + + File file = Util.createTempFile("rc"); + + if ("MS932".equals(System.getProperty("file.encoding"))) { + writeKanjiResourceFile(file); + } else { + writeResourceFile(file); + } + + return file; + } + + private void writeResourceFile(File file) throws IOException { + FileOutputStream os = null; + OutputStreamWriter osw = null; + BufferedWriter w = null; + + try { + os = new FileOutputStream(file); + osw = new OutputStreamWriter(os, "ISO-8859-1"); + w = new BufferedWriter(osw); + w.write(_sb.toString()); + } finally { + Util.close(w); + Util.close(osw); + Util.close(os); + } + } + + /** + * Handle Japanese encoding - by toshimm. + */ + private void writeKanjiResourceFile(File file) throws IOException { + FileOutputStream output = null; + KanjiEscapeOutputStream kanji = null; + OutputStreamWriter writer = null; + BufferedWriter w = null; + + try { + output = new FileOutputStream(file); + kanji = new KanjiEscapeOutputStream(output); + writer = new OutputStreamWriter(kanji); + w = new BufferedWriter(writer); + w.write(_sb.toString()); + } finally { + Util.close(w); + Util.close(writer); + Util.close(kanji); + Util.close(output); + } + } + + private void addVersionInfo(VersionInfo v) { + if (v == null) { + return; + } + + _sb.append("1 VERSIONINFO\n"); + _sb.append("FILEVERSION "); + _sb.append(v.getFileVersion().replaceAll("\\.", ", ")); + _sb.append("\nPRODUCTVERSION "); + _sb.append(v.getProductVersion().replaceAll("\\.", ", ")); + _sb.append("\nFILEFLAGSMASK 0\n" + + "FILEOS 0x40000\n" + + "FILETYPE 1\n" + + "{\n" + + " BLOCK \"StringFileInfo\"\n" + + " {\n" + + " BLOCK \""); + _sb.append(String.format("%04X%04X", v.getLanguage().getId(), CharsetID.MULTILINGUAL.getId())); + _sb.append("\"\n" + + " {\n"); + + addVerBlockValue("CompanyName", v.getCompanyName()); + addVerBlockValue("FileDescription", v.getFileDescription()); + addVerBlockValue("FileVersion", v.getTxtFileVersion()); + addVerBlockValue("InternalName", v.getInternalName()); + addVerBlockValue("LegalCopyright", v.getCopyright()); + addVerBlockValue("LegalTrademarks", v.getTrademarks()); + addVerBlockValue("OriginalFilename", v.getOriginalFilename()); + addVerBlockValue("ProductName", v.getProductName()); + addVerBlockValue("ProductVersion", v.getTxtProductVersion()); + _sb.append(" }\n }\nBLOCK \"VarFileInfo\"\n{\nVALUE \"Translation\", "); + _sb.append(String.format("0x%04X, 0x%04X", v.getLanguage().getId(), CharsetID.MULTILINGUAL.getId())); + _sb.append("\n}\n}"); + } + + private void addJre(Jre jre) { + addWindowsPath(JRE_PATH, jre.getPath()); + addTrue(REQUIRES_JDK, jre.getRequiresJdk()); + addTrue(REQUIRES_64_BIT, jre.getRequires64Bit()); + addText(JAVA_MIN_VER, jre.getMinVersion()); + addText(JAVA_MAX_VER, jre.getMaxVersion()); + + addInteger(INITIAL_HEAP_SIZE, jre.getInitialHeapSize()); + addInteger(INITIAL_HEAP_PERCENT, jre.getInitialHeapPercent()); + addInteger(MAX_HEAP_SIZE, jre.getMaxHeapSize()); + addInteger(MAX_HEAP_PERCENT, jre.getMaxHeapPercent()); + + StringBuffer options = new StringBuffer(); + + if (jre.getOptions() != null && !jre.getOptions().isEmpty()) { + addSpace(options); + append(options, jre.getOptions(), " "); + } + + addText(JVM_OPTIONS, options.toString()); + } + + private void addSplash(Splash splash) { + if (splash == null) { + return; + } + + addTrue(SHOW_SPLASH, true); + addTrue(SPLASH_WAITS_FOR_WINDOW, splash.getWaitForWindow()); + addText(SPLASH_TIMEOUT, String.valueOf(splash.getTimeout())); + addTrue(SPLASH_TIMEOUT_ERR, splash.isTimeoutErr()); + addBitmap(SPLASH_BITMAP, splash.getFile()); + } + + private void addMessages(Config c) { + Msg msg = c.getMessages(); + + if (msg == null) { + msg = new Msg(); + } + + addText(STARTUP_ERR, msg.getStartupErr()); + addText(JRE_NOT_FOUND_ERR, msg.getJreNotFoundErr()); + addText(JRE_VERSION_ERR, msg.getJreVersionErr()); + addText(LAUNCHER_ERR, msg.getLauncherErr()); + + if (c.getSingleInstance() != null) { + addText(INSTANCE_ALREADY_EXISTS_MSG, msg.getInstanceAlreadyExistsMsg()); + } + } + + private void append(StringBuffer sb, List list, String separator) { + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + + if (i < list.size() - 1) { + sb.append(separator); + } + } + } + + private void addText(int id, String text) { + if (text == null || text.equals("")) { + return; + } + + _sb.append(id); + _sb.append(" RCDATA BEGIN \""); + _sb.append(escape(text)); + _sb.append("\\0\" END\n"); + } + + private void addTrue(int id, boolean value) { + if (value) { + addText(id, "true"); + } + } + + private void addInteger(int id, Integer value) { + if (value != null) { + addText(id, value.toString()); + } + } + + /** + * Stores path in Windows format with '\' separators. + */ + private void addWindowsPath(int id, String path) { + if (path == null || path.equals("")) { + return; + } + + _sb.append(id); + _sb.append(" RCDATA BEGIN \""); + _sb.append(path.replaceAll("\\\\", "\\\\\\\\") + .replaceAll("/", "\\\\\\\\")); + _sb.append("\\0\" END\n"); + } + + private void addManifest(int id, File manifest) { + if (manifest == null || manifest.getPath().equals("")) { + return; + } + + _sb.append(id); + _sb.append(" 24 \""); + _sb.append(getPath(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), manifest))); + _sb.append("\"\n"); + } + + private void addIcon(int id, File icon) { + if (icon == null || icon.getPath().equals("")) { + return; + } + + _sb.append(id); + _sb.append(" ICON DISCARDABLE \""); + _sb.append(getPath(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), icon))); + _sb.append("\"\n"); + } + + private void addBitmap(int id, File bitmap) { + if (bitmap == null) { + return; + } + + _sb.append(id); + _sb.append(" BITMAP \""); + _sb.append(getPath(Util.getAbsoluteFile( + ConfigPersister.getInstance().getConfigPath(), bitmap))); + _sb.append("\"\n"); + } + + private String getPath(File f) { + return f.getPath().replaceAll("\\\\", "\\\\\\\\"); + } + + private void addSpace(StringBuffer sb) { + int len = sb.length(); + + if (len-- > 0 && sb.charAt(len) != ' ') { + sb.append(' '); + } + } + + private void addVerBlockValue(String key, String value) { + _sb.append(" VALUE \""); + _sb.append(key); + _sb.append("\", \""); + + if (value != null) { + _sb.append(escape(value)); + } + + _sb.append("\"\n"); + } + + private String escape(String text) { + return text.replace("\"", "\"\"") + .replace("\\", "\\\\") + .replace("\n", "\\r\\n"); + } +} diff --git a/launch4j/src/net/sf/launch4j/Util.java b/launch4j/src/net/sf/launch4j/Util.java index b1006b8..c96ef58 100644 --- a/launch4j/src/net/sf/launch4j/Util.java +++ b/launch4j/src/net/sf/launch4j/Util.java @@ -1,220 +1,220 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on 2005-04-24 - */ -package net.sf.launch4j; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Util { - public static final boolean WINDOWS_OS = System.getProperty("os.name") - .toLowerCase().startsWith("windows"); - - private static final String Launch4jProperties = "launch4j.properties"; - - private Util() {} - - public static Properties getProperties() throws IOException { - Properties props = new Properties(); - InputStream in = Main.class.getClassLoader().getResourceAsStream(Launch4jProperties); - props.load(in); - in.close(); - return props; - } - - public static File createTempFile(String suffix) throws IOException { - String tmpdir = System.getProperty("launch4j.tmpdir"); - if (tmpdir != null) { - if (tmpdir.indexOf(' ') != -1) { - throw new IOException(Messages.getString("Util.tmpdir")); - } - return File.createTempFile("launch4j", suffix, new File(tmpdir)); - } else { - return File.createTempFile("launch4j", suffix); - } - } - - public static File getJarBasedir() { - try { - URI uri = new URI(Util.class.getClassLoader() - .getResource(Launch4jProperties) - .getFile()); - - String path = uri.getPath(); - - if (path.startsWith("/") && path.contains("!")) { - // jar file - String jarPath = path.substring(0, path.lastIndexOf('!')); - String basedir = jarPath.substring(0, jarPath.lastIndexOf('/') + 1); - return new File(basedir); - } else { - // class files - launch4j development - return new File("."); - } - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } - - public static File getAbsoluteFile(File basepath, File f) { - return f.isAbsolute() ? f : new File(basepath, f.getPath()); - } - - public static String getExtension(File f) { - String name = f.getName(); - int x = name.lastIndexOf('.'); - if (x != -1) { - return name.substring(x); - } else { - return ""; - } - } - - public static void exec(String[] cmd, Log log) throws ExecException { - BufferedReader is = null; - try { - if (WINDOWS_OS) { - for (int i = 0; i < cmd.length; i++) { - cmd[i] = cmd[i].replaceAll("/", "\\\\"); - } - } - Process p = Runtime.getRuntime().exec(cmd); - is = new BufferedReader(new InputStreamReader(p.getErrorStream())); - String line; - int errLine = -1; - Pattern pattern = Pattern.compile(":\\d+:"); - while ((line = is.readLine()) != null) { - log.append(line); - Matcher matcher = pattern.matcher(line); - if (matcher.find()) { - errLine = Integer.valueOf( - line.substring(matcher.start() + 1, matcher.end() - 1)) - .intValue(); - break; - } - } - is.close(); - p.waitFor(); - if (errLine != -1) { - StringBuffer sb = new StringBuffer(Messages.getString("Util.exec.failed")); - AppendCommandLine(sb, cmd); - throw new ExecException(sb.toString(), errLine); - } - if (p.exitValue() != 0) { - StringBuffer sb = new StringBuffer(Messages.getString("Util.exec.failed")); - sb.append(" ("); - sb.append(p.exitValue()); - sb.append(')'); - AppendCommandLine(sb, cmd); - throw new ExecException(sb.toString()); - } - } catch (IOException e) { - close(is); - throw new ExecException(e); - } catch (InterruptedException e) { - close(is); - throw new ExecException(e); - } - } - - private static void AppendCommandLine(StringBuffer sb, String[] cmd) { - sb.append(": "); - for (int i = 0; i < cmd.length; i++) { - sb.append(cmd[i]); - if (i < cmd.length - 1) { - sb.append(' '); - } - } - } - - public static void close(final InputStream o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static void close(final OutputStream o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static void close(final Reader o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static void close(final Writer o) { - if (o != null) { - try { - o.close(); - } catch (IOException e) { - System.err.println(e); // XXX log - } - } - } - - public static boolean delete(File f) { - return (f != null) ? f.delete() : false; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on 2005-04-24 + */ +package net.sf.launch4j; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.Reader; +import java.io.Writer; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Util { + public static final boolean WINDOWS_OS = System.getProperty("os.name") + .toLowerCase().startsWith("windows"); + + private static final String Launch4jProperties = "launch4j.properties"; + + private Util() {} + + public static Properties getProperties() throws IOException { + Properties props = new Properties(); + InputStream in = Main.class.getClassLoader().getResourceAsStream(Launch4jProperties); + props.load(in); + in.close(); + return props; + } + + public static File createTempFile(String suffix) throws IOException { + String tmpdir = System.getProperty("launch4j.tmpdir"); + if (tmpdir != null) { + if (tmpdir.indexOf(' ') != -1) { + throw new IOException(Messages.getString("Util.tmpdir")); + } + return File.createTempFile("launch4j", suffix, new File(tmpdir)); + } else { + return File.createTempFile("launch4j", suffix); + } + } + + public static File getJarBasedir() { + try { + URI uri = new URI(Util.class.getClassLoader() + .getResource(Launch4jProperties) + .getFile()); + + String path = uri.getPath(); + + if (path.startsWith("/") && path.contains("!")) { + // jar file + String jarPath = path.substring(0, path.lastIndexOf('!')); + String basedir = jarPath.substring(0, jarPath.lastIndexOf('/') + 1); + return new File(basedir); + } else { + // class files - launch4j development + return new File("."); + } + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + public static File getAbsoluteFile(File basepath, File f) { + return f.isAbsolute() ? f : new File(basepath, f.getPath()); + } + + public static String getExtension(File f) { + String name = f.getName(); + int x = name.lastIndexOf('.'); + if (x != -1) { + return name.substring(x); + } else { + return ""; + } + } + + public static void exec(String[] cmd, Log log) throws ExecException { + BufferedReader is = null; + try { + if (WINDOWS_OS) { + for (int i = 0; i < cmd.length; i++) { + cmd[i] = cmd[i].replaceAll("/", "\\\\"); + } + } + Process p = Runtime.getRuntime().exec(cmd); + is = new BufferedReader(new InputStreamReader(p.getErrorStream())); + String line; + int errLine = -1; + Pattern pattern = Pattern.compile(":\\d+:"); + while ((line = is.readLine()) != null) { + log.append(line); + Matcher matcher = pattern.matcher(line); + if (matcher.find()) { + errLine = Integer.valueOf( + line.substring(matcher.start() + 1, matcher.end() - 1)) + .intValue(); + break; + } + } + is.close(); + p.waitFor(); + if (errLine != -1) { + StringBuffer sb = new StringBuffer(Messages.getString("Util.exec.failed")); + AppendCommandLine(sb, cmd); + throw new ExecException(sb.toString(), errLine); + } + if (p.exitValue() != 0) { + StringBuffer sb = new StringBuffer(Messages.getString("Util.exec.failed")); + sb.append(" ("); + sb.append(p.exitValue()); + sb.append(')'); + AppendCommandLine(sb, cmd); + throw new ExecException(sb.toString()); + } + } catch (IOException e) { + close(is); + throw new ExecException(e); + } catch (InterruptedException e) { + close(is); + throw new ExecException(e); + } + } + + private static void AppendCommandLine(StringBuffer sb, String[] cmd) { + sb.append(": "); + for (int i = 0; i < cmd.length; i++) { + sb.append(cmd[i]); + if (i < cmd.length - 1) { + sb.append(' '); + } + } + } + + public static void close(final InputStream o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static void close(final OutputStream o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static void close(final Reader o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static void close(final Writer o) { + if (o != null) { + try { + o.close(); + } catch (IOException e) { + System.err.println(e); // XXX log + } + } + } + + public static boolean delete(File f) { + return (f != null) ? f.delete() : false; + } +} diff --git a/launch4j/src/net/sf/launch4j/ant/AntClassPath.java b/launch4j/src/net/sf/launch4j/ant/AntClassPath.java index 171a930..7a7c30e 100644 --- a/launch4j/src/net/sf/launch4j/ant/AntClassPath.java +++ b/launch4j/src/net/sf/launch4j/ant/AntClassPath.java @@ -1,63 +1,63 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Jul 19, 2006 - */ -package net.sf.launch4j.ant; - -import java.util.ArrayList; -import java.util.List; - -import net.sf.launch4j.config.ClassPath; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class AntClassPath extends ClassPath { - private final List wrappedPaths = new ArrayList(); - - public void setCp(String cp){ - StringWrapper wrapper = new StringWrapper(); - wrapper.addText(cp); - wrappedPaths.add(wrapper); - } - - public void addCp(StringWrapper cp) { - wrappedPaths.add(cp); - } - - public void unwrap() { - setPaths(StringWrapper.unwrap(wrappedPaths)); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Jul 19, 2006 + */ +package net.sf.launch4j.ant; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.launch4j.config.ClassPath; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class AntClassPath extends ClassPath { + private final List wrappedPaths = new ArrayList(); + + public void setCp(String cp){ + StringWrapper wrapper = new StringWrapper(); + wrapper.addText(cp); + wrappedPaths.add(wrapper); + } + + public void addCp(StringWrapper cp) { + wrappedPaths.add(cp); + } + + public void unwrap() { + setPaths(StringWrapper.unwrap(wrappedPaths)); + } +} diff --git a/launch4j/src/net/sf/launch4j/ant/AntConfig.java b/launch4j/src/net/sf/launch4j/ant/AntConfig.java index ae4ed2f..bc6b284 100644 --- a/launch4j/src/net/sf/launch4j/ant/AntConfig.java +++ b/launch4j/src/net/sf/launch4j/ant/AntConfig.java @@ -1,131 +1,131 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 24, 2005 - */ -package net.sf.launch4j.ant; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.apache.tools.ant.BuildException; - -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.Msg; -import net.sf.launch4j.config.SingleInstance; -import net.sf.launch4j.config.Splash; -import net.sf.launch4j.config.VersionInfo; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class AntConfig extends Config { - private final List wrappedHeaderObjects = new ArrayList(); - private final List wrappedLibs = new ArrayList(); - private final List wrappedVariables = new ArrayList(); - - public void setJarPath(String path) { - setJar(new File(path)); - } - - public void addObj(StringWrapper obj) { - wrappedHeaderObjects.add(obj); - } - - public void addLib(StringWrapper lib) { - wrappedLibs.add(lib); - } - - public void addVar(StringWrapper var) { - wrappedVariables.add(var); - } - - // __________________________________________________________________________________ - - public void addSingleInstance(SingleInstance singleInstance) { - checkNull(getSingleInstance(), "singleInstance"); - setSingleInstance(singleInstance); - } - - public void addClassPath(AntClassPath classPath) { - checkNull(getClassPath(), "classPath"); - setClassPath(classPath); - } - - public void addJre(AntJre jre) { - checkNull(getJre(), "jre"); - setJre(jre); - } - - public void addSplash(Splash splash) { - checkNull(getSplash(), "splash"); - setSplash(splash); - } - - public void addVersionInfo(VersionInfo versionInfo) { - checkNull(getVersionInfo(), "versionInfo"); - setVersionInfo(versionInfo); - } - - public void addMessages(Msg messages) { - checkNull(getMessages(), "messages"); - setMessages(messages); - } - - // __________________________________________________________________________________ - - public void unwrap() { - setHeaderObjects(StringWrapper.unwrap(wrappedHeaderObjects)); - setLibs(StringWrapper.unwrap(wrappedLibs)); - setVariables(StringWrapper.unwrap(wrappedVariables)); - - if (getClassPath() != null) { - ((AntClassPath) getClassPath()).unwrap(); - } - - if (getJre() != null) { - ((AntJre) getJre()).unwrap(); - } - } - - private void checkNull(Object o, String name) { - if (o != null) { - throw new BuildException( - Messages.getString("AntConfig.duplicate.element") - + ": " - + name); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 24, 2005 + */ +package net.sf.launch4j.ant; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.apache.tools.ant.BuildException; + +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.Msg; +import net.sf.launch4j.config.SingleInstance; +import net.sf.launch4j.config.Splash; +import net.sf.launch4j.config.VersionInfo; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class AntConfig extends Config { + private final List wrappedHeaderObjects = new ArrayList(); + private final List wrappedLibs = new ArrayList(); + private final List wrappedVariables = new ArrayList(); + + public void setJarPath(String path) { + setJar(new File(path)); + } + + public void addObj(StringWrapper obj) { + wrappedHeaderObjects.add(obj); + } + + public void addLib(StringWrapper lib) { + wrappedLibs.add(lib); + } + + public void addVar(StringWrapper var) { + wrappedVariables.add(var); + } + + // __________________________________________________________________________________ + + public void addSingleInstance(SingleInstance singleInstance) { + checkNull(getSingleInstance(), "singleInstance"); + setSingleInstance(singleInstance); + } + + public void addClassPath(AntClassPath classPath) { + checkNull(getClassPath(), "classPath"); + setClassPath(classPath); + } + + public void addJre(AntJre jre) { + checkNull(getJre(), "jre"); + setJre(jre); + } + + public void addSplash(Splash splash) { + checkNull(getSplash(), "splash"); + setSplash(splash); + } + + public void addVersionInfo(VersionInfo versionInfo) { + checkNull(getVersionInfo(), "versionInfo"); + setVersionInfo(versionInfo); + } + + public void addMessages(Msg messages) { + checkNull(getMessages(), "messages"); + setMessages(messages); + } + + // __________________________________________________________________________________ + + public void unwrap() { + setHeaderObjects(StringWrapper.unwrap(wrappedHeaderObjects)); + setLibs(StringWrapper.unwrap(wrappedLibs)); + setVariables(StringWrapper.unwrap(wrappedVariables)); + + if (getClassPath() != null) { + ((AntClassPath) getClassPath()).unwrap(); + } + + if (getJre() != null) { + ((AntJre) getJre()).unwrap(); + } + } + + private void checkNull(Object o, String name) { + if (o != null) { + throw new BuildException( + Messages.getString("AntConfig.duplicate.element") + + ": " + + name); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/ant/AntJre.java b/launch4j/src/net/sf/launch4j/ant/AntJre.java index ee30b77..e213432 100644 --- a/launch4j/src/net/sf/launch4j/ant/AntJre.java +++ b/launch4j/src/net/sf/launch4j/ant/AntJre.java @@ -1,69 +1,57 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Jul 18, 2006 - */ -package net.sf.launch4j.ant; - -import java.util.ArrayList; -import java.util.List; - -import net.sf.launch4j.config.Jre; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class AntJre extends Jre { - private final List wrappedOptions = new ArrayList(); - - public void addOpt(StringWrapper opt) { - wrappedOptions.add(opt); - } - - public void unwrap() { - setOptions(StringWrapper.unwrap(wrappedOptions)); - } - - /** - * For backwards compatibility. - */ - public void setDontUsePrivateJres(boolean dontUse) { - if (dontUse) { - setJdkPreference(JDK_PREFERENCE_JRE_ONLY); - } - else { - setJdkPreference(JDK_PREFERENCE_PREFER_JRE); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Jul 18, 2006 + */ +package net.sf.launch4j.ant; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.launch4j.config.Jre; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class AntJre extends Jre { + private final List wrappedOptions = new ArrayList(); + + public void addOpt(StringWrapper opt) { + wrappedOptions.add(opt); + } + + public void unwrap() { + setOptions(StringWrapper.unwrap(wrappedOptions)); + } +} diff --git a/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java b/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java index 22234a1..f41c84f 100644 --- a/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java +++ b/launch4j/src/net/sf/launch4j/ant/Launch4jTask.java @@ -1,162 +1,162 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 24, 2005 - */ -package net.sf.launch4j.ant; - -import java.io.File; - -import net.sf.launch4j.Builder; -import net.sf.launch4j.BuilderException; -import net.sf.launch4j.Log; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.config.ConfigPersisterException; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Launch4jTask extends Task { - private File _configFile; - private AntConfig _config; - - // System properties - private File tmpdir; // launch4j.tmpdir - private File bindir; // launch4j.bindir - - // Override configFile settings - private File jar; - private File outfile; - private String fileVersion; - private String txtFileVersion; - private String productVersion; - private String txtProductVersion; - - public void execute() throws BuildException { - try { - if (tmpdir != null) { - System.setProperty("launch4j.tmpdir", tmpdir.getPath()); - } - if (bindir != null) { - System.setProperty("launch4j.bindir", bindir.getPath()); - } - if (_configFile != null && _config != null) { - throw new BuildException( - Messages.getString("Launch4jTask.specify.config")); - } else if (_configFile != null) { - ConfigPersister.getInstance().load(_configFile); - Config c = ConfigPersister.getInstance().getConfig(); - if (jar != null) { - c.setJar(jar); - } - if (outfile != null) { - c.setOutfile(outfile); - } - if (fileVersion != null) { - c.getVersionInfo().setFileVersion(fileVersion); - } - if (txtFileVersion != null) { - c.getVersionInfo().setTxtFileVersion(txtFileVersion); - } - if (productVersion != null) { - c.getVersionInfo().setProductVersion(productVersion); - } - if (txtProductVersion != null) { - c.getVersionInfo().setTxtProductVersion(txtProductVersion); - } - } else if (_config != null) { - _config.unwrap(); - ConfigPersister.getInstance().setAntConfig(_config, - getProject().getBaseDir()); - } else { - throw new BuildException( - Messages.getString("Launch4jTask.specify.config")); - } - final Builder b = new Builder(Log.getAntLog()); - b.build(); - } catch (ConfigPersisterException e) { - throw new BuildException(e); - } catch (BuilderException e) { - throw new BuildException(e); - } - } - - public void setConfigFile(File configFile) { - _configFile = configFile; - } - - public void addConfig(AntConfig config) { - _config = config; - } - - public void setBindir(File bindir) { - this.bindir = bindir; - } - - public void setTmpdir(File tmpdir) { - this.tmpdir = tmpdir; - } - - public void setFileVersion(String fileVersion) { - this.fileVersion = fileVersion; - } - - public void setJar(File jar) { - this.jar = jar; - } - - public void setJarPath(String path) { - this.jar = new File(path); - } - - public void setOutfile(File outfile) { - this.outfile = outfile; - } - - public void setProductVersion(String productVersion) { - this.productVersion = productVersion; - } - - public void setTxtFileVersion(String txtFileVersion) { - this.txtFileVersion = txtFileVersion; - } - - public void setTxtProductVersion(String txtProductVersion) { - this.txtProductVersion = txtProductVersion; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 24, 2005 + */ +package net.sf.launch4j.ant; + +import java.io.File; + +import net.sf.launch4j.Builder; +import net.sf.launch4j.BuilderException; +import net.sf.launch4j.Log; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.config.ConfigPersisterException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Launch4jTask extends Task { + private File _configFile; + private AntConfig _config; + + // System properties + private File tmpdir; // launch4j.tmpdir + private File bindir; // launch4j.bindir + + // Override configFile settings + private File jar; + private File outfile; + private String fileVersion; + private String txtFileVersion; + private String productVersion; + private String txtProductVersion; + + public void execute() throws BuildException { + try { + if (tmpdir != null) { + System.setProperty("launch4j.tmpdir", tmpdir.getPath()); + } + if (bindir != null) { + System.setProperty("launch4j.bindir", bindir.getPath()); + } + if (_configFile != null && _config != null) { + throw new BuildException( + Messages.getString("Launch4jTask.specify.config")); + } else if (_configFile != null) { + ConfigPersister.getInstance().load(_configFile); + Config c = ConfigPersister.getInstance().getConfig(); + if (jar != null) { + c.setJar(jar); + } + if (outfile != null) { + c.setOutfile(outfile); + } + if (fileVersion != null) { + c.getVersionInfo().setFileVersion(fileVersion); + } + if (txtFileVersion != null) { + c.getVersionInfo().setTxtFileVersion(txtFileVersion); + } + if (productVersion != null) { + c.getVersionInfo().setProductVersion(productVersion); + } + if (txtProductVersion != null) { + c.getVersionInfo().setTxtProductVersion(txtProductVersion); + } + } else if (_config != null) { + _config.unwrap(); + ConfigPersister.getInstance().setAntConfig(_config, + getProject().getBaseDir()); + } else { + throw new BuildException( + Messages.getString("Launch4jTask.specify.config")); + } + final Builder b = new Builder(Log.getAntLog()); + b.build(); + } catch (ConfigPersisterException e) { + throw new BuildException(e); + } catch (BuilderException e) { + throw new BuildException(e); + } + } + + public void setConfigFile(File configFile) { + _configFile = configFile; + } + + public void addConfig(AntConfig config) { + _config = config; + } + + public void setBindir(File bindir) { + this.bindir = bindir; + } + + public void setTmpdir(File tmpdir) { + this.tmpdir = tmpdir; + } + + public void setFileVersion(String fileVersion) { + this.fileVersion = fileVersion; + } + + public void setJar(File jar) { + this.jar = jar; + } + + public void setJarPath(String path) { + this.jar = new File(path); + } + + public void setOutfile(File outfile) { + this.outfile = outfile; + } + + public void setProductVersion(String productVersion) { + this.productVersion = productVersion; + } + + public void setTxtFileVersion(String txtFileVersion) { + this.txtFileVersion = txtFileVersion; + } + + public void setTxtProductVersion(String txtProductVersion) { + this.txtProductVersion = txtProductVersion; + } +} diff --git a/launch4j/src/net/sf/launch4j/ant/Messages.java b/launch4j/src/net/sf/launch4j/ant/Messages.java index 7bd5262..375787e 100644 --- a/launch4j/src/net/sf/launch4j/ant/Messages.java +++ b/launch4j/src/net/sf/launch4j/ant/Messages.java @@ -1,55 +1,55 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.ant; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.ant.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.ant; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.ant.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/launch4j/src/net/sf/launch4j/ant/StringWrapper.java b/launch4j/src/net/sf/launch4j/ant/StringWrapper.java index 70ab715..ecbfd39 100644 --- a/launch4j/src/net/sf/launch4j/ant/StringWrapper.java +++ b/launch4j/src/net/sf/launch4j/ant/StringWrapper.java @@ -1,69 +1,69 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Jul 18, 2006 - */ -package net.sf.launch4j.ant; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class StringWrapper { - private String text; - - public static List unwrap(List wrappers) { - if (wrappers.isEmpty()) { - return null; - } - - List strings = new ArrayList(wrappers.size()); - - for (StringWrapper w : wrappers) { - strings.add(w.toString()); - } - - return strings; - } - - public void addText(String text) { - this.text = text; - } - - public String toString() { - return text; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Jul 18, 2006 + */ +package net.sf.launch4j.ant; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class StringWrapper { + private String text; + + public static List unwrap(List wrappers) { + if (wrappers.isEmpty()) { + return null; + } + + List strings = new ArrayList(wrappers.size()); + + for (StringWrapper w : wrappers) { + strings.add(w.toString()); + } + + return strings; + } + + public void addText(String text) { + this.text = text; + } + + public String toString() { + return text; + } +} diff --git a/launch4j/src/net/sf/launch4j/ant/messages.properties b/launch4j/src/net/sf/launch4j/ant/messages.properties index b78a6f8..8131029 100644 --- a/launch4j/src/net/sf/launch4j/ant/messages.properties +++ b/launch4j/src/net/sf/launch4j/ant/messages.properties @@ -1,35 +1,35 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2015 Grzegorz Kowal -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -Launch4jTask.specify.config=Specify configFile or config -AntConfig.duplicate.element=Duplicate element +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2015 Grzegorz Kowal +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +Launch4jTask.specify.config=Specify configFile or config +AntConfig.duplicate.element=Duplicate element diff --git a/launch4j/src/net/sf/launch4j/ant/messages_es.properties b/launch4j/src/net/sf/launch4j/ant/messages_es.properties deleted file mode 100644 index a48d4a8..0000000 --- a/launch4j/src/net/sf/launch4j/ant/messages_es.properties +++ /dev/null @@ -1,35 +0,0 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Martínez Ros -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -Launch4jTask.specify.config=Specify configFile or config -AntConfig.duplicate.element=Duplicate element diff --git a/launch4j/src/net/sf/launch4j/binding/Binding.java b/launch4j/src/net/sf/launch4j/binding/Binding.java index e4202dd..4cf6f19 100644 --- a/launch4j/src/net/sf/launch4j/binding/Binding.java +++ b/launch4j/src/net/sf/launch4j/binding/Binding.java @@ -1,62 +1,62 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public interface Binding { - /** Used to mark components with invalid data. */ - public final static Color INVALID_COLOR = Color.PINK; - - /** Java Bean property bound to a component */ - public String getProperty(); - /** Clear component, set it to the default value */ - public void clear(IValidatable bean); - /** Java Bean property -> Component */ - public void put(IValidatable bean); - /** Component -> Java Bean property */ - public void get(IValidatable bean); - /** Mark component as valid */ - public void markValid(); - /** Mark component as invalid */ - public void markInvalid(); - /** Enable or disable the component */ - public void setEnabled(boolean enabled); -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public interface Binding { + /** Used to mark components with invalid data. */ + public final static Color INVALID_COLOR = Color.PINK; + + /** Java Bean property bound to a component */ + public String getProperty(); + /** Clear component, set it to the default value */ + public void clear(IValidatable bean); + /** Java Bean property -> Component */ + public void put(IValidatable bean); + /** Component -> Java Bean property */ + public void get(IValidatable bean); + /** Mark component as valid */ + public void markValid(); + /** Mark component as invalid */ + public void markInvalid(); + /** Enable or disable the component */ + public void setEnabled(boolean enabled); +} diff --git a/launch4j/src/net/sf/launch4j/binding/BindingException.java b/launch4j/src/net/sf/launch4j/binding/BindingException.java index 868a1df..170c757 100644 --- a/launch4j/src/net/sf/launch4j/binding/BindingException.java +++ b/launch4j/src/net/sf/launch4j/binding/BindingException.java @@ -1,52 +1,52 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -/** - * Signals a runtime error, a missing property in a Java Bean for example. - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class BindingException extends RuntimeException { - public BindingException(Throwable t) { - super(t); - } - - public BindingException(String msg) { - super(msg); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +/** + * Signals a runtime error, a missing property in a Java Bean for example. + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class BindingException extends RuntimeException { + public BindingException(Throwable t) { + super(t); + } + + public BindingException(String msg) { + super(msg); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/Bindings.java b/launch4j/src/net/sf/launch4j/binding/Bindings.java index 29ddb7f..2a4fdab 100644 --- a/launch4j/src/net/sf/launch4j/binding/Bindings.java +++ b/launch4j/src/net/sf/launch4j/binding/Bindings.java @@ -1,333 +1,333 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.HashMap; -import java.util.Map; - -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JList; -import javax.swing.JRadioButton; -import javax.swing.JTextArea; -import javax.swing.JToggleButton; -import javax.swing.text.JTextComponent; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * Creates and handles bindings. - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Bindings implements PropertyChangeListener, ActionListener { - private final Map _bindings = new HashMap(); - private final Map _optComponents = new HashMap(); - private boolean _modified = false; - - /** - * Used to track component modifications. - */ - @Override - public void propertyChange(PropertyChangeEvent evt) { - String prop = evt.getPropertyName(); - if ("AccessibleValue".equals(prop) - || "AccessibleText".equals(prop) - || ("AccessibleVisibleData".equals(prop) - && evt.getSource().getClass().getName().contains("JList"))) { - _modified = true; - } - } - - @Override - public void actionPerformed(ActionEvent e) { - _modified = true; - } - - /** - * Any of the components modified? - */ - public boolean isModified() { - return _modified; - } - - public Binding getBinding(String property) { - return _bindings.get(property); - } - - private void registerPropertyChangeListener(JComponent c) { - c.getAccessibleContext().addPropertyChangeListener(this); - } - - private void registerPropertyChangeListener(JComponent[] components) { - for (JComponent c : components) { - c.getAccessibleContext().addPropertyChangeListener(this); - } - } - - private boolean isPropertyNull(IValidatable bean, Binding b) { - try { - for (String property : _optComponents.keySet()) { - if (b.getProperty().startsWith(property)) { - return PropertyUtils.getProperty(bean, property) == null; - } - } - - return false; - } catch (Exception e) { - throw new BindingException(e); - } - } - - /** - * Enables or disables all components bound to properties that begin with given prefix. - */ - public void setComponentsEnabled(String prefix, boolean enabled) { - for (Binding b : _bindings.values()) { - if (b.getProperty().startsWith(prefix)) { - b.setEnabled(enabled); - } - } - } - - /** - * Clear all components, set them to their default values. - * Clears the _modified flag. - */ - public void clear(IValidatable bean) { - for (Binding b : _optComponents.values()) { - b.clear(bean); - } - - for (Binding b : _bindings.values()) { - b.clear(bean); - } - - _modified = false; - } - - /** - * Copies data from the Java Bean to the UI components. - * Clears the _modified flag. - */ - public void put(IValidatable bean) { - for (Binding b : _optComponents.values()) { - b.put(bean); - } - - for (Binding b : _bindings.values()) { - if (isPropertyNull(bean, b)) { - b.clear(null); - } else { - b.put(bean); - } - } - - _modified = false; - } - - /** - * Copies data from UI components to the Java Bean and checks it's class invariants. - * Clears the _modified flag. - * @throws InvariantViolationException - * @throws BindingException - */ - public void get(IValidatable bean) { - try { - for (Binding b : _optComponents.values()) { - b.get(bean); - } - - for (Binding b : _bindings.values()) { - if (!isPropertyNull(bean, b)) { - b.get(bean); - } - } - - bean.checkInvariants(); - - for (String property : _optComponents.keySet()) { - IValidatable component = (IValidatable) PropertyUtils.getProperty(bean, - property); - - if (component != null) { - component.checkInvariants(); - } - } - - _modified = false; // XXX - } catch (InvariantViolationException e) { - e.setBinding(getBinding(e.getProperty())); - throw e; - } catch (Exception e) { - throw new BindingException(e); - } - } - - private Bindings add(Binding b) { - if (_bindings.containsKey(b.getProperty())) { - throw new BindingException(Messages.getString("Bindings.duplicate.binding")); - } - - _bindings.put(b.getProperty(), b); - return this; - } - - /** - * Add an optional (nullable) Java Bean component of type clazz. - */ - public Bindings addOptComponent(String property, Class clazz, JToggleButton c, - boolean enabledByDefault) { - Binding b = new OptComponentBinding(this, property, clazz, c, enabledByDefault); - - if (_optComponents.containsKey(property)) { - throw new BindingException(Messages.getString("Bindings.duplicate.binding")); - } - - _optComponents.put(property, b); - return this; - } - - /** - * Add an optional (nullable) Java Bean component of type clazz. - */ - public Bindings addOptComponent(String property, Class clazz, JToggleButton c) { - return addOptComponent(property, clazz, c, false); - } - - /** - * Handles JEditorPane, JTextArea, JTextField - */ - public Bindings add(String property, JTextComponent c, String defaultValue) { - registerPropertyChangeListener(c); - return add(new JTextComponentBinding(property, c, defaultValue)); - } - - /** - * Handles JEditorPane, JTextArea, JTextField - */ - public Bindings add(String property, JTextComponent c) { - registerPropertyChangeListener(c); - return add(new JTextComponentBinding(property, c, "")); - } - - /** - * Handles JToggleButton, JCheckBox - */ - public Bindings add(String property, JToggleButton c, boolean defaultValue) { - registerPropertyChangeListener(c); - return add(new JToggleButtonBinding(property, c, defaultValue)); - } - - /** - * Handles JToggleButton, JCheckBox - */ - public Bindings add(String property, JToggleButton c) { - registerPropertyChangeListener(c); - return add(new JToggleButtonBinding(property, c, false)); - } - - /** - * Handles JRadioButton - */ - public Bindings add(String property, JRadioButton[] cs, int defaultValue) { - registerPropertyChangeListener(cs); - return add(new JRadioButtonBinding(property, cs, defaultValue)); - } - - /** - * Handles JRadioButton - */ - public Bindings add(String property, JRadioButton[] cs) { - registerPropertyChangeListener(cs); - return add(new JRadioButtonBinding(property, cs, 0)); - } - - /** - * Handles JTextArea - */ - public Bindings add(String property, JTextArea textArea, String defaultValue) { - registerPropertyChangeListener(textArea); - return add(new JTextComponentBinding(property, textArea, defaultValue)); - } - - /** - * Handles JTextArea lists - */ - public Bindings add(String property, JTextArea textArea) { - registerPropertyChangeListener(textArea); - return add(new JTextAreaBinding(property, textArea)); - } - - /** - * Handles Optional JTextArea lists - */ - public Bindings add(String property, String stateProperty, - JToggleButton button, JTextArea textArea) { - registerPropertyChangeListener(button); - registerPropertyChangeListener(textArea); - return add(new OptJTextAreaBinding(property, stateProperty, button, textArea)); - } - - /** - * Handles JList - */ - public Bindings add(String property, JList list) { - registerPropertyChangeListener(list); - return add(new JListBinding(property, list)); - } - - /** - * Handles JComboBox - */ - public Bindings add(String property, JComboBox combo, int defaultValue) { - combo.addActionListener(this); - return add(new JComboBoxBinding(property, combo, defaultValue)); - } - - /** - * Handles JComboBox - */ - public Bindings add(String property, JComboBox combo) { - combo.addActionListener(this); - return add(new JComboBoxBinding(property, combo, 0)); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JRadioButton; +import javax.swing.JTextArea; +import javax.swing.JToggleButton; +import javax.swing.text.JTextComponent; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * Creates and handles bindings. + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Bindings implements PropertyChangeListener, ActionListener { + private final Map _bindings = new HashMap(); + private final Map _optComponents = new HashMap(); + private boolean _modified = false; + + /** + * Used to track component modifications. + */ + @Override + public void propertyChange(PropertyChangeEvent evt) { + String prop = evt.getPropertyName(); + if ("AccessibleValue".equals(prop) + || "AccessibleText".equals(prop) + || ("AccessibleVisibleData".equals(prop) + && evt.getSource().getClass().getName().contains("JList"))) { + _modified = true; + } + } + + @Override + public void actionPerformed(ActionEvent e) { + _modified = true; + } + + /** + * Any of the components modified? + */ + public boolean isModified() { + return _modified; + } + + public Binding getBinding(String property) { + return _bindings.get(property); + } + + private void registerPropertyChangeListener(JComponent c) { + c.getAccessibleContext().addPropertyChangeListener(this); + } + + private void registerPropertyChangeListener(JComponent[] components) { + for (JComponent c : components) { + c.getAccessibleContext().addPropertyChangeListener(this); + } + } + + private boolean isPropertyNull(IValidatable bean, Binding b) { + try { + for (String property : _optComponents.keySet()) { + if (b.getProperty().startsWith(property)) { + return PropertyUtils.getProperty(bean, property) == null; + } + } + + return false; + } catch (Exception e) { + throw new BindingException(e); + } + } + + /** + * Enables or disables all components bound to properties that begin with given prefix. + */ + public void setComponentsEnabled(String prefix, boolean enabled) { + for (Binding b : _bindings.values()) { + if (b.getProperty().startsWith(prefix)) { + b.setEnabled(enabled); + } + } + } + + /** + * Clear all components, set them to their default values. + * Clears the _modified flag. + */ + public void clear(IValidatable bean) { + for (Binding b : _optComponents.values()) { + b.clear(bean); + } + + for (Binding b : _bindings.values()) { + b.clear(bean); + } + + _modified = false; + } + + /** + * Copies data from the Java Bean to the UI components. + * Clears the _modified flag. + */ + public void put(IValidatable bean) { + for (Binding b : _optComponents.values()) { + b.put(bean); + } + + for (Binding b : _bindings.values()) { + if (isPropertyNull(bean, b)) { + b.clear(null); + } else { + b.put(bean); + } + } + + _modified = false; + } + + /** + * Copies data from UI components to the Java Bean and checks it's class invariants. + * Clears the _modified flag. + * @throws InvariantViolationException + * @throws BindingException + */ + public void get(IValidatable bean) { + try { + for (Binding b : _optComponents.values()) { + b.get(bean); + } + + for (Binding b : _bindings.values()) { + if (!isPropertyNull(bean, b)) { + b.get(bean); + } + } + + bean.checkInvariants(); + + for (String property : _optComponents.keySet()) { + IValidatable component = (IValidatable) PropertyUtils.getProperty(bean, + property); + + if (component != null) { + component.checkInvariants(); + } + } + + _modified = false; // XXX + } catch (InvariantViolationException e) { + e.setBinding(getBinding(e.getProperty())); + throw e; + } catch (Exception e) { + throw new BindingException(e); + } + } + + private Bindings add(Binding b) { + if (_bindings.containsKey(b.getProperty())) { + throw new BindingException(Messages.getString("Bindings.duplicate.binding")); + } + + _bindings.put(b.getProperty(), b); + return this; + } + + /** + * Add an optional (nullable) Java Bean component of type clazz. + */ + public Bindings addOptComponent(String property, Class clazz, JToggleButton c, + boolean enabledByDefault) { + Binding b = new OptComponentBinding(this, property, clazz, c, enabledByDefault); + + if (_optComponents.containsKey(property)) { + throw new BindingException(Messages.getString("Bindings.duplicate.binding")); + } + + _optComponents.put(property, b); + return this; + } + + /** + * Add an optional (nullable) Java Bean component of type clazz. + */ + public Bindings addOptComponent(String property, Class clazz, JToggleButton c) { + return addOptComponent(property, clazz, c, false); + } + + /** + * Handles JEditorPane, JTextArea, JTextField + */ + public Bindings add(String property, JTextComponent c, String defaultValue) { + registerPropertyChangeListener(c); + return add(new JTextComponentBinding(property, c, defaultValue)); + } + + /** + * Handles JEditorPane, JTextArea, JTextField + */ + public Bindings add(String property, JTextComponent c) { + registerPropertyChangeListener(c); + return add(new JTextComponentBinding(property, c, "")); + } + + /** + * Handles JToggleButton, JCheckBox + */ + public Bindings add(String property, JToggleButton c, boolean defaultValue) { + registerPropertyChangeListener(c); + return add(new JToggleButtonBinding(property, c, defaultValue)); + } + + /** + * Handles JToggleButton, JCheckBox + */ + public Bindings add(String property, JToggleButton c) { + registerPropertyChangeListener(c); + return add(new JToggleButtonBinding(property, c, false)); + } + + /** + * Handles JRadioButton + */ + public Bindings add(String property, JRadioButton[] cs, int defaultValue) { + registerPropertyChangeListener(cs); + return add(new JRadioButtonBinding(property, cs, defaultValue)); + } + + /** + * Handles JRadioButton + */ + public Bindings add(String property, JRadioButton[] cs) { + registerPropertyChangeListener(cs); + return add(new JRadioButtonBinding(property, cs, 0)); + } + + /** + * Handles JTextArea + */ + public Bindings add(String property, JTextArea textArea, String defaultValue) { + registerPropertyChangeListener(textArea); + return add(new JTextComponentBinding(property, textArea, defaultValue)); + } + + /** + * Handles JTextArea lists + */ + public Bindings add(String property, JTextArea textArea) { + registerPropertyChangeListener(textArea); + return add(new JTextAreaBinding(property, textArea)); + } + + /** + * Handles Optional JTextArea lists + */ + public Bindings add(String property, String stateProperty, + JToggleButton button, JTextArea textArea) { + registerPropertyChangeListener(button); + registerPropertyChangeListener(textArea); + return add(new OptJTextAreaBinding(property, stateProperty, button, textArea)); + } + + /** + * Handles JList + */ + public Bindings add(String property, JList list) { + registerPropertyChangeListener(list); + return add(new JListBinding(property, list)); + } + + /** + * Handles JComboBox + */ + public Bindings add(String property, JComboBox combo, int defaultValue) { + combo.addActionListener(this); + return add(new JComboBoxBinding(property, combo, defaultValue)); + } + + /** + * Handles JComboBox + */ + public Bindings add(String property, JComboBox combo) { + combo.addActionListener(this); + return add(new JComboBoxBinding(property, combo, 0)); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/IValidatable.java b/launch4j/src/net/sf/launch4j/binding/IValidatable.java index 4865967..f8fcd21 100644 --- a/launch4j/src/net/sf/launch4j/binding/IValidatable.java +++ b/launch4j/src/net/sf/launch4j/binding/IValidatable.java @@ -1,44 +1,44 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on 2004-01-30 - */ -package net.sf.launch4j.binding; - -/** - * @author Copyright (C) 2004 Grzegorz Kowal - */ -public interface IValidatable { - public void checkInvariants(); -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on 2004-01-30 + */ +package net.sf.launch4j.binding; + +/** + * @author Copyright (C) 2004 Grzegorz Kowal + */ +public interface IValidatable { + public void checkInvariants(); +} diff --git a/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java b/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java index 67db27b..004caf4 100644 --- a/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java +++ b/launch4j/src/net/sf/launch4j/binding/InvariantViolationException.java @@ -1,67 +1,67 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Jun 23, 2003 - */ -package net.sf.launch4j.binding; - -/** - * @author Copyright (C) 2003 Grzegorz Kowal - */ -public class InvariantViolationException extends RuntimeException { - private final String _property; - private Binding _binding; - - public InvariantViolationException(String msg) { - super(msg); - _property = null; - } - - public InvariantViolationException(String property, String msg) { - super(msg); - _property = property; - } - - public String getProperty() { - return _property; - } - - public Binding getBinding() { - return _binding; - } - - public void setBinding(Binding binding) { - _binding = binding; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Jun 23, 2003 + */ +package net.sf.launch4j.binding; + +/** + * @author Copyright (C) 2003 Grzegorz Kowal + */ +public class InvariantViolationException extends RuntimeException { + private final String _property; + private Binding _binding; + + public InvariantViolationException(String msg) { + super(msg); + _property = null; + } + + public InvariantViolationException(String property, String msg) { + super(msg); + _property = property; + } + + public String getProperty() { + return _property; + } + + public Binding getBinding() { + return _binding; + } + + public void setBinding(Binding binding) { + _binding = binding; + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/JComboBoxBinding.java b/launch4j/src/net/sf/launch4j/binding/JComboBoxBinding.java index a3f611e..695c1cc 100644 --- a/launch4j/src/net/sf/launch4j/binding/JComboBoxBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/JComboBoxBinding.java @@ -1,119 +1,119 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2007 Ian Roberts - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 10, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -import javax.swing.JComboBox; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2007 Ian Roberts - */ -public class JComboBoxBinding implements Binding { - private final String _property; - private final JComboBox _combo; - private final int _defaultValue; - private final Color _validColor; - - public JComboBoxBinding(String property, JComboBox combo, int defaultValue) { - if (property == null || combo == null) { - throw new NullPointerException(); - } - if (property.equals("") - || combo.getItemCount() == 0 - || defaultValue < 0 || defaultValue >= combo.getItemCount()) { - throw new IllegalArgumentException(); - } - _property = property; - _combo = combo; - _defaultValue = defaultValue; - _validColor = combo.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - select(_defaultValue); - } - - public void put(IValidatable bean) { - try { - Integer i = (Integer) PropertyUtils.getProperty(bean, _property); - if (i == null) { - throw new BindingException( - Messages.getString("JComboBoxBinding.property.null")); - } - select(i.intValue()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - PropertyUtils.setProperty(bean, _property, new Integer(_combo.getSelectedIndex())); - return; - } catch (Exception e) { - throw new BindingException(e); - } - } - - private void select(int index) { - if (index < 0 || index >= _combo.getItemCount()) { - throw new BindingException( - Messages.getString("JComboBoxBinding.index.out.of.bounds")); - } - _combo.setSelectedIndex(index); - } - - public void markValid() { - _combo.setBackground(_validColor); - _combo.requestFocusInWindow(); - } - - public void markInvalid() { - _combo.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _combo.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2007 Ian Roberts + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 10, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +import javax.swing.JComboBox; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2007 Ian Roberts + */ +public class JComboBoxBinding implements Binding { + private final String _property; + private final JComboBox _combo; + private final int _defaultValue; + private final Color _validColor; + + public JComboBoxBinding(String property, JComboBox combo, int defaultValue) { + if (property == null || combo == null) { + throw new NullPointerException(); + } + if (property.equals("") + || combo.getItemCount() == 0 + || defaultValue < 0 || defaultValue >= combo.getItemCount()) { + throw new IllegalArgumentException(); + } + _property = property; + _combo = combo; + _defaultValue = defaultValue; + _validColor = combo.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + select(_defaultValue); + } + + public void put(IValidatable bean) { + try { + Integer i = (Integer) PropertyUtils.getProperty(bean, _property); + if (i == null) { + throw new BindingException( + Messages.getString("JComboBoxBinding.property.null")); + } + select(i.intValue()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + PropertyUtils.setProperty(bean, _property, new Integer(_combo.getSelectedIndex())); + return; + } catch (Exception e) { + throw new BindingException(e); + } + } + + private void select(int index) { + if (index < 0 || index >= _combo.getItemCount()) { + throw new BindingException( + Messages.getString("JComboBoxBinding.index.out.of.bounds")); + } + _combo.setSelectedIndex(index); + } + + public void markValid() { + _combo.setBackground(_validColor); + _combo.requestFocusInWindow(); + } + + public void markInvalid() { + _combo.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _combo.setEnabled(enabled); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/JListBinding.java b/launch4j/src/net/sf/launch4j/binding/JListBinding.java index 060f89f..10176f6 100644 --- a/launch4j/src/net/sf/launch4j/binding/JListBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/JListBinding.java @@ -1,121 +1,122 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.DefaultListModel; -import javax.swing.JList; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class JListBinding implements Binding { - private final String _property; - private final JList _list; - private final Color _validColor; - - public JListBinding(String property, JList list) { - if (property == null || list == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _list = list; - _validColor = _list.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _list.setModel(new DefaultListModel()); - } - - public void put(IValidatable bean) { - try { - DefaultListModel model = new DefaultListModel(); - List list = (List) PropertyUtils.getProperty(bean, _property); - - if (list != null) { - for (Object o : list) { - model.addElement(o); - } - } - - _list.setModel(model); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - DefaultListModel model = (DefaultListModel) _list.getModel(); - final int size = model.getSize(); - List list = new ArrayList(size); - - for (int i = 0; i < size; i++) { - list.add(model.get(i)); - } - - PropertyUtils.setProperty(bean, _property, list); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _list.setBackground(_validColor); - _list.requestFocusInWindow(); - } - - public void markInvalid() { - _list.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _list.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.DefaultListModel; +import javax.swing.JList; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class JListBinding implements Binding { + private final String _property; + private final JList _list; + private final Color _validColor; + + public JListBinding(String property, JList list) { + if (property == null || list == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _list = list; + _validColor = _list.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _list.setModel(new DefaultListModel()); + } + + public void put(IValidatable bean) { + try { + DefaultListModel model = new DefaultListModel(); + @SuppressWarnings("unchecked") + List list = (List) PropertyUtils.getProperty(bean, _property); + + if (list != null) { + for (T item : list) { + model.addElement(item); + } + } + + _list.setModel(model); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + DefaultListModel model = (DefaultListModel) _list.getModel(); + final int size = model.getSize(); + List list = new ArrayList(size); + + for (int i = 0; i < size; i++) { + list.add(model.get(i)); + } + + PropertyUtils.setProperty(bean, _property, list); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _list.setBackground(_validColor); + _list.requestFocusInWindow(); + } + + public void markInvalid() { + _list.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _list.setEnabled(enabled); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java b/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java index 345f802..b9e458b 100644 --- a/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/JRadioButtonBinding.java @@ -1,146 +1,146 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 10, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -import javax.swing.JRadioButton; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class JRadioButtonBinding implements Binding { - private final String _property; - private final JRadioButton[] _buttons; - private final int _defaultValue; - private final Color _validColor; - - public JRadioButtonBinding(String property, JRadioButton[] buttons, int defaultValue) { - if (property == null || buttons == null) { - throw new NullPointerException(); - } - for (int i = 0; i < buttons.length; i++) { - if (buttons[i] == null) { - throw new NullPointerException(); - } - } - if (property.equals("") - || buttons.length == 0 - || defaultValue < 0 || defaultValue >= buttons.length) { - throw new IllegalArgumentException(); - } - _property = property; - _buttons = buttons; - _defaultValue = defaultValue; - _validColor = buttons[0].getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - select(_defaultValue); - } - - public void put(IValidatable bean) { - try { - Integer i = (Integer) PropertyUtils.getProperty(bean, _property); - if (i == null) { - throw new BindingException( - Messages.getString("JRadioButtonBinding.property.null")); - } - select(i.intValue()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - for (int i = 0; i < _buttons.length; i++) { - if (_buttons[i].isSelected()) { - PropertyUtils.setProperty(bean, _property, new Integer(i)); - return; - } - } - throw new BindingException( - Messages.getString("JRadioButtonBinding.nothing.selected")); - } catch (Exception e) { - throw new BindingException(e); - } - } - - private void select(int index) { - if (index < 0 || index >= _buttons.length) { - throw new BindingException( - Messages.getString("JRadioButtonBinding.index.out.of.bounds")); - } - _buttons[index].setSelected(true); - } - - public void markValid() { - for (int i = 0; i < _buttons.length; i++) { - if (_buttons[i].isSelected()) { - _buttons[i].setBackground(_validColor); - _buttons[i].requestFocusInWindow(); - return; - } - } - throw new BindingException( - Messages.getString("JRadioButtonBinding.nothing.selected")); - } - - public void markInvalid() { - for (int i = 0; i < _buttons.length; i++) { - if (_buttons[i].isSelected()) { - _buttons[i].setBackground(Binding.INVALID_COLOR); - return; - } - } - throw new BindingException( - Messages.getString("JRadioButtonBinding.nothing.selected")); - } - - public void setEnabled(boolean enabled) { - for (int i = 0; i < _buttons.length; i++) { - _buttons[i].setEnabled(enabled); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 10, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +import javax.swing.JRadioButton; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class JRadioButtonBinding implements Binding { + private final String _property; + private final JRadioButton[] _buttons; + private final int _defaultValue; + private final Color _validColor; + + public JRadioButtonBinding(String property, JRadioButton[] buttons, int defaultValue) { + if (property == null || buttons == null) { + throw new NullPointerException(); + } + for (int i = 0; i < buttons.length; i++) { + if (buttons[i] == null) { + throw new NullPointerException(); + } + } + if (property.equals("") + || buttons.length == 0 + || defaultValue < 0 || defaultValue >= buttons.length) { + throw new IllegalArgumentException(); + } + _property = property; + _buttons = buttons; + _defaultValue = defaultValue; + _validColor = buttons[0].getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + select(_defaultValue); + } + + public void put(IValidatable bean) { + try { + Integer i = (Integer) PropertyUtils.getProperty(bean, _property); + if (i == null) { + throw new BindingException( + Messages.getString("JRadioButtonBinding.property.null")); + } + select(i.intValue()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + for (int i = 0; i < _buttons.length; i++) { + if (_buttons[i].isSelected()) { + PropertyUtils.setProperty(bean, _property, new Integer(i)); + return; + } + } + throw new BindingException( + Messages.getString("JRadioButtonBinding.nothing.selected")); + } catch (Exception e) { + throw new BindingException(e); + } + } + + private void select(int index) { + if (index < 0 || index >= _buttons.length) { + throw new BindingException( + Messages.getString("JRadioButtonBinding.index.out.of.bounds")); + } + _buttons[index].setSelected(true); + } + + public void markValid() { + for (int i = 0; i < _buttons.length; i++) { + if (_buttons[i].isSelected()) { + _buttons[i].setBackground(_validColor); + _buttons[i].requestFocusInWindow(); + return; + } + } + throw new BindingException( + Messages.getString("JRadioButtonBinding.nothing.selected")); + } + + public void markInvalid() { + for (int i = 0; i < _buttons.length; i++) { + if (_buttons[i].isSelected()) { + _buttons[i].setBackground(Binding.INVALID_COLOR); + return; + } + } + throw new BindingException( + Messages.getString("JRadioButtonBinding.nothing.selected")); + } + + public void setEnabled(boolean enabled) { + for (int i = 0; i < _buttons.length; i++) { + _buttons[i].setEnabled(enabled); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java b/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java index e018797..282afe9 100644 --- a/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/JTextAreaBinding.java @@ -1,128 +1,128 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Jun 14, 2006 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JTextArea; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class JTextAreaBinding implements Binding { - private final String _property; - private final JTextArea _textArea; - private final Color _validColor; - - public JTextAreaBinding(String property, JTextArea textArea) { - if (property == null || textArea == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _textArea = textArea; - _validColor = _textArea.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - put(bean); - } - - public void put(IValidatable bean) { - try { - List list = (List) PropertyUtils.getProperty(bean, _property); - StringBuffer sb = new StringBuffer(); - - if (list != null) { - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - if (i < list.size() - 1) { - sb.append("\n"); - } - } - } - - _textArea.setText(sb.toString()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - String text = _textArea.getText(); - - if (!text.equals("")) { - String[] items = text.split("\n"); - List list = new ArrayList(); - - for (int i = 0; i < items.length; i++) { - list.add(items[i]); - } - - PropertyUtils.setProperty(bean, _property, list); - } else { - PropertyUtils.setProperty(bean, _property, null); - } - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _textArea.setBackground(_validColor); - _textArea.requestFocusInWindow(); - } - - public void markInvalid() { - _textArea.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _textArea.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Jun 14, 2006 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JTextArea; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class JTextAreaBinding implements Binding { + private final String _property; + private final JTextArea _textArea; + private final Color _validColor; + + public JTextAreaBinding(String property, JTextArea textArea) { + if (property == null || textArea == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _textArea = textArea; + _validColor = _textArea.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + put(bean); + } + + public void put(IValidatable bean) { + try { + List list = (List) PropertyUtils.getProperty(bean, _property); + StringBuffer sb = new StringBuffer(); + + if (list != null) { + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + if (i < list.size() - 1) { + sb.append("\n"); + } + } + } + + _textArea.setText(sb.toString()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + String text = _textArea.getText(); + + if (!text.equals("")) { + String[] items = text.split("\n"); + List list = new ArrayList(); + + for (int i = 0; i < items.length; i++) { + list.add(items[i]); + } + + PropertyUtils.setProperty(bean, _property, list); + } else { + PropertyUtils.setProperty(bean, _property, null); + } + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _textArea.setBackground(_validColor); + _textArea.requestFocusInWindow(); + } + + public void markInvalid() { + _textArea.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _textArea.setEnabled(enabled); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java b/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java index 0232b78..44c3be7 100644 --- a/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/JTextComponentBinding.java @@ -1,108 +1,108 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -import javax.swing.text.JTextComponent; - -import org.apache.commons.beanutils.BeanUtils; - -/** - * Handles JEditorPane, JTextArea, JTextField - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class JTextComponentBinding implements Binding { - private final String _property; - private final JTextComponent _textComponent; - private final String _defaultValue; - private final Color _validColor; - - public JTextComponentBinding(String property, JTextComponent textComponent, - String defaultValue) { - if (property == null || textComponent == null || defaultValue == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _textComponent = textComponent; - _defaultValue = defaultValue; - _validColor = _textComponent.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _textComponent.setText(_defaultValue); - } - - public void put(IValidatable bean) { - try { - String s = BeanUtils.getProperty(bean, _property); - // XXX displays zeros as blank - _textComponent.setText(s != null && !s.equals("0") ? s : ""); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - BeanUtils.setProperty(bean, _property, _textComponent.getText()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _textComponent.setBackground(_validColor); - _textComponent.requestFocusInWindow(); - } - - public void markInvalid() { - _textComponent.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _textComponent.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +import javax.swing.text.JTextComponent; + +import org.apache.commons.beanutils.BeanUtils; + +/** + * Handles JEditorPane, JTextArea, JTextField + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class JTextComponentBinding implements Binding { + private final String _property; + private final JTextComponent _textComponent; + private final String _defaultValue; + private final Color _validColor; + + public JTextComponentBinding(String property, JTextComponent textComponent, + String defaultValue) { + if (property == null || textComponent == null || defaultValue == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _textComponent = textComponent; + _defaultValue = defaultValue; + _validColor = _textComponent.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _textComponent.setText(_defaultValue); + } + + public void put(IValidatable bean) { + try { + String s = BeanUtils.getProperty(bean, _property); + // XXX displays zeros as blank + _textComponent.setText(s != null && !s.equals("0") ? s : ""); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + BeanUtils.setProperty(bean, _property, _textComponent.getText()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _textComponent.setBackground(_validColor); + _textComponent.requestFocusInWindow(); + } + + public void markInvalid() { + _textComponent.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _textComponent.setEnabled(enabled); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java b/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java index 9410cfc..242bc40 100644 --- a/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/JToggleButtonBinding.java @@ -1,108 +1,108 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 30, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; - -import javax.swing.JToggleButton; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * Handles JToggleButton, JCheckBox - * - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class JToggleButtonBinding implements Binding { - private final String _property; - private final JToggleButton _button; - private final boolean _defaultValue; - private final Color _validColor; - - public JToggleButtonBinding(String property, JToggleButton button, - boolean defaultValue) { - if (property == null || button == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _button = button; - _defaultValue = defaultValue; - _validColor = _button.getBackground(); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _button.setSelected(_defaultValue); - } - - public void put(IValidatable bean) { - try { - Boolean b = (Boolean) PropertyUtils.getProperty(bean, _property); - _button.setSelected(b != null && b.booleanValue()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - PropertyUtils.setProperty(bean, _property, - Boolean.valueOf(_button.isSelected())); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _button.setBackground(_validColor); - _button.requestFocusInWindow(); - } - - public void markInvalid() { - _button.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _button.setEnabled(enabled); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 30, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; + +import javax.swing.JToggleButton; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * Handles JToggleButton, JCheckBox + * + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class JToggleButtonBinding implements Binding { + private final String _property; + private final JToggleButton _button; + private final boolean _defaultValue; + private final Color _validColor; + + public JToggleButtonBinding(String property, JToggleButton button, + boolean defaultValue) { + if (property == null || button == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _button = button; + _defaultValue = defaultValue; + _validColor = _button.getBackground(); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _button.setSelected(_defaultValue); + } + + public void put(IValidatable bean) { + try { + Boolean b = (Boolean) PropertyUtils.getProperty(bean, _property); + _button.setSelected(b != null && b.booleanValue()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + PropertyUtils.setProperty(bean, _property, + Boolean.valueOf(_button.isSelected())); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _button.setBackground(_validColor); + _button.requestFocusInWindow(); + } + + public void markInvalid() { + _button.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _button.setEnabled(enabled); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/Messages.java b/launch4j/src/net/sf/launch4j/binding/Messages.java index 7bd0aa4..2b6d684 100644 --- a/launch4j/src/net/sf/launch4j/binding/Messages.java +++ b/launch4j/src/net/sf/launch4j/binding/Messages.java @@ -1,78 +1,78 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.binding; - -import java.text.MessageFormat; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.binding.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - private static final MessageFormat FORMATTER = new MessageFormat(""); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } - - public static String getString(String key, String arg0) { - return getString(key, new Object[] {arg0}); - } - - public static String getString(String key, String arg0, String arg1) { - return getString(key, new Object[] {arg0, arg1}); - } - - public static String getString(String key, String arg0, String arg1, String arg2) { - return getString(key, new Object[] {arg0, arg1, arg2}); - } - - public static String getString(String key, Object[] args) { - try { - FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); - return FORMATTER.format(args); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.binding; + +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.binding.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + private static final MessageFormat FORMATTER = new MessageFormat(""); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static String getString(String key, String arg0) { + return getString(key, new Object[] {arg0}); + } + + public static String getString(String key, String arg0, String arg1) { + return getString(key, new Object[] {arg0, arg1}); + } + + public static String getString(String key, String arg0, String arg1, String arg2) { + return getString(key, new Object[] {arg0, arg1, arg2}); + } + + public static String getString(String key, Object[] args) { + try { + FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); + return FORMATTER.format(args); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java b/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java index 8fef9a1..0825808 100644 --- a/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/OptComponentBinding.java @@ -1,122 +1,122 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 11, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Arrays; - -import javax.swing.JToggleButton; - -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class OptComponentBinding implements Binding, ActionListener { - private final Bindings _bindings; - private final String _property; - private final Class _clazz; - private final JToggleButton _button; - private final boolean _enabledByDefault; - - public OptComponentBinding(Bindings bindings, String property, Class clazz, - JToggleButton button, boolean enabledByDefault) { - if (property == null || clazz == null || button == null) { - throw new NullPointerException(); - } - - if (property.equals("")) { - throw new IllegalArgumentException(); - } - - if (!Arrays.asList(clazz.getInterfaces()).contains(IValidatable.class)) { - throw new IllegalArgumentException( - Messages.getString("OptComponentBinding.must.implement") - + IValidatable.class); - } - - _bindings = bindings; - _property = property; - _clazz = clazz; - _button = button; - _button.addActionListener(this); - _enabledByDefault = enabledByDefault; - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - _button.setSelected(_enabledByDefault); - updateComponents(); - } - - public void put(IValidatable bean) { - try { - Object component = PropertyUtils.getProperty(bean, _property); - _button.setSelected(component != null); - updateComponents(); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - PropertyUtils.setProperty(bean, _property, _button.isSelected() - ? _clazz.newInstance() : null); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() {} - - public void markInvalid() {} - - public void setEnabled(boolean enabled) {} // XXX implement? - - public void actionPerformed(ActionEvent e) { - updateComponents(); - } - - private void updateComponents() { - _bindings.setComponentsEnabled(_property, _button.isSelected()); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 11, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; + +import javax.swing.JToggleButton; + +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class OptComponentBinding implements Binding, ActionListener { + private final Bindings _bindings; + private final String _property; + private final Class _clazz; + private final JToggleButton _button; + private final boolean _enabledByDefault; + + public OptComponentBinding(Bindings bindings, String property, Class clazz, + JToggleButton button, boolean enabledByDefault) { + if (property == null || clazz == null || button == null) { + throw new NullPointerException(); + } + + if (property.equals("")) { + throw new IllegalArgumentException(); + } + + if (!Arrays.asList(clazz.getInterfaces()).contains(IValidatable.class)) { + throw new IllegalArgumentException( + Messages.getString("OptComponentBinding.must.implement") + + IValidatable.class); + } + + _bindings = bindings; + _property = property; + _clazz = clazz; + _button = button; + _button.addActionListener(this); + _enabledByDefault = enabledByDefault; + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + _button.setSelected(_enabledByDefault); + updateComponents(); + } + + public void put(IValidatable bean) { + try { + Object component = PropertyUtils.getProperty(bean, _property); + _button.setSelected(component != null); + updateComponents(); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + PropertyUtils.setProperty(bean, _property, _button.isSelected() + ? _clazz.newInstance() : null); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() {} + + public void markInvalid() {} + + public void setEnabled(boolean enabled) {} // XXX implement? + + public void actionPerformed(ActionEvent e) { + updateComponents(); + } + + private void updateComponents() { + _bindings.setComponentsEnabled(_property, _button.isSelected()); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java b/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java index 1fd2709..2c1bc8d 100644 --- a/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java +++ b/launch4j/src/net/sf/launch4j/binding/OptJTextAreaBinding.java @@ -1,146 +1,146 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Sep 3, 2005 - */ -package net.sf.launch4j.binding; - -import java.awt.Color; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JTextArea; -import javax.swing.JToggleButton; - -import org.apache.commons.beanutils.BeanUtils; -import org.apache.commons.beanutils.PropertyUtils; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class OptJTextAreaBinding implements Binding, ActionListener { - private final String _property; - private final String _stateProperty; - private final JToggleButton _button; - private final JTextArea _textArea; - private final Color _validColor; - - public OptJTextAreaBinding(String property, String stateProperty, - JToggleButton button, JTextArea textArea) { - if (property == null || button == null || textArea == null) { - throw new NullPointerException(); - } - if (property.equals("")) { - throw new IllegalArgumentException(); - } - _property = property; - _stateProperty = stateProperty; - _button = button; - _textArea = textArea; - _validColor = _textArea.getBackground(); - button.addActionListener(this); - } - - public String getProperty() { - return _property; - } - - public void clear(IValidatable bean) { - put(bean); - } - - public void put(IValidatable bean) { - try { - boolean selected = "true".equals(BeanUtils.getProperty(bean, - _stateProperty)); - _button.setSelected(selected); - _textArea.setEnabled(selected); - List list = (List) PropertyUtils.getProperty(bean, _property); - StringBuffer sb = new StringBuffer(); - - if (list != null) { - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - if (i < list.size() - 1) { - sb.append("\n"); - } - } - } - - _textArea.setText(sb.toString()); - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void get(IValidatable bean) { - try { - String text = _textArea.getText(); - - if (_button.isSelected() && !text.equals("")) { - String[] items = text.split("\n"); - List list = new ArrayList(); - - for (String s : items) { - list.add(s); - } - - PropertyUtils.setProperty(bean, _property, list); - } else { - PropertyUtils.setProperty(bean, _property, null); - } - } catch (Exception e) { - throw new BindingException(e); - } - } - - public void markValid() { - _textArea.setBackground(_validColor); - _textArea.requestFocusInWindow(); - } - - public void markInvalid() { - _textArea.setBackground(Binding.INVALID_COLOR); - } - - public void setEnabled(boolean enabled) { - _textArea.setEnabled(enabled); - } - - public void actionPerformed(ActionEvent e) { - _textArea.setEnabled(_button.isSelected()); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Sep 3, 2005 + */ +package net.sf.launch4j.binding; + +import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JTextArea; +import javax.swing.JToggleButton; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class OptJTextAreaBinding implements Binding, ActionListener { + private final String _property; + private final String _stateProperty; + private final JToggleButton _button; + private final JTextArea _textArea; + private final Color _validColor; + + public OptJTextAreaBinding(String property, String stateProperty, + JToggleButton button, JTextArea textArea) { + if (property == null || button == null || textArea == null) { + throw new NullPointerException(); + } + if (property.equals("")) { + throw new IllegalArgumentException(); + } + _property = property; + _stateProperty = stateProperty; + _button = button; + _textArea = textArea; + _validColor = _textArea.getBackground(); + button.addActionListener(this); + } + + public String getProperty() { + return _property; + } + + public void clear(IValidatable bean) { + put(bean); + } + + public void put(IValidatable bean) { + try { + boolean selected = "true".equals(BeanUtils.getProperty(bean, + _stateProperty)); + _button.setSelected(selected); + _textArea.setEnabled(selected); + List list = (List) PropertyUtils.getProperty(bean, _property); + StringBuffer sb = new StringBuffer(); + + if (list != null) { + for (int i = 0; i < list.size(); i++) { + sb.append(list.get(i)); + if (i < list.size() - 1) { + sb.append("\n"); + } + } + } + + _textArea.setText(sb.toString()); + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void get(IValidatable bean) { + try { + String text = _textArea.getText(); + + if (_button.isSelected() && !text.equals("")) { + String[] items = text.split("\n"); + List list = new ArrayList(); + + for (String s : items) { + list.add(s); + } + + PropertyUtils.setProperty(bean, _property, list); + } else { + PropertyUtils.setProperty(bean, _property, null); + } + } catch (Exception e) { + throw new BindingException(e); + } + } + + public void markValid() { + _textArea.setBackground(_validColor); + _textArea.requestFocusInWindow(); + } + + public void markInvalid() { + _textArea.setBackground(Binding.INVALID_COLOR); + } + + public void setEnabled(boolean enabled) { + _textArea.setEnabled(enabled); + } + + public void actionPerformed(ActionEvent e) { + _textArea.setEnabled(_button.isSelected()); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/Validator.java b/launch4j/src/net/sf/launch4j/binding/Validator.java index fb2484a..b903bee 100644 --- a/launch4j/src/net/sf/launch4j/binding/Validator.java +++ b/launch4j/src/net/sf/launch4j/binding/Validator.java @@ -1,252 +1,252 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on 2004-01-30 - */ -package net.sf.launch4j.binding; - -import java.io.File; -import java.util.Arrays; -import java.util.List; - -import net.sf.launch4j.Util; -import net.sf.launch4j.config.ConfigPersister; - -/** - * @author Copyright (C) 2004 Grzegorz Kowal - */ -public class Validator { - public static final String ALPHANUMERIC_PATTERN = "[\\w]*?"; - public static final String ALPHA_PATTERN = "[\\w&&\\D]*?"; - public static final String NUMERIC_PATTERN = "[\\d]*?"; - public static final String PATH_PATTERN = "[\\w|[ .,:\\-/\\\\]]*?"; - - public static final int MAX_STR = 128; - public static final int MAX_PATH = 260; - public static final int MAX_BIG_STR = 8192; // or 16384; - public static final int MAX_ARGS = 32767 - 2048; - - private Validator() {} - - public static boolean isEmpty(String s) { - return s == null || s.equals(""); - } - - public static void checkNotNull(Object o, String property, String name) { - if (o == null) { - signalViolation(property, - Messages.getString("Validator.empty.field", name)); - } - } - - public static void checkString(String s, int maxLength, String property, - String name) { - if (s == null || s.length() == 0) { - signalViolation(property, - Messages.getString("Validator.empty.field", name)); - } - if (s.length() > maxLength) { - signalLengthViolation(property, name, maxLength); - } - } - - public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, - String property, String name) { - if (strings == null) { - return; - } - - int totalLength = 0; - - for (String s : strings) { - checkString(s, maxLength, property, name); - totalLength += s.length(); - - if (totalLength > totalMaxLength) { - signalLengthViolation(property, name, totalMaxLength); - } - } - } - - public static void checkString(String s, int maxLength, String pattern, - String property, String name) { - checkString(s, maxLength, property, name); - - if (!s.matches(pattern)) { - signalViolation(property, - Messages.getString("Validator.invalid.data", name)); - } - } - - public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, - String pattern, String property, String name, String msg) { - if (strings == null) { - return; - } - - int totalLength = 0; - - for (String s : strings) { - checkString(s, maxLength, property, name); - - if (!s.matches(pattern)) { - signalViolation(property, msg != null - ? msg - : Messages.getString("Validator.invalid.data", name)); - } - - totalLength += s.length(); - - if (totalLength > totalMaxLength) { - signalLengthViolation(property, name, totalMaxLength); - } - } - } - - public static void checkOptString(String s, int maxLength, String property, - String name) { - if (s == null || s.length() == 0) { - return; - } - - if (s.length() > maxLength) { - signalLengthViolation(property, name, maxLength); - } - } - - public static void checkOptString(String s, int maxLength, String pattern, - String property, String name) { - if (s == null || s.length() == 0) { - return; - } - - if (s.length() > maxLength) { - signalLengthViolation(property, name, maxLength); - } - - if (!s.matches(pattern)) { - signalViolation(property, - Messages.getString("Validator.invalid.data", name)); - } - } - - public static void checkRange(int value, int min, int max, - String property, String name) { - if (value < min || value > max) { - signalViolation(property, - Messages.getString("Validator.must.be.in.range", name, - String.valueOf(min), String.valueOf(max))); - } - } - - public static void checkRange(char value, char min, char max, - String property, String name) { - if (value < min || value > max) { - signalViolation(property, Messages.getString("Validator.must.be.in.range", - name, String.valueOf(min), String.valueOf(max))); - } - } - - public static void checkMin(int value, int min, String property, String name) { - if (value < min) { - signalViolation(property, - Messages.getString("Validator.must.be.at.least", name, - String.valueOf(min))); - } - } - - public static void checkIn(String s, String[] strings, String property, - String name) { - if (isEmpty(s)) { - signalViolation(property, - Messages.getString("Validator.empty.field", name)); - } - - List list = Arrays.asList(strings); - - if (!list.contains(s)) { - signalViolation(property, - Messages.getString("Validator.invalid.option", name, list.toString())); - } - } - - public static void checkTrue(boolean condition, String property, String msg) { - if (!condition) { - signalViolation(property, msg); - } - } - - public static void checkFalse(boolean condition, String property, String msg) { - if (condition) { - signalViolation(property, msg); - } - } - - public static void checkFile(File f, String property, String fileDescription) { - File cfgPath = ConfigPersister.getInstance().getConfigPath(); - if (f == null - || f.getPath().equals("") - || (!f.exists() && !Util.getAbsoluteFile(cfgPath, f).exists())) { - signalViolation(property, - Messages.getString("Validator.doesnt.exist", fileDescription)); - } - } - - public static void checkOptFile(File f, String property, String fileDescription) { - if (f != null && f.getPath().length() > 0) { - checkFile(f, property, fileDescription); - } - } - - public static void checkRelativeWinPath(String path, String property, String msg) { - if (path == null - || path.equals("") - || path.startsWith("/") - || path.startsWith("\\") - || path.indexOf(':') != -1) { - signalViolation(property, msg); - } - } - - public static void signalLengthViolation(String property, String name, - int maxLength) { - signalViolation(property, - Messages.getString("Validator.exceeds.max.length", name, - String.valueOf(maxLength))); - } - - public static void signalViolation(String property, String msg) { - throw new InvariantViolationException(property, msg); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on 2004-01-30 + */ +package net.sf.launch4j.binding; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +import net.sf.launch4j.Util; +import net.sf.launch4j.config.ConfigPersister; + +/** + * @author Copyright (C) 2004 Grzegorz Kowal + */ +public class Validator { + public static final String ALPHANUMERIC_PATTERN = "[\\w]*?"; + public static final String ALPHA_PATTERN = "[\\w&&\\D]*?"; + public static final String NUMERIC_PATTERN = "[\\d]*?"; + public static final String PATH_PATTERN = "[\\w|[ .,:\\-/\\\\]]*?"; + + public static final int MAX_STR = 128; + public static final int MAX_PATH = 260; + public static final int MAX_BIG_STR = 8192; // or 16384; + public static final int MAX_ARGS = 32767 - 2048; + + private Validator() {} + + public static boolean isEmpty(String s) { + return s == null || s.equals(""); + } + + public static void checkNotNull(Object o, String property, String name) { + if (o == null) { + signalViolation(property, + Messages.getString("Validator.empty.field", name)); + } + } + + public static void checkString(String s, int maxLength, String property, + String name) { + if (s == null || s.length() == 0) { + signalViolation(property, + Messages.getString("Validator.empty.field", name)); + } + if (s.length() > maxLength) { + signalLengthViolation(property, name, maxLength); + } + } + + public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, + String property, String name) { + if (strings == null) { + return; + } + + int totalLength = 0; + + for (String s : strings) { + checkString(s, maxLength, property, name); + totalLength += s.length(); + + if (totalLength > totalMaxLength) { + signalLengthViolation(property, name, totalMaxLength); + } + } + } + + public static void checkString(String s, int maxLength, String pattern, + String property, String name) { + checkString(s, maxLength, property, name); + + if (!s.matches(pattern)) { + signalViolation(property, + Messages.getString("Validator.invalid.data", name)); + } + } + + public static void checkOptStrings(List strings, int maxLength, int totalMaxLength, + String pattern, String property, String name, String msg) { + if (strings == null) { + return; + } + + int totalLength = 0; + + for (String s : strings) { + checkString(s, maxLength, property, name); + + if (!s.matches(pattern)) { + signalViolation(property, msg != null + ? msg + : Messages.getString("Validator.invalid.data", name)); + } + + totalLength += s.length(); + + if (totalLength > totalMaxLength) { + signalLengthViolation(property, name, totalMaxLength); + } + } + } + + public static void checkOptString(String s, int maxLength, String property, + String name) { + if (s == null || s.length() == 0) { + return; + } + + if (s.length() > maxLength) { + signalLengthViolation(property, name, maxLength); + } + } + + public static void checkOptString(String s, int maxLength, String pattern, + String property, String name) { + if (s == null || s.length() == 0) { + return; + } + + if (s.length() > maxLength) { + signalLengthViolation(property, name, maxLength); + } + + if (!s.matches(pattern)) { + signalViolation(property, + Messages.getString("Validator.invalid.data", name)); + } + } + + public static void checkRange(int value, int min, int max, + String property, String name) { + if (value < min || value > max) { + signalViolation(property, + Messages.getString("Validator.must.be.in.range", name, + String.valueOf(min), String.valueOf(max))); + } + } + + public static void checkRange(char value, char min, char max, + String property, String name) { + if (value < min || value > max) { + signalViolation(property, Messages.getString("Validator.must.be.in.range", + name, String.valueOf(min), String.valueOf(max))); + } + } + + public static void checkMin(int value, int min, String property, String name) { + if (value < min) { + signalViolation(property, + Messages.getString("Validator.must.be.at.least", name, + String.valueOf(min))); + } + } + + public static void checkIn(String s, String[] strings, String property, + String name) { + if (isEmpty(s)) { + signalViolation(property, + Messages.getString("Validator.empty.field", name)); + } + + List list = Arrays.asList(strings); + + if (!list.contains(s)) { + signalViolation(property, + Messages.getString("Validator.invalid.option", name, list.toString())); + } + } + + public static void checkTrue(boolean condition, String property, String msg) { + if (!condition) { + signalViolation(property, msg); + } + } + + public static void checkFalse(boolean condition, String property, String msg) { + if (condition) { + signalViolation(property, msg); + } + } + + public static void checkFile(File f, String property, String fileDescription) { + File cfgPath = ConfigPersister.getInstance().getConfigPath(); + if (f == null + || f.getPath().equals("") + || (!f.exists() && !Util.getAbsoluteFile(cfgPath, f).exists())) { + signalViolation(property, + Messages.getString("Validator.doesnt.exist", fileDescription)); + } + } + + public static void checkOptFile(File f, String property, String fileDescription) { + if (f != null && f.getPath().length() > 0) { + checkFile(f, property, fileDescription); + } + } + + public static void checkRelativeWinPath(String path, String property, String msg) { + if (path == null + || path.equals("") + || path.startsWith("/") + || path.startsWith("\\") + || path.indexOf(':') != -1) { + signalViolation(property, msg); + } + } + + public static void signalLengthViolation(String property, String name, + int maxLength) { + signalViolation(property, + Messages.getString("Validator.exceeds.max.length", name, + String.valueOf(maxLength))); + } + + public static void signalViolation(String property, String msg) { + throw new InvariantViolationException(property, msg); + } +} diff --git a/launch4j/src/net/sf/launch4j/binding/messages.properties b/launch4j/src/net/sf/launch4j/binding/messages.properties index e9548cd..da7a74a 100644 --- a/launch4j/src/net/sf/launch4j/binding/messages.properties +++ b/launch4j/src/net/sf/launch4j/binding/messages.properties @@ -1,52 +1,52 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2015 Grzegorz Kowal -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -OptComponentBinding.must.implement=Optional component must implement - -Validator.empty.field=Enter: {0} -Validator.invalid.data=Invalid data: {0} -Validator.must.be.in.range={0} must be in range [{1}-{2}] -Validator.must.be.at.least={0} must be at least -Validator.already.exists={0} already exists. -Validator.doesnt.exist={0} doesn''t exist. -Validator.exceeds.max.length={0} exceeds the maximum length of {1} characters. -Validator.invalid.option={0} must be one of [{1}] - -Bindings.duplicate.binding=Duplicate binding - -JRadioButtonBinding.property.null=Property is null -JRadioButtonBinding.nothing.selected=Nothing selected -JRadioButtonBinding.index.out.of.bounds=Button index out of bounds - -JComboBoxBinding.property.null=Property is null -JComboBoxBinding.index.out.of.bounds=Combo box index out of bounds +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2015 Grzegorz Kowal +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +OptComponentBinding.must.implement=Optional component must implement + +Validator.empty.field=Enter: {0} +Validator.invalid.data=Invalid data: {0} +Validator.must.be.in.range={0} must be in range [{1}-{2}] +Validator.must.be.at.least={0} must be at least +Validator.already.exists={0} already exists. +Validator.doesnt.exist={0} doesn''t exist. +Validator.exceeds.max.length={0} exceeds the maximum length of {1} characters. +Validator.invalid.option={0} must be one of [{1}] + +Bindings.duplicate.binding=Duplicate binding + +JRadioButtonBinding.property.null=Property is null +JRadioButtonBinding.nothing.selected=Nothing selected +JRadioButtonBinding.index.out.of.bounds=Button index out of bounds + +JComboBoxBinding.property.null=Property is null +JComboBoxBinding.index.out.of.bounds=Combo box index out of bounds diff --git a/launch4j/src/net/sf/launch4j/binding/messages_es.properties b/launch4j/src/net/sf/launch4j/binding/messages_es.properties deleted file mode 100644 index 52e44f2..0000000 --- a/launch4j/src/net/sf/launch4j/binding/messages_es.properties +++ /dev/null @@ -1,51 +0,0 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Martínez Ros -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -OptComponentBinding.must.implement=El componente opcional debe ser implementado - -Validator.empty.field=Introduzca: {0} -Validator.invalid.data=Dato no válido: {0} -Validator.must.be.in.range={0} debe estar en el rango [{1}-{2}] -Validator.must.be.at.least={0} deb ser al menos -Validator.already.exists={0} ya existe. -Validator.doesnt.exist={0} no existe. -Validator.exceeds.max.length={0} excede la longitud máxima de {1} caracteres. -Validator.invalid.option={0} must be one of [{1}] - -Bindings.duplicate.binding=Binding duplicado - -JRadioButtonBinding.property.null=La propiedad es nula -JRadioButtonBinding.nothing.selected=Nada seleccionado -JRadioButtonBinding.index.out.of.bounds=Índice de botón fuera de límite -JComboBoxBinding.property.null=Property is null -JComboBoxBinding.index.out.of.bounds=Combo box index out of bounds diff --git a/launch4j/src/net/sf/launch4j/config/CharsetID.java b/launch4j/src/net/sf/launch4j/config/CharsetID.java index 40bd8d2..3e759ed 100644 --- a/launch4j/src/net/sf/launch4j/config/CharsetID.java +++ b/launch4j/src/net/sf/launch4j/config/CharsetID.java @@ -1,110 +1,110 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2015 Sebastian Bögl - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.config; - -import java.util.Arrays; -/** - * @see VERSIONINFO resource - * @see VarFileInfo BLOCK - */ -public enum CharsetID implements Describable { - /** 0x0000 */ - ASCII(0, Messages.getString("Charset.ascii")), - /** 0x04E8 */ - ARABIC(1256, Messages.getString("Language.arabic")), - /** 0x04E3 */ - CYRILLIC(1251, Messages.getString("Charset.cyrillic")), - /** 0x04E5 */ - GREEK(1253, Messages.getString("Language.greek")), - /** 0x04E7 */ - HEBREW(1255, Messages.getString("Language.hebrew")), - /** 0x03A4 */ - SHIFT_JIS(932, Messages.getString("Charset.shift.jis")), - /** 0x03B5 */ - SHIFT_KSC(949, Messages.getString("Charset.shift.ksc")), - /** 0x04E2 */ - LATIN2(1250, Messages.getString("Charset.latin2")), - /** 0x04E4 */ - MULTILINGUAL(1252, Messages.getString("Charset.multilingual")), - /** 0x0B63 */ - BIG5(950, Messages.getString("Charset.big5")), - /** 0x04E6 */ - TURKISH(1254, Messages.getString("Language.turkish")), - /** 0x04B0 */ - UNICODE(1200, Messages.getString("Charset.unicode")), - ; - - private static final CharsetID[] VALUES = CharsetID.values(); - - static { - Arrays.sort(VALUES, new DescribableComparator()); - } - - private final int id; - private final String description; - - CharsetID(int id, String description) { - this.id = id; - this.description = description; - } - - public int getId() { - return id; - } - - @Override - public String toString() { - return description; - } - - @Override - public String getDescription() { - return description; - } - - @Override - public int getIndex() { - for (int i = 0; i < VALUES.length; i++) { - if (VALUES[i] == this) { - return i; - } - } - // should never happen - return -1; - } - - public static CharsetID[] sortedValues() { - return VALUES; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2015 Sebastian Bögl + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.config; + +import java.util.Arrays; +/** + * @see VERSIONINFO resource + * @see VarFileInfo BLOCK + */ +public enum CharsetID implements Describable { + /** 0x0000 */ + ASCII(0, Messages.getString("Charset.ascii")), + /** 0x04E8 */ + ARABIC(1256, Messages.getString("Language.arabic")), + /** 0x04E3 */ + CYRILLIC(1251, Messages.getString("Charset.cyrillic")), + /** 0x04E5 */ + GREEK(1253, Messages.getString("Language.greek")), + /** 0x04E7 */ + HEBREW(1255, Messages.getString("Language.hebrew")), + /** 0x03A4 */ + SHIFT_JIS(932, Messages.getString("Charset.shift.jis")), + /** 0x03B5 */ + SHIFT_KSC(949, Messages.getString("Charset.shift.ksc")), + /** 0x04E2 */ + LATIN2(1250, Messages.getString("Charset.latin2")), + /** 0x04E4 */ + MULTILINGUAL(1252, Messages.getString("Charset.multilingual")), + /** 0x0B63 */ + BIG5(950, Messages.getString("Charset.big5")), + /** 0x04E6 */ + TURKISH(1254, Messages.getString("Language.turkish")), + /** 0x04B0 */ + UNICODE(1200, Messages.getString("Charset.unicode")), + ; + + private static final CharsetID[] VALUES = CharsetID.values(); + + static { + Arrays.sort(VALUES, new DescribableComparator()); + } + + private final int id; + private final String description; + + CharsetID(int id, String description) { + this.id = id; + this.description = description; + } + + public int getId() { + return id; + } + + @Override + public String toString() { + return description; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public int getIndex() { + for (int i = 0; i < VALUES.length; i++) { + if (VALUES[i] == this) { + return i; + } + } + // should never happen + return -1; + } + + public static CharsetID[] sortedValues() { + return VALUES; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/ClassPath.java b/launch4j/src/net/sf/launch4j/config/ClassPath.java index 885d07f..14f624c 100644 --- a/launch4j/src/net/sf/launch4j/config/ClassPath.java +++ b/launch4j/src/net/sf/launch4j/config/ClassPath.java @@ -1,92 +1,92 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.config; - -import java.util.List; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class ClassPath implements IValidatable { - private String mainClass; - private List paths; - - public void checkInvariants() { - Validator.checkString(mainClass, Validator.MAX_PATH, "mainClass", - Messages.getString("ClassPath.mainClass")); - Validator.checkOptStrings(paths, - Validator.MAX_PATH, - Validator.MAX_ARGS, - "paths", - Messages.getString("ClassPath.path")); - } - - public String getMainClass() { - return mainClass; - } - - public void setMainClass(String mainClass) { - this.mainClass = mainClass; - } - - public List getPaths() { - return paths; - } - - public void setPaths(List paths) { - this.paths = paths; - } - - public String getPathsString() { - StringBuffer sb = new StringBuffer(); - - if (paths != null) { - for (int i = 0; i < paths.size(); i++) { - sb.append(paths.get(i)); - - if (i < paths.size() - 1) { - sb.append(';'); - } - } - } - - return sb.toString(); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.config; + +import java.util.List; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class ClassPath implements IValidatable { + private String mainClass; + private List paths; + + public void checkInvariants() { + Validator.checkString(mainClass, Validator.MAX_PATH, "mainClass", + Messages.getString("ClassPath.mainClass")); + Validator.checkOptStrings(paths, + Validator.MAX_PATH, + Validator.MAX_ARGS, + "paths", + Messages.getString("ClassPath.path")); + } + + public String getMainClass() { + return mainClass; + } + + public void setMainClass(String mainClass) { + this.mainClass = mainClass; + } + + public List getPaths() { + return paths; + } + + public void setPaths(List paths) { + this.paths = paths; + } + + public String getPathsString() { + StringBuffer sb = new StringBuffer(); + + if (paths != null) { + for (int i = 0; i < paths.size(); i++) { + sb.append(paths.get(i)); + + if (i < paths.size() - 1) { + sb.append(';'); + } + } + } + + return sb.toString(); + } +} diff --git a/launch4j/src/net/sf/launch4j/config/Config.java b/launch4j/src/net/sf/launch4j/config/Config.java index a9671c2..aaad10f 100644 --- a/launch4j/src/net/sf/launch4j/config/Config.java +++ b/launch4j/src/net/sf/launch4j/config/Config.java @@ -1,428 +1,424 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j.config; - -import java.io.File; -import java.util.Arrays; -import java.util.List; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Config implements IValidatable { - - // 1.x config properties_____________________________________________________________ - public static final String HEADER = "header"; - public static final String JAR = "jar"; - public static final String OUTFILE = "outfile"; - public static final String ERR_TITLE = "errTitle"; - public static final String JAR_ARGS = "jarArgs"; - public static final String CHDIR = "chdir"; - public static final String STAY_ALIVE = "stayAlive"; - public static final String ICON = "icon"; - - // __________________________________________________________________________________ - public static final String DOWNLOAD_URL = "http://java.com/download"; - - public static final String GUI_HEADER = "gui"; - public static final String CONSOLE_HEADER = "console"; - public static final String JNI_GUI_HEADER_32 = "jniGui32"; - public static final String JNI_CONSOLE_HEADER_32 = "jniConsole32"; - - private static final String[] HEADER_TYPES = new String[] { GUI_HEADER, - CONSOLE_HEADER, - JNI_GUI_HEADER_32, - JNI_CONSOLE_HEADER_32 }; - - private static final String[] PRIORITY_CLASS_NAMES = new String[] { "normal", - "idle", - "high" }; - - private static final int[] PRIORITY_CLASSES = new int[] { 0x00000020, - 0x00000040, - 0x00000080 }; - - private boolean dontWrapJar; - private String headerType = GUI_HEADER; - private List headerObjects; - private List libs; - private File jar; - private File outfile; - - // Runtime header configuration - private String errTitle; - private String cmdLine; - private String chdir; - private String priority; - private String downloadUrl; - private String supportUrl; - private boolean stayAlive; - private boolean restartOnCrash; - private File manifest; - private File icon; - private List variables; - private SingleInstance singleInstance; - private ClassPath classPath; - private Jre jre; - private Splash splash; - private VersionInfo versionInfo; - private Msg messages; - - public void checkInvariants() { - Validator.checkTrue(outfile != null && outfile.getPath().endsWith(".exe"), - "outfile", Messages.getString("Config.specify.output.exe")); - if (dontWrapJar) { - if (jar != null && !jar.getPath().equals("")) { - Validator.checkRelativeWinPath(jar.getPath(), "jar", - Messages.getString("Config.application.jar.path")); - } else { - Validator.checkTrue(classPath != null, "classPath", - Messages.getString("ClassPath.or.jar")); - } - } else { - Validator.checkFile(jar, "jar", - Messages.getString("Config.application.jar")); - } - if (!Validator.isEmpty(chdir)) { - Validator.checkRelativeWinPath(chdir, "chdir", - Messages.getString("Config.chdir.relative")); - Validator.checkFalse(chdir.toLowerCase().equals("true") - || chdir.toLowerCase().equals("false"), - "chdir", Messages.getString("Config.chdir.path")); - } - Validator.checkOptFile(manifest, "manifest", Messages.getString("Config.manifest")); - Validator.checkOptFile(icon, "icon", Messages.getString("Config.icon")); - Validator.checkOptString(cmdLine, Validator.MAX_BIG_STR, "jarArgs", - Messages.getString("Config.jar.arguments")); - Validator.checkOptString(errTitle, Validator.MAX_STR, "errTitle", - Messages.getString("Config.error.title")); - Validator.checkOptString(downloadUrl, 256, - "downloadUrl", Messages.getString("Config.download.url")); - Validator.checkOptString(supportUrl, 256, - "supportUrl", Messages.getString("Config.support.url")); - Validator.checkIn(getHeaderType(), HEADER_TYPES, "headerType", - Messages.getString("Config.header.type")); - Validator.checkFalse(!isGuiApplication() && splash != null, - "headerType", - Messages.getString("Config.splash.not.impl.by.console.hdr")); - Validator.checkOptStrings(variables, - Validator.MAX_ARGS, - Validator.MAX_ARGS, - "[^=%\t]+=[^=\t]+", - "variables", - Messages.getString("Config.variables"), - Messages.getString("Config.variables.err")); - Validator.checkIn(getPriority(), PRIORITY_CLASS_NAMES, "priority", - Messages.getString("Config.priority")); - checkJniInvariants(); - jre.checkInvariants(); - } - - private void checkJniInvariants() { - // TODO: Remove once JNI is fully implemented. - if (isJniApplication()) { - Validator.checkTrue(".".equals(chdir), "chdir", - "Only '.' is allowed in change directory."); - Validator.checkTrue(Validator.isEmpty(cmdLine), "cmdLine", - "Constant command line arguments not supported."); - Validator.checkFalse(stayAlive, "stayAlive", - "Stay alive option is not used in JNI, this is the default behavior."); - Validator.checkFalse(restartOnCrash, "restartOnCrash", - "Restart on crash not supported."); - Validator.checkIn(getPriority(), new String[] { "normal" }, "priority", - "Process priority is not supported,"); - Validator.checkNotNull(classPath, "classpath", "classpath"); - Validator.checkFalse(jre.getBundledJre64Bit(), "jre.bundledJre64Bit", - "64-bit bundled JRE not supported."); - Validator.checkTrue(Jre.RUNTIME_BITS_32.equals(jre.getRuntimeBits()), "jre.runtimeBits", - "64-bit JRE not supported."); - } - } - - public void validate() { - checkInvariants(); - if (classPath != null) { - classPath.checkInvariants(); - } - if (splash != null) { - splash.checkInvariants(); - } - if (versionInfo != null) { - versionInfo.checkInvariants(); - } - } - - /** Change current directory to EXE location. */ - public String getChdir() { - return chdir; - } - - public void setChdir(String chdir) { - this.chdir = chdir; - } - - /** Constant command line arguments passed to the application. */ - public String getCmdLine() { - return cmdLine; - } - - public void setCmdLine(String cmdLine) { - this.cmdLine = cmdLine; - } - - /** Optional, error message box title. */ - public String getErrTitle() { - return errTitle; - } - - public void setErrTitle(String errTitle) { - this.errTitle = errTitle; - } - - public boolean isGuiApplication() { - return GUI_HEADER.equals(headerType) || JNI_GUI_HEADER_32.equals(headerType); - } - - public boolean isJniApplication() { - return JNI_GUI_HEADER_32.equals(headerType) - || JNI_CONSOLE_HEADER_32.equals(headerType); - } - - /** launch4j header file. */ - public String getHeaderType() { - return headerType; - } - - public void setHeaderType(String headerType) { - this.headerType = headerType; - } - - /** launch4j header file index - used by GUI. */ - public int getHeaderTypeIndex() { - int x = Arrays.asList(HEADER_TYPES).indexOf(getHeaderType()); - return x != -1 ? x : 0; - } - - public void setHeaderTypeIndex(int headerTypeIndex) { - headerType = HEADER_TYPES[headerTypeIndex]; - } - - public boolean isCustomHeaderObjects() { - return headerObjects != null && !headerObjects.isEmpty(); - } - - public List getHeaderObjects() { - return isCustomHeaderObjects() ? headerObjects - : LdDefaults.getHeaderObjects(getHeaderTypeIndex()); - } - - public void setHeaderObjects(List headerObjects) { - this.headerObjects = headerObjects; - } - - public boolean isCustomLibs() { - return libs != null && !libs.isEmpty(); - } - - public List getLibs() { - return isCustomLibs() ? libs : LdDefaults.getLibs(headerType); - } - - public void setLibs(List libs) { - this.libs = libs; - } - - /** Wrapper's manifest for User Account Control. */ - public File getManifest() { - return manifest; - } - - public void setManifest(File manifest) { - this.manifest = manifest; - } - - /** ICO file. */ - public File getIcon() { - return icon; - } - - public void setIcon(File icon) { - this.icon = icon; - } - - /** Jar to wrap. */ - public File getJar() { - return jar; - } - - public void setJar(File jar) { - this.jar = jar; - } - - public List getVariables() { - return variables; - } - - public void setVariables(List variables) { - this.variables = variables; - } - - public ClassPath getClassPath() { - return classPath; - } - - public void setClassPath(ClassPath classpath) { - this.classPath = classpath; - } - - /** JRE configuration */ - public Jre getJre() { - return jre; - } - - public void setJre(Jre jre) { - this.jre = jre; - } - - /** Output EXE file. */ - public File getOutfile() { - return outfile; - } - - public void setOutfile(File outfile) { - this.outfile = outfile; - } - - /** Splash screen configuration. */ - public Splash getSplash() { - return splash; - } - - public void setSplash(Splash splash) { - this.splash = splash; - } - - /** Stay alive after launching the application. */ - public boolean isStayAlive() { - return stayAlive; - } - - public void setStayAlive(boolean stayAlive) { - this.stayAlive = stayAlive; - } - - /** Restart the application after a crash (i.e. exit code other than 0) */ - public boolean isRestartOnCrash() { - return restartOnCrash; - } - - public void setRestartOnCrash(boolean restartOnCrash) { - this.restartOnCrash = restartOnCrash; - } - - public VersionInfo getVersionInfo() { - return versionInfo; - } - - public void setVersionInfo(VersionInfo versionInfo) { - this.versionInfo = versionInfo; - } - - public boolean isDontWrapJar() { - return dontWrapJar; - } - - public void setDontWrapJar(boolean dontWrapJar) { - this.dontWrapJar = dontWrapJar; - } - - public int getPriorityIndex() { - int x = Arrays.asList(PRIORITY_CLASS_NAMES).indexOf(getPriority()); - return x != -1 ? x : 0; - } - - public void setPriorityIndex(int x) { - priority = PRIORITY_CLASS_NAMES[x]; - } - - public String getPriority() { - return Validator.isEmpty(priority) ? PRIORITY_CLASS_NAMES[0] : priority; - } - - public void setPriority(String priority) { - this.priority = priority; - } - - public int getPriorityClass() { - return PRIORITY_CLASSES[getPriorityIndex()]; - } - - public String getDownloadUrl() { - return downloadUrl == null ? DOWNLOAD_URL : downloadUrl; - } - - public void setDownloadUrl(String downloadUrl) { - this.downloadUrl = downloadUrl; - } - - public String getSupportUrl() { - return supportUrl; - } - - public void setSupportUrl(String supportUrl) { - this.supportUrl = supportUrl; - } - - public Msg getMessages() { - return messages; - } - - public void setMessages(Msg messages) { - this.messages = messages; - } - - public SingleInstance getSingleInstance() { - return singleInstance; - } - - public void setSingleInstance(SingleInstance singleInstance) { - this.singleInstance = singleInstance; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j.config; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Config implements IValidatable { + + // 1.x config properties_____________________________________________________________ + public static final String HEADER = "header"; + public static final String JAR = "jar"; + public static final String OUTFILE = "outfile"; + public static final String ERR_TITLE = "errTitle"; + public static final String JAR_ARGS = "jarArgs"; + public static final String CHDIR = "chdir"; + public static final String STAY_ALIVE = "stayAlive"; + public static final String ICON = "icon"; + + // __________________________________________________________________________________ + public static final String GUI_HEADER = "gui"; + public static final String CONSOLE_HEADER = "console"; + public static final String JNI_GUI_HEADER_32 = "jniGui32"; + public static final String JNI_CONSOLE_HEADER_32 = "jniConsole32"; + + private static final String[] HEADER_TYPES = new String[] { GUI_HEADER, + CONSOLE_HEADER, + JNI_GUI_HEADER_32, + JNI_CONSOLE_HEADER_32 }; + + private static final String[] PRIORITY_CLASS_NAMES = new String[] { "normal", + "idle", + "high" }; + + private static final int[] PRIORITY_CLASSES = new int[] { 0x00000020, + 0x00000040, + 0x00000080 }; + + private boolean dontWrapJar; + private String headerType = GUI_HEADER; + private List headerObjects; + private List libs; + private File jar; + private File outfile; + + // Runtime header configuration + private String errTitle; + private String cmdLine; + private String chdir; + private String priority; + private String downloadUrl; + private String supportUrl; + private boolean stayAlive; + private boolean restartOnCrash; + private File manifest; + private File icon; + private List variables; + private SingleInstance singleInstance; + private ClassPath classPath; + private Jre jre; + private Splash splash; + private VersionInfo versionInfo; + private Msg messages; + + public void checkInvariants() { + Validator.checkTrue(outfile != null && outfile.getPath().endsWith(".exe"), + "outfile", Messages.getString("Config.specify.output.exe")); + if (dontWrapJar) { + if (jar != null && !jar.getPath().equals("")) { + Validator.checkRelativeWinPath(jar.getPath(), "jar", + Messages.getString("Config.application.jar.path")); + } else { + Validator.checkTrue(classPath != null, "classPath", + Messages.getString("ClassPath.or.jar")); + } + } else { + Validator.checkFile(jar, "jar", + Messages.getString("Config.application.jar")); + } + if (!Validator.isEmpty(chdir)) { + Validator.checkRelativeWinPath(chdir, "chdir", + Messages.getString("Config.chdir.relative")); + Validator.checkFalse(chdir.toLowerCase().equals("true") + || chdir.toLowerCase().equals("false"), + "chdir", Messages.getString("Config.chdir.path")); + } + Validator.checkOptFile(manifest, "manifest", Messages.getString("Config.manifest")); + Validator.checkOptFile(icon, "icon", Messages.getString("Config.icon")); + Validator.checkOptString(cmdLine, Validator.MAX_BIG_STR, "jarArgs", + Messages.getString("Config.jar.arguments")); + Validator.checkOptString(errTitle, Validator.MAX_STR, "errTitle", + Messages.getString("Config.error.title")); + Validator.checkOptString(downloadUrl, 256, + "downloadUrl", Messages.getString("Config.download.url")); + Validator.checkOptString(supportUrl, 256, + "supportUrl", Messages.getString("Config.support.url")); + Validator.checkIn(getHeaderType(), HEADER_TYPES, "headerType", + Messages.getString("Config.header.type")); + Validator.checkFalse(!isGuiApplication() && splash != null, + "headerType", + Messages.getString("Config.splash.not.impl.by.console.hdr")); + Validator.checkOptStrings(variables, + Validator.MAX_ARGS, + Validator.MAX_ARGS, + "[^=%\t]+=[^\t]+", + "variables", + Messages.getString("Config.variables"), + Messages.getString("Config.variables.err")); + Validator.checkIn(getPriority(), PRIORITY_CLASS_NAMES, "priority", + Messages.getString("Config.priority")); + checkJniInvariants(); + jre.checkInvariants(); + } + + private void checkJniInvariants() { + // TODO: Remove once JNI is fully implemented. + if (isJniApplication()) { + Validator.checkTrue(".".equals(chdir), "chdir", + "Only '.' is allowed in change directory."); + Validator.checkTrue(Validator.isEmpty(cmdLine), "cmdLine", + "Constant command line arguments not supported."); + Validator.checkFalse(stayAlive, "stayAlive", + "Stay alive option is not used in JNI, this is the default behavior."); + Validator.checkFalse(restartOnCrash, "restartOnCrash", + "Restart on crash not supported."); + Validator.checkIn(getPriority(), new String[] { "normal" }, "priority", + "Process priority is not supported,"); + Validator.checkNotNull(classPath, "classpath", "classpath"); + Validator.checkFalse(jre.getRequires64Bit(), "jre.requires64Bit", + "64-bit JRE not supported."); + } + } + + public void validate() { + checkInvariants(); + if (classPath != null) { + classPath.checkInvariants(); + } + if (splash != null) { + splash.checkInvariants(); + } + if (versionInfo != null) { + versionInfo.checkInvariants(); + } + } + + /** Change current directory to EXE location. */ + public String getChdir() { + return chdir; + } + + public void setChdir(String chdir) { + this.chdir = chdir; + } + + /** Constant command line arguments passed to the application. */ + public String getCmdLine() { + return cmdLine; + } + + public void setCmdLine(String cmdLine) { + this.cmdLine = cmdLine; + } + + /** Optional, error message box title. */ + public String getErrTitle() { + return errTitle; + } + + public void setErrTitle(String errTitle) { + this.errTitle = errTitle; + } + + public boolean isGuiApplication() { + return GUI_HEADER.equals(headerType) || JNI_GUI_HEADER_32.equals(headerType); + } + + public boolean isJniApplication() { + return JNI_GUI_HEADER_32.equals(headerType) + || JNI_CONSOLE_HEADER_32.equals(headerType); + } + + /** launch4j header file. */ + public String getHeaderType() { + return headerType; + } + + public void setHeaderType(String headerType) { + this.headerType = headerType; + } + + /** launch4j header file index - used by GUI. */ + public int getHeaderTypeIndex() { + int x = Arrays.asList(HEADER_TYPES).indexOf(getHeaderType()); + return x != -1 ? x : 0; + } + + public void setHeaderTypeIndex(int headerTypeIndex) { + headerType = HEADER_TYPES[headerTypeIndex]; + } + + public boolean isCustomHeaderObjects() { + return headerObjects != null && !headerObjects.isEmpty(); + } + + public List getHeaderObjects() { + return isCustomHeaderObjects() ? headerObjects + : LdDefaults.getHeaderObjects(getHeaderTypeIndex()); + } + + public void setHeaderObjects(List headerObjects) { + this.headerObjects = headerObjects; + } + + public boolean isCustomLibs() { + return libs != null && !libs.isEmpty(); + } + + public List getLibs() { + return isCustomLibs() ? libs : LdDefaults.getLibs(headerType); + } + + public void setLibs(List libs) { + this.libs = libs; + } + + /** Wrapper's manifest for User Account Control. */ + public File getManifest() { + return manifest; + } + + public void setManifest(File manifest) { + this.manifest = manifest; + } + + /** ICO file. */ + public File getIcon() { + return icon; + } + + public void setIcon(File icon) { + this.icon = icon; + } + + /** Jar to wrap. */ + public File getJar() { + return jar; + } + + public void setJar(File jar) { + this.jar = jar; + } + + public List getVariables() { + return variables; + } + + public void setVariables(List variables) { + this.variables = variables; + } + + public ClassPath getClassPath() { + return classPath; + } + + public void setClassPath(ClassPath classpath) { + this.classPath = classpath; + } + + /** JRE configuration */ + public Jre getJre() { + return jre; + } + + public void setJre(Jre jre) { + this.jre = jre; + } + + /** Output EXE file. */ + public File getOutfile() { + return outfile; + } + + public void setOutfile(File outfile) { + this.outfile = outfile; + } + + /** Splash screen configuration. */ + public Splash getSplash() { + return splash; + } + + public void setSplash(Splash splash) { + this.splash = splash; + } + + /** Stay alive after launching the application. */ + public boolean isStayAlive() { + return stayAlive; + } + + public void setStayAlive(boolean stayAlive) { + this.stayAlive = stayAlive; + } + + /** Restart the application after a crash (i.e. exit code other than 0) */ + public boolean isRestartOnCrash() { + return restartOnCrash; + } + + public void setRestartOnCrash(boolean restartOnCrash) { + this.restartOnCrash = restartOnCrash; + } + + public VersionInfo getVersionInfo() { + return versionInfo; + } + + public void setVersionInfo(VersionInfo versionInfo) { + this.versionInfo = versionInfo; + } + + public boolean isDontWrapJar() { + return dontWrapJar; + } + + public void setDontWrapJar(boolean dontWrapJar) { + this.dontWrapJar = dontWrapJar; + } + + public int getPriorityIndex() { + int x = Arrays.asList(PRIORITY_CLASS_NAMES).indexOf(getPriority()); + return x != -1 ? x : 0; + } + + public void setPriorityIndex(int x) { + priority = PRIORITY_CLASS_NAMES[x]; + } + + public String getPriority() { + return Validator.isEmpty(priority) ? PRIORITY_CLASS_NAMES[0] : priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public int getPriorityClass() { + return PRIORITY_CLASSES[getPriorityIndex()]; + } + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getSupportUrl() { + return supportUrl; + } + + public void setSupportUrl(String supportUrl) { + this.supportUrl = supportUrl; + } + + public Msg getMessages() { + return messages; + } + + public void setMessages(Msg messages) { + this.messages = messages; + } + + public SingleInstance getSingleInstance() { + return singleInstance; + } + + public void setSingleInstance(SingleInstance singleInstance) { + this.singleInstance = singleInstance; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/ConfigPersister.java b/launch4j/src/net/sf/launch4j/config/ConfigPersister.java index cca274a..5f0434c 100644 --- a/launch4j/src/net/sf/launch4j/config/ConfigPersister.java +++ b/launch4j/src/net/sf/launch4j/config/ConfigPersister.java @@ -1,276 +1,200 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 22, 2005 - */ -package net.sf.launch4j.config; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.ls.DOMImplementationLS; -import org.w3c.dom.ls.LSSerializer; - -import net.sf.launch4j.Util; - -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; - -/** - * @author Copyright (C) 2014 Grzegorz Kowal - */ -public class ConfigPersister { - - private static final ConfigPersister _instance = new ConfigPersister(); - - private final XStream _xstream; - private Config _config; - private File _configPath; - - private ConfigPersister() { - _xstream = new XStream(new DomDriver()); - _xstream.alias("launch4jConfig", Config.class); - _xstream.alias("classPath", ClassPath.class); - _xstream.alias("jre", Jre.class); - _xstream.alias("splash", Splash.class); - _xstream.alias("versionInfo", VersionInfo.class); - - _xstream.addImplicitCollection(Config.class, "headerObjects", "obj", - String.class); - _xstream.addImplicitCollection(Config.class, "libs", "lib", String.class); - _xstream.addImplicitCollection(Config.class, "variables", "var", String.class); - _xstream.addImplicitCollection(ClassPath.class, "paths", "cp", String.class); - _xstream.addImplicitCollection(Jre.class, "options", "opt", String.class); - } - - public static ConfigPersister getInstance() { - return _instance; - } - - public Config getConfig() { - return _config; - } - - public File getConfigPath() { - return _configPath; - } - - public File getOutputPath() throws IOException { - if (_config.getOutfile().isAbsolute()) { - return _config.getOutfile().getParentFile(); - } - File parent = _config.getOutfile().getParentFile(); - return (parent != null) ? new File(_configPath, parent.getPath()) : _configPath; - } - - public File getOutputFile() throws IOException { - return _config.getOutfile().isAbsolute() - ? _config.getOutfile() - : new File(getOutputPath(), _config.getOutfile().getName()); - } - - public void createBlank() { - _config = new Config(); - _config.setJre(new Jre()); - _configPath = null; - } - - public void setAntConfig(Config c, File basedir) { - _config = c; - _configPath = basedir; - } - - public void load(File f) throws ConfigPersisterException { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document doc = builder.parse(f); - - DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation(); - LSSerializer lsSerializer = domImplementation.createLSSerializer(); - String configString = lsSerializer.writeToString(doc); - - _config = (Config) _xstream.fromXML(convertToCurrent(configString)); - setConfigPath(f); - } catch (Exception e) { - throw new ConfigPersisterException(e); - } - } - - /** - * Imports launch4j 1.x.x config file. - */ - public void loadVersion1(File f) throws ConfigPersisterException { - try { - Props props = new Props(f); - _config = new Config(); - String header = props.getProperty(Config.HEADER); - _config.setHeaderType(header == null - || header.toLowerCase().equals("guihead.bin") ? Config.GUI_HEADER - : Config.CONSOLE_HEADER); - _config.setJar(props.getFile(Config.JAR)); - _config.setOutfile(props.getFile(Config.OUTFILE)); - _config.setJre(new Jre()); - _config.getJre().setPath(props.getProperty(Jre.PATH)); - _config.getJre().setMinVersion(props.getProperty(Jre.MIN_VERSION)); - _config.getJre().setMaxVersion(props.getProperty(Jre.MAX_VERSION)); - - String args = props.getProperty(Jre.ARGS); - - if (args != null) { - List jreOptions = new ArrayList(); - jreOptions.add(args); - _config.getJre().setOptions(jreOptions); - } - - _config.setCmdLine(props.getProperty(Config.JAR_ARGS)); - _config.setChdir("true".equals(props.getProperty(Config.CHDIR)) - ? "." : null); - _config.setStayAlive("true".equals(props.getProperty(Config.STAY_ALIVE))); - _config.setErrTitle(props.getProperty(Config.ERR_TITLE)); - _config.setIcon(props.getFile(Config.ICON)); - - File splashFile = props.getFile(Splash.SPLASH_FILE); - - if (splashFile != null) { - _config.setSplash(new Splash()); - _config.getSplash().setFile(splashFile); - String waitfor = props.getProperty("waitfor"); // 1.x - _config.getSplash().setWaitForWindow(waitfor != null - && !waitfor.equals("")); - String splashTimeout = props.getProperty(Splash.TIMEOUT); - if (splashTimeout != null) { - _config.getSplash().setTimeout(Integer.parseInt(splashTimeout)); - } - _config.getSplash().setTimeoutErr("true".equals( - props.getProperty(Splash.TIMEOUT_ERR))); - } else { - _config.setSplash(null); - } - setConfigPath(f); - } catch (IOException e) { - throw new ConfigPersisterException(e); - } - } - - public void save(File f) throws ConfigPersisterException { - try { - BufferedWriter w = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(f), "UTF-8")); - w.write("\n"); - _xstream.toXML(_config, w); - w.close(); - setConfigPath(f); - } catch (Exception e) { - throw new ConfigPersisterException(e); - } - } - - /** - * Converts 2.x config to current format. - */ - private String convertToCurrent(String configString) { - return configString - .replaceAll("0<", "gui<") - .replaceAll("1<", "console<") - .replaceAll("jarArgs>", "cmdLine>") - .replaceAll("", "") - .replaceAll("args>", "opt>") - .replaceAll("", "") - .replaceAll("false", - "" + Jre.JDK_PREFERENCE_PREFER_JRE + "") - .replaceAll("true", - "" + Jre.JDK_PREFERENCE_JRE_ONLY + "") - .replaceAll("0", "") - .replaceAll("0", "") - .replaceAll(".*", ""); - } - - private void setConfigPath(File configFile) { - _configPath = configFile.getAbsoluteFile().getParentFile(); - } - - private class Props { - final Properties _properties = new Properties(); - - public Props(File f) throws IOException { - FileInputStream is = null; - try { - is = new FileInputStream(f); - _properties.load(is); - } finally { - Util.close(is); - } - } - - /** - * Get property and remove trailing # comments. - */ - public String getProperty(String key) { - String p = _properties.getProperty(key); - - if (p == null) { - return null; - } - - int x = p.indexOf('#'); - - if (x == -1) { - return p; - } - - do { - x--; - } while (x > 0 && (p.charAt(x) == ' ' || p.charAt(x) == '\t')); - - return (x == 0) ? "" : p.substring(0, x + 1); - } - - public File getFile(String key) { - String value = getProperty(key); - return value != null ? new File(value) : null; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 22, 2005 + */ +package net.sf.launch4j.config; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Collection; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSSerializer; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; +import com.thoughtworks.xstream.security.*; + +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2014 Grzegorz Kowal + */ +public class ConfigPersister { + + private static final ConfigPersister _instance = new ConfigPersister(); + + private final XStream _xstream; + private Config _config; + private File _configPath; + + private ConfigPersister() { + _xstream = new XStream(new DomDriver()); + + _xstream.addPermission(NoTypePermission.NONE); + _xstream.addPermission(NullPermission.NULL); + _xstream.addPermission(PrimitiveTypePermission.PRIMITIVES); + _xstream.allowTypeHierarchy(Collection.class); + _xstream.allowTypesByWildcard(new String[] { "net.sf.launch4j.config.*" }); + + _xstream.alias("launch4jConfig", Config.class); + _xstream.alias("classPath", ClassPath.class); + _xstream.alias("jre", Jre.class); + _xstream.alias("splash", Splash.class); + _xstream.alias("versionInfo", VersionInfo.class); + + _xstream.addImplicitCollection(Config.class, "headerObjects", "obj", + String.class); + _xstream.addImplicitCollection(Config.class, "libs", "lib", String.class); + _xstream.addImplicitCollection(Config.class, "variables", "var", String.class); + _xstream.addImplicitCollection(ClassPath.class, "paths", "cp", String.class); + _xstream.addImplicitCollection(Jre.class, "options", "opt", String.class); + } + + public static ConfigPersister getInstance() { + return _instance; + } + + public Config getConfig() { + return _config; + } + + public File getConfigPath() { + return _configPath; + } + + public File getOutputPath() throws IOException { + if (_config.getOutfile().isAbsolute()) { + return _config.getOutfile().getParentFile(); + } + File parent = _config.getOutfile().getParentFile(); + return (parent != null) ? new File(_configPath, parent.getPath()) : _configPath; + } + + public File getOutputFile() throws IOException { + return _config.getOutfile().isAbsolute() + ? _config.getOutfile() + : new File(getOutputPath(), _config.getOutfile().getName()); + } + + public void createBlank() { + _config = new Config(); + _config.setJre(new Jre()); + _configPath = null; + } + + public void setAntConfig(Config c, File basedir) { + _config = c; + _configPath = basedir; + } + + public void load(File f) throws ConfigPersisterException { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(f); + + DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation(); + LSSerializer lsSerializer = domImplementation.createLSSerializer(); + String configString = lsSerializer.writeToString(doc); + + _config = convertToCurrent(configString); + setConfigPath(f); + } catch (Exception e) { + throw new ConfigPersisterException(e); + } + } + + + public void save(File f) throws ConfigPersisterException { + try { + BufferedWriter w = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(f), "UTF-8")); + w.write("\n"); + _xstream.toXML(_config, w); + w.close(); + setConfigPath(f); + } catch (Exception e) { + throw new ConfigPersisterException(e); + } + } + + /** + * Converts 2.x config to current format. + */ + private Config convertToCurrent(String configString) { + boolean requires64Bit = configString.contains("true") + || configString.contains("64"); + + String updatedConfigString = configString + .replaceAll("0<", "gui<") + .replaceAll("1<", "console<") + .replaceAll("jarArgs>", "cmdLine>") + .replaceAll("", "") + .replaceAll("args>", "opt>") + .replaceAll("", "") + .replaceAll("jdkOnly", "true") + .replaceAll("0", "") + .replaceAll("0", "") + .replaceAll(".*", "") + .replaceAll(".*", "") + .replaceAll(".*", "") + .replaceAll(".*", "") + .replaceAll(".*", ""); + + Config config = (Config) _xstream.fromXML(updatedConfigString); + + if (Validator.isEmpty(config.getJre().getPath())) { + config.getJre().setPath(Jre.DEFAULT_PATH); + } + + if (requires64Bit) { + config.getJre().setRequires64Bit(true); + } + + return config; + } + + private void setConfigPath(File configFile) { + _configPath = configFile.getAbsoluteFile().getParentFile(); + } +} diff --git a/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java b/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java index 8a055b2..729d4e5 100644 --- a/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java +++ b/launch4j/src/net/sf/launch4j/config/ConfigPersisterException.java @@ -1,51 +1,51 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 22, 2005 - */ -package net.sf.launch4j.config; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ConfigPersisterException extends Exception { - - public ConfigPersisterException(String msg, Throwable t) { - super(msg, t); - } - - public ConfigPersisterException(Throwable t) { - super(t); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 22, 2005 + */ +package net.sf.launch4j.config; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ConfigPersisterException extends Exception { + + public ConfigPersisterException(String msg, Throwable t) { + super(msg, t); + } + + public ConfigPersisterException(Throwable t) { + super(t); + } +} diff --git a/launch4j/src/net/sf/launch4j/config/Describable.java b/launch4j/src/net/sf/launch4j/config/Describable.java index f98a7a5..c9f9c6b 100644 --- a/launch4j/src/net/sf/launch4j/config/Describable.java +++ b/launch4j/src/net/sf/launch4j/config/Describable.java @@ -1,18 +1,18 @@ -package net.sf.launch4j.config; - -import java.util.Comparator; - -public interface Describable { - - String getDescription(); - - int getIndex(); - - class DescribableComparator implements Comparator { - - @Override - public int compare(Describable o1, Describable o2) { - return o1.getDescription().compareTo(o2.getDescription()); - } - } -} +package net.sf.launch4j.config; + +import java.util.Comparator; + +public interface Describable { + + String getDescription(); + + int getIndex(); + + class DescribableComparator implements Comparator { + + @Override + public int compare(Describable o1, Describable o2) { + return o1.getDescription().compareTo(o2.getDescription()); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/config/Jre.java b/launch4j/src/net/sf/launch4j/config/Jre.java index cd91661..5586236 100644 --- a/launch4j/src/net/sf/launch4j/config/Jre.java +++ b/launch4j/src/net/sf/launch4j/config/Jre.java @@ -1,292 +1,194 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j.config; - -import java.util.Arrays; -import java.util.List; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Jre implements IValidatable { - - // 1.x config properties_____________________________________________________________ - public static final String PATH = "jrepath"; - public static final String MIN_VERSION = "javamin"; - public static final String MAX_VERSION = "javamax"; - public static final String ARGS = "jvmArgs"; - - // __________________________________________________________________________________ - public static final String VERSION_PATTERN = "(1\\.\\d\\.\\d(_\\d{1,3})?)|[1-9][0-9]{0,2}(\\.\\d{1,3}){0,2}"; - - public static final String JDK_PREFERENCE_JRE_ONLY = "jreOnly"; - public static final String JDK_PREFERENCE_PREFER_JRE = "preferJre"; - public static final String JDK_PREFERENCE_PREFER_JDK = "preferJdk"; - public static final String JDK_PREFERENCE_JDK_ONLY = "jdkOnly"; - - public static final String RUNTIME_BITS_64 = "64"; - public static final String RUNTIME_BITS_64_AND_32 = "64/32"; - public static final String RUNTIME_BITS_32_AND_64 = "32/64"; - public static final String RUNTIME_BITS_32 = "32"; - - private static final String[] JDK_PREFERENCE_NAMES = new String[] { - JDK_PREFERENCE_JRE_ONLY, - JDK_PREFERENCE_PREFER_JRE, - JDK_PREFERENCE_PREFER_JDK, - JDK_PREFERENCE_JDK_ONLY }; - - private static final String[] RUNTIME_BITS_OPTIONS = new String[] { - RUNTIME_BITS_64, - RUNTIME_BITS_64_AND_32, - RUNTIME_BITS_32_AND_64, - RUNTIME_BITS_32 }; - - public static final int DEFAULT_JDK_PREFERENCE_INDEX - = Arrays.asList(JDK_PREFERENCE_NAMES).indexOf(JDK_PREFERENCE_PREFER_JRE); - - public static final int DEFAULT_RUNTIME_BITS_INDEX - = Arrays.asList(RUNTIME_BITS_OPTIONS).indexOf(RUNTIME_BITS_64_AND_32); - - private String path; - private boolean bundledJre64Bit; - private boolean bundledJreAsFallback; - private String minVersion; - private String maxVersion; - private String jdkPreference; - private String runtimeBits; - private Integer initialHeapSize; - private Integer initialHeapPercent; - private Integer maxHeapSize; - private Integer maxHeapPercent; - private List options; - - public void checkInvariants() { - Validator.checkOptString(minVersion, 20, VERSION_PATTERN, - "jre.minVersion", Messages.getString("Jre.min.version")); - Validator.checkOptString(maxVersion, 20, VERSION_PATTERN, - "jre.maxVersion", Messages.getString("Jre.max.version")); - if (Validator.isEmpty(path)) { - Validator.checkFalse(bundledJre64Bit, "jre.bundledJre64Bit", - Messages.getString("Jre.bundled.64bit.invalid")); - Validator.checkFalse(bundledJreAsFallback, "jre.bundledJreAsFallback", - Messages.getString("Jre.bundled.fallback.invalid")); - Validator.checkFalse(Validator.isEmpty(minVersion), - "jre.minVersion", Messages.getString("Jre.specify.jre.min.version.or.path")); - } else { - Validator.checkString(path, Validator.MAX_PATH, - "jre.path", Messages.getString("Jre.bundled.path")); - } - if (!Validator.isEmpty(maxVersion)) { - Validator.checkFalse(Validator.isEmpty(minVersion), - "jre.minVersion", Messages.getString("Jre.specify.min.version")); - Validator.checkTrue(JreVersion.parseString(minVersion).compareTo(JreVersion.parseString(maxVersion)) < 0, - "jre.maxVersion", Messages.getString("Jre.max.greater.than.min")); - } - Validator.checkTrue(initialHeapSize == null || maxHeapSize != null, - "jre.maxHeapSize", Messages.getString("Jre.initial.and.max.heap")); - Validator.checkTrue(initialHeapSize == null || initialHeapSize.intValue() > 0, - "jre.initialHeapSize", Messages.getString("Jre.initial.heap")); - Validator.checkTrue(maxHeapSize == null || (maxHeapSize.intValue() - >= ((initialHeapSize != null) ? initialHeapSize.intValue() : 1)), - "jre.maxHeapSize", Messages.getString("Jre.max.heap")); - Validator.checkTrue(initialHeapPercent == null || maxHeapPercent != null, - "jre.maxHeapPercent", Messages.getString("Jre.initial.and.max.heap")); - if (initialHeapPercent != null) { - Validator.checkRange(initialHeapPercent.intValue(), 1, 100, - "jre.initialHeapPercent", - Messages.getString("Jre.initial.heap.percent")); - } - if (maxHeapPercent != null) { - Validator.checkRange(maxHeapPercent.intValue(), - initialHeapPercent != null ? initialHeapPercent.intValue() : 1, 100, - "jre.maxHeapPercent", - Messages.getString("Jre.max.heap.percent")); - } - Validator.checkIn(getJdkPreference(), JDK_PREFERENCE_NAMES, - "jre.jdkPreference", Messages.getString("Jre.jdkPreference")); - Validator.checkIn(getRuntimeBits(), RUNTIME_BITS_OPTIONS, - "jre.runtimeBits", Messages.getString("Jre.runtimeBits")); - Validator.checkOptStrings(options, - Validator.MAX_ARGS, - Validator.MAX_ARGS, - "[^\"]*|([^\"]*\"[^\"]*\"[^\"]*)*", - "jre.options", - Messages.getString("Jre.jvm.options"), - Messages.getString("Jre.jvm.options.unclosed.quotation")); - - // Quoted variable references: "[^%]*|([^%]*\"([^%]*%[^%]+%[^%]*)+\"[^%]*)*" - Validator.checkOptStrings(options, - Validator.MAX_ARGS, - Validator.MAX_ARGS, - "[^%]*|([^%]*([^%]*%[^%]*%[^%]*)+[^%]*)*", - "jre.options", - Messages.getString("Jre.jvm.options"), - Messages.getString("Jre.jvm.options.variable")); - } - - /** JVM options */ - public List getOptions() { - return options; - } - - public void setOptions(List options) { - this.options = options; - } - - /** Max Java version (x.x.x) */ - public String getMaxVersion() { - return maxVersion; - } - - public void setMaxVersion(String maxVersion) { - this.maxVersion = maxVersion; - } - - /** Min Java version (x.x.x) */ - public String getMinVersion() { - return minVersion; - } - - public void setMinVersion(String minVersion) { - this.minVersion = minVersion; - } - - /** Preference for standalone JRE or JDK-private JRE */ - public String getJdkPreference() { - return Validator.isEmpty(jdkPreference) ? JDK_PREFERENCE_PREFER_JRE - : jdkPreference; - } - - public void setJdkPreference(String jdkPreference) { - this.jdkPreference = jdkPreference; - } - - /** Preference for standalone JRE or JDK-private JRE */ - public int getJdkPreferenceIndex() { - int x = Arrays.asList(JDK_PREFERENCE_NAMES).indexOf(getJdkPreference()); - return x != -1 ? x : DEFAULT_JDK_PREFERENCE_INDEX; - } - - public void setJdkPreferenceIndex(int x) { - this.jdkPreference = JDK_PREFERENCE_NAMES[x]; - } - - public String getRuntimeBits() { - return Validator.isEmpty(runtimeBits) ? RUNTIME_BITS_64_AND_32 - : runtimeBits; - } - - public void setRuntimeBits(String runtimeBits) { - this.runtimeBits = runtimeBits; - } - - public int getRuntimeBitsIndex() { - int x = Arrays.asList(RUNTIME_BITS_OPTIONS).indexOf(getRuntimeBits()); - return x != -1 ? x : DEFAULT_RUNTIME_BITS_INDEX; - } - - public void setRuntimeBitsIndex(int x) { - this.runtimeBits = RUNTIME_BITS_OPTIONS[x]; - } - - /** JRE path */ - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public boolean getBundledJre64Bit() { - return bundledJre64Bit; - } - - public void setBundledJre64Bit(boolean bundledJre64Bit) { - this.bundledJre64Bit = bundledJre64Bit; - } - - public boolean getBundledJreAsFallback() { - return bundledJreAsFallback; - } - - public void setBundledJreAsFallback(boolean bundledJreAsFallback) { - this.bundledJreAsFallback = bundledJreAsFallback; - } - - /** Initial heap size in MB */ - public Integer getInitialHeapSize() { - return initialHeapSize; - } - - public void setInitialHeapSize(Integer initialHeapSize) { - this.initialHeapSize = getInteger(initialHeapSize); - } - - /** Max heap size in MB */ - public Integer getMaxHeapSize() { - return maxHeapSize; - } - - public void setMaxHeapSize(Integer maxHeapSize) { - this.maxHeapSize = getInteger(maxHeapSize); - } - - public Integer getInitialHeapPercent() { - return initialHeapPercent; - } - - public void setInitialHeapPercent(Integer initialHeapPercent) { - this.initialHeapPercent = getInteger(initialHeapPercent); - } - - public Integer getMaxHeapPercent() { - return maxHeapPercent; - } - - public void setMaxHeapPercent(Integer maxHeapPercent) { - this.maxHeapPercent = getInteger(maxHeapPercent); - } - - /** Convert 0 to null */ - private Integer getInteger(Integer i) { - return i != null && i.intValue() == 0 ? null : i; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j.config; + +import java.util.List; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Jre implements IValidatable { + + public static final String VERSION_PATTERN = "(1\\.\\d\\.\\d(_\\d{1,3})?)|[1-9][0-9]{0,2}(\\.\\d{1,3}){0,2}"; + public static final String DEFAULT_PATH = "%JAVA_HOME%;%PATH%"; + + private String path; + private boolean requiresJdk; + private boolean requires64Bit; + private String minVersion; + private String maxVersion; + private Integer initialHeapSize; + private Integer initialHeapPercent; + private Integer maxHeapSize; + private Integer maxHeapPercent; + private List options; + + public void checkInvariants() { + Validator.checkOptString(minVersion, 20, VERSION_PATTERN, "jre.minVersion", + Messages.getString("Jre.min.version")); + Validator.checkOptString(maxVersion, 20, VERSION_PATTERN, "jre.maxVersion", + Messages.getString("Jre.max.version")); + Validator.checkString(path, Validator.MAX_PATH, "jre.path", Messages.getString("Jre.path")); + if (!Validator.isEmpty(maxVersion)) { + Validator.checkFalse(Validator.isEmpty(minVersion), "jre.minVersion", + Messages.getString("Jre.specify.min.version")); + Validator.checkTrue(JreVersion.parseString(minVersion).compareTo(JreVersion.parseString(maxVersion)) < 0, + "jre.maxVersion", Messages.getString("Jre.max.greater.than.min")); + } + Validator.checkTrue(initialHeapSize == null || maxHeapSize != null, "jre.maxHeapSize", + Messages.getString("Jre.initial.and.max.heap")); + Validator.checkTrue(initialHeapSize == null || initialHeapSize.intValue() > 0, "jre.initialHeapSize", + Messages.getString("Jre.initial.heap")); + Validator.checkTrue( + maxHeapSize == null + || (maxHeapSize.intValue() >= ((initialHeapSize != null) ? initialHeapSize.intValue() : 1)), + "jre.maxHeapSize", Messages.getString("Jre.max.heap")); + Validator.checkTrue(initialHeapPercent == null || maxHeapPercent != null, "jre.maxHeapPercent", + Messages.getString("Jre.initial.and.max.heap")); + if (initialHeapPercent != null) { + Validator.checkRange(initialHeapPercent.intValue(), 1, 100, "jre.initialHeapPercent", + Messages.getString("Jre.initial.heap.percent")); + } + if (maxHeapPercent != null) { + Validator.checkRange(maxHeapPercent.intValue(), + initialHeapPercent != null ? initialHeapPercent.intValue() : 1, 100, "jre.maxHeapPercent", + Messages.getString("Jre.max.heap.percent")); + } + Validator.checkOptStrings(options, Validator.MAX_ARGS, Validator.MAX_ARGS, "[^\"]*|([^\"]*\"[^\"]*\"[^\"]*)*", + "jre.options", Messages.getString("Jre.jvm.options"), + Messages.getString("Jre.jvm.options.unclosed.quotation")); + + // Quoted variable references: "[^%]*|([^%]*\"([^%]*%[^%]+%[^%]*)+\"[^%]*)*" + Validator.checkOptStrings(options, Validator.MAX_ARGS, Validator.MAX_ARGS, + "[^%]*|([^%]*([^%]*%[^%]*%[^%]*)+[^%]*)*", "jre.options", Messages.getString("Jre.jvm.options"), + Messages.getString("Jre.jvm.options.variable")); + } + + /** JVM options */ + public List getOptions() { + return options; + } + + public void setOptions(List options) { + this.options = options; + } + + /** Max Java version (x.x.x) */ + public String getMaxVersion() { + return maxVersion; + } + + public void setMaxVersion(String maxVersion) { + this.maxVersion = maxVersion; + } + + /** Min Java version (x.x.x) */ + public String getMinVersion() { + return minVersion; + } + + public void setMinVersion(String minVersion) { + this.minVersion = minVersion; + } + + public boolean getRequiresJdk() { + return this.requiresJdk; + } + + public void setRequiresJdk(boolean requiresJdk) { + this.requiresJdk = requiresJdk; + } + + /** JRE path */ + public String getPath() { + return this.path; + } + + public void setPath(String path) { + this.path = path; + } + + public boolean getRequires64Bit() { + return requires64Bit; + } + + public void setRequires64Bit(boolean requires64Bit) { + this.requires64Bit= requires64Bit; + } + + /** Initial heap size in MB */ + public Integer getInitialHeapSize() { + return initialHeapSize; + } + + public void setInitialHeapSize(Integer initialHeapSize) { + this.initialHeapSize = getInteger(initialHeapSize); + } + + /** Max heap size in MB */ + public Integer getMaxHeapSize() { + return maxHeapSize; + } + + public void setMaxHeapSize(Integer maxHeapSize) { + this.maxHeapSize = getInteger(maxHeapSize); + } + + public Integer getInitialHeapPercent() { + return initialHeapPercent; + } + + public void setInitialHeapPercent(Integer initialHeapPercent) { + this.initialHeapPercent = getInteger(initialHeapPercent); + } + + public Integer getMaxHeapPercent() { + return maxHeapPercent; + } + + public void setMaxHeapPercent(Integer maxHeapPercent) { + this.maxHeapPercent = getInteger(maxHeapPercent); + } + + /** Convert 0 to null */ + private Integer getInteger(Integer i) { + return i != null && i.intValue() == 0 ? null : i; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/JreVersion.java b/launch4j/src/net/sf/launch4j/config/JreVersion.java index 185257e..83b90f5 100644 --- a/launch4j/src/net/sf/launch4j/config/JreVersion.java +++ b/launch4j/src/net/sf/launch4j/config/JreVersion.java @@ -1,124 +1,124 @@ -package net.sf.launch4j.config; - -/** - * This class will abstract application from JRE versioning schema and provide - * comparing capabilities - * - * @author sergeyk - * - */ -public class JreVersion implements Comparable { - private int x1; - private int x2; - private int x3; - private int x4; - - public static JreVersion parseString(String versionStr) { - JreVersion ret = new JreVersion(); - if (versionStr == null || versionStr.trim().length() == 0) { - return ret; - } - if (!versionStr.matches(Jre.VERSION_PATTERN)) { - // NOTE: This is actually shouldn't happen because version format had to be - // checked by Jre#checkInvariants BEFORE calling this method - throw new IllegalArgumentException("JRE version is not in a right format."); - } - - String[] parts = versionStr.split("[\\._]"); - int first = Integer.parseInt(parts[0]); - if (first > 1) { - // java 9+ version schema - ret.x1 = 1; - ret.x2 = first; - if (parts.length >= 2) { - ret.x3 = Integer.parseInt(parts[1]); - if (parts.length >= 3) { - ret.x4 = Integer.parseInt(parts[2]); - } - } - } else { - // java <= 1.8 version schema - ret.x1 = first; - if (parts.length >= 2) { - ret.x2 = Integer.parseInt(parts[1]); - if (parts.length >= 3) { - ret.x3 = Integer.parseInt(parts[2]); - if (parts.length == 4) { - ret.x4 = Integer.parseInt(parts[3]); - } - } - } - } - - return ret; - } - - @Override - public String toString() { - if (x2 >= 9) { - return x2 + "." + x3 + "." + x4; - } - - return x1 + "." + x2 + "." + x3 + (x4 > 0 ? "_" + x4 : ""); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + x1; - result = prime * result + x2; - result = prime * result + x3; - result = prime * result + x4; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - JreVersion other = (JreVersion) obj; - if (x1 != other.x1) { - return false; - } - if (x2 != other.x2) { - return false; - } - if (x3 != other.x3) { - return false; - } - if (x4 != other.x4) { - return false; - } - return true; - } - - @Override - public int compareTo(JreVersion o) { - if (this.equals(o)) { - return 0; - } - - if (x1 != o.x1) { - return x1 - o.x1; - } - if (x2 != o.x2) { - return x2 - o.x2; - } - if (x3 != o.x3) { - return x3 - o.x3; - } - if (x4 != o.x4) { - return x4 - o.x4; - } - - throw new IllegalStateException("If you see this exception it means JreVersion::equals() method is buggy"); - } -} +package net.sf.launch4j.config; + +/** + * This class will abstract application from JRE versioning schema and provide + * comparing capabilities + * + * @author sergeyk + * + */ +public class JreVersion implements Comparable { + private int x1; + private int x2; + private int x3; + private int x4; + + public static JreVersion parseString(String versionStr) { + JreVersion ret = new JreVersion(); + if (versionStr == null || versionStr.trim().length() == 0) { + return ret; + } + if (!versionStr.matches(Jre.VERSION_PATTERN)) { + // NOTE: This is actually shouldn't happen because version format had to be + // checked by Jre#checkInvariants BEFORE calling this method + throw new IllegalArgumentException("JRE version is not in a right format."); + } + + String[] parts = versionStr.split("[\\._]"); + int first = Integer.parseInt(parts[0]); + if (first > 1) { + // java 9+ version schema + ret.x1 = 1; + ret.x2 = first; + if (parts.length >= 2) { + ret.x3 = Integer.parseInt(parts[1]); + if (parts.length >= 3) { + ret.x4 = Integer.parseInt(parts[2]); + } + } + } else { + // java <= 1.8 version schema + ret.x1 = first; + if (parts.length >= 2) { + ret.x2 = Integer.parseInt(parts[1]); + if (parts.length >= 3) { + ret.x3 = Integer.parseInt(parts[2]); + if (parts.length == 4) { + ret.x4 = Integer.parseInt(parts[3]); + } + } + } + } + + return ret; + } + + @Override + public String toString() { + if (x2 >= 9) { + return x2 + "." + x3 + "." + x4; + } + + return x1 + "." + x2 + "." + x3 + (x4 > 0 ? "_" + x4 : ""); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + x1; + result = prime * result + x2; + result = prime * result + x3; + result = prime * result + x4; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + JreVersion other = (JreVersion) obj; + if (x1 != other.x1) { + return false; + } + if (x2 != other.x2) { + return false; + } + if (x3 != other.x3) { + return false; + } + if (x4 != other.x4) { + return false; + } + return true; + } + + @Override + public int compareTo(JreVersion o) { + if (this.equals(o)) { + return 0; + } + + if (x1 != o.x1) { + return x1 - o.x1; + } + if (x2 != o.x2) { + return x2 - o.x2; + } + if (x3 != o.x3) { + return x3 - o.x3; + } + if (x4 != o.x4) { + return x4 - o.x4; + } + + throw new IllegalStateException("If you see this exception it means JreVersion::equals() method is buggy"); + } +} diff --git a/launch4j/src/net/sf/launch4j/config/LanguageID.java b/launch4j/src/net/sf/launch4j/config/LanguageID.java index 9648a48..b19fe36 100644 --- a/launch4j/src/net/sf/launch4j/config/LanguageID.java +++ b/launch4j/src/net/sf/launch4j/config/LanguageID.java @@ -1,132 +1,132 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2015 Sebastian Bögl - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.config; - -import java.util.Arrays; - -/** - * @see VERSIONINFO resource - * @see VarFileInfo BLOCK - */ -public enum LanguageID implements Describable { - ALBANIAN(0x041C, Messages.getString("Language.albanian")), - ARABIC(0x0401, Messages.getString("Language.arabic")), - BAHASA(0x0421, Messages.getString("Language.bahasa")), - DUTCH_BELGIAN(0x0813, Messages.getString("Language.belgian.dutch")), - FRENCH_BELGIAN(0x080C, Messages.getString("Language.belgian.french")), - BULGARIAN(0x0402, Messages.getString("Language.bulgarian")), - FRENCH_CANADIAN(0x0C0C, Messages.getString("Language.canadian.french")), - CASTILIAN_SPANISH(0x040A, Messages.getString("Language.spanish.castilian")), - CATALAN(0x0403, Messages.getString("Language.catalan")), - CROATO_SERBIAN_LATIN(0x041A, Messages.getString("Language.croato.serbian.latin")), - CZECH(0x0405, Messages.getString("Language.czech")), - DANISH(0x0406, Messages.getString("Language.danish")), - DUTCH(0x0413, Messages.getString("Language.dutch")), - ENGLISH_UK(0x0809, Messages.getString("Language.english.uk")), - ENGLISH_US(0x0409, Messages.getString("Language.english.us")), - FINNISH(0x040B, Messages.getString("Language.finnish")), - FRENCH(0x040C, Messages.getString("Language.french")), - GERMAN(0x0407, Messages.getString("Language.german")), - GREEK(0x0408, Messages.getString("Language.greek")), - HEBREW(0x040D, Messages.getString("Language.hebrew")), - HUNGARIAN(0x040E, Messages.getString("Language.hungarian")), - ICELANDIC(0x040F, Messages.getString("Language.icelandic")), - ITALIAN(0x0410, Messages.getString("Language.italian")), - JAPANESE(0x0411, Messages.getString("Language.japanese")), - KOREAN(0x0412, Messages.getString("Language.korean")), - NORWEGIAN_BOKMAL(0x0414, Messages.getString("Language.norwegian.bokmal")), - NORWEGIAN_NYNORSK(0x0814, Messages.getString("Language.norwegian.nynorsk")), - POLISH(0x0415, Messages.getString("Language.polish")), - PORTUGUESE_BRAZIL(0x0416, Messages.getString("Language.portuguese.brazil")), - PORTUGUESE_PORTUGAL(0x0816, Messages.getString("Language.portuguese.portugal")), - RHAETO_ROMANIC(0x0417, Messages.getString("Language.rhaeto.romanic")), - ROMANIAN(0x0418, Messages.getString("Language.romanian")), - RUSSIAN(0x0419, Messages.getString("Language.russian")), - SERBO_CROATIAN_CYRILLIC(0x081A, Messages.getString("Language.serbo.croatian.cyrillic")), - SIMPLIFIED_CHINESE(0x0804, Messages.getString("Language.chinese.simplified")), - SLOVAK(0x041B, Messages.getString("Language.slovak")), - SPANISH_MEXICO(0x080A, Messages.getString("Language.spanish.mexico")), - SWEDISH(0x041D, Messages.getString("Language.swedish")), - FRENCH_SWISS(0x100C, Messages.getString("Language.swiss.french")), - GERMAN_SWISS(0x0807, Messages.getString("Language.swiss.german")), - ITALIAN_SWISS(0x0810, Messages.getString("Language.swiss.italian")), - THAI(0x041E, Messages.getString("Language.thai")), - TRADITIONAL_CHINESE(0x0404, Messages.getString("Language.chinese.traditional")), - TURKISH(0x041F, Messages.getString("Language.turkish")), - URDU(0x0420, Messages.getString("Language.urdu")), - ; - - private static final LanguageID[] VALUES = LanguageID.values(); - - static { - Arrays.sort(VALUES, new DescribableComparator()); - } - - private final int id; - private final String description; - - LanguageID(int id, String description) { - this.id = id; - this.description = description; - } - - public int getId() { - return id; - } - - @Override - public String getDescription() { - return description; - } - - @Override - public String toString() { - return description; - } - - @Override - public int getIndex() { - for (int i = 0; i < VALUES.length; i++) { - if (VALUES[i] == this) { - return i; - } - } - // should never happen - return -1; - } - - public static LanguageID[] sortedValues() { - return VALUES; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2015 Sebastian Bögl + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.config; + +import java.util.Arrays; + +/** + * @see VERSIONINFO resource + * @see VarFileInfo BLOCK + */ +public enum LanguageID implements Describable { + ALBANIAN(0x041C, Messages.getString("Language.albanian")), + ARABIC(0x0401, Messages.getString("Language.arabic")), + BAHASA(0x0421, Messages.getString("Language.bahasa")), + DUTCH_BELGIAN(0x0813, Messages.getString("Language.belgian.dutch")), + FRENCH_BELGIAN(0x080C, Messages.getString("Language.belgian.french")), + BULGARIAN(0x0402, Messages.getString("Language.bulgarian")), + FRENCH_CANADIAN(0x0C0C, Messages.getString("Language.canadian.french")), + CASTILIAN_SPANISH(0x040A, Messages.getString("Language.spanish.castilian")), + CATALAN(0x0403, Messages.getString("Language.catalan")), + CROATO_SERBIAN_LATIN(0x041A, Messages.getString("Language.croato.serbian.latin")), + CZECH(0x0405, Messages.getString("Language.czech")), + DANISH(0x0406, Messages.getString("Language.danish")), + DUTCH(0x0413, Messages.getString("Language.dutch")), + ENGLISH_UK(0x0809, Messages.getString("Language.english.uk")), + ENGLISH_US(0x0409, Messages.getString("Language.english.us")), + FINNISH(0x040B, Messages.getString("Language.finnish")), + FRENCH(0x040C, Messages.getString("Language.french")), + GERMAN(0x0407, Messages.getString("Language.german")), + GREEK(0x0408, Messages.getString("Language.greek")), + HEBREW(0x040D, Messages.getString("Language.hebrew")), + HUNGARIAN(0x040E, Messages.getString("Language.hungarian")), + ICELANDIC(0x040F, Messages.getString("Language.icelandic")), + ITALIAN(0x0410, Messages.getString("Language.italian")), + JAPANESE(0x0411, Messages.getString("Language.japanese")), + KOREAN(0x0412, Messages.getString("Language.korean")), + NORWEGIAN_BOKMAL(0x0414, Messages.getString("Language.norwegian.bokmal")), + NORWEGIAN_NYNORSK(0x0814, Messages.getString("Language.norwegian.nynorsk")), + POLISH(0x0415, Messages.getString("Language.polish")), + PORTUGUESE_BRAZIL(0x0416, Messages.getString("Language.portuguese.brazil")), + PORTUGUESE_PORTUGAL(0x0816, Messages.getString("Language.portuguese.portugal")), + RHAETO_ROMANIC(0x0417, Messages.getString("Language.rhaeto.romanic")), + ROMANIAN(0x0418, Messages.getString("Language.romanian")), + RUSSIAN(0x0419, Messages.getString("Language.russian")), + SERBO_CROATIAN_CYRILLIC(0x081A, Messages.getString("Language.serbo.croatian.cyrillic")), + SIMPLIFIED_CHINESE(0x0804, Messages.getString("Language.chinese.simplified")), + SLOVAK(0x041B, Messages.getString("Language.slovak")), + SPANISH_MEXICO(0x080A, Messages.getString("Language.spanish.mexico")), + SWEDISH(0x041D, Messages.getString("Language.swedish")), + FRENCH_SWISS(0x100C, Messages.getString("Language.swiss.french")), + GERMAN_SWISS(0x0807, Messages.getString("Language.swiss.german")), + ITALIAN_SWISS(0x0810, Messages.getString("Language.swiss.italian")), + THAI(0x041E, Messages.getString("Language.thai")), + TRADITIONAL_CHINESE(0x0404, Messages.getString("Language.chinese.traditional")), + TURKISH(0x041F, Messages.getString("Language.turkish")), + URDU(0x0420, Messages.getString("Language.urdu")), + ; + + private static final LanguageID[] VALUES = LanguageID.values(); + + static { + Arrays.sort(VALUES, new DescribableComparator()); + } + + private final int id; + private final String description; + + LanguageID(int id, String description) { + this.id = id; + this.description = description; + } + + public int getId() { + return id; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public String toString() { + return description; + } + + @Override + public int getIndex() { + for (int i = 0; i < VALUES.length; i++) { + if (VALUES[i] == this) { + return i; + } + } + // should never happen + return -1; + } + + public static LanguageID[] sortedValues() { + return VALUES; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/LdDefaults.java b/launch4j/src/net/sf/launch4j/config/LdDefaults.java index 4cb1387..183a78f 100644 --- a/launch4j/src/net/sf/launch4j/config/LdDefaults.java +++ b/launch4j/src/net/sf/launch4j/config/LdDefaults.java @@ -1,117 +1,108 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Sep 3, 2005 - */ -package net.sf.launch4j.config; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class LdDefaults { - private static final List GUI_OBJECTS = Arrays.asList(new String[] { - "w32api/crt2.o", - "head/guihead.o", - "head/head.o" }); - - private static final List CONSOLE_OBJECTS = Arrays.asList(new String[] { - "w32api/crt2.o", - "head/consolehead.o", - "head/head.o" }); - - private static final List JNI_GUI_32_OBJECTS = Arrays.asList(new String[] { - "w32api_jni/crt2.o", - "head_jni_BETA/jniguihead.o", - "head_jni_BETA/head.o", - "head_jni_BETA/jnihead.o" }); - - private static final List JNI_CONSOLE_32_OBJECTS = Arrays.asList(new String[] { - "w32api_jni/crt2.o", - "head_jni_BETA/jniconsolehead.o", - "head_jni_BETA/head.o", - "head_jni_BETA/jnihead.o" }); - - private static final List> HEADER_OBJECTS; - - private static final List LIBS = Arrays.asList(new String[] { - "w32api/libmingw32.a", - "w32api/libgcc.a", - "w32api/libmsvcrt.a", - "w32api/libkernel32.a", - "w32api/libuser32.a", - "w32api/libadvapi32.a", - "w32api/libshell32.a" }); - - private static final List JNI_LIBS = Arrays.asList(new String[] { - "w32api_jni/libmingw32.a", - "w32api_jni/libmingwex.a", - "w32api_jni/libgcc.a", - "w32api_jni/libmsvcrt.a", - "w32api_jni/libmoldname.a", - "w32api_jni/libkernel32.a", - "w32api_jni/libuser32.a", - "w32api_jni/libadvapi32.a", - "w32api_jni/libshell32.a" }); - - static { - HEADER_OBJECTS = new ArrayList>(); - HEADER_OBJECTS.add(GUI_OBJECTS); - HEADER_OBJECTS.add(CONSOLE_OBJECTS); - HEADER_OBJECTS.add(JNI_GUI_32_OBJECTS); - HEADER_OBJECTS.add(JNI_CONSOLE_32_OBJECTS); - } - - public static List getHeaderObjects(int headerTypeIndex) { - if (headerTypeIndex < 0 || headerTypeIndex > 3) { - throw new IllegalArgumentException("headerTypeIndex is out of range: " + headerTypeIndex); - } - - return HEADER_OBJECTS.get(headerTypeIndex); - } - - public static List getLibs(String headerType) { - if (Config.GUI_HEADER.equals(headerType) - || Config.CONSOLE_HEADER.equals(headerType)) { - return LIBS; - } - - if (Config.JNI_GUI_HEADER_32.equals(headerType) - || Config.JNI_CONSOLE_HEADER_32.equals(headerType)) { - return JNI_LIBS; - } - - throw new IllegalArgumentException("Unknown headerType: " + headerType); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Sep 3, 2005 + */ +package net.sf.launch4j.config; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class LdDefaults { + private static final List GUI_OBJECTS = Arrays.asList(new String[] { + "w32api/crt2.o", + "head/guihead.o", + "head/head.o" }); + + private static final List CONSOLE_OBJECTS = Arrays.asList(new String[] { + "w32api/crt2.o", + "head/consolehead.o", + "head/head.o" }); + + private static final List JNI_GUI_32_OBJECTS = Arrays.asList(new String[] { + "w32api/crt2.o", + "head_jni_BETA/jniguihead.o", + "head_jni_BETA/head.o", + "head_jni_BETA/jnihead.o" }); + + private static final List JNI_CONSOLE_32_OBJECTS = Arrays.asList(new String[] { + "w32api/crt2.o", + "head_jni_BETA/jniconsolehead.o", + "head_jni_BETA/head.o", + "head_jni_BETA/jnihead.o" }); + + private static final List> HEADER_OBJECTS; + + private static final List LIBS = Arrays.asList(new String[] { + "w32api/libmingw32.a", + "w32api/libmingwex.a", + "w32api/libgcc.a", + "w32api/libmsvcrt.a", + "w32api/libmoldname.a", + "w32api/libkernel32.a", + "w32api/libuser32.a", + "w32api/libadvapi32.a", + "w32api/libshell32.a" }); + + static { + HEADER_OBJECTS = new ArrayList>(); + HEADER_OBJECTS.add(GUI_OBJECTS); + HEADER_OBJECTS.add(CONSOLE_OBJECTS); + HEADER_OBJECTS.add(JNI_GUI_32_OBJECTS); + HEADER_OBJECTS.add(JNI_CONSOLE_32_OBJECTS); + } + + public static List getHeaderObjects(int headerTypeIndex) { + if (headerTypeIndex < 0 || headerTypeIndex > 3) { + throw new IllegalArgumentException("headerTypeIndex is out of range: " + headerTypeIndex); + } + + return HEADER_OBJECTS.get(headerTypeIndex); + } + + public static List getLibs(String headerType) { + if (Config.GUI_HEADER.equals(headerType) + || Config.CONSOLE_HEADER.equals(headerType)) { + return LIBS; + } + + if (Config.JNI_GUI_HEADER_32.equals(headerType) + || Config.JNI_CONSOLE_HEADER_32.equals(headerType)) { + return LIBS; + } + + throw new IllegalArgumentException("Unknown headerType: " + headerType); + } +} diff --git a/launch4j/src/net/sf/launch4j/config/Messages.java b/launch4j/src/net/sf/launch4j/config/Messages.java index c0f0b9d..2d3f0a7 100644 --- a/launch4j/src/net/sf/launch4j/config/Messages.java +++ b/launch4j/src/net/sf/launch4j/config/Messages.java @@ -1,78 +1,78 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.config; - -import java.text.MessageFormat; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.config.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - private static final MessageFormat FORMATTER = new MessageFormat(""); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } - - public static String getString(String key, String arg0) { - return getString(key, new Object[] {arg0}); - } - - public static String getString(String key, String arg0, String arg1) { - return getString(key, new Object[] {arg0, arg1}); - } - - public static String getString(String key, String arg0, String arg1, String arg2) { - return getString(key, new Object[] {arg0, arg1, arg2}); - } - - public static String getString(String key, Object[] args) { - try { - FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); - return FORMATTER.format(args); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.config; + +import java.text.MessageFormat; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.config.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + private static final MessageFormat FORMATTER = new MessageFormat(""); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } + + public static String getString(String key, String arg0) { + return getString(key, new Object[] {arg0}); + } + + public static String getString(String key, String arg0, String arg1) { + return getString(key, new Object[] {arg0, arg1}); + } + + public static String getString(String key, String arg0, String arg1, String arg2) { + return getString(key, new Object[] {arg0, arg1, arg2}); + } + + public static String getString(String key, Object[] args) { + try { + FORMATTER.applyPattern(RESOURCE_BUNDLE.getString(key)); + return FORMATTER.format(args); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/launch4j/src/net/sf/launch4j/config/Msg.java b/launch4j/src/net/sf/launch4j/config/Msg.java index a5d5fe5..1dc91cb 100644 --- a/launch4j/src/net/sf/launch4j/config/Msg.java +++ b/launch4j/src/net/sf/launch4j/config/Msg.java @@ -1,111 +1,110 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Oct 8, 2006 - */ -package net.sf.launch4j.config; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class Msg implements IValidatable { - private String startupErr; - private String bundledJreErr; - private String jreVersionErr; - private String launcherErr; - private String instanceAlreadyExistsMsg; - - public void checkInvariants() { - Validator.checkOptString(startupErr, 1024, "startupErr", - Messages.getString("Msg.startupErr")); - Validator.checkOptString(bundledJreErr, 1024, "bundledJreErr", - Messages.getString("Msg.bundledJreErr")); - Validator.checkOptString(jreVersionErr, 1024, "jreVersionErr", - Messages.getString("Msg.jreVersionErr")); - Validator.checkOptString(launcherErr, 1024, "launcherErr", - Messages.getString("Msg.launcherErr")); - Validator.checkOptString(instanceAlreadyExistsMsg, 1024, "instanceAlreadyExistsMsg", - Messages.getString("Msg.instanceAlreadyExistsMsg")); - } - - public String getStartupErr() { - return !Validator.isEmpty(startupErr) ? startupErr - : "An error occurred while starting the application."; - } - - public void setStartupErr(String startupErr) { - this.startupErr = startupErr; - } - - public String getBundledJreErr() { - return !Validator.isEmpty(bundledJreErr) ? bundledJreErr - : "This application was configured to use a bundled Java Runtime" + - " Environment but the runtime is missing or corrupted."; - } - - public void setBundledJreErr(String bundledJreErr) { - this.bundledJreErr = bundledJreErr; - } - - public String getJreVersionErr() { - return !Validator.isEmpty(jreVersionErr) ? jreVersionErr - : "This application requires a Java Runtime Environment"; - } - - public void setJreVersionErr(String jreVersionErr) { - this.jreVersionErr = jreVersionErr; - } - - public String getLauncherErr() { - return !Validator.isEmpty(launcherErr) ? launcherErr - : "The registry refers to a nonexistent Java Runtime Environment" + - " installation or the runtime is corrupted."; - } - - public void setLauncherErr(String launcherErr) { - this.launcherErr = launcherErr; - } - - public String getInstanceAlreadyExistsMsg() { - return !Validator.isEmpty(instanceAlreadyExistsMsg) ? instanceAlreadyExistsMsg - : "An application instance is already running."; - } - - public void setInstanceAlreadyExistsMsg(String instanceAlreadyExistsMsg) { - this.instanceAlreadyExistsMsg = instanceAlreadyExistsMsg; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Oct 8, 2006 + */ +package net.sf.launch4j.config; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class Msg implements IValidatable { + private String startupErr; + private String jreNotFoundErr; + private String jreVersionErr; + private String launcherErr; + private String instanceAlreadyExistsMsg; + + public void checkInvariants() { + Validator.checkOptString(startupErr, 1024, "startupErr", + Messages.getString("Msg.startupErr")); + Validator.checkOptString(jreNotFoundErr, 1024, "jreNotFoundErr", + Messages.getString("Msg.jreNotFoundErr")); + Validator.checkOptString(jreVersionErr, 1024, "jreVersionErr", + Messages.getString("Msg.jreVersionErr")); + Validator.checkOptString(launcherErr, 1024, "launcherErr", + Messages.getString("Msg.launcherErr")); + Validator.checkOptString(instanceAlreadyExistsMsg, 1024, "instanceAlreadyExistsMsg", + Messages.getString("Msg.instanceAlreadyExistsMsg")); + } + + public String getStartupErr() { + return !Validator.isEmpty(startupErr) ? startupErr + : "An error occurred while starting the application."; + } + + public void setStartupErr(String startupErr) { + this.startupErr = startupErr; + } + + public String getJreNotFoundErr() { + return !Validator.isEmpty(jreNotFoundErr) ? jreNotFoundErr + : "This application requires a Java Runtime Environment."; + } + + public void setJreNotFoundErr(String jreNotFoundErr) { + this.jreNotFoundErr = jreNotFoundErr; + } + + public String getJreVersionErr() { + return !Validator.isEmpty(jreVersionErr) ? jreVersionErr + : "This application requires a Java Runtime Environment"; + } + + public void setJreVersionErr(String jreVersionErr) { + this.jreVersionErr = jreVersionErr; + } + + public String getLauncherErr() { + return !Validator.isEmpty(launcherErr) ? launcherErr + : "The registry refers to a nonexistent Java Runtime Environment" + + " installation or the runtime is corrupted."; + } + + public void setLauncherErr(String launcherErr) { + this.launcherErr = launcherErr; + } + + public String getInstanceAlreadyExistsMsg() { + return !Validator.isEmpty(instanceAlreadyExistsMsg) ? instanceAlreadyExistsMsg + : "An application instance is already running."; + } + + public void setInstanceAlreadyExistsMsg(String instanceAlreadyExistsMsg) { + this.instanceAlreadyExistsMsg = instanceAlreadyExistsMsg; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/SingleInstance.java b/launch4j/src/net/sf/launch4j/config/SingleInstance.java index d8fdd7a..b6abf9a 100644 --- a/launch4j/src/net/sf/launch4j/config/SingleInstance.java +++ b/launch4j/src/net/sf/launch4j/config/SingleInstance.java @@ -1,74 +1,74 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/** - * Created on 2007-09-16 - */ -package net.sf.launch4j.config; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2007 Grzegorz Kowal - */ -public class SingleInstance implements IValidatable { - - private String mutexName; - private String windowTitle; - - public void checkInvariants() { - Validator.checkString(mutexName, Validator.MAX_STR, - "singleInstance.mutexName", - Messages.getString("SingleInstance.mutexName")); - Validator.checkOptString(windowTitle, Validator.MAX_STR, - "singleInstance.windowTitle", - Messages.getString("SingleInstance.windowTitle")); - } - - public String getWindowTitle() { - return windowTitle; - } - - public void setWindowTitle(String appWindowName) { - this.windowTitle = appWindowName; - } - - public String getMutexName() { - return mutexName; - } - - public void setMutexName(String mutexName) { - this.mutexName = mutexName; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Created on 2007-09-16 + */ +package net.sf.launch4j.config; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2007 Grzegorz Kowal + */ +public class SingleInstance implements IValidatable { + + private String mutexName; + private String windowTitle; + + public void checkInvariants() { + Validator.checkString(mutexName, Validator.MAX_STR, + "singleInstance.mutexName", + Messages.getString("SingleInstance.mutexName")); + Validator.checkOptString(windowTitle, Validator.MAX_STR, + "singleInstance.windowTitle", + Messages.getString("SingleInstance.windowTitle")); + } + + public String getWindowTitle() { + return windowTitle; + } + + public void setWindowTitle(String appWindowName) { + this.windowTitle = appWindowName; + } + + public String getMutexName() { + return mutexName; + } + + public void setMutexName(String mutexName) { + this.mutexName = mutexName; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/Splash.java b/launch4j/src/net/sf/launch4j/config/Splash.java index 47f76d8..75cf3d3 100644 --- a/launch4j/src/net/sf/launch4j/config/Splash.java +++ b/launch4j/src/net/sf/launch4j/config/Splash.java @@ -1,103 +1,103 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Apr 21, 2005 - */ -package net.sf.launch4j.config; - -import java.io.File; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class Splash implements IValidatable { - - // 1.x config properties_____________________________________________________________ - public static final String SPLASH_FILE = "splash"; - public static final String WAIT_FOR_TITLE = "waitForTitle"; - public static final String TIMEOUT = "splashTimeout"; - public static final String TIMEOUT_ERR = "splashTimeoutErr"; - - // __________________________________________________________________________________ - private File file; - private boolean waitForWindow = true; - private int timeout = 60; - private boolean timeoutErr = true; - - public void checkInvariants() { - Validator.checkFile(file, "splash.file", - Messages.getString("Splash.splash.file")); - Validator.checkRange(timeout, 1, 60 * 15, "splash.timeout", - Messages.getString("Splash.splash.timeout")); - } - - /** Splash screen in BMP format. */ - public File getFile() { - return file; - } - - public void setFile(File file) { - this.file = file; - } - - /** Splash timeout in seconds. */ - public int getTimeout() { - return timeout; - } - - public void setTimeout(int timeout) { - this.timeout = timeout; - } - - /** Signal error on splash timeout. */ - public boolean isTimeoutErr() { - return timeoutErr; - } - - public void setTimeoutErr(boolean timeoutErr) { - this.timeoutErr = timeoutErr; - } - - /** Hide splash screen when the child process displayes the first window. */ - public boolean getWaitForWindow() { - return waitForWindow; - } - - public void setWaitForWindow(boolean waitForWindow) { - this.waitForWindow = waitForWindow; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Apr 21, 2005 + */ +package net.sf.launch4j.config; + +import java.io.File; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class Splash implements IValidatable { + + // 1.x config properties_____________________________________________________________ + public static final String SPLASH_FILE = "splash"; + public static final String WAIT_FOR_TITLE = "waitForTitle"; + public static final String TIMEOUT = "splashTimeout"; + public static final String TIMEOUT_ERR = "splashTimeoutErr"; + + // __________________________________________________________________________________ + private File file; + private boolean waitForWindow = true; + private int timeout = 60; + private boolean timeoutErr = true; + + public void checkInvariants() { + Validator.checkFile(file, "splash.file", + Messages.getString("Splash.splash.file")); + Validator.checkRange(timeout, 1, 60 * 15, "splash.timeout", + Messages.getString("Splash.splash.timeout")); + } + + /** Splash screen in BMP format. */ + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } + + /** Splash timeout in seconds. */ + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + /** Signal error on splash timeout. */ + public boolean isTimeoutErr() { + return timeoutErr; + } + + public void setTimeoutErr(boolean timeoutErr) { + this.timeoutErr = timeoutErr; + } + + /** Hide splash screen when the child process displayes the first window. */ + public boolean getWaitForWindow() { + return waitForWindow; + } + + public void setWaitForWindow(boolean waitForWindow) { + this.waitForWindow = waitForWindow; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/VersionInfo.java b/launch4j/src/net/sf/launch4j/config/VersionInfo.java index da7a2ca..367712c 100644 --- a/launch4j/src/net/sf/launch4j/config/VersionInfo.java +++ b/launch4j/src/net/sf/launch4j/config/VersionInfo.java @@ -1,197 +1,197 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 21, 2005 - */ -package net.sf.launch4j.config; - -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.binding.Validator; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class VersionInfo implements IValidatable { - public static final String VERSION_PATTERN = "(\\d+\\.){3}\\d+"; - public static final int DEFAULT_LANGUAGE_INDEX = LanguageID.ENGLISH_US.getIndex(); - - private String fileVersion; - private String txtFileVersion; - private String fileDescription; - private String copyright; - private String productVersion; - private String txtProductVersion; - private String productName; - private String companyName; - private String internalName; - private String originalFilename; - private String trademarks; - private LanguageID language; - - public void checkInvariants() { - Validator.checkString(fileVersion, 20, VERSION_PATTERN, - "versionInfo.fileVersion", - Messages.getString("VersionInfo.file.version")); - Validator.checkString(txtFileVersion, 50, "versionInfo.txtFileVersion", - Messages.getString("VersionInfo.txt.file.version")); - Validator.checkString(fileDescription, 150, "versionInfo.fileDescription", - Messages.getString("VersionInfo.file.description")); - Validator.checkString(copyright, 150, "versionInfo.copyright", - Messages.getString("VersionInfo.copyright")); - Validator.checkString(productVersion, 20, VERSION_PATTERN, - "versionInfo.productVersion", - Messages.getString("VersionInfo.product.version")); - Validator.checkString(txtProductVersion, 50, "versionInfo.txtProductVersion", - Messages.getString("VersionInfo.txt.product.version")); - Validator.checkString(productName, 150, "versionInfo.productName", - Messages.getString("VersionInfo.product.name")); - Validator.checkOptString(companyName, 150, "versionInfo.companyName", - Messages.getString("VersionInfo.company.name")); - Validator.checkString(internalName, 50, "versionInfo.internalName", - Messages.getString("VersionInfo.internal.name")); - Validator.checkOptString(trademarks, 150, "versionInfo.trademarks", - Messages.getString("VersionInfo.trademarks")); - Validator.checkTrue(!internalName.endsWith(".exe"), "versionInfo.internalName", - Messages.getString("VersionInfo.internal.name.not.exe")); - Validator.checkString(originalFilename, 50, "versionInfo.originalFilename", - Messages.getString("VersionInfo.original.filename")); - Validator.checkTrue(originalFilename.endsWith(".exe"), - "versionInfo.originalFilename", - Messages.getString("VersionInfo.original.filename.exe")); - } - - public String getCompanyName() { - return companyName; - } - - public void setCompanyName(String companyName) { - this.companyName = companyName; - } - - public String getCopyright() { - return copyright; - } - - public void setCopyright(String copyright) { - this.copyright = copyright; - } - - public String getFileDescription() { - return fileDescription; - } - - public void setFileDescription(String fileDescription) { - this.fileDescription = fileDescription; - } - - public String getFileVersion() { - return fileVersion; - } - - public void setFileVersion(String fileVersion) { - this.fileVersion = fileVersion; - } - - public String getInternalName() { - return internalName; - } - - public void setInternalName(String internalName) { - this.internalName = internalName; - } - - public String getOriginalFilename() { - return originalFilename; - } - - public void setOriginalFilename(String originalFilename) { - this.originalFilename = originalFilename; - } - - public String getProductName() { - return productName; - } - - public void setProductName(String productName) { - this.productName = productName; - } - - public String getProductVersion() { - return productVersion; - } - - public void setProductVersion(String productVersion) { - this.productVersion = productVersion; - } - - public String getTxtFileVersion() { - return txtFileVersion; - } - - public void setTxtFileVersion(String txtFileVersion) { - this.txtFileVersion = txtFileVersion; - } - - public String getTxtProductVersion() { - return txtProductVersion; - } - - public void setTxtProductVersion(String txtProductVersion) { - this.txtProductVersion = txtProductVersion; - } - - public String getTrademarks() { - return trademarks; - } - - public void setTrademarks(String trademarks) { - this.trademarks = trademarks; - } - - public LanguageID getLanguage() { - return (language == null) ? LanguageID.sortedValues()[DEFAULT_LANGUAGE_INDEX] : language; - } - - public void setLanguage(LanguageID language) { - this.language = language; - } - - public int getLanguageIndex() { - return (language == null) ? DEFAULT_LANGUAGE_INDEX : language.getIndex(); - } - - public void setLanguageIndex(int index) { - language = LanguageID.sortedValues()[index]; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 21, 2005 + */ +package net.sf.launch4j.config; + +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.binding.Validator; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class VersionInfo implements IValidatable { + public static final String VERSION_PATTERN = "(\\d+\\.){3}\\d+"; + public static final int DEFAULT_LANGUAGE_INDEX = LanguageID.ENGLISH_US.getIndex(); + + private String fileVersion; + private String txtFileVersion; + private String fileDescription; + private String copyright; + private String productVersion; + private String txtProductVersion; + private String productName; + private String companyName; + private String internalName; + private String originalFilename; + private String trademarks; + private LanguageID language; + + public void checkInvariants() { + Validator.checkString(fileVersion, 20, VERSION_PATTERN, + "versionInfo.fileVersion", + Messages.getString("VersionInfo.file.version")); + Validator.checkString(txtFileVersion, 50, "versionInfo.txtFileVersion", + Messages.getString("VersionInfo.txt.file.version")); + Validator.checkString(fileDescription, 150, "versionInfo.fileDescription", + Messages.getString("VersionInfo.file.description")); + Validator.checkString(copyright, 150, "versionInfo.copyright", + Messages.getString("VersionInfo.copyright")); + Validator.checkString(productVersion, 20, VERSION_PATTERN, + "versionInfo.productVersion", + Messages.getString("VersionInfo.product.version")); + Validator.checkString(txtProductVersion, 50, "versionInfo.txtProductVersion", + Messages.getString("VersionInfo.txt.product.version")); + Validator.checkString(productName, 150, "versionInfo.productName", + Messages.getString("VersionInfo.product.name")); + Validator.checkOptString(companyName, 150, "versionInfo.companyName", + Messages.getString("VersionInfo.company.name")); + Validator.checkString(internalName, 50, "versionInfo.internalName", + Messages.getString("VersionInfo.internal.name")); + Validator.checkOptString(trademarks, 150, "versionInfo.trademarks", + Messages.getString("VersionInfo.trademarks")); + Validator.checkTrue(!internalName.endsWith(".exe"), "versionInfo.internalName", + Messages.getString("VersionInfo.internal.name.not.exe")); + Validator.checkString(originalFilename, 50, "versionInfo.originalFilename", + Messages.getString("VersionInfo.original.filename")); + Validator.checkTrue(originalFilename.endsWith(".exe"), + "versionInfo.originalFilename", + Messages.getString("VersionInfo.original.filename.exe")); + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCopyright() { + return copyright; + } + + public void setCopyright(String copyright) { + this.copyright = copyright; + } + + public String getFileDescription() { + return fileDescription; + } + + public void setFileDescription(String fileDescription) { + this.fileDescription = fileDescription; + } + + public String getFileVersion() { + return fileVersion; + } + + public void setFileVersion(String fileVersion) { + this.fileVersion = fileVersion; + } + + public String getInternalName() { + return internalName; + } + + public void setInternalName(String internalName) { + this.internalName = internalName; + } + + public String getOriginalFilename() { + return originalFilename; + } + + public void setOriginalFilename(String originalFilename) { + this.originalFilename = originalFilename; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getProductVersion() { + return productVersion; + } + + public void setProductVersion(String productVersion) { + this.productVersion = productVersion; + } + + public String getTxtFileVersion() { + return txtFileVersion; + } + + public void setTxtFileVersion(String txtFileVersion) { + this.txtFileVersion = txtFileVersion; + } + + public String getTxtProductVersion() { + return txtProductVersion; + } + + public void setTxtProductVersion(String txtProductVersion) { + this.txtProductVersion = txtProductVersion; + } + + public String getTrademarks() { + return trademarks; + } + + public void setTrademarks(String trademarks) { + this.trademarks = trademarks; + } + + public LanguageID getLanguage() { + return (language == null) ? LanguageID.sortedValues()[DEFAULT_LANGUAGE_INDEX] : language; + } + + public void setLanguage(LanguageID language) { + this.language = language; + } + + public int getLanguageIndex() { + return (language == null) ? DEFAULT_LANGUAGE_INDEX : language.getIndex(); + } + + public void setLanguageIndex(int index) { + language = LanguageID.sortedValues()[index]; + } +} diff --git a/launch4j/src/net/sf/launch4j/config/messages.properties b/launch4j/src/net/sf/launch4j/config/messages.properties index b2eecc4..912944f 100644 --- a/launch4j/src/net/sf/launch4j/config/messages.properties +++ b/launch4j/src/net/sf/launch4j/config/messages.properties @@ -1,151 +1,147 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2015 Grzegorz Kowal -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -Splash.splash.file=Splash file -Splash.splash.timeout=Splash timeout - -Config.specify.output.exe=Specify output file with .exe extension. -Config.application.jar=Application jar -Config.application.jar.path=Specify runtime path of the jar relative to the executable. -Config.chdir.relative='chdir' must be a path relative to the executable. -Config.chdir.path='chdir' is now a path instead of a boolean, please check the docs. -Config.manifest=Manifest -Config.icon=Icon -Config.jar.arguments=Jar arguments -Config.error.title=Error title -Config.download.url=Download URL -Config.support.url=Support URL -Config.header.type=Header type -Config.splash.not.impl.by.console.hdr=Splash screen is not implemented by console header. -Config.variables=Environment variables -Config.variables.err=Environment variable assignment should have the form varname=[value][%varref%]... -Config.priority=Process priority - -ClassPath.mainClass=Main class -ClassPath.or.jar=Specify runtime path of a jar or the classpath. -ClassPath.path=Classpath - -VersionInfo.file.version=File version, should be 'x.x.x.x' -VersionInfo.txt.file.version=Free form file version -VersionInfo.file.description=File description -VersionInfo.copyright=Copyright -VersionInfo.product.version=Product version, should be 'x.x.x.x' -VersionInfo.txt.product.version=Free from product version -VersionInfo.product.name=Product name -VersionInfo.company.name=Company name -VersionInfo.trademarks=Trademarks -VersionInfo.internal.name=Internal name -VersionInfo.internal.name.not.exe=Internal name shouldn't have the .exe extension. -VersionInfo.original.filename=Original filename -VersionInfo.original.filename.exe=Original filename should end with the .exe extension. - -Jre.min.version=Minimum JRE version should be 1.x.x[_xxx] or the Java 9 new version scheme xxx[.xxx[.xxx]], e.g., 1.5, 1.8.0_121, 10.0.1 -Jre.max.version=Maximum JRE version should be 1.x.x[_xxx] or the Java 9 new version scheme xxx[.xxx[.xxx]], e.g., 1.5, 1.8.0_121, 10.0.1 -Jre.specify.jre.min.version.or.path=Specify minimum JRE version and/or bundled JRE path. -Jre.bundled.path=Bundled JRE path -Jre.bundled.64bit.invalid=The bundled JRE 64-bit option can only be used if the JRE path is specified. -Jre.bundled.fallback.invalid=The bundled JRE as fallback option can only be used if the JRE path is specified. -Jre.specify.min.version=Specify minimum JRE version. -Jre.max.greater.than.min=Maximum JRE version must be greater than the minimum.\nTo use a certain JRE version, you may set the min/max range to [1.4.2 - 1.4.2_10] for example. -Jre.initial.and.max.heap=If you change the initial heap size please also specify the maximum size. -Jre.initial.heap=Initial heap size must be greater than 0, leave the field blank to use the JVM default. -Jre.max.heap=Maximum heap size cannot be less than the initial size, leave the field blank to use the JVM default. -Jre.initial.heap.percent=Initial heap % -Jre.max.heap.percent=Maximum heap % -Jre.jdkPreference=JDK preference -Jre.runtimeBits=Runtime bits -Jre.jvm.options=JVM arguments -Jre.jvm.options.unclosed.quotation=JVM arguments contain an unclosed quotation. -Jre.jvm.options.variable=Invalid environment variable reference. - -Msg.startupErr=Startup error message -Msg.bundledJreErr=Bundled JRE error message -Msg.jreVersionErr=JRE version error message -Msg.launcherErr=Launcher error message - -SingleInstance.mutexName=Mutex name -SingleInstance.windowTitle=Window title - -Charset.ascii=7-bit ASCII -Charset.unicode=Unicode -Charset.multilingual=Multilingual -Charset.shift.jis=Japan (Shift JIS X-0208) -Charset.shift.ksc=Korea (Shift KSC 5601) -Charset.big5=Taiwan (Big5) -Charset.latin2=Latin-2 (Eastern European) -Charset.cyrillic=Cyrillic -Language.arabic=Arabic -Language.bulgarian=Bulgarian -Language.catalan=Catalan -Language.chinese.traditional=Chinese (Traditional) -Language.czech=Czech -Language.danish=Danish -Language.german=German -Language.english.us=English U.S. -Language.greek=Greek -Language.hebrew=Hebrew -Language.polish=Polish -Language.portuguese.brazil=Portuguese (Brazil) -Language.rhaeto.romanic=Rhaeto Romanic -Language.romanian=Romanian -Language.russian=Russian -Language.spanish.castilian=Spanish (Castilian) -Language.finnish=Finnish -Language.french=French -Language.hungarian=Hungarian -Language.icelandic=Icelandic -Language.italian=Italian -Language.japanese=Japanese -Language.korean=Korean -Language.dutch=Dutch -Language.norwegian.bokmal=Norwegian Bokm\u00E5l -Language.croato.serbian.latin=Croato-Serbian (Latin) -Language.slovak=Slovak -Language.albanian=Albanian -Language.swedish=Swedish -Language.thai=Thai -Language.turkish=Turkish -Language.urdu=Urdu -Language.bahasa=Bahasa -Language.chinese.simplified=Chinese (Simplified) -Language.swiss.german=Swiss German -Language.english.uk=English U.K. -Language.spanish.mexico=Spanish (Mexico) -Language.belgian.french=Belgian French -Language.canadian.french=Canadian French -Language.swiss.italian=Swiss Italian -Language.belgian.dutch=Belgian Dutch -Language.norwegian.nynorsk=Norwegian Nynorsk -Language.portuguese.portugal=Portuguese (Portugal) -Language.serbo.croatian.cyrillic=Serbo-Croatian (Cyrillic) -Language.swiss.french=Swiss French +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2015 Grzegorz Kowal +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +Splash.splash.file=Splash file +Splash.splash.timeout=Splash timeout + +Config.specify.output.exe=Specify output file with .exe extension. +Config.application.jar=Application jar +Config.application.jar.path=Specify runtime path of the jar relative to the executable. +Config.chdir.relative='chdir' must be a path relative to the executable. +Config.chdir.path='chdir' is now a path instead of a boolean, please check the docs. +Config.manifest=Manifest +Config.icon=Icon +Config.jar.arguments=Jar arguments +Config.error.title=Error title +Config.download.url=Download URL +Config.support.url=Support URL +Config.header.type=Header type +Config.splash.not.impl.by.console.hdr=Splash screen is not implemented by console header. +Config.variables=Environment variables +Config.variables.err=Environment variable assignment should have the form varname=[value][%varref%]... +Config.priority=Process priority + +ClassPath.mainClass=Main class +ClassPath.or.jar=Specify runtime path of a jar or the classpath. +ClassPath.path=Classpath + +VersionInfo.file.version=File version, should be 'x.x.x.x' +VersionInfo.txt.file.version=Free form file version +VersionInfo.file.description=File description +VersionInfo.copyright=Copyright +VersionInfo.product.version=Product version, should be 'x.x.x.x' +VersionInfo.txt.product.version=Free from product version +VersionInfo.product.name=Product name +VersionInfo.company.name=Company name +VersionInfo.trademarks=Trademarks +VersionInfo.internal.name=Internal name +VersionInfo.internal.name.not.exe=Internal name shouldn't have the .exe extension. +VersionInfo.original.filename=Original filename +VersionInfo.original.filename.exe=Original filename should end with the .exe extension. + +Jre.min.version=Minimum JRE version should be 1.x.x[_xxx] or the Java 9 new version scheme xxx[.xxx[.xxx]], e.g., 1.5, 1.8.0_121, 10.0.1 +Jre.max.version=Maximum JRE version should be 1.x.x[_xxx] or the Java 9 new version scheme xxx[.xxx[.xxx]], e.g., 1.5, 1.8.0_121, 10.0.1 +Jre.path=JRE path +Jre.specify.min.version=Specify minimum JRE version. +Jre.max.greater.than.min=Maximum JRE version must be greater than the minimum.\nTo use a certain JRE version, you may set the min/max range to [1.4.2 - 1.4.2_10] for example. +Jre.initial.and.max.heap=If you change the initial heap size please also specify the maximum size. +Jre.initial.heap=Initial heap size must be greater than 0, leave the field blank to use the JVM default. +Jre.max.heap=Maximum heap size cannot be less than the initial size, leave the field blank to use the JVM default. +Jre.initial.heap.percent=Initial heap % +Jre.max.heap.percent=Maximum heap % +Jre.requiresJdk=Requires JDK +Jre.jvm.options=JVM arguments +Jre.jvm.options.unclosed.quotation=JVM arguments contain an unclosed quotation. +Jre.jvm.options.variable=Invalid environment variable reference. + +Msg.startupErr=Startup error message +Msg.jreNotFoundErr=JRE not found error message +Msg.jreVersionErr=JRE version error message +Msg.launcherErr=Launcher error message + +SingleInstance.mutexName=Mutex name +SingleInstance.windowTitle=Window title + +Charset.ascii=7-bit ASCII +Charset.unicode=Unicode +Charset.multilingual=Multilingual +Charset.shift.jis=Japan (Shift JIS X-0208) +Charset.shift.ksc=Korea (Shift KSC 5601) +Charset.big5=Taiwan (Big5) +Charset.latin2=Latin-2 (Eastern European) +Charset.cyrillic=Cyrillic +Language.arabic=Arabic +Language.bulgarian=Bulgarian +Language.catalan=Catalan +Language.chinese.traditional=Chinese (Traditional) +Language.czech=Czech +Language.danish=Danish +Language.german=German +Language.english.us=English U.S. +Language.greek=Greek +Language.hebrew=Hebrew +Language.polish=Polish +Language.portuguese.brazil=Portuguese (Brazil) +Language.rhaeto.romanic=Rhaeto Romanic +Language.romanian=Romanian +Language.russian=Russian +Language.spanish.castilian=Spanish (Castilian) +Language.finnish=Finnish +Language.french=French +Language.hungarian=Hungarian +Language.icelandic=Icelandic +Language.italian=Italian +Language.japanese=Japanese +Language.korean=Korean +Language.dutch=Dutch +Language.norwegian.bokmal=Norwegian Bokm\u00E5l +Language.croato.serbian.latin=Croato-Serbian (Latin) +Language.slovak=Slovak +Language.albanian=Albanian +Language.swedish=Swedish +Language.thai=Thai +Language.turkish=Turkish +Language.urdu=Urdu +Language.bahasa=Bahasa +Language.chinese.simplified=Chinese (Simplified) +Language.swiss.german=Swiss German +Language.english.uk=English U.K. +Language.spanish.mexico=Spanish (Mexico) +Language.belgian.french=Belgian French +Language.canadian.french=Canadian French +Language.swiss.italian=Swiss Italian +Language.belgian.dutch=Belgian Dutch +Language.norwegian.nynorsk=Norwegian Nynorsk +Language.portuguese.portugal=Portuguese (Portugal) +Language.serbo.croatian.cyrillic=Serbo-Croatian (Cyrillic) +Language.swiss.french=Swiss French diff --git a/launch4j/src/net/sf/launch4j/config/messages_es.properties b/launch4j/src/net/sf/launch4j/config/messages_es.properties deleted file mode 100644 index 5b897d0..0000000 --- a/launch4j/src/net/sf/launch4j/config/messages_es.properties +++ /dev/null @@ -1,75 +0,0 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Martínez Ros -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -Splash.splash.file = Fichero de la pantalla de bienvenida -Splash.splash.timeout = Tiempo de espera de la pantalla de bienvenida - -Config.specify.output.exe = Especifique el fichero de salida con extensi\u00F3n .exe. -Config.application.jar = Aplicaci\u00F3n jar -Config.application.jar.path = Especifique la ruta del jar relativa al ejecutable. -Config.chdir.relative = 'Cambiar al directorio' debe ser una ruta relativa al ejecutable. -Config.chdir.path = 'Cambiar al directorio' ahora es una ruta en lugar de un booleano, por favor consulte la documentaci\u00F3n. -Config.icon = Icono -Config.jar.arguments = Argumentos del jar -Config.error.title = T\u00EDtulo de error -Config.header.type = Tipo de cabecera -Config.splash.not.impl.by.console.hdr = La pantalla de bienvenida no est\u00E1 implementada para la cabecera de tipo consola. - -VersionInfo.file.version = La versi\u00F3n del fichero, deber\u00EDa ser 'x.x.x.x' -VersionInfo.txt.file.version = Forma libre de versi\u00F3n del fichero -VersionInfo.file.description = Descripci\u00F3n del fichero -VersionInfo.copyright = Copyright -VersionInfo.product.version = Versi\u00F3n del producto, deber\u00EDa ser 'x.x.x.x' -VersionInfo.txt.product.version = Forma libre de versi\u00F3n del producto -VersionInfo.product.name = Nombre del producto -VersionInfo.company.name = Nombre de la organizaci\u00F3n -VersionInfo.internal.name = Nombre interno -VersionInfo.internal.name.not.exe = El nombre interno no deber\u00EDa tener extensi\u00F3n .exe. -VersionInfo.original.filename = Nombre original del fichero -VersionInfo.original.filename.exe = El nombre original del fichero debe acabar con extensi\u00F3n .exe. -Jre.min.version = La versi\u00F3n m\u00EDnima del JRE deber\u00EDa ser x.x.x[_xx] -Jre.max.version = La versi\u00F3n m\u00E1xima del JRE deber\u00EDa ser x.x.x[_xx] -Jre.specify.jre.min.version.or.path=Specify minimum JRE version and/or bundled JRE path. -Jre.bundled.path.rel = La ruta del JRE debe ser relativa al ejecutable. -Jre.specify.min.version = Especifique la versi\u00F3n m\u00EDnima del JRE. -Jre.max.greater.than.min = La versi\u00F3n m\u00E1xima del JRE debe ser mayor que la m\u00EDnima.\nPara usar cierta versi\u00F3n del JRE, puede esyablecer el rango m\u00EDnimo/m\u00E1ximo a [1.4.2 - 1.4.2_10], por ejemplo. -Jre.jvm.options = Argumentos de la JVM - -Msg.startupErr=Startup error message -Msg.bundledJreErr=Bundled JRE error message -Msg.jreVersionErr=JRE version error message -Msg.launcherErr=Launcher error message - -SingleInstance.mutexName=Mutex name -SingleInstance.windowTitle=Window title - diff --git a/launch4j/src/net/sf/launch4j/form/BasicForm.java b/launch4j/src/net/sf/launch4j/form/BasicForm.java index 72f477e..ddaae32 100644 --- a/launch4j/src/net/sf/launch4j/form/BasicForm.java +++ b/launch4j/src/net/sf/launch4j/form/BasicForm.java @@ -1,283 +1,284 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JTextField; - -public abstract class BasicForm extends JPanel -{ - protected final JButton _outfileButton = new JButton(); - protected final JLabel _outfileLabel = new JLabel(); - protected final JLabel _iconLabel = new JLabel(); - protected final JLabel _jarLabel = new JLabel(); - protected final JButton _jarButton = new JButton(); - protected final JButton _iconButton = new JButton(); - protected final JLabel _cmdLineLabel = new JLabel(); - protected final JLabel _optionsLabel = new JLabel(); - protected final JLabel _chdirLabel = new JLabel(); - protected final JLabel _processPriorityLabel = new JLabel(); - protected final JRadioButton _normalPriorityRadio = new JRadioButton(); - protected final ButtonGroup _buttongroup1 = new ButtonGroup(); - protected final JRadioButton _idlePriorityRadio = new JRadioButton(); - protected final JRadioButton _highPriorityRadio = new JRadioButton(); - protected final JTextField _cmdLineField = new JTextField(); - protected final JTextField _chdirField = new JTextField(); - protected final JTextField _iconField = new JTextField(); - protected final JCheckBox _dontWrapJarCheck = new JCheckBox(); - protected final JTextField _jarField = new JTextField(); - protected final JTextField _outfileField = new JTextField(); - protected final JLabel _errorTitleLabel = new JLabel(); - protected final JTextField _errorTitleField = new JTextField(); - protected final JLabel _downloadUrlLabel = new JLabel(); - protected final JTextField _downloadUrlField = new JTextField(); - protected final JLabel _supportUrlLabel = new JLabel(); - protected final JTextField _supportUrlField = new JTextField(); - protected final JTextField _manifestField = new JTextField(); - protected final JButton _manifestButton = new JButton(); - protected final JCheckBox _stayAliveCheck = new JCheckBox(); - protected final JCheckBox _restartOnCrashCheck = new JCheckBox(); - - /** - * Default constructor - */ - public BasicForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _outfileButton.setIcon(loadImage("images/open16.png")); - _outfileButton.setName("outfileButton"); - jpanel1.add(_outfileButton,cc.xy(12,2)); - - _outfileLabel.setIcon(loadImage("images/asterix.gif")); - _outfileLabel.setName("outfileLabel"); - _outfileLabel.setText(Messages.getString("outfile")); - jpanel1.add(_outfileLabel,cc.xy(2,2)); - - _iconLabel.setName("iconLabel"); - _iconLabel.setText(Messages.getString("icon")); - jpanel1.add(_iconLabel,cc.xy(2,10)); - - _jarLabel.setIcon(loadImage("images/asterix.gif")); - _jarLabel.setName("jarLabel"); - _jarLabel.setText(Messages.getString("jar")); - jpanel1.add(_jarLabel,cc.xy(2,4)); - - _jarButton.setIcon(loadImage("images/open16.png")); - _jarButton.setName("jarButton"); - jpanel1.add(_jarButton,cc.xy(12,4)); - - _iconButton.setIcon(loadImage("images/open16.png")); - _iconButton.setName("iconButton"); - jpanel1.add(_iconButton,cc.xy(12,10)); - - _cmdLineLabel.setName("cmdLineLabel"); - _cmdLineLabel.setText(Messages.getString("cmdLine")); - _cmdLineLabel.setToolTipText(""); - jpanel1.add(_cmdLineLabel,cc.xy(2,14)); - - _optionsLabel.setName("optionsLabel"); - _optionsLabel.setText(Messages.getString("options")); - jpanel1.add(_optionsLabel,cc.xy(2,18)); - - _chdirLabel.setName("chdirLabel"); - _chdirLabel.setText(Messages.getString("chdir")); - jpanel1.add(_chdirLabel,cc.xy(2,12)); - - _processPriorityLabel.setName("processPriorityLabel"); - _processPriorityLabel.setText(Messages.getString("priority")); - jpanel1.add(_processPriorityLabel,cc.xy(2,16)); - - _normalPriorityRadio.setActionCommand(Messages.getString("normalPriority")); - _normalPriorityRadio.setName("normalPriorityRadio"); - _normalPriorityRadio.setText(Messages.getString("normalPriority")); - _buttongroup1.add(_normalPriorityRadio); - jpanel1.add(_normalPriorityRadio,cc.xy(4,16)); - - _idlePriorityRadio.setActionCommand(Messages.getString("idlePriority")); - _idlePriorityRadio.setName("idlePriorityRadio"); - _idlePriorityRadio.setText(Messages.getString("idlePriority")); - _buttongroup1.add(_idlePriorityRadio); - jpanel1.add(_idlePriorityRadio,cc.xy(6,16)); - - _highPriorityRadio.setActionCommand(Messages.getString("highPriority")); - _highPriorityRadio.setName("highPriorityRadio"); - _highPriorityRadio.setText(Messages.getString("highPriority")); - _buttongroup1.add(_highPriorityRadio); - jpanel1.add(_highPriorityRadio,cc.xy(8,16)); - - _cmdLineField.setName("cmdLineField"); - _cmdLineField.setToolTipText(Messages.getString("cmdLineTip")); - jpanel1.add(_cmdLineField,cc.xywh(4,14,7,1)); - - _chdirField.setName("chdirField"); - _chdirField.setToolTipText(Messages.getString("chdirTip")); - jpanel1.add(_chdirField,cc.xywh(4,12,7,1)); - - _iconField.setName("iconField"); - _iconField.setToolTipText(Messages.getString("iconTip")); - jpanel1.add(_iconField,cc.xywh(4,10,7,1)); - - _dontWrapJarCheck.setActionCommand("Don't wrap the jar, launch it only"); - _dontWrapJarCheck.setName("dontWrapJarCheck"); - _dontWrapJarCheck.setText(Messages.getString("dontWrapJar")); - jpanel1.add(_dontWrapJarCheck,cc.xywh(4,6,7,1)); - - _jarField.setName("jarField"); - _jarField.setToolTipText(Messages.getString("jarTip")); - jpanel1.add(_jarField,cc.xywh(4,4,7,1)); - - _outfileField.setName("outfileField"); - _outfileField.setToolTipText(Messages.getString("outfileTip")); - jpanel1.add(_outfileField,cc.xywh(4,2,7,1)); - - TitledSeparator titledseparator1 = new TitledSeparator(); - titledseparator1.setText(Messages.getString("downloadAndSupport")); - jpanel1.add(titledseparator1,cc.xywh(2,22,11,1)); - - _errorTitleLabel.setName("errorTitleLabel"); - _errorTitleLabel.setText(Messages.getString("errorTitle")); - jpanel1.add(_errorTitleLabel,cc.xy(2,24)); - - _errorTitleField.setName("errorTitleField"); - _errorTitleField.setToolTipText(Messages.getString("errorTitleTip")); - jpanel1.add(_errorTitleField,cc.xywh(4,24,7,1)); - - _downloadUrlLabel.setName("downloadUrlLabel"); - _downloadUrlLabel.setText(Messages.getString("downloadUrl")); - jpanel1.add(_downloadUrlLabel,cc.xy(2,26)); - - _downloadUrlField.setName("downloadUrlField"); - jpanel1.add(_downloadUrlField,cc.xywh(4,26,7,1)); - - _supportUrlLabel.setName("supportUrlLabel"); - _supportUrlLabel.setText(Messages.getString("supportUrl")); - jpanel1.add(_supportUrlLabel,cc.xy(2,28)); - - _supportUrlField.setName("supportUrlField"); - jpanel1.add(_supportUrlField,cc.xywh(4,28,7,1)); - - JLabel jlabel1 = new JLabel(); - jlabel1.setText(Messages.getString("manifest")); - jpanel1.add(jlabel1,cc.xy(2,8)); - - _manifestField.setName("manifestField"); - _manifestField.setToolTipText(Messages.getString("manifestTip")); - jpanel1.add(_manifestField,cc.xywh(4,8,7,1)); - - _manifestButton.setIcon(loadImage("images/open16.png")); - _manifestButton.setName("manifestButton"); - jpanel1.add(_manifestButton,cc.xy(12,8)); - - _stayAliveCheck.setActionCommand("Stay alive after launching a GUI application"); - _stayAliveCheck.setName("stayAliveCheck"); - _stayAliveCheck.setText(Messages.getString("stayAlive")); - jpanel1.add(_stayAliveCheck,cc.xywh(4,18,7,1)); - - _restartOnCrashCheck.setActionCommand("Restart the application after a crash"); - _restartOnCrashCheck.setName("restartOnCrashCheck"); - _restartOnCrashCheck.setText(Messages.getString("restartOnCrash")); - _restartOnCrashCheck.setToolTipText(Messages.getString("restartOnCrashToolTip")); - jpanel1.add(_restartOnCrashCheck,cc.xywh(4,20,7,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ButtonGroup; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JTextField; +import javax.swing.UIManager; + +public abstract class BasicForm extends JPanel +{ + protected final JButton _outfileButton = new JButton(); + protected final JLabel _outfileLabel = new JLabel(); + protected final JLabel _iconLabel = new JLabel(); + protected final JLabel _jarLabel = new JLabel(); + protected final JButton _jarButton = new JButton(); + protected final JButton _iconButton = new JButton(); + protected final JLabel _cmdLineLabel = new JLabel(); + protected final JLabel _optionsLabel = new JLabel(); + protected final JLabel _chdirLabel = new JLabel(); + protected final JLabel _processPriorityLabel = new JLabel(); + protected final JRadioButton _normalPriorityRadio = new JRadioButton(); + protected final ButtonGroup _buttongroup1 = new ButtonGroup(); + protected final JRadioButton _idlePriorityRadio = new JRadioButton(); + protected final JRadioButton _highPriorityRadio = new JRadioButton(); + protected final JTextField _cmdLineField = new JTextField(); + protected final JTextField _chdirField = new JTextField(); + protected final JTextField _iconField = new JTextField(); + protected final JCheckBox _dontWrapJarCheck = new JCheckBox(); + protected final JTextField _jarField = new JTextField(); + protected final JTextField _outfileField = new JTextField(); + protected final JLabel _errorTitleLabel = new JLabel(); + protected final JTextField _errorTitleField = new JTextField(); + protected final JLabel _downloadUrlLabel = new JLabel(); + protected final JTextField _downloadUrlField = new JTextField(); + protected final JLabel _supportUrlLabel = new JLabel(); + protected final JTextField _supportUrlField = new JTextField(); + protected final JTextField _manifestField = new JTextField(); + protected final JButton _manifestButton = new JButton(); + protected final JCheckBox _stayAliveCheck = new JCheckBox(); + protected final JCheckBox _restartOnCrashCheck = new JCheckBox(); + + /** + * Default constructor + */ + public BasicForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _outfileButton.setIcon(UIManager.getIcon("Tree.closedIcon")); + _outfileButton.setName("outfileButton"); + jpanel1.add(_outfileButton,cc.xy(12,2)); + + _outfileLabel.setIcon(loadImage("images/asterix.gif")); + _outfileLabel.setName("outfileLabel"); + _outfileLabel.setText(Messages.getString("outfile")); + jpanel1.add(_outfileLabel,cc.xy(2,2)); + + _iconLabel.setName("iconLabel"); + _iconLabel.setText(Messages.getString("icon")); + jpanel1.add(_iconLabel,cc.xy(2,10)); + + _jarLabel.setIcon(loadImage("images/asterix.gif")); + _jarLabel.setName("jarLabel"); + _jarLabel.setText(Messages.getString("jar")); + jpanel1.add(_jarLabel,cc.xy(2,4)); + + _jarButton.setIcon(UIManager.getIcon("Tree.closedIcon")); + _jarButton.setName("jarButton"); + jpanel1.add(_jarButton,cc.xy(12,4)); + + _iconButton.setIcon(UIManager.getIcon("Tree.closedIcon")); + _iconButton.setName("iconButton"); + jpanel1.add(_iconButton,cc.xy(12,10)); + + _cmdLineLabel.setName("cmdLineLabel"); + _cmdLineLabel.setText(Messages.getString("cmdLine")); + _cmdLineLabel.setToolTipText(""); + jpanel1.add(_cmdLineLabel,cc.xy(2,14)); + + _optionsLabel.setName("optionsLabel"); + _optionsLabel.setText(Messages.getString("options")); + jpanel1.add(_optionsLabel,cc.xy(2,18)); + + _chdirLabel.setName("chdirLabel"); + _chdirLabel.setText(Messages.getString("chdir")); + jpanel1.add(_chdirLabel,cc.xy(2,12)); + + _processPriorityLabel.setName("processPriorityLabel"); + _processPriorityLabel.setText(Messages.getString("priority")); + jpanel1.add(_processPriorityLabel,cc.xy(2,16)); + + _normalPriorityRadio.setActionCommand(Messages.getString("normalPriority")); + _normalPriorityRadio.setName("normalPriorityRadio"); + _normalPriorityRadio.setText(Messages.getString("normalPriority")); + _buttongroup1.add(_normalPriorityRadio); + jpanel1.add(_normalPriorityRadio,cc.xy(4,16)); + + _idlePriorityRadio.setActionCommand(Messages.getString("idlePriority")); + _idlePriorityRadio.setName("idlePriorityRadio"); + _idlePriorityRadio.setText(Messages.getString("idlePriority")); + _buttongroup1.add(_idlePriorityRadio); + jpanel1.add(_idlePriorityRadio,cc.xy(6,16)); + + _highPriorityRadio.setActionCommand(Messages.getString("highPriority")); + _highPriorityRadio.setName("highPriorityRadio"); + _highPriorityRadio.setText(Messages.getString("highPriority")); + _buttongroup1.add(_highPriorityRadio); + jpanel1.add(_highPriorityRadio,cc.xy(8,16)); + + _cmdLineField.setName("cmdLineField"); + _cmdLineField.setToolTipText(Messages.getString("cmdLineTip")); + jpanel1.add(_cmdLineField,cc.xywh(4,14,7,1)); + + _chdirField.setName("chdirField"); + _chdirField.setToolTipText(Messages.getString("chdirTip")); + jpanel1.add(_chdirField,cc.xywh(4,12,7,1)); + + _iconField.setName("iconField"); + _iconField.setToolTipText(Messages.getString("iconTip")); + jpanel1.add(_iconField,cc.xywh(4,10,7,1)); + + _dontWrapJarCheck.setActionCommand("Don't wrap the jar, launch it only"); + _dontWrapJarCheck.setName("dontWrapJarCheck"); + _dontWrapJarCheck.setText(Messages.getString("dontWrapJar")); + jpanel1.add(_dontWrapJarCheck,cc.xywh(4,6,7,1)); + + _jarField.setName("jarField"); + _jarField.setToolTipText(Messages.getString("jarTip")); + jpanel1.add(_jarField,cc.xywh(4,4,7,1)); + + _outfileField.setName("outfileField"); + _outfileField.setToolTipText(Messages.getString("outfileTip")); + jpanel1.add(_outfileField,cc.xywh(4,2,7,1)); + + TitledSeparator titledseparator1 = new TitledSeparator(); + titledseparator1.setText(Messages.getString("downloadAndSupport")); + jpanel1.add(titledseparator1,cc.xywh(2,22,11,1)); + + _errorTitleLabel.setName("errorTitleLabel"); + _errorTitleLabel.setText(Messages.getString("errorTitle")); + jpanel1.add(_errorTitleLabel,cc.xy(2,24)); + + _errorTitleField.setName("errorTitleField"); + _errorTitleField.setToolTipText(Messages.getString("errorTitleTip")); + jpanel1.add(_errorTitleField,cc.xywh(4,24,7,1)); + + _downloadUrlLabel.setName("downloadUrlLabel"); + _downloadUrlLabel.setText(Messages.getString("downloadUrl")); + jpanel1.add(_downloadUrlLabel,cc.xy(2,26)); + + _downloadUrlField.setName("downloadUrlField"); + jpanel1.add(_downloadUrlField,cc.xywh(4,26,7,1)); + + _supportUrlLabel.setName("supportUrlLabel"); + _supportUrlLabel.setText(Messages.getString("supportUrl")); + jpanel1.add(_supportUrlLabel,cc.xy(2,28)); + + _supportUrlField.setName("supportUrlField"); + jpanel1.add(_supportUrlField,cc.xywh(4,28,7,1)); + + JLabel jlabel1 = new JLabel(); + jlabel1.setText(Messages.getString("manifest")); + jpanel1.add(jlabel1,cc.xy(2,8)); + + _manifestField.setName("manifestField"); + _manifestField.setToolTipText(Messages.getString("manifestTip")); + jpanel1.add(_manifestField,cc.xywh(4,8,7,1)); + + _manifestButton.setIcon(UIManager.getIcon("Tree.closedIcon")); + _manifestButton.setName("manifestButton"); + jpanel1.add(_manifestButton,cc.xy(12,8)); + + _stayAliveCheck.setActionCommand("Stay alive after launching a GUI application"); + _stayAliveCheck.setName("stayAliveCheck"); + _stayAliveCheck.setText(Messages.getString("stayAlive")); + jpanel1.add(_stayAliveCheck,cc.xywh(4,18,7,1)); + + _restartOnCrashCheck.setActionCommand("Restart the application after a crash"); + _restartOnCrashCheck.setName("restartOnCrashCheck"); + _restartOnCrashCheck.setText(Messages.getString("restartOnCrash")); + _restartOnCrashCheck.setToolTipText(Messages.getString("restartOnCrashToolTip")); + jpanel1.add(_restartOnCrashCheck,cc.xywh(4,20,7,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/ClassPathForm.java b/launch4j/src/net/sf/launch4j/form/ClassPathForm.java index f19d08e..4cbf8e6 100644 --- a/launch4j/src/net/sf/launch4j/form/ClassPathForm.java +++ b/launch4j/src/net/sf/launch4j/form/ClassPathForm.java @@ -1,193 +1,194 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; - -public abstract class ClassPathForm extends JPanel -{ - protected final JTextField _classpathField = new JTextField(); - protected final JLabel _classpathFieldLabel = new JLabel(); - protected final JLabel _classpathListLabel = new JLabel(); - protected final JList _classpathList = new JList(); - protected final JLabel _mainclassLabel = new JLabel(); - protected final JTextField _mainclassField = new JTextField(); - protected final JButton _acceptClasspathButton = new JButton(); - protected final JButton _removeClasspathButton = new JButton(); - protected final JButton _importClasspathButton = new JButton(); - protected final JButton _classpathUpButton = new JButton(); - protected final JButton _classpathDownButton = new JButton(); - protected final JCheckBox _classpathCheck = new JCheckBox(); - protected final JButton _newClasspathButton = new JButton(); - - /** - * Default constructor - */ - public ClassPathForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _classpathField.setName("classpathField"); - jpanel1.add(_classpathField,cc.xywh(4,11,7,1)); - - _classpathFieldLabel.setIcon(loadImage("images/asterix.gif")); - _classpathFieldLabel.setName("classpathFieldLabel"); - _classpathFieldLabel.setText(Messages.getString("editClassPath")); - jpanel1.add(_classpathFieldLabel,cc.xy(2,11)); - - _classpathListLabel.setName("classpathListLabel"); - _classpathListLabel.setText(Messages.getString("classPath")); - jpanel1.add(_classpathListLabel,cc.xy(2,6)); - - _classpathList.setName("classpathList"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_classpathList); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xywh(4,6,7,4)); - - _mainclassLabel.setIcon(loadImage("images/asterix.gif")); - _mainclassLabel.setName("mainclassLabel"); - _mainclassLabel.setText(Messages.getString("mainClass")); - jpanel1.add(_mainclassLabel,cc.xy(2,4)); - - _mainclassField.setName("mainclassField"); - jpanel1.add(_mainclassField,cc.xywh(4,4,7,1)); - - _acceptClasspathButton.setActionCommand("Add"); - _acceptClasspathButton.setIcon(loadImage("images/ok16.png")); - _acceptClasspathButton.setName("acceptClasspathButton"); - _acceptClasspathButton.setText(Messages.getString("accept")); - jpanel1.add(_acceptClasspathButton,cc.xy(8,13)); - - _removeClasspathButton.setActionCommand("Remove"); - _removeClasspathButton.setIcon(loadImage("images/cancel16.png")); - _removeClasspathButton.setName("removeClasspathButton"); - _removeClasspathButton.setText(Messages.getString("remove")); - jpanel1.add(_removeClasspathButton,cc.xy(10,13)); - - _importClasspathButton.setIcon(loadImage("images/open16.png")); - _importClasspathButton.setName("importClasspathButton"); - _importClasspathButton.setToolTipText(Messages.getString("importClassPath")); - jpanel1.add(_importClasspathButton,cc.xy(12,4)); - - _classpathUpButton.setIcon(loadImage("images/up16.png")); - _classpathUpButton.setName("classpathUpButton"); - jpanel1.add(_classpathUpButton,cc.xy(12,6)); - - _classpathDownButton.setIcon(loadImage("images/down16.png")); - _classpathDownButton.setName("classpathDownButton"); - jpanel1.add(_classpathDownButton,cc.xy(12,8)); - - _classpathCheck.setActionCommand("Custom classpath"); - _classpathCheck.setName("classpathCheck"); - _classpathCheck.setText(Messages.getString("customClassPath")); - jpanel1.add(_classpathCheck,cc.xy(4,2)); - - _newClasspathButton.setActionCommand("New"); - _newClasspathButton.setIcon(loadImage("images/new16.png")); - _newClasspathButton.setName("newClasspathButton"); - _newClasspathButton.setText(Messages.getString("new")); - jpanel1.add(_newClasspathButton,cc.xy(6,13)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.UIManager; + +public abstract class ClassPathForm extends JPanel +{ + protected final JTextField _classpathField = new JTextField(); + protected final JLabel _classpathFieldLabel = new JLabel(); + protected final JLabel _classpathListLabel = new JLabel(); + protected final JList _classpathList = new JList(); + protected final JLabel _mainclassLabel = new JLabel(); + protected final JTextField _mainclassField = new JTextField(); + protected final JButton _acceptClasspathButton = new JButton(); + protected final JButton _removeClasspathButton = new JButton(); + protected final JButton _importClasspathButton = new JButton(); + protected final JButton _classpathUpButton = new JButton(); + protected final JButton _classpathDownButton = new JButton(); + protected final JCheckBox _classpathCheck = new JCheckBox(); + protected final JButton _newClasspathButton = new JButton(); + + /** + * Default constructor + */ + public ClassPathForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _classpathField.setName("classpathField"); + jpanel1.add(_classpathField,cc.xywh(4,11,7,1)); + + _classpathFieldLabel.setIcon(loadImage("images/asterix.gif")); + _classpathFieldLabel.setName("classpathFieldLabel"); + _classpathFieldLabel.setText(Messages.getString("editClassPath")); + jpanel1.add(_classpathFieldLabel,cc.xy(2,11)); + + _classpathListLabel.setName("classpathListLabel"); + _classpathListLabel.setText(Messages.getString("classPath")); + jpanel1.add(_classpathListLabel,cc.xy(2,6)); + + _classpathList.setName("classpathList"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_classpathList); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xywh(4,6,7,4)); + + _mainclassLabel.setIcon(loadImage("images/asterix.gif")); + _mainclassLabel.setName("mainclassLabel"); + _mainclassLabel.setText(Messages.getString("mainClass")); + jpanel1.add(_mainclassLabel,cc.xy(2,4)); + + _mainclassField.setName("mainclassField"); + jpanel1.add(_mainclassField,cc.xywh(4,4,7,1)); + + _acceptClasspathButton.setActionCommand("Add"); + _acceptClasspathButton.setIcon(loadImage("images/ok16.png")); + _acceptClasspathButton.setName("acceptClasspathButton"); + _acceptClasspathButton.setText(Messages.getString("accept")); + jpanel1.add(_acceptClasspathButton,cc.xy(8,13)); + + _removeClasspathButton.setActionCommand("Remove"); + _removeClasspathButton.setIcon(loadImage("images/cancel16.png")); + _removeClasspathButton.setName("removeClasspathButton"); + _removeClasspathButton.setText(Messages.getString("remove")); + jpanel1.add(_removeClasspathButton,cc.xy(10,13)); + + _importClasspathButton.setIcon(UIManager.getIcon("Tree.closedIcon")); + _importClasspathButton.setName("importClasspathButton"); + _importClasspathButton.setToolTipText(Messages.getString("importClassPath")); + jpanel1.add(_importClasspathButton,cc.xy(12,4)); + + _classpathUpButton.setIcon(loadImage("images/up16.png")); + _classpathUpButton.setName("classpathUpButton"); + jpanel1.add(_classpathUpButton,cc.xy(12,6)); + + _classpathDownButton.setIcon(loadImage("images/down16.png")); + _classpathDownButton.setName("classpathDownButton"); + jpanel1.add(_classpathDownButton,cc.xy(12,8)); + + _classpathCheck.setActionCommand("Custom classpath"); + _classpathCheck.setName("classpathCheck"); + _classpathCheck.setText(Messages.getString("customClassPath")); + jpanel1.add(_classpathCheck,cc.xy(4,2)); + + _newClasspathButton.setActionCommand("New"); + _newClasspathButton.setIcon(loadImage("images/new16.png")); + _newClasspathButton.setName("newClasspathButton"); + _newClasspathButton.setText(Messages.getString("new")); + jpanel1.add(_newClasspathButton,cc.xy(6,13)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/ConfigForm.java b/launch4j/src/net/sf/launch4j/form/ConfigForm.java index dcb6c85..b3c6fff 100644 --- a/launch4j/src/net/sf/launch4j/form/ConfigForm.java +++ b/launch4j/src/net/sf/launch4j/form/ConfigForm.java @@ -1,132 +1,132 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; -import javax.swing.JTextArea; - -public abstract class ConfigForm extends JPanel -{ - protected final JTextArea _logTextArea = new JTextArea(); - protected final TitledSeparator _logSeparator = new TitledSeparator(); - protected final JTabbedPane _tab = new JTabbedPane(); - - /** - * Default constructor - */ - public ConfigForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:3DLU:NONE,FILL:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _logTextArea.setName("logTextArea"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_logTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xy(2,6)); - - _logSeparator.setName("logSeparator"); - _logSeparator.setText(Messages.getString("log")); - jpanel1.add(_logSeparator,cc.xy(2,4)); - - _tab.setName("tab"); - jpanel1.add(_tab,cc.xywh(1,2,3,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,3,4,5,6,7 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; + +public abstract class ConfigForm extends JPanel +{ + protected final JTextArea _logTextArea = new JTextArea(); + protected final TitledSeparator _logSeparator = new TitledSeparator(); + protected final JTabbedPane _tab = new JTabbedPane(); + + /** + * Default constructor + */ + public ConfigForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:3DLU:NONE,FILL:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _logTextArea.setName("logTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_logTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xy(2,6)); + + _logSeparator.setName("logSeparator"); + _logSeparator.setText(Messages.getString("log")); + jpanel1.add(_logSeparator,cc.xy(2,4)); + + _tab.setName("tab"); + jpanel1.add(_tab,cc.xywh(1,2,3,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3 },new int[]{ 1,3,4,5,6,7 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java b/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java index 17e99fb..f2b79e6 100644 --- a/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java +++ b/launch4j/src/net/sf/launch4j/form/EnvironmentVarsForm.java @@ -1,127 +1,127 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -public abstract class EnvironmentVarsForm extends JPanel -{ - protected final JTextArea _envVarsTextArea = new JTextArea(); - protected final JLabel _envVarsLabel = new JLabel(); - - /** - * Default constructor - */ - public EnvironmentVarsForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _envVarsTextArea.setName("envVarsTextArea"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_envVarsTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xy(4,2)); - - _envVarsLabel.setName("envVarsLabel"); - _envVarsLabel.setText(Messages.getString("setVariables")); - jpanel1.add(_envVarsLabel,new CellConstraints(2,2,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +public abstract class EnvironmentVarsForm extends JPanel +{ + protected final JTextArea _envVarsTextArea = new JTextArea(); + protected final JLabel _envVarsLabel = new JLabel(); + + /** + * Default constructor + */ + public EnvironmentVarsForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _envVarsTextArea.setName("envVarsTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_envVarsTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xy(4,2)); + + _envVarsLabel.setName("envVarsLabel"); + _envVarsLabel.setText(Messages.getString("setVariables")); + jpanel1.add(_envVarsLabel,new CellConstraints(2,2,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/HeaderForm.java b/launch4j/src/net/sf/launch4j/form/HeaderForm.java index 9465b24..599ac6b 100644 --- a/launch4j/src/net/sf/launch4j/form/HeaderForm.java +++ b/launch4j/src/net/sf/launch4j/form/HeaderForm.java @@ -1,192 +1,192 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -public abstract class HeaderForm extends JPanel -{ - protected final JLabel _headerTypeLabel = new JLabel(); - protected final JRadioButton _guiHeaderRadio = new JRadioButton(); - protected final ButtonGroup _headerButtonGroup = new ButtonGroup(); - protected final JRadioButton _consoleHeaderRadio = new JRadioButton(); - protected final JTextArea _headerObjectsTextArea = new JTextArea(); - protected final JTextArea _libsTextArea = new JTextArea(); - protected final JCheckBox _headerObjectsCheck = new JCheckBox(); - protected final JCheckBox _libsCheck = new JCheckBox(); - protected final TitledSeparator _linkerOptionsSeparator = new TitledSeparator(); - protected final JRadioButton _jniGuiHeaderRadio = new JRadioButton(); - protected final JRadioButton _jniConsoleHeaderRadio = new JRadioButton(); - - /** - * Default constructor - */ - public HeaderForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(0.2),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _headerTypeLabel.setName("headerTypeLabel"); - _headerTypeLabel.setText(Messages.getString("headerType")); - jpanel1.add(_headerTypeLabel,cc.xy(2,2)); - - _guiHeaderRadio.setActionCommand("GUI"); - _guiHeaderRadio.setName("guiHeaderRadio"); - _guiHeaderRadio.setText(Messages.getString("gui")); - _guiHeaderRadio.setToolTipText(Messages.getString("guiTooltip")); - _headerButtonGroup.add(_guiHeaderRadio); - jpanel1.add(_guiHeaderRadio,cc.xy(4,2)); - - _consoleHeaderRadio.setActionCommand("Console"); - _consoleHeaderRadio.setName("consoleHeaderRadio"); - _consoleHeaderRadio.setText(Messages.getString("console")); - _consoleHeaderRadio.setToolTipText(Messages.getString("consoleTooltip")); - _headerButtonGroup.add(_consoleHeaderRadio); - jpanel1.add(_consoleHeaderRadio,cc.xy(6,2)); - - _headerObjectsTextArea.setName("headerObjectsTextArea"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_headerObjectsTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xywh(4,6,8,1)); - - _libsTextArea.setName("libsTextArea"); - JScrollPane jscrollpane2 = new JScrollPane(); - jscrollpane2.setViewportView(_libsTextArea); - jscrollpane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane2,cc.xywh(4,8,8,1)); - - _headerObjectsCheck.setActionCommand("Object files"); - _headerObjectsCheck.setName("headerObjectsCheck"); - _headerObjectsCheck.setText(Messages.getString("objectFiles")); - jpanel1.add(_headerObjectsCheck,new CellConstraints(2,6,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - _libsCheck.setActionCommand("w32api"); - _libsCheck.setName("libsCheck"); - _libsCheck.setText(Messages.getString("libs")); - jpanel1.add(_libsCheck,new CellConstraints(2,8,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - _linkerOptionsSeparator.setName("linkerOptionsSeparator"); - _linkerOptionsSeparator.setText(Messages.getString("linkerOptions")); - jpanel1.add(_linkerOptionsSeparator,cc.xywh(2,4,10,1)); - - _jniGuiHeaderRadio.setActionCommand(Messages.getString("jniGui")); - _jniGuiHeaderRadio.setForeground(new Color(255,102,0)); - _jniGuiHeaderRadio.setName("jniGuiHeaderRadio"); - _jniGuiHeaderRadio.setText(Messages.getString("jniGui")); - _jniGuiHeaderRadio.setToolTipText(Messages.getString("jniGuiTooltip")); - _headerButtonGroup.add(_jniGuiHeaderRadio); - jpanel1.add(_jniGuiHeaderRadio,cc.xy(8,2)); - - _jniConsoleHeaderRadio.setActionCommand(Messages.getString("jniConsole")); - _jniConsoleHeaderRadio.setForeground(new Color(255,102,0)); - _jniConsoleHeaderRadio.setName("jniConsoleHeaderRadio"); - _jniConsoleHeaderRadio.setText(Messages.getString("jniConsole")); - _jniConsoleHeaderRadio.setToolTipText(Messages.getString("jniConsoleTooltip")); - _headerButtonGroup.add(_jniConsoleHeaderRadio); - jpanel1.add(_jniConsoleHeaderRadio,cc.xy(10,2)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12 },new int[]{ 1,2,3,4,5,6,7,8,9 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ButtonGroup; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +public abstract class HeaderForm extends JPanel +{ + protected final JLabel _headerTypeLabel = new JLabel(); + protected final JRadioButton _guiHeaderRadio = new JRadioButton(); + protected final ButtonGroup _headerButtonGroup = new ButtonGroup(); + protected final JRadioButton _consoleHeaderRadio = new JRadioButton(); + protected final JTextArea _headerObjectsTextArea = new JTextArea(); + protected final JTextArea _libsTextArea = new JTextArea(); + protected final JCheckBox _headerObjectsCheck = new JCheckBox(); + protected final JCheckBox _libsCheck = new JCheckBox(); + protected final TitledSeparator _linkerOptionsSeparator = new TitledSeparator(); + protected final JRadioButton _jniGuiHeaderRadio = new JRadioButton(); + protected final JRadioButton _jniConsoleHeaderRadio = new JRadioButton(); + + /** + * Default constructor + */ + public HeaderForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:DEFAULT:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(0.2),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _headerTypeLabel.setName("headerTypeLabel"); + _headerTypeLabel.setText(Messages.getString("headerType")); + jpanel1.add(_headerTypeLabel,cc.xy(2,2)); + + _guiHeaderRadio.setActionCommand("GUI"); + _guiHeaderRadio.setName("guiHeaderRadio"); + _guiHeaderRadio.setText(Messages.getString("gui")); + _guiHeaderRadio.setToolTipText(Messages.getString("guiTooltip")); + _headerButtonGroup.add(_guiHeaderRadio); + jpanel1.add(_guiHeaderRadio,cc.xy(4,2)); + + _consoleHeaderRadio.setActionCommand("Console"); + _consoleHeaderRadio.setName("consoleHeaderRadio"); + _consoleHeaderRadio.setText(Messages.getString("console")); + _consoleHeaderRadio.setToolTipText(Messages.getString("consoleTooltip")); + _headerButtonGroup.add(_consoleHeaderRadio); + jpanel1.add(_consoleHeaderRadio,cc.xy(6,2)); + + _headerObjectsTextArea.setName("headerObjectsTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_headerObjectsTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xywh(4,6,8,1)); + + _libsTextArea.setName("libsTextArea"); + JScrollPane jscrollpane2 = new JScrollPane(); + jscrollpane2.setViewportView(_libsTextArea); + jscrollpane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane2,cc.xywh(4,8,8,1)); + + _headerObjectsCheck.setActionCommand("Object files"); + _headerObjectsCheck.setName("headerObjectsCheck"); + _headerObjectsCheck.setText(Messages.getString("objectFiles")); + jpanel1.add(_headerObjectsCheck,new CellConstraints(2,6,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + _libsCheck.setActionCommand("w32api"); + _libsCheck.setName("libsCheck"); + _libsCheck.setText(Messages.getString("libs")); + jpanel1.add(_libsCheck,new CellConstraints(2,8,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + _linkerOptionsSeparator.setName("linkerOptionsSeparator"); + _linkerOptionsSeparator.setText(Messages.getString("linkerOptions")); + jpanel1.add(_linkerOptionsSeparator,cc.xywh(2,4,10,1)); + + _jniGuiHeaderRadio.setActionCommand(Messages.getString("jniGui")); + _jniGuiHeaderRadio.setForeground(new Color(255,102,0)); + _jniGuiHeaderRadio.setName("jniGuiHeaderRadio"); + _jniGuiHeaderRadio.setText(Messages.getString("jniGui")); + _jniGuiHeaderRadio.setToolTipText(Messages.getString("jniGuiTooltip")); + _headerButtonGroup.add(_jniGuiHeaderRadio); + jpanel1.add(_jniGuiHeaderRadio,cc.xy(8,2)); + + _jniConsoleHeaderRadio.setActionCommand(Messages.getString("jniConsole")); + _jniConsoleHeaderRadio.setForeground(new Color(255,102,0)); + _jniConsoleHeaderRadio.setName("jniConsoleHeaderRadio"); + _jniConsoleHeaderRadio.setText(Messages.getString("jniConsole")); + _jniConsoleHeaderRadio.setToolTipText(Messages.getString("jniConsoleTooltip")); + _headerButtonGroup.add(_jniConsoleHeaderRadio); + jpanel1.add(_jniConsoleHeaderRadio,cc.xy(10,2)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12 },new int[]{ 1,2,3,4,5,6,7,8,9 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/JreForm.java b/launch4j/src/net/sf/launch4j/form/JreForm.java index 979b81c..b3db722 100644 --- a/launch4j/src/net/sf/launch4j/form/JreForm.java +++ b/launch4j/src/net/sf/launch4j/form/JreForm.java @@ -1,307 +1,297 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; - -public abstract class JreForm extends JPanel -{ - protected final JLabel _jrePathLabel = new JLabel(); - protected final JLabel _jreMinLabel = new JLabel(); - protected final JLabel _jreMaxLabel = new JLabel(); - protected final JLabel _jvmOptionsTextLabel = new JLabel(); - protected final JTextField _jreMinField = new JTextField(); - protected final JTextField _jreMaxField = new JTextField(); - protected final JTextArea _jvmOptionsTextArea = new JTextArea(); - protected final JLabel _initialHeapSizeLabel = new JLabel(); - protected final JLabel _maxHeapSizeLabel = new JLabel(); - protected final JTextField _initialHeapSizeField = new JTextField(); - protected final JTextField _maxHeapSizeField = new JTextField(); - protected final JTextField _maxHeapPercentField = new JTextField(); - protected final JTextField _initialHeapPercentField = new JTextField(); - protected final JComboBox _jdkPreferenceCombo = new JComboBox(); - protected final JComboBox _runtimeBitsCombo = new JComboBox(); - protected final JComboBox _varCombo = new JComboBox(); - protected final JButton _propertyButton = new JButton(); - protected final JButton _optionButton = new JButton(); - protected final JButton _envPropertyButton = new JButton(); - protected final JButton _envOptionButton = new JButton(); - protected final JTextField _envVarField = new JTextField(); - protected final JTextField _jrePathField = new JTextField(); - protected final JCheckBox _bundledJre64BitCheck = new JCheckBox(); - protected final JCheckBox _bundledJreAsFallbackCheck = new JCheckBox(); - - /** - * Default constructor - */ - public JreForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:60DLU:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:50DLU:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _jrePathLabel.setName("jrePathLabel"); - _jrePathLabel.setText(Messages.getString("jrePath")); - jpanel1.add(_jrePathLabel,cc.xy(2,2)); - - _jreMinLabel.setName("jreMinLabel"); - _jreMinLabel.setText(Messages.getString("jreMin")); - jpanel1.add(_jreMinLabel,cc.xy(2,6)); - - _jreMaxLabel.setName("jreMaxLabel"); - _jreMaxLabel.setText(Messages.getString("jreMax")); - jpanel1.add(_jreMaxLabel,cc.xy(2,8)); - - _jvmOptionsTextLabel.setName("jvmOptionsTextLabel"); - _jvmOptionsTextLabel.setText(Messages.getString("jvmOptions")); - jpanel1.add(_jvmOptionsTextLabel,new CellConstraints(2,16,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - _jreMinField.setName("jreMinField"); - jpanel1.add(_jreMinField,cc.xy(4,6)); - - _jreMaxField.setName("jreMaxField"); - jpanel1.add(_jreMaxField,cc.xy(4,8)); - - _jvmOptionsTextArea.setName("jvmOptionsTextArea"); - _jvmOptionsTextArea.setToolTipText(Messages.getString("jvmOptionsTip")); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_jvmOptionsTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xywh(4,16,7,1)); - - _initialHeapSizeLabel.setName("initialHeapSizeLabel"); - _initialHeapSizeLabel.setText(Messages.getString("initialHeapSize")); - jpanel1.add(_initialHeapSizeLabel,cc.xy(2,12)); - - _maxHeapSizeLabel.setName("maxHeapSizeLabel"); - _maxHeapSizeLabel.setText(Messages.getString("maxHeapSize")); - jpanel1.add(_maxHeapSizeLabel,cc.xy(2,14)); - - JLabel jlabel1 = new JLabel(); - jlabel1.setText("MB"); - jpanel1.add(jlabel1,cc.xy(6,12)); - - JLabel jlabel2 = new JLabel(); - jlabel2.setText("MB"); - jpanel1.add(jlabel2,cc.xy(6,14)); - - _initialHeapSizeField.setName("initialHeapSizeField"); - jpanel1.add(_initialHeapSizeField,cc.xy(4,12)); - - _maxHeapSizeField.setName("maxHeapSizeField"); - jpanel1.add(_maxHeapSizeField,cc.xy(4,14)); - - _maxHeapPercentField.setName("maxHeapPercentField"); - jpanel1.add(_maxHeapPercentField,cc.xy(8,14)); - - _initialHeapPercentField.setName("initialHeapPercentField"); - jpanel1.add(_initialHeapPercentField,cc.xy(8,12)); - - _jdkPreferenceCombo.setName("jdkPreferenceCombo"); - jpanel1.add(_jdkPreferenceCombo,cc.xywh(8,6,3,1)); - - JLabel jlabel3 = new JLabel(); - jlabel3.setText(Messages.getString("availableMemory")); - jpanel1.add(jlabel3,cc.xy(10,12)); - - JLabel jlabel4 = new JLabel(); - jlabel4.setText(Messages.getString("availableMemory")); - jpanel1.add(jlabel4,cc.xy(10,14)); - - _runtimeBitsCombo.setName("runtimeBitsCombo"); - _runtimeBitsCombo.setToolTipText(""); - jpanel1.add(_runtimeBitsCombo,cc.xywh(8,8,3,1)); - - jpanel1.add(createPanel1(),cc.xywh(2,18,9,1)); - TitledSeparator titledseparator1 = new TitledSeparator(); - titledseparator1.setText(Messages.getString("searchOptions")); - jpanel1.add(titledseparator1,cc.xywh(2,4,9,1)); - - TitledSeparator titledseparator2 = new TitledSeparator(); - titledseparator2.setText(Messages.getString("options")); - jpanel1.add(titledseparator2,cc.xywh(2,10,9,1)); - - jpanel1.add(createPanel2(),cc.xywh(4,2,7,1)); - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }); - return jpanel1; - } - - public JPanel createPanel1() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _varCombo.setName("varCombo"); - jpanel1.add(_varCombo,cc.xy(3,1)); - - _propertyButton.setActionCommand("Add"); - _propertyButton.setIcon(loadImage("images/edit_add16.png")); - _propertyButton.setName("propertyButton"); - _propertyButton.setText(Messages.getString("property")); - _propertyButton.setToolTipText(Messages.getString("propertyTip")); - jpanel1.add(_propertyButton,cc.xy(5,1)); - - _optionButton.setActionCommand("Add"); - _optionButton.setIcon(loadImage("images/edit_add16.png")); - _optionButton.setName("optionButton"); - _optionButton.setText(Messages.getString("option")); - _optionButton.setToolTipText(Messages.getString("optionTip")); - jpanel1.add(_optionButton,cc.xy(7,1)); - - _envPropertyButton.setActionCommand("Add"); - _envPropertyButton.setIcon(loadImage("images/edit_add16.png")); - _envPropertyButton.setName("envPropertyButton"); - _envPropertyButton.setText(Messages.getString("property")); - _envPropertyButton.setToolTipText(Messages.getString("propertyTip")); - jpanel1.add(_envPropertyButton,cc.xy(5,3)); - - JLabel jlabel1 = new JLabel(); - jlabel1.setText(Messages.getString("varsAndRegistry")); - jpanel1.add(jlabel1,cc.xy(1,1)); - - JLabel jlabel2 = new JLabel(); - jlabel2.setIcon(loadImage("images/asterix.gif")); - jlabel2.setText(Messages.getString("envVar")); - jpanel1.add(jlabel2,cc.xy(1,3)); - - _envOptionButton.setActionCommand("Add"); - _envOptionButton.setIcon(loadImage("images/edit_add16.png")); - _envOptionButton.setName("envOptionButton"); - _envOptionButton.setText(Messages.getString("option")); - _envOptionButton.setToolTipText(Messages.getString("optionTip")); - jpanel1.add(_envOptionButton,cc.xy(7,3)); - - _envVarField.setName("envVarField"); - jpanel1.add(_envVarField,cc.xy(3,3)); - - addFillComponents(jpanel1,new int[]{ 2,4,6 },new int[]{ 2 }); - return jpanel1; - } - - public JPanel createPanel2() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _jrePathField.setName("jrePathField"); - _jrePathField.setToolTipText(Messages.getString("jrePathTip")); - jpanel1.add(_jrePathField,cc.xy(1,1)); - - _bundledJre64BitCheck.setActionCommand(Messages.getString("bundledJre64Bit")); - _bundledJre64BitCheck.setName("bundledJre64BitCheck"); - _bundledJre64BitCheck.setText(Messages.getString("bundledJre64Bit")); - _bundledJre64BitCheck.setToolTipText(Messages.getString("bundledJre64BitTip")); - jpanel1.add(_bundledJre64BitCheck,cc.xy(3,1)); - - _bundledJreAsFallbackCheck.setActionCommand(Messages.getString("bundledJreAsFallback")); - _bundledJreAsFallbackCheck.setName("bundledJreAsFallbackCheck"); - _bundledJreAsFallbackCheck.setText(Messages.getString("bundledJreAsFallback")); - _bundledJreAsFallbackCheck.setToolTipText(Messages.getString("bundledJreAsFallbackTip")); - jpanel1.add(_bundledJreAsFallbackCheck,cc.xy(5,1)); - - addFillComponents(jpanel1,new int[]{ 2,4 },new int[0]); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; + +public abstract class JreForm extends JPanel +{ + protected final JLabel _jrePathLabel = new JLabel(); + protected final JLabel _jreMinLabel = new JLabel(); + protected final JLabel _jreMaxLabel = new JLabel(); + protected final JLabel _jvmOptionsTextLabel = new JLabel(); + protected final JTextField _jreMinField = new JTextField(); + protected final JTextField _jreMaxField = new JTextField(); + protected final JTextArea _jvmOptionsTextArea = new JTextArea(); + protected final JLabel _initialHeapSizeLabel = new JLabel(); + protected final JLabel _maxHeapSizeLabel = new JLabel(); + protected final JTextField _initialHeapSizeField = new JTextField(); + protected final JTextField _maxHeapSizeField = new JTextField(); + protected final JTextField _maxHeapPercentField = new JTextField(); + protected final JTextField _initialHeapPercentField = new JTextField(); + protected final JComboBox _varCombo = new JComboBox(); + protected final JButton _propertyButton = new JButton(); + protected final JButton _optionButton = new JButton(); + protected final JButton _envPropertyButton = new JButton(); + protected final JButton _envOptionButton = new JButton(); + protected final JTextField _envVarField = new JTextField(); + protected final JTextField _jrePathField = new JTextField(); + protected final JCheckBox _requires64BitCheck = new JCheckBox(); + protected final JCheckBox _requiresJdkCheck = new JCheckBox(); + + /** + * Default constructor + */ + public JreForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:7DLU:NONE,FILL:60DLU:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:50DLU:GROW(1.0),CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _jrePathLabel.setName("jrePathLabel"); + _jrePathLabel.setText(Messages.getString("jrePath")); + jpanel1.add(_jrePathLabel,cc.xy(2,2)); + + _jreMinLabel.setName("jreMinLabel"); + _jreMinLabel.setText(Messages.getString("jreMin")); + jpanel1.add(_jreMinLabel,cc.xy(2,6)); + + _jreMaxLabel.setName("jreMaxLabel"); + _jreMaxLabel.setText(Messages.getString("jreMax")); + jpanel1.add(_jreMaxLabel,cc.xy(2,8)); + + _jvmOptionsTextLabel.setName("jvmOptionsTextLabel"); + _jvmOptionsTextLabel.setText(Messages.getString("jvmOptions")); + jpanel1.add(_jvmOptionsTextLabel,new CellConstraints(2,16,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + _jreMinField.setName("jreMinField"); + jpanel1.add(_jreMinField,cc.xy(4,6)); + + _jreMaxField.setName("jreMaxField"); + jpanel1.add(_jreMaxField,cc.xy(4,8)); + + _jvmOptionsTextArea.setName("jvmOptionsTextArea"); + _jvmOptionsTextArea.setToolTipText(Messages.getString("jvmOptionsTip")); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_jvmOptionsTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xywh(4,16,7,1)); + + _initialHeapSizeLabel.setName("initialHeapSizeLabel"); + _initialHeapSizeLabel.setText(Messages.getString("initialHeapSize")); + jpanel1.add(_initialHeapSizeLabel,cc.xy(2,12)); + + _maxHeapSizeLabel.setName("maxHeapSizeLabel"); + _maxHeapSizeLabel.setText(Messages.getString("maxHeapSize")); + jpanel1.add(_maxHeapSizeLabel,cc.xy(2,14)); + + JLabel jlabel1 = new JLabel(); + jlabel1.setText("MB"); + jpanel1.add(jlabel1,cc.xy(6,12)); + + JLabel jlabel2 = new JLabel(); + jlabel2.setText("MB"); + jpanel1.add(jlabel2,cc.xy(6,14)); + + _initialHeapSizeField.setName("initialHeapSizeField"); + jpanel1.add(_initialHeapSizeField,cc.xy(4,12)); + + _maxHeapSizeField.setName("maxHeapSizeField"); + jpanel1.add(_maxHeapSizeField,cc.xy(4,14)); + + _maxHeapPercentField.setName("maxHeapPercentField"); + jpanel1.add(_maxHeapPercentField,cc.xy(8,14)); + + _initialHeapPercentField.setName("initialHeapPercentField"); + jpanel1.add(_initialHeapPercentField,cc.xy(8,12)); + + JLabel jlabel3 = new JLabel(); + jlabel3.setText(Messages.getString("availableMemory")); + jpanel1.add(jlabel3,cc.xy(10,12)); + + JLabel jlabel4 = new JLabel(); + jlabel4.setText(Messages.getString("availableMemory")); + jpanel1.add(jlabel4,cc.xy(10,14)); + + jpanel1.add(createPanel1(),cc.xywh(2,18,9,1)); + TitledSeparator titledseparator1 = new TitledSeparator(); + titledseparator1.setText(Messages.getString("searchOptions")); + jpanel1.add(titledseparator1,cc.xywh(2,4,9,1)); + + TitledSeparator titledseparator2 = new TitledSeparator(); + titledseparator2.setText(Messages.getString("options")); + jpanel1.add(titledseparator2,cc.xywh(2,10,9,1)); + + jpanel1.add(createPanel2(),cc.xywh(4,2,7,1)); + _requires64BitCheck.setActionCommand(Messages.getString("requires64Bit")); + _requires64BitCheck.setName("requires64BitCheck"); + _requires64BitCheck.setText(Messages.getString("requires64Bit")); + _requires64BitCheck.setToolTipText(Messages.getString("requires64BitTip")); + jpanel1.add(_requires64BitCheck,cc.xywh(8,8,3,1)); + + _requiresJdkCheck.setActionCommand(Messages.getString("requiresJdk")); + _requiresJdkCheck.setName("requiresJdkCheck"); + _requiresJdkCheck.setText(Messages.getString("requiresJdk")); + jpanel1.add(_requiresJdkCheck,cc.xywh(8,6,3,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9,10,11 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }); + return jpanel1; + } + + public JPanel createPanel1() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _varCombo.setName("varCombo"); + jpanel1.add(_varCombo,cc.xy(3,1)); + + _propertyButton.setActionCommand("Add"); + _propertyButton.setIcon(loadImage("images/edit_add16.png")); + _propertyButton.setName("propertyButton"); + _propertyButton.setText(Messages.getString("property")); + _propertyButton.setToolTipText(Messages.getString("propertyTip")); + jpanel1.add(_propertyButton,cc.xy(5,1)); + + _optionButton.setActionCommand("Add"); + _optionButton.setIcon(loadImage("images/edit_add16.png")); + _optionButton.setName("optionButton"); + _optionButton.setText(Messages.getString("option")); + _optionButton.setToolTipText(Messages.getString("optionTip")); + jpanel1.add(_optionButton,cc.xy(7,1)); + + _envPropertyButton.setActionCommand("Add"); + _envPropertyButton.setIcon(loadImage("images/edit_add16.png")); + _envPropertyButton.setName("envPropertyButton"); + _envPropertyButton.setText(Messages.getString("property")); + _envPropertyButton.setToolTipText(Messages.getString("propertyTip")); + jpanel1.add(_envPropertyButton,cc.xy(5,3)); + + JLabel jlabel1 = new JLabel(); + jlabel1.setText(Messages.getString("varsAndRegistry")); + jpanel1.add(jlabel1,cc.xy(1,1)); + + JLabel jlabel2 = new JLabel(); + jlabel2.setIcon(loadImage("images/asterix.gif")); + jlabel2.setText(Messages.getString("envVar")); + jpanel1.add(jlabel2,cc.xy(1,3)); + + _envOptionButton.setActionCommand("Add"); + _envOptionButton.setIcon(loadImage("images/edit_add16.png")); + _envOptionButton.setName("envOptionButton"); + _envOptionButton.setText(Messages.getString("option")); + _envOptionButton.setToolTipText(Messages.getString("optionTip")); + jpanel1.add(_envOptionButton,cc.xy(7,3)); + + _envVarField.setName("envVarField"); + jpanel1.add(_envVarField,cc.xy(3,3)); + + addFillComponents(jpanel1,new int[]{ 2,4,6 },new int[]{ 2 }); + return jpanel1; + } + + public JPanel createPanel2() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE","CENTER:DEFAULT:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _jrePathField.setName("jrePathField"); + _jrePathField.setToolTipText(Messages.getString("jrePathTip")); + jpanel1.add(_jrePathField,cc.xywh(1,1,5,1)); + + addFillComponents(jpanel1,new int[]{ 2,3,4,5 },new int[0]); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/JreForm.jfrm b/launch4j/src/net/sf/launch4j/form/JreForm.jfrm index ffb56c9e3d44542503870a802fc02046a9eb25c0..a666a8d1798ea23fe51e68048ccf652fa4d67992 100644 GIT binary patch literal 19263 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 n91>i@zh%hHOZ7G{)o@-iew7NrTv!!?MT!U*< diff --git a/launch4j/src/net/sf/launch4j/form/Messages.java b/launch4j/src/net/sf/launch4j/form/Messages.java index d995a22..1529ed1 100644 --- a/launch4j/src/net/sf/launch4j/form/Messages.java +++ b/launch4j/src/net/sf/launch4j/form/Messages.java @@ -1,55 +1,55 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.form; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.form.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.form; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.form.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/launch4j/src/net/sf/launch4j/form/MessagesForm.java b/launch4j/src/net/sf/launch4j/form/MessagesForm.java index f2e8723..b456d9a 100644 --- a/launch4j/src/net/sf/launch4j/form/MessagesForm.java +++ b/launch4j/src/net/sf/launch4j/form/MessagesForm.java @@ -1,183 +1,183 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - -public abstract class MessagesForm extends JPanel -{ - protected final JTextArea _startupErrTextArea = new JTextArea(); - protected final JTextArea _bundledJreErrTextArea = new JTextArea(); - protected final JTextArea _jreVersionErrTextArea = new JTextArea(); - protected final JTextArea _launcherErrTextArea = new JTextArea(); - protected final JCheckBox _messagesCheck = new JCheckBox(); - protected final JTextArea _instanceAlreadyExistsMsgTextArea = new JTextArea(); - - /** - * Default constructor - */ - public MessagesForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _startupErrTextArea.setName("startupErrTextArea"); - JScrollPane jscrollpane1 = new JScrollPane(); - jscrollpane1.setViewportView(_startupErrTextArea); - jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane1,cc.xy(4,4)); - - _bundledJreErrTextArea.setName("bundledJreErrTextArea"); - JScrollPane jscrollpane2 = new JScrollPane(); - jscrollpane2.setViewportView(_bundledJreErrTextArea); - jscrollpane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane2,cc.xy(4,6)); - - _jreVersionErrTextArea.setName("jreVersionErrTextArea"); - _jreVersionErrTextArea.setToolTipText(Messages.getString("jreVersionErrTip")); - JScrollPane jscrollpane3 = new JScrollPane(); - jscrollpane3.setViewportView(_jreVersionErrTextArea); - jscrollpane3.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane3,cc.xy(4,8)); - - _launcherErrTextArea.setName("launcherErrTextArea"); - JScrollPane jscrollpane4 = new JScrollPane(); - jscrollpane4.setViewportView(_launcherErrTextArea); - jscrollpane4.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane4.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane4,cc.xy(4,10)); - - JLabel jlabel1 = new JLabel(); - jlabel1.setText(Messages.getString("startupErr")); - jpanel1.add(jlabel1,new CellConstraints(2,4,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - JLabel jlabel2 = new JLabel(); - jlabel2.setText(Messages.getString("bundledJreErr")); - jpanel1.add(jlabel2,new CellConstraints(2,6,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - JLabel jlabel3 = new JLabel(); - jlabel3.setText(Messages.getString("jreVersionErr")); - jpanel1.add(jlabel3,new CellConstraints(2,8,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - JLabel jlabel4 = new JLabel(); - jlabel4.setText(Messages.getString("launcherErr")); - jpanel1.add(jlabel4,new CellConstraints(2,10,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - _messagesCheck.setActionCommand("Add version information"); - _messagesCheck.setName("messagesCheck"); - _messagesCheck.setText(Messages.getString("addMessages")); - jpanel1.add(_messagesCheck,cc.xy(4,2)); - - JLabel jlabel5 = new JLabel(); - jlabel5.setText(Messages.getString("instanceAlreadyExistsMsg")); - jpanel1.add(jlabel5,new CellConstraints(2,12,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); - - _instanceAlreadyExistsMsgTextArea.setName("instanceAlreadyExistsMsgTextArea"); - _instanceAlreadyExistsMsgTextArea.setToolTipText(Messages.getString("instanceAlreadyExistsMsgTip")); - JScrollPane jscrollpane5 = new JScrollPane(); - jscrollpane5.setViewportView(_instanceAlreadyExistsMsgTextArea); - jscrollpane5.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - jscrollpane5.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - jpanel1.add(jscrollpane5,cc.xy(4,12)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +public abstract class MessagesForm extends JPanel +{ + protected final JTextArea _startupErrTextArea = new JTextArea(); + protected final JTextArea _jreNotFoundErrTextArea = new JTextArea(); + protected final JTextArea _jreVersionErrTextArea = new JTextArea(); + protected final JTextArea _launcherErrTextArea = new JTextArea(); + protected final JCheckBox _messagesCheck = new JCheckBox(); + protected final JTextArea _instanceAlreadyExistsMsgTextArea = new JTextArea(); + + /** + * Default constructor + */ + public MessagesForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:3DLU:NONE,FILL:DEFAULT:GROW(1.0),CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _startupErrTextArea.setName("startupErrTextArea"); + JScrollPane jscrollpane1 = new JScrollPane(); + jscrollpane1.setViewportView(_startupErrTextArea); + jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane1,cc.xy(4,4)); + + _jreNotFoundErrTextArea.setName("jreNotFoundErrTextArea"); + JScrollPane jscrollpane2 = new JScrollPane(); + jscrollpane2.setViewportView(_jreNotFoundErrTextArea); + jscrollpane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane2,cc.xy(4,6)); + + _jreVersionErrTextArea.setName("jreVersionErrTextArea"); + _jreVersionErrTextArea.setToolTipText(Messages.getString("jreVersionErrTip")); + JScrollPane jscrollpane3 = new JScrollPane(); + jscrollpane3.setViewportView(_jreVersionErrTextArea); + jscrollpane3.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane3,cc.xy(4,8)); + + _launcherErrTextArea.setName("launcherErrTextArea"); + JScrollPane jscrollpane4 = new JScrollPane(); + jscrollpane4.setViewportView(_launcherErrTextArea); + jscrollpane4.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane4.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane4,cc.xy(4,10)); + + JLabel jlabel1 = new JLabel(); + jlabel1.setText(Messages.getString("startupErr")); + jpanel1.add(jlabel1,new CellConstraints(2,4,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + JLabel jlabel2 = new JLabel(); + jlabel2.setText(Messages.getString("jreNotFoundErr")); + jpanel1.add(jlabel2,new CellConstraints(2,6,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + JLabel jlabel3 = new JLabel(); + jlabel3.setText(Messages.getString("jreVersionErr")); + jpanel1.add(jlabel3,new CellConstraints(2,8,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + JLabel jlabel4 = new JLabel(); + jlabel4.setText(Messages.getString("launcherErr")); + jpanel1.add(jlabel4,new CellConstraints(2,10,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + _messagesCheck.setActionCommand("Add version information"); + _messagesCheck.setName("messagesCheck"); + _messagesCheck.setText(Messages.getString("addMessages")); + jpanel1.add(_messagesCheck,cc.xy(4,2)); + + JLabel jlabel5 = new JLabel(); + jlabel5.setText(Messages.getString("instanceAlreadyExistsMsg")); + jpanel1.add(jlabel5,new CellConstraints(2,12,1,1,CellConstraints.DEFAULT,CellConstraints.TOP)); + + _instanceAlreadyExistsMsgTextArea.setName("instanceAlreadyExistsMsgTextArea"); + _instanceAlreadyExistsMsgTextArea.setToolTipText(Messages.getString("instanceAlreadyExistsMsgTip")); + JScrollPane jscrollpane5 = new JScrollPane(); + jscrollpane5.setViewportView(_instanceAlreadyExistsMsgTextArea); + jscrollpane5.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jscrollpane5.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jpanel1.add(jscrollpane5,cc.xy(4,12)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/MessagesForm.jfrm b/launch4j/src/net/sf/launch4j/form/MessagesForm.jfrm index e8044dfd7c08649042cfd360307ebd9eac7cad5f..bc36e1d37a950485c4dc8eafdf0c4016b2412188 100644 GIT binary patch literal 9155 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 diff --git a/launch4j/src/net/sf/launch4j/form/SingleInstanceForm.java b/launch4j/src/net/sf/launch4j/form/SingleInstanceForm.java index 2bfe724..7a2eb2e 100644 --- a/launch4j/src/net/sf/launch4j/form/SingleInstanceForm.java +++ b/launch4j/src/net/sf/launch4j/form/SingleInstanceForm.java @@ -1,141 +1,141 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -public abstract class SingleInstanceForm extends JPanel -{ - protected final JLabel _splashFileLabel = new JLabel(); - protected final JTextField _mutexNameField = new JTextField(); - protected final JCheckBox _singleInstanceCheck = new JCheckBox(); - protected final JTextField _windowTitleField = new JTextField(); - protected final JLabel _splashFileLabel1 = new JLabel(); - - /** - * Default constructor - */ - public SingleInstanceForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _splashFileLabel.setIcon(loadImage("images/asterix.gif")); - _splashFileLabel.setName("splashFileLabel"); - _splashFileLabel.setText(Messages.getString("mutexName")); - jpanel1.add(_splashFileLabel,cc.xy(2,4)); - - _mutexNameField.setName("mutexNameField"); - _mutexNameField.setToolTipText(Messages.getString("mutexNameTip")); - jpanel1.add(_mutexNameField,cc.xywh(4,4,2,1)); - - _singleInstanceCheck.setActionCommand("Enable splash screen"); - _singleInstanceCheck.setName("singleInstanceCheck"); - _singleInstanceCheck.setText(Messages.getString("enableSingleInstance")); - jpanel1.add(_singleInstanceCheck,cc.xywh(4,2,2,1)); - - _windowTitleField.setName("windowTitleField"); - _windowTitleField.setToolTipText(Messages.getString("windowTitleTip")); - jpanel1.add(_windowTitleField,cc.xywh(4,6,2,1)); - - _splashFileLabel1.setName("splashFileLabel"); - _splashFileLabel1.setText(Messages.getString("windowTitle")); - jpanel1.add(_splashFileLabel1,cc.xy(2,6)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6 },new int[]{ 1,2,3,4,5,6,7 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +public abstract class SingleInstanceForm extends JPanel +{ + protected final JLabel _splashFileLabel = new JLabel(); + protected final JTextField _mutexNameField = new JTextField(); + protected final JCheckBox _singleInstanceCheck = new JCheckBox(); + protected final JTextField _windowTitleField = new JTextField(); + protected final JLabel _splashFileLabel1 = new JLabel(); + + /** + * Default constructor + */ + public SingleInstanceForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _splashFileLabel.setIcon(loadImage("images/asterix.gif")); + _splashFileLabel.setName("splashFileLabel"); + _splashFileLabel.setText(Messages.getString("mutexName")); + jpanel1.add(_splashFileLabel,cc.xy(2,4)); + + _mutexNameField.setName("mutexNameField"); + _mutexNameField.setToolTipText(Messages.getString("mutexNameTip")); + jpanel1.add(_mutexNameField,cc.xywh(4,4,2,1)); + + _singleInstanceCheck.setActionCommand("Enable splash screen"); + _singleInstanceCheck.setName("singleInstanceCheck"); + _singleInstanceCheck.setText(Messages.getString("enableSingleInstance")); + jpanel1.add(_singleInstanceCheck,cc.xywh(4,2,2,1)); + + _windowTitleField.setName("windowTitleField"); + _windowTitleField.setToolTipText(Messages.getString("windowTitleTip")); + jpanel1.add(_windowTitleField,cc.xywh(4,6,2,1)); + + _splashFileLabel1.setName("splashFileLabel"); + _splashFileLabel1.setText(Messages.getString("windowTitle")); + jpanel1.add(_splashFileLabel1,cc.xy(2,6)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6 },new int[]{ 1,2,3,4,5,6,7 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/SplashForm.java b/launch4j/src/net/sf/launch4j/form/SplashForm.java index 7a3085a..f391733 100644 --- a/launch4j/src/net/sf/launch4j/form/SplashForm.java +++ b/launch4j/src/net/sf/launch4j/form/SplashForm.java @@ -1,166 +1,167 @@ -package net.sf.launch4j.form; - -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -public abstract class SplashForm extends JPanel -{ - protected final JLabel _splashFileLabel = new JLabel(); - protected final JLabel _waitForWindowLabel = new JLabel(); - protected final JLabel _timeoutLabel = new JLabel(); - protected final JCheckBox _timeoutErrCheck = new JCheckBox(); - protected final JTextField _splashFileField = new JTextField(); - protected final JTextField _timeoutField = new JTextField(); - protected final JButton _splashFileButton = new JButton(); - protected final JCheckBox _splashCheck = new JCheckBox(); - protected final JCheckBox _waitForWindowCheck = new JCheckBox(); - - /** - * Default constructor - */ - public SplashForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _splashFileLabel.setIcon(loadImage("images/asterix.gif")); - _splashFileLabel.setName("splashFileLabel"); - _splashFileLabel.setText(Messages.getString("splashFile")); - jpanel1.add(_splashFileLabel,cc.xy(2,4)); - - _waitForWindowLabel.setName("waitForWindowLabel"); - _waitForWindowLabel.setText(Messages.getString("waitForWindow")); - jpanel1.add(_waitForWindowLabel,cc.xy(2,6)); - - _timeoutLabel.setIcon(loadImage("images/asterix.gif")); - _timeoutLabel.setName("timeoutLabel"); - _timeoutLabel.setText(Messages.getString("timeout")); - jpanel1.add(_timeoutLabel,cc.xy(2,8)); - - _timeoutErrCheck.setActionCommand("Signal error on timeout"); - _timeoutErrCheck.setName("timeoutErrCheck"); - _timeoutErrCheck.setText(Messages.getString("timeoutErr")); - _timeoutErrCheck.setToolTipText(Messages.getString("timeoutErrTip")); - jpanel1.add(_timeoutErrCheck,cc.xywh(4,10,2,1)); - - _splashFileField.setName("splashFileField"); - _splashFileField.setToolTipText(Messages.getString("splashFileTip")); - jpanel1.add(_splashFileField,cc.xywh(4,4,2,1)); - - _timeoutField.setName("timeoutField"); - _timeoutField.setToolTipText(Messages.getString("timeoutTip")); - jpanel1.add(_timeoutField,cc.xy(4,8)); - - _splashFileButton.setIcon(loadImage("images/open16.png")); - _splashFileButton.setName("splashFileButton"); - jpanel1.add(_splashFileButton,cc.xy(7,4)); - - _splashCheck.setActionCommand("Enable splash screen"); - _splashCheck.setName("splashCheck"); - _splashCheck.setText(Messages.getString("enableSplash")); - jpanel1.add(_splashCheck,cc.xywh(4,2,2,1)); - - _waitForWindowCheck.setActionCommand("Close splash screen when an application window appears"); - _waitForWindowCheck.setName("waitForWindowCheck"); - _waitForWindowCheck.setText(Messages.getString("waitForWindowText")); - jpanel1.add(_waitForWindowCheck,cc.xywh(4,6,2,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.UIManager; + +public abstract class SplashForm extends JPanel +{ + protected final JLabel _splashFileLabel = new JLabel(); + protected final JLabel _waitForWindowLabel = new JLabel(); + protected final JLabel _timeoutLabel = new JLabel(); + protected final JCheckBox _timeoutErrCheck = new JCheckBox(); + protected final JTextField _splashFileField = new JTextField(); + protected final JTextField _timeoutField = new JTextField(); + protected final JButton _splashFileButton = new JButton(); + protected final JCheckBox _splashCheck = new JCheckBox(); + protected final JCheckBox _waitForWindowCheck = new JCheckBox(); + + /** + * Default constructor + */ + public SplashForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE,FILL:26PX:NONE,FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _splashFileLabel.setIcon(loadImage("images/asterix.gif")); + _splashFileLabel.setName("splashFileLabel"); + _splashFileLabel.setText(Messages.getString("splashFile")); + jpanel1.add(_splashFileLabel,cc.xy(2,4)); + + _waitForWindowLabel.setName("waitForWindowLabel"); + _waitForWindowLabel.setText(Messages.getString("waitForWindow")); + jpanel1.add(_waitForWindowLabel,cc.xy(2,6)); + + _timeoutLabel.setIcon(loadImage("images/asterix.gif")); + _timeoutLabel.setName("timeoutLabel"); + _timeoutLabel.setText(Messages.getString("timeout")); + jpanel1.add(_timeoutLabel,cc.xy(2,8)); + + _timeoutErrCheck.setActionCommand("Signal error on timeout"); + _timeoutErrCheck.setName("timeoutErrCheck"); + _timeoutErrCheck.setText(Messages.getString("timeoutErr")); + _timeoutErrCheck.setToolTipText(Messages.getString("timeoutErrTip")); + jpanel1.add(_timeoutErrCheck,cc.xywh(4,10,2,1)); + + _splashFileField.setName("splashFileField"); + _splashFileField.setToolTipText(Messages.getString("splashFileTip")); + jpanel1.add(_splashFileField,cc.xywh(4,4,2,1)); + + _timeoutField.setName("timeoutField"); + _timeoutField.setToolTipText(Messages.getString("timeoutTip")); + jpanel1.add(_timeoutField,cc.xy(4,8)); + + _splashFileButton.setIcon(UIManager.getIcon("Tree.closedIcon")); + _splashFileButton.setName("splashFileButton"); + jpanel1.add(_splashFileButton,cc.xy(7,4)); + + _splashCheck.setActionCommand("Enable splash screen"); + _splashCheck.setName("splashCheck"); + _splashCheck.setText(Messages.getString("enableSplash")); + jpanel1.add(_splashCheck,cc.xywh(4,2,2,1)); + + _waitForWindowCheck.setActionCommand("Close splash screen when an application window appears"); + _waitForWindowCheck.setName("waitForWindowCheck"); + _waitForWindowCheck.setText(Messages.getString("waitForWindowText")); + jpanel1.add(_waitForWindowCheck,cc.xywh(4,6,2,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java b/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java index 92cfda2..5afd615 100644 --- a/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java +++ b/launch4j/src/net/sf/launch4j/form/VersionInfoForm.java @@ -1,251 +1,255 @@ -package net.sf.launch4j.form; - -import com.jeta.forms.components.separator.TitledSeparator; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import javax.swing.Box; -import javax.swing.ImageIcon; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JTextField; - -public abstract class VersionInfoForm extends JPanel -{ - protected final JCheckBox _versionInfoCheck = new JCheckBox(); - protected final JLabel _fileVersionLabel = new JLabel(); - protected final JTextField _fileVersionField = new JTextField(); - protected final TitledSeparator _addVersionInfoSeparator = new TitledSeparator(); - protected final JLabel _productVersionLabel = new JLabel(); - protected final JTextField _productVersionField = new JTextField(); - protected final JLabel _fileDescriptionLabel = new JLabel(); - protected final JTextField _fileDescriptionField = new JTextField(); - protected final JLabel _copyrightLabel = new JLabel(); - protected final JTextField _copyrightField = new JTextField(); - protected final JLabel _txtFileVersionLabel = new JLabel(); - protected final JTextField _txtFileVersionField = new JTextField(); - protected final JLabel _txtProductVersionLabel = new JLabel(); - protected final JTextField _txtProductVersionField = new JTextField(); - protected final JLabel _productNameLabel = new JLabel(); - protected final JTextField _productNameField = new JTextField(); - protected final JLabel _originalFilenameLabel = new JLabel(); - protected final JTextField _originalFilenameField = new JTextField(); - protected final JLabel _internalNameLabel = new JLabel(); - protected final JTextField _internalNameField = new JTextField(); - protected final JLabel _companyNameLabel = new JLabel(); - protected final JTextField _companyNameField = new JTextField(); - protected final JLabel _languageLabel = new JLabel(); - protected final JComboBox _languageCombo = new JComboBox(); - protected final JLabel _trademarksLabel = new JLabel(); - protected final JTextField _trademarksField = new JTextField(); - - /** - * Default constructor - */ - public VersionInfoForm() - { - initializePanel(); - } - - /** - * Adds fill components to empty cells in the first row and first column of the grid. - * This ensures that the grid spacing will be the same as shown in the designer. - * @param cols an array of column indices in the first row where fill components should be added. - * @param rows an array of row indices in the first column where fill components should be added. - */ - void addFillComponents( Container panel, int[] cols, int[] rows ) - { - Dimension filler = new Dimension(10,10); - - boolean filled_cell_11 = false; - CellConstraints cc = new CellConstraints(); - if ( cols.length > 0 && rows.length > 0 ) - { - if ( cols[0] == 1 && rows[0] == 1 ) - { - /** add a rigid area */ - panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); - filled_cell_11 = true; - } - } - - for( int index = 0; index < cols.length; index++ ) - { - if ( cols[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); - } - - for( int index = 0; index < rows.length; index++ ) - { - if ( rows[index] == 1 && filled_cell_11 ) - { - continue; - } - panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); - } - - } - - /** - * Helper method to load an image file from the CLASSPATH - * @param imageName the package and name of the file to load relative to the CLASSPATH - * @return an ImageIcon instance with the specified image file - * @throws IllegalArgumentException if the image resource cannot be loaded. - */ - public ImageIcon loadImage( String imageName ) - { - try - { - ClassLoader classloader = getClass().getClassLoader(); - java.net.URL url = classloader.getResource( imageName ); - if ( url != null ) - { - ImageIcon icon = new ImageIcon( url ); - return icon; - } - } - catch( Exception e ) - { - e.printStackTrace(); - } - throw new IllegalArgumentException( "Unable to load image: " + imageName ); - } - - public JPanel createPanel() - { - JPanel jpanel1 = new JPanel(); - FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:7DLU:NONE,RIGHT:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); - CellConstraints cc = new CellConstraints(); - jpanel1.setLayout(formlayout1); - - _versionInfoCheck.setActionCommand("Add version information"); - _versionInfoCheck.setName("versionInfoCheck"); - _versionInfoCheck.setText(Messages.getString("addVersionInfo")); - jpanel1.add(_versionInfoCheck,cc.xywh(4,2,5,1)); - - _fileVersionLabel.setIcon(loadImage("images/asterix.gif")); - _fileVersionLabel.setName("fileVersionLabel"); - _fileVersionLabel.setText(Messages.getString("fileVersion")); - jpanel1.add(_fileVersionLabel,cc.xy(2,4)); - - _fileVersionField.setName("fileVersionField"); - _fileVersionField.setToolTipText(Messages.getString("fileVersionTip")); - jpanel1.add(_fileVersionField,cc.xy(4,4)); - - _addVersionInfoSeparator.setName("addVersionInfoSeparator"); - _addVersionInfoSeparator.setText("Additional information"); - jpanel1.add(_addVersionInfoSeparator,cc.xywh(2,10,7,1)); - - _productVersionLabel.setIcon(loadImage("images/asterix.gif")); - _productVersionLabel.setName("productVersionLabel"); - _productVersionLabel.setText(Messages.getString("productVersion")); - jpanel1.add(_productVersionLabel,cc.xy(2,12)); - - _productVersionField.setName("productVersionField"); - _productVersionField.setToolTipText(Messages.getString("productVersionTip")); - jpanel1.add(_productVersionField,cc.xy(4,12)); - - _fileDescriptionLabel.setIcon(loadImage("images/asterix.gif")); - _fileDescriptionLabel.setName("fileDescriptionLabel"); - _fileDescriptionLabel.setText(Messages.getString("fileDescription")); - jpanel1.add(_fileDescriptionLabel,cc.xy(2,6)); - - _fileDescriptionField.setName("fileDescriptionField"); - _fileDescriptionField.setToolTipText(Messages.getString("fileDescriptionTip")); - jpanel1.add(_fileDescriptionField,cc.xywh(4,6,5,1)); - - _copyrightLabel.setIcon(loadImage("images/asterix.gif")); - _copyrightLabel.setName("copyrightLabel"); - _copyrightLabel.setText(Messages.getString("copyright")); - jpanel1.add(_copyrightLabel,cc.xy(2,8)); - - _copyrightField.setName("copyrightField"); - jpanel1.add(_copyrightField,cc.xywh(4,8,5,1)); - - _txtFileVersionLabel.setIcon(loadImage("images/asterix.gif")); - _txtFileVersionLabel.setName("txtFileVersionLabel"); - _txtFileVersionLabel.setText(Messages.getString("txtFileVersion")); - jpanel1.add(_txtFileVersionLabel,cc.xy(6,4)); - - _txtFileVersionField.setName("txtFileVersionField"); - _txtFileVersionField.setToolTipText(Messages.getString("txtFileVersionTip")); - jpanel1.add(_txtFileVersionField,cc.xy(8,4)); - - _txtProductVersionLabel.setIcon(loadImage("images/asterix.gif")); - _txtProductVersionLabel.setName("txtProductVersionLabel"); - _txtProductVersionLabel.setText(Messages.getString("txtProductVersion")); - jpanel1.add(_txtProductVersionLabel,cc.xy(6,12)); - - _txtProductVersionField.setName("txtProductVersionField"); - _txtProductVersionField.setToolTipText(Messages.getString("txtProductVersionTip")); - jpanel1.add(_txtProductVersionField,cc.xy(8,12)); - - _productNameLabel.setIcon(loadImage("images/asterix.gif")); - _productNameLabel.setName("productNameLabel"); - _productNameLabel.setText(Messages.getString("productName")); - jpanel1.add(_productNameLabel,cc.xy(2,14)); - - _productNameField.setName("productNameField"); - jpanel1.add(_productNameField,cc.xywh(4,14,5,1)); - - _originalFilenameLabel.setIcon(loadImage("images/asterix.gif")); - _originalFilenameLabel.setName("originalFilenameLabel"); - _originalFilenameLabel.setText(Messages.getString("originalFilename")); - jpanel1.add(_originalFilenameLabel,cc.xy(2,20)); - - _originalFilenameField.setName("originalFilenameField"); - _originalFilenameField.setToolTipText(Messages.getString("originalFilenameTip")); - jpanel1.add(_originalFilenameField,cc.xywh(4,20,5,1)); - - _internalNameLabel.setIcon(loadImage("images/asterix.gif")); - _internalNameLabel.setName("internalNameLabel"); - _internalNameLabel.setText(Messages.getString("internalName")); - jpanel1.add(_internalNameLabel,cc.xy(2,18)); - - _internalNameField.setName("internalNameField"); - _internalNameField.setToolTipText(Messages.getString("internalNameTip")); - jpanel1.add(_internalNameField,cc.xywh(4,18,5,1)); - - _companyNameLabel.setName("companyNameLabel"); - _companyNameLabel.setText(Messages.getString("companyName")); - jpanel1.add(_companyNameLabel,cc.xy(2,16)); - - _companyNameField.setName("companyNameField"); - jpanel1.add(_companyNameField,cc.xywh(4,16,5,1)); - - _languageLabel.setName("languageLabel"); - _languageLabel.setText(Messages.getString("language")); - jpanel1.add(_languageLabel,cc.xy(2,24)); - - _languageCombo.setName("languageCombo"); - jpanel1.add(_languageCombo,cc.xywh(4,24,3,1)); - - _trademarksLabel.setName("trademarksLabel"); - _trademarksLabel.setText(Messages.getString("trademarks")); - jpanel1.add(_trademarksLabel,cc.xy(2,22)); - - _trademarksField.setName("trademarksField"); - jpanel1.add(_trademarksField,cc.xywh(4,22,5,1)); - - addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 }); - return jpanel1; - } - - /** - * Initializer - */ - protected void initializePanel() - { - setLayout(new BorderLayout()); - add(createPanel(), BorderLayout.CENTER); - } - - -} +package net.sf.launch4j.form; + +import com.jeta.forms.components.separator.TitledSeparator; +import com.jgoodies.forms.layout.CellConstraints; +import com.jgoodies.forms.layout.FormLayout; + +import net.sf.launch4j.config.LanguageID; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + + +public abstract class VersionInfoForm extends JPanel +{ + protected final JCheckBox _versionInfoCheck = new JCheckBox(); + protected final JLabel _fileVersionLabel = new JLabel(); + protected final JTextField _fileVersionField = new JTextField(); + protected final TitledSeparator _addVersionInfoSeparator = new TitledSeparator(); + protected final JLabel _productVersionLabel = new JLabel(); + protected final JTextField _productVersionField = new JTextField(); + protected final JLabel _fileDescriptionLabel = new JLabel(); + protected final JTextField _fileDescriptionField = new JTextField(); + protected final JLabel _copyrightLabel = new JLabel(); + protected final JTextField _copyrightField = new JTextField(); + protected final JLabel _txtFileVersionLabel = new JLabel(); + protected final JTextField _txtFileVersionField = new JTextField(); + protected final JLabel _txtProductVersionLabel = new JLabel(); + protected final JTextField _txtProductVersionField = new JTextField(); + protected final JLabel _productNameLabel = new JLabel(); + protected final JTextField _productNameField = new JTextField(); + protected final JLabel _originalFilenameLabel = new JLabel(); + protected final JTextField _originalFilenameField = new JTextField(); + protected final JLabel _internalNameLabel = new JLabel(); + protected final JTextField _internalNameField = new JTextField(); + protected final JLabel _companyNameLabel = new JLabel(); + protected final JTextField _companyNameField = new JTextField(); + protected final JLabel _languageLabel = new JLabel(); + protected final JComboBox _languageCombo = new JComboBox(); + protected final JLabel _trademarksLabel = new JLabel(); + protected final JTextField _trademarksField = new JTextField(); + + /** + * Default constructor + */ + public VersionInfoForm() + { + initializePanel(); + } + + /** + * Adds fill components to empty cells in the first row and first column of the grid. + * This ensures that the grid spacing will be the same as shown in the designer. + * @param cols an array of column indices in the first row where fill components should be added. + * @param rows an array of row indices in the first column where fill components should be added. + */ + void addFillComponents( Container panel, int[] cols, int[] rows ) + { + Dimension filler = new Dimension(10,10); + + boolean filled_cell_11 = false; + CellConstraints cc = new CellConstraints(); + if ( cols.length > 0 && rows.length > 0 ) + { + if ( cols[0] == 1 && rows[0] == 1 ) + { + /** add a rigid area */ + panel.add( Box.createRigidArea( filler ), cc.xy(1,1) ); + filled_cell_11 = true; + } + } + + for( int index = 0; index < cols.length; index++ ) + { + if ( cols[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(cols[index],1) ); + } + + for( int index = 0; index < rows.length; index++ ) + { + if ( rows[index] == 1 && filled_cell_11 ) + { + continue; + } + panel.add( Box.createRigidArea( filler ), cc.xy(1,rows[index]) ); + } + + } + + /** + * Helper method to load an image file from the CLASSPATH + * @param imageName the package and name of the file to load relative to the CLASSPATH + * @return an ImageIcon instance with the specified image file + * @throws IllegalArgumentException if the image resource cannot be loaded. + */ + public ImageIcon loadImage( String imageName ) + { + try + { + ClassLoader classloader = getClass().getClassLoader(); + java.net.URL url = classloader.getResource( imageName ); + if ( url != null ) + { + ImageIcon icon = new ImageIcon( url ); + return icon; + } + } + catch( Exception e ) + { + e.printStackTrace(); + } + throw new IllegalArgumentException( "Unable to load image: " + imageName ); + } + + public JPanel createPanel() + { + JPanel jpanel1 = new JPanel(); + FormLayout formlayout1 = new FormLayout("FILL:7DLU:NONE,RIGHT:MAX(65DLU;DEFAULT):NONE,FILL:3DLU:NONE,FILL:60DLU:NONE,FILL:7DLU:NONE,RIGHT:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:7DLU:NONE","CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:3DLU:NONE,CENTER:DEFAULT:NONE,CENTER:9DLU:NONE"); + CellConstraints cc = new CellConstraints(); + jpanel1.setLayout(formlayout1); + + _versionInfoCheck.setActionCommand("Add version information"); + _versionInfoCheck.setName("versionInfoCheck"); + _versionInfoCheck.setText(Messages.getString("addVersionInfo")); + jpanel1.add(_versionInfoCheck,cc.xywh(4,2,5,1)); + + _fileVersionLabel.setIcon(loadImage("images/asterix.gif")); + _fileVersionLabel.setName("fileVersionLabel"); + _fileVersionLabel.setText(Messages.getString("fileVersion")); + jpanel1.add(_fileVersionLabel,cc.xy(2,4)); + + _fileVersionField.setName("fileVersionField"); + _fileVersionField.setToolTipText(Messages.getString("fileVersionTip")); + jpanel1.add(_fileVersionField,cc.xy(4,4)); + + _addVersionInfoSeparator.setName("addVersionInfoSeparator"); + _addVersionInfoSeparator.setText("Additional information"); + jpanel1.add(_addVersionInfoSeparator,cc.xywh(2,10,7,1)); + + _productVersionLabel.setIcon(loadImage("images/asterix.gif")); + _productVersionLabel.setName("productVersionLabel"); + _productVersionLabel.setText(Messages.getString("productVersion")); + jpanel1.add(_productVersionLabel,cc.xy(2,12)); + + _productVersionField.setName("productVersionField"); + _productVersionField.setToolTipText(Messages.getString("productVersionTip")); + jpanel1.add(_productVersionField,cc.xy(4,12)); + + _fileDescriptionLabel.setIcon(loadImage("images/asterix.gif")); + _fileDescriptionLabel.setName("fileDescriptionLabel"); + _fileDescriptionLabel.setText(Messages.getString("fileDescription")); + jpanel1.add(_fileDescriptionLabel,cc.xy(2,6)); + + _fileDescriptionField.setName("fileDescriptionField"); + _fileDescriptionField.setToolTipText(Messages.getString("fileDescriptionTip")); + jpanel1.add(_fileDescriptionField,cc.xywh(4,6,5,1)); + + _copyrightLabel.setIcon(loadImage("images/asterix.gif")); + _copyrightLabel.setName("copyrightLabel"); + _copyrightLabel.setText(Messages.getString("copyright")); + jpanel1.add(_copyrightLabel,cc.xy(2,8)); + + _copyrightField.setName("copyrightField"); + jpanel1.add(_copyrightField,cc.xywh(4,8,5,1)); + + _txtFileVersionLabel.setIcon(loadImage("images/asterix.gif")); + _txtFileVersionLabel.setName("txtFileVersionLabel"); + _txtFileVersionLabel.setText(Messages.getString("txtFileVersion")); + jpanel1.add(_txtFileVersionLabel,cc.xy(6,4)); + + _txtFileVersionField.setName("txtFileVersionField"); + _txtFileVersionField.setToolTipText(Messages.getString("txtFileVersionTip")); + jpanel1.add(_txtFileVersionField,cc.xy(8,4)); + + _txtProductVersionLabel.setIcon(loadImage("images/asterix.gif")); + _txtProductVersionLabel.setName("txtProductVersionLabel"); + _txtProductVersionLabel.setText(Messages.getString("txtProductVersion")); + jpanel1.add(_txtProductVersionLabel,cc.xy(6,12)); + + _txtProductVersionField.setName("txtProductVersionField"); + _txtProductVersionField.setToolTipText(Messages.getString("txtProductVersionTip")); + jpanel1.add(_txtProductVersionField,cc.xy(8,12)); + + _productNameLabel.setIcon(loadImage("images/asterix.gif")); + _productNameLabel.setName("productNameLabel"); + _productNameLabel.setText(Messages.getString("productName")); + jpanel1.add(_productNameLabel,cc.xy(2,14)); + + _productNameField.setName("productNameField"); + jpanel1.add(_productNameField,cc.xywh(4,14,5,1)); + + _originalFilenameLabel.setIcon(loadImage("images/asterix.gif")); + _originalFilenameLabel.setName("originalFilenameLabel"); + _originalFilenameLabel.setText(Messages.getString("originalFilename")); + jpanel1.add(_originalFilenameLabel,cc.xy(2,20)); + + _originalFilenameField.setName("originalFilenameField"); + _originalFilenameField.setToolTipText(Messages.getString("originalFilenameTip")); + jpanel1.add(_originalFilenameField,cc.xywh(4,20,5,1)); + + _internalNameLabel.setIcon(loadImage("images/asterix.gif")); + _internalNameLabel.setName("internalNameLabel"); + _internalNameLabel.setText(Messages.getString("internalName")); + jpanel1.add(_internalNameLabel,cc.xy(2,18)); + + _internalNameField.setName("internalNameField"); + _internalNameField.setToolTipText(Messages.getString("internalNameTip")); + jpanel1.add(_internalNameField,cc.xywh(4,18,5,1)); + + _companyNameLabel.setName("companyNameLabel"); + _companyNameLabel.setText(Messages.getString("companyName")); + jpanel1.add(_companyNameLabel,cc.xy(2,16)); + + _companyNameField.setName("companyNameField"); + jpanel1.add(_companyNameField,cc.xywh(4,16,5,1)); + + _languageLabel.setName("languageLabel"); + _languageLabel.setText(Messages.getString("language")); + jpanel1.add(_languageLabel,cc.xy(2,24)); + + _languageCombo.setName("languageCombo"); + jpanel1.add(_languageCombo,cc.xywh(4,24,3,1)); + + _trademarksLabel.setName("trademarksLabel"); + _trademarksLabel.setText(Messages.getString("trademarks")); + jpanel1.add(_trademarksLabel,cc.xy(2,22)); + + _trademarksField.setName("trademarksField"); + jpanel1.add(_trademarksField,cc.xywh(4,22,5,1)); + + addFillComponents(jpanel1,new int[]{ 1,2,3,4,5,6,7,8,9 },new int[]{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 }); + return jpanel1; + } + + /** + * Initializer + */ + protected void initializePanel() + { + setLayout(new BorderLayout()); + add(createPanel(), BorderLayout.CENTER); + } + + +} diff --git a/launch4j/src/net/sf/launch4j/form/messages.properties b/launch4j/src/net/sf/launch4j/form/messages.properties index b50c32b..32caff3 100644 --- a/launch4j/src/net/sf/launch4j/form/messages.properties +++ b/launch4j/src/net/sf/launch4j/form/messages.properties @@ -1,161 +1,159 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2015 Grzegorz Kowal -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -log=Log - -outfile=Output file: -outfileTip=Output executable file. -stayAlive=Stay alive after launching a GUI application -restartOnCrash=Restart the application after a crash -restartOnCrashToolTip=When the application exits, any exit code other than 0 is considered a crash and the application will be started again -manifest=Wrapper manifest: -manifestTip=Wrapper manifest for User Account Control. -icon=Icon: -iconTip=Application icon. -jar=Jar: -jarTip=Application jar. -dontWrapJar=Dont't wrap the jar, launch only -cmdLine=Command line args: -cmdLineTip=Constant command line arguments passed to the application. -options=Options: -chdir=Change dir: -chdirTip=Change current directory to a location relative to the executable. Empty field has no effect, . - changes directory to the exe location. -priority=Process priority: -normalPriority=Normal -idlePriority=Idle -highPriority=High -downloadAndSupport=Java download and support -errorTitle=Error title: -errorTitleTip=Launch4j signals errors using a message box, you can set it's title to the application's name. -downloadUrl=Java download URL: -supportUrl=Support URL: - -new=New -accept=Accept -remove=Remove -customClassPath=Custom classpath -classPath=Classpath: -mainClass=Main class: -editClassPath=Edit item: -importClassPath=Import attributes from a jar's manifest. - -headerType=Header type: -gui=GUI -guiTooltip=Stable version of the GUI header which uses the javaw.exe launcher. -console=Console -consoleTooltip=Stable version of the console header which uses the java.exe launcher. -jniGui=JNI GUI (beta) -jniGuiTooltip=BETA version of the GUI header which launches the Java VM through JNI. -jniConsole=JNI Console (beta) -jniConsoleTooltip=BETA version of the console header which launches the Java VM through JNI. -objectFiles=Object files: -libs=w32api: -linkerOptions=Custom header - linker options - -enableSingleInstance=Allow only a single instance of the application -mutexName=Mutex name -mutexNameTip=Mutex name that will uniquely identify your application. -windowTitle=Window title -windowTitleTip=Title of the GUI application window to bring up on attempt to start a next instance. - -jrePath=Bundled JRE path: -jrePathTip=Bundled JRE path relative to the executable or absolute. -bundledJre64Bit=64-bit -bundledJre64BitTip=The bundled JRE is 64-bit, heap size will not be limited to the 32-bit maximum. -bundledJreAsFallback=Fallback option -bundledJreAsFallbackTip=When the fallback option is checked, the bundled JRE will be used only if the min/max search fails. By default the bundled JRE, if specified, is used as first. -searchOptions=Search options -options=Options -jreMin=Min JRE version: -jreMax=Max JRE version: -dontUsePrivateJres=Don't use private JREs -jvmOptions=JVM options: -jvmOptionsTip=Accepts everything you would normally pass to java/javaw launcher: assertion options, system properties and X options. -initialHeapSize=Initial heap size: -maxHeapSize=Max heap size: -availableMemory=% of available memory -addVariables=Add variables: -addVariablesTip=Add special variable or map environment variables to system properties. -exeDirVarTip=Executable's runtime directory path. -exeFileVarTip=Executable's runtime file path (directory and filename). -varsAndRegistry=Variables / registry: -envVar=Environment var: -property=Property -propertyTip=Map a variable to a system property. -option=Option -optionTip=Pass a JVM option using a variable. - -setVariables=Set variables: - -enableSplash=Enable splash screen -splashFile=Splash file: -splashFileTip=Splash screen file in BMP format. -waitForWindow=Wait for window -waitForWindowText=Close splash screen when an application window appears -timeout=Timeout [s]: -timeoutTip=Number of seconds after which the splash screen must close. Splash timeout may cause an error depending on splashTimeoutErr property. -timeoutErr=Signal error on timeout -timeoutErrTip=True signals an error on splash timeout, false closes the splash screen quietly. - -version=Version -additionalInfo=Additional information -addVersionInfo=Add version information -fileVersion=File version: -fileVersionTip=Version number 'x.x.x.x' -productVersion=Product version: -productVersionTip=Version number 'x.x.x.x' -fileDescription=File description: -fileDescriptionTip=File description presented to the user. -copyright=Copyright: -txtFileVersion=Free form: -txtFileVersionTip=Free form file version, for example '1.20.RC1'. -txtProductVersion=Free form: -txtProductVersionTip=Free form product version, for example '1.20.RC1'. -productName=Product name: -originalFilename=Original filename: -originalFilenameTip=Original name of the file without the path. Allows to determine whether a file has been renamed by a user. -internalName=Internal name: -internalNameTip=Internal name without extension, original filename or module name for example. -companyName=Company name: -trademarks=Trademarks: -language=Language: -charset=Charset: - -addMessages=Add custom messages -startupErr=Startup error: -bundledJreErr=Bundled JRE error: -jreVersionErr=JRE version error: -jreVersionErrTip=Launch4j will append the required version number at the end of this message. -launcherErr=Launcher error: -instanceAlreadyExistsMsg=Inst. already exists: -instanceAlreadyExistsMsgTip=Message displayed by single instance console applications if an instance already exists. +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2015 Grzegorz Kowal +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +log=Log + +outfile=Output file: +outfileTip=Output executable file. +stayAlive=Stay alive after launching a GUI application +restartOnCrash=Restart the application after a crash +restartOnCrashToolTip=When the application exits, any exit code other than 0 is considered a crash and the application will be started again +manifest=Wrapper manifest: +manifestTip=Wrapper manifest for User Account Control. +icon=Icon: +iconTip=Application icon. +jar=Jar: +jarTip=Application jar. +dontWrapJar=Dont't wrap the jar, launch only +cmdLine=Command line args: +cmdLineTip=Constant command line arguments passed to the application. +options=Options: +chdir=Change dir: +chdirTip=Change current directory to a location relative to the executable. Empty field has no effect, . - changes directory to the exe location. +priority=Process priority: +normalPriority=Normal +idlePriority=Idle +highPriority=High +downloadAndSupport=Java download and support +errorTitle=Error title: +errorTitleTip=Launch4j signals errors using a message box, you can set it's title to the application's name. +downloadUrl=Java download URL: +supportUrl=Support URL: + +new=New +accept=Accept +remove=Remove +customClassPath=Custom classpath +classPath=Classpath: +mainClass=Main class: +editClassPath=Edit item: +importClassPath=Import attributes from a jar's manifest. + +headerType=Header type: +gui=GUI +guiTooltip=Stable version of the GUI header which uses the javaw.exe launcher. +console=Console +consoleTooltip=Stable version of the console header which uses the java.exe launcher. +jniGui=JNI GUI (beta) +jniGuiTooltip=BETA version of the GUI header which launches the Java VM through JNI. +jniConsole=JNI Console (beta) +jniConsoleTooltip=BETA version of the console header which launches the Java VM through JNI. +objectFiles=Object files: +libs=w32api: +linkerOptions=Custom header - linker options + +enableSingleInstance=Allow only a single instance of the application +mutexName=Mutex name +mutexNameTip=Mutex name that will uniquely identify your application. +windowTitle=Window title +windowTitleTip=Title of the GUI application window to bring up on attempt to start a next instance. + +jrePath=JRE paths: +jrePathTip=JRE path(s) relative to the executable or absolute, for example 'myAppJre' or 'c:\\GlobalJre;%JAVA_HOME%'. +requiresJdk=JDK required +requires64Bit=64-Bit required +requires64BitTip=64-bit runtime is required so that the heap size will not be limited to the 32-bit maximum. +searchOptions=Search options +options=Options +jreMin=Min JRE version: +jreMax=Max JRE version: +jvmOptions=JVM options: +jvmOptionsTip=Accepts everything you would normally pass to java/javaw launcher: assertion options, system properties and X options. +initialHeapSize=Initial heap size: +maxHeapSize=Max heap size: +availableMemory=% of available memory +addVariables=Add variables: +addVariablesTip=Add special variable or map environment variables to system properties. +exeDirVarTip=Executable's runtime directory path. +exeFileVarTip=Executable's runtime file path (directory and filename). +varsAndRegistry=Variables / registry: +envVar=Environment var: +property=Property +propertyTip=Map a variable to a system property. +option=Option +optionTip=Pass a JVM option using a variable. + +setVariables=Set variables: + +enableSplash=Enable splash screen +splashFile=Splash file: +splashFileTip=Splash screen file in BMP format. +waitForWindow=Wait for window +waitForWindowText=Close splash screen when an application window appears +timeout=Timeout [s]: +timeoutTip=Number of seconds after which the splash screen must close. Splash timeout may cause an error depending on splashTimeoutErr property. +timeoutErr=Signal error on timeout +timeoutErrTip=True signals an error on splash timeout, false closes the splash screen quietly. + +version=Version +additionalInfo=Additional information +addVersionInfo=Add version information +fileVersion=File version: +fileVersionTip=Version number 'x.x.x.x' +productVersion=Product version: +productVersionTip=Version number 'x.x.x.x' +fileDescription=File description: +fileDescriptionTip=File description presented to the user. +copyright=Copyright: +txtFileVersion=Free form: +txtFileVersionTip=Free form file version, for example '1.20.RC1'. +txtProductVersion=Free form: +txtProductVersionTip=Free form product version, for example '1.20.RC1'. +productName=Product name: +originalFilename=Original filename: +originalFilenameTip=Original name of the file without the path. Allows to determine whether a file has been renamed by a user. +internalName=Internal name: +internalNameTip=Internal name without extension, original filename or module name for example. +companyName=Company name: +trademarks=Trademarks: +language=Language: +charset=Charset: + +addMessages=Add custom messages +startupErr=Startup error: +jreNotFoundErr=JRE error: +jreVersionErr=JRE version error: +jreVersionErrTip=Launch4j will append the required version number at the end of this message. +launcherErr=Launcher error: +instanceAlreadyExistsMsg=Inst. already exists: +instanceAlreadyExistsMsgTip=Message displayed by single instance console applications if an instance already exists. diff --git a/launch4j/src/net/sf/launch4j/form/messages_es.properties b/launch4j/src/net/sf/launch4j/form/messages_es.properties deleted file mode 100644 index fa77e0f..0000000 --- a/launch4j/src/net/sf/launch4j/form/messages_es.properties +++ /dev/null @@ -1,117 +0,0 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Martínez Ros -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -log = Registro - -outfile = Fichero de salida -outfileTip = Fichero ejecutable de salida. -errorTitle = T\u00EDtulo de error -errorTitleTip = Launch4j indica los errores usando una ventana de mensaje, usted puede ponerle el nombre de la aplicaci\u00F3n a esta ventana. -stayAlive = Mantener abierto despu\u00E9s de lanzar una aplicaci\u00F3n GUI -icon = Icono -iconTip = Icono de la aplicaci\u00F3n. -jar = Jar -jarTip = Jar de la aplicaci\u00F3n. -dontWrapJar = No empaquetar el jar, s\u00F3lo lanzar -cmdLine = Argumentos del jar -cmdLine = Argumentos de l\u00EDnea de \u00F3rdenes pasados a la aplicaci\u00F3n. -options = Opciones -chdir = Cambiar al directorio -chdirTip = Cambia el directorio actual a la localizaci\u00F3n relativa al ejecutable. Si el campo se deja vac\u00EDo, no tiene efecto, . - cambia el directorio a la localizaci\u00F3n del exe. -headerType = Tipo de cabecera -gui = GUI -console = Consola -objectFiles = Ficheros objeto -libs = w32api -linkerOptions = Cabecera personalizada - opciones del enlazador -jrePath = Ruta del JRE -jrePathTip = Ruta relativa al ejecutable del JRE. -jreMin = Versi\u00F3n m\u00EDnima del JRE -jreMax = Versi\u00F3n m\u00E1xima del JRE -jvmOptions = Argumentos de la JVM -jvmOptionsTip = Acepta cualquier argumento que normalmente se le pasar\u00EDa al lanzador java/javaw\: opciones assertion, propiedades de sistema y opciones X. -initialHeapSize = Tama\u00F1o inicial de la pila -maxHeapSize = Tama\u00F1o m\u00E1ximo de la pila -freeMemory=% of free memory -addVariables = A\u00F1adir variables -addVariablesTip = A\u00F1adir una variable especial o mapear variables de entorno a las propiedades del sistema. -exeDirVarTip = Ruta del directorio del ejecutable. -exeFileVarTip = Ruta del fichero ejecutable (directorio y nombre del fichero). -other = Otra -otherTip = Mapear una variable de entorno a una propiedad del sistema. -otherVarTip = Variable de entorno que mapear. -add = A\u00F1adir -specifyVar = Especificar variable de entorno que a\u00F1adir. -enableSplash = Activar pantalla de bienvenida -splashFile = Imagen -splashFileTip = Imagen en formato BMP para la pantalla de bienvenida. -waitForWindow = Esperar la ventana -waitForWindowText = Cerrar la pantalla de bienvenida cuando aparezca una ventana de la aplicaci\u00F3n -timeout = Tiempo de espera [s] -timeoutTip = Numero de segundos despu\u00E9s de los que la pantalla de bienvenida se debe cerrar. Esta propiedad puede causar provocar un error dependiendo de la propiedad splashTimeoutErr. -timeoutErr = Se\u00F1al de error asociada al tiempo de espera -timeoutErrTip = Marcado (true) se\u00F1ala un error despu\u00E9s del tiempo de espera de la pantalla de bienvenida, no marcado (false) cierra la pantalla de bienvenida silenciosamente -addVersionInfo = A\u00F1ade informaci\u00F3n sobre la versi\u00F3n -fileVersion = Versi\u00F3n del fichero -fileVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x' -additionalInfo = Informaci\u00F3n adicional -productVersion = Versi\u00F3n del producto -productVersionTip = N\u00FAmero de versi\u00F3n 'x.x.x.x' -fileDescription = Descripci\u00F3n del fichero -fileDescriptionTip = Descripci\u00F3n del fichero que se le muestra al usuario. -copyright = Copyright -txtFileVersion = Forma libre -txtFileVersionTip = Forma libre de versi\u00F3n, por ejemplo '1.20.RC1'. -txtProductVersion = Forma libre -txtProductVersionTip = Forma libre del producto, por ejemplo '1.20.RC1'. -productName = Nombre del producto -originalFilename = Nombre original del fichero -originalFilenameTip = Nombre original del fichero sin la ruta. Permite determinar si un fichero ha sido renombrado por un usuario. -internalName = Nombre interno -internalNameTip = Nombre interno sin extensi\u00F3n, el nombre original del fichero o el m\u00F3dulo, por ejemplo. -companyName = Nombre de la organizaci\u00F3n - -addMessages=Add custom messages -startupErr=Startup error: -bundledJreErr=Bundled JRE error: -jreVersionErr=JRE version error: -jreVersionErrTip=Launch4j will append the required version number at the end of this message. -launcherErr=Launcher error: -instanceAlreadyExistsMsg=Inst. already exists: -instanceAlreadyExistsMsgTip=Message displayed by single instance console applications if an instance already exists. - -enableSingleInstance=Allow only a single instance of the application -mutexName=Mutex name -mutexNameTip=Mutex name that will uniquely identify your application. -windowTitle=Window title -windowTitleTip=Title of the application window to bring up on attempt to start a next instance. diff --git a/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java b/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java index cbf69d1..5e31593 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java +++ b/launch4j/src/net/sf/launch4j/formimpl/AbstractAcceptListener.java @@ -1,75 +1,75 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.Color; -import java.awt.event.ActionListener; - -import javax.swing.JTextField; - -import net.sf.launch4j.binding.Binding; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public abstract class AbstractAcceptListener implements ActionListener { - final JTextField _field; - - public AbstractAcceptListener(JTextField f, boolean listen) { - _field = f; - if (listen) { - _field.addActionListener(this); - } - } - - protected String getText() { - return _field.getText(); - } - - protected void clear() { - _field.setText(""); - _field.requestFocusInWindow(); - } - - protected void signalViolation(String msg) { - final Color bg = _field.getBackground(); - _field.setBackground(Binding.INVALID_COLOR); - MainFrame.getInstance().warn(msg); - _field.setBackground(bg); - _field.requestFocusInWindow(); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.Color; +import java.awt.event.ActionListener; + +import javax.swing.JTextField; + +import net.sf.launch4j.binding.Binding; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public abstract class AbstractAcceptListener implements ActionListener { + final JTextField _field; + + public AbstractAcceptListener(JTextField f, boolean listen) { + _field = f; + if (listen) { + _field.addActionListener(this); + } + } + + protected String getText() { + return _field.getText(); + } + + protected void clear() { + _field.setText(""); + _field.requestFocusInWindow(); + } + + protected void signalViolation(String msg) { + final Color bg = _field.getBackground(); + _field.setBackground(Binding.INVALID_COLOR); + MainFrame.getInstance().warn(msg); + _field.setBackground(bg); + _field.requestFocusInWindow(); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java index 6488aaf..866cecc 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/BasicFormImpl.java @@ -1,101 +1,100 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.JFileChooser; -import javax.swing.JRadioButton; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.form.BasicForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class BasicFormImpl extends BasicForm { - - public BasicFormImpl(Bindings bindings, JFileChooser fc) { - bindings.add("outfile", _outfileField) - .add("dontWrapJar", _dontWrapJarCheck) - .add("jar", _jarField) - .add("manifest", _manifestField) - .add("icon", _iconField) - .add("cmdLine", _cmdLineField) - .add("errTitle", _errorTitleField) - .add("downloadUrl", _downloadUrlField, Config.DOWNLOAD_URL) - .add("supportUrl", _supportUrlField) - .add("chdir", _chdirField, ".") - .add("priorityIndex", new JRadioButton[] { _normalPriorityRadio, - _idlePriorityRadio, - _highPriorityRadio }) - .add("stayAlive", _stayAliveCheck) - .add("restartOnCrash", _restartOnCrashCheck); - - _dontWrapJarCheck.addChangeListener(new DontWrapJarChangeListener()); - - _outfileButton.addActionListener(new BrowseActionListener(true, fc, - new FileChooserFilter("Windows executables (.exe)", ".exe"), - _outfileField)); - _jarButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Jar files", ".jar"), _jarField)); - _manifestButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Manifest files (.manifest)", ".manifest"), - _manifestField)); - _iconButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Icon files (.ico)", ".ico"), _iconField)); - } - - private class DontWrapJarChangeListener implements ChangeListener { - - public void stateChanged(ChangeEvent e) { - boolean dontWrap = _dontWrapJarCheck.isSelected(); - if (dontWrap) { - _jarLabel.setIcon(loadImage("images/asterix-o.gif")); - _jarLabel.setText(Messages.getString("jarPath")); - _jarField.setToolTipText(Messages.getString("jarPathTip")); - } else { - _jarLabel.setIcon(loadImage("images/asterix.gif")); - _jarLabel.setText(Messages.getString("jar")); - _jarField.setToolTipText(Messages.getString("jarTip")); - } - _jarButton.setEnabled(!dontWrap); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.JFileChooser; +import javax.swing.JRadioButton; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.form.BasicForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class BasicFormImpl extends BasicForm { + + public BasicFormImpl(Bindings bindings, JFileChooser fc) { + bindings.add("outfile", _outfileField) + .add("dontWrapJar", _dontWrapJarCheck) + .add("jar", _jarField) + .add("manifest", _manifestField) + .add("icon", _iconField) + .add("cmdLine", _cmdLineField) + .add("errTitle", _errorTitleField) + .add("downloadUrl", _downloadUrlField) + .add("supportUrl", _supportUrlField) + .add("chdir", _chdirField, ".") + .add("priorityIndex", new JRadioButton[] { _normalPriorityRadio, + _idlePriorityRadio, + _highPriorityRadio }) + .add("stayAlive", _stayAliveCheck) + .add("restartOnCrash", _restartOnCrashCheck); + + _dontWrapJarCheck.addChangeListener(new DontWrapJarChangeListener()); + + _outfileButton.addActionListener(new BrowseActionListener(true, fc, + new FileChooserFilter("Windows executables (.exe)", ".exe"), + _outfileField)); + _jarButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Jar files", ".jar"), _jarField)); + _manifestButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Manifest files (.manifest)", ".manifest"), + _manifestField)); + _iconButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Icon files (.ico)", ".ico"), _iconField)); + } + + private class DontWrapJarChangeListener implements ChangeListener { + + public void stateChanged(ChangeEvent e) { + boolean dontWrap = _dontWrapJarCheck.isSelected(); + if (dontWrap) { + _jarLabel.setIcon(loadImage("images/asterix-o.gif")); + _jarLabel.setText(Messages.getString("jarPath")); + _jarField.setToolTipText(Messages.getString("jarPathTip")); + } else { + _jarLabel.setIcon(loadImage("images/asterix.gif")); + _jarLabel.setText(Messages.getString("jar")); + _jarField.setToolTipText(Messages.getString("jarTip")); + } + _jarButton.setEnabled(!dontWrap); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java b/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java index 103e954..8404c5c 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java +++ b/launch4j/src/net/sf/launch4j/formimpl/BrowseActionListener.java @@ -1,79 +1,79 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; - -import javax.swing.JFileChooser; -import javax.swing.JTextField; - -import net.sf.launch4j.FileChooserFilter; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class BrowseActionListener implements ActionListener { - private final boolean _save; - private final JFileChooser _fileChooser; - private final FileChooserFilter _filter; - private final JTextField _field; - - public BrowseActionListener(boolean save, JFileChooser fileChooser, - FileChooserFilter filter, JTextField field) { - _save = save; - _fileChooser = fileChooser; - _filter = filter; - _field = field; - } - - public void actionPerformed(ActionEvent e) { - if (!_field.isEnabled()) { - return; - } - _fileChooser.setFileFilter(_filter); - _fileChooser.setSelectedFile(new File("")); - int result = _save - ? _fileChooser.showSaveDialog(MainFrame.getInstance()) - : _fileChooser.showOpenDialog(MainFrame.getInstance()); - if (result == JFileChooser.APPROVE_OPTION) { - _field.setText(_fileChooser.getSelectedFile().getPath()); - } - _fileChooser.removeChoosableFileFilter(_filter); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; + +import javax.swing.JFileChooser; +import javax.swing.JTextField; + +import net.sf.launch4j.FileChooserFilter; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class BrowseActionListener implements ActionListener { + private final boolean _save; + private final JFileChooser _fileChooser; + private final FileChooserFilter _filter; + private final JTextField _field; + + public BrowseActionListener(boolean save, JFileChooser fileChooser, + FileChooserFilter filter, JTextField field) { + _save = save; + _fileChooser = fileChooser; + _filter = filter; + _field = field; + } + + public void actionPerformed(ActionEvent e) { + if (!_field.isEnabled()) { + return; + } + _fileChooser.setFileFilter(_filter); + _fileChooser.setSelectedFile(new File("")); + int result = _save + ? _fileChooser.showSaveDialog(MainFrame.getInstance()) + : _fileChooser.showOpenDialog(MainFrame.getInstance()); + if (result == JFileChooser.APPROVE_OPTION) { + _field.setText(_fileChooser.getSelectedFile().getPath()); + } + _fileChooser.removeChoosableFileFilter(_filter); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java index 79c5074..005a9d9 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/ClassPathFormImpl.java @@ -1,222 +1,222 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.util.jar.Attributes; -import java.util.jar.JarFile; - -import javax.swing.DefaultListModel; -import javax.swing.JFileChooser; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.binding.Validator; -import net.sf.launch4j.config.ClassPath; -import net.sf.launch4j.form.ClassPathForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class ClassPathFormImpl extends ClassPathForm { - private final JFileChooser _fileChooser; - private final FileChooserFilter _filter - = new FileChooserFilter("Executable jar", ".jar"); - - public ClassPathFormImpl(Bindings bindings, JFileChooser fc) { - bindings.addOptComponent("classPath", ClassPath.class, _classpathCheck) - .add("classPath.mainClass", _mainclassField) - .add("classPath.paths", _classpathList); - _fileChooser = fc; - - ClasspathCheckListener cpl = new ClasspathCheckListener(); - _classpathCheck.addChangeListener(cpl); - cpl.stateChanged(null); - - _classpathList.setModel(new DefaultListModel()); - _classpathList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - _classpathList.addListSelectionListener(new ClasspathSelectionListener()); - - _newClasspathButton.addActionListener(new NewClasspathListener()); - _acceptClasspathButton.addActionListener( - new AcceptClasspathListener(_classpathField)); - _removeClasspathButton.addActionListener(new RemoveClasspathListener()); - _importClasspathButton.addActionListener(new ImportClasspathListener()); - _classpathUpButton.addActionListener(new MoveUpListener()); - _classpathDownButton.addActionListener(new MoveDownListener()); - } - - private class ClasspathCheckListener implements ChangeListener { - public void stateChanged(ChangeEvent e) { - boolean on = _classpathCheck.isSelected(); - _importClasspathButton.setEnabled(on); - _classpathUpButton.setEnabled(on); - _classpathDownButton.setEnabled(on); - _classpathField.setEnabled(on); - _newClasspathButton.setEnabled(on); - _acceptClasspathButton.setEnabled(on); - _removeClasspathButton.setEnabled(on); - } - } - - private class NewClasspathListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - _classpathList.clearSelection(); - _classpathField.setText(""); - _classpathField.requestFocusInWindow(); - } - } - - private class AcceptClasspathListener extends AbstractAcceptListener { - public AcceptClasspathListener(JTextField f) { - super(f, true); - } - - public void actionPerformed(ActionEvent e) { - String cp = getText(); - if (Validator.isEmpty(cp)) { - signalViolation(Messages.getString("specifyClassPath")); - return; - } - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - if (_classpathList.isSelectionEmpty()) { - model.addElement(cp); - clear(); - } else { - model.setElementAt(cp, _classpathList.getSelectedIndex()); - } - } - } - - private class ClasspathSelectionListener implements ListSelectionListener { - public void valueChanged(ListSelectionEvent e) { - if (e.getValueIsAdjusting()) { - return; - } - if (_classpathList.isSelectionEmpty()) { - _classpathField.setText(""); - } else { - _classpathField.setText((String) _classpathList.getSelectedValue()); - } - _classpathField.requestFocusInWindow(); - } - } - - private class RemoveClasspathListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (_classpathList.isSelectionEmpty() - || !MainFrame.getInstance().confirm( - Messages.getString("confirmClassPathRemoval"))) { - return; - } - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - while (!_classpathList.isSelectionEmpty()) { - model.remove(_classpathList.getSelectedIndex()); - } - } - } - - private class MoveUpListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - int x = _classpathList.getSelectedIndex(); - if (x < 1) { - return; - } - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - Object o = model.get(x - 1); - model.set(x - 1, model.get(x)); - model.set(x, o); - _classpathList.setSelectedIndex(x - 1); - } - } - - private class MoveDownListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - DefaultListModel model = (DefaultListModel) _classpathList.getModel(); - int x = _classpathList.getSelectedIndex(); - if (x == -1 || x >= model.getSize() - 1) { - return; - } - Object o = model.get(x + 1); - model.set(x + 1, model.get(x)); - model.set(x, o); - _classpathList.setSelectedIndex(x + 1); - } - } - - private class ImportClasspathListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - try { - _fileChooser.setFileFilter(_filter); - _fileChooser.setSelectedFile(new File("")); - if (_fileChooser.showOpenDialog(MainFrame.getInstance()) - == JFileChooser.APPROVE_OPTION) { - JarFile jar = new JarFile(_fileChooser.getSelectedFile()); - if (jar.getManifest() == null) { - jar.close(); - MainFrame.getInstance().info(Messages.getString("noManifest")); - return; - } - Attributes attr = jar.getManifest().getMainAttributes(); - String mainClass = (String) attr.getValue("Main-Class"); - String classPath = (String) attr.getValue("Class-Path"); - jar.close(); - _mainclassField.setText(mainClass != null ? mainClass : ""); - DefaultListModel model = new DefaultListModel(); - if (classPath != null) { - String[] paths = classPath.split(" "); - for (int i = 0; i < paths.length; i++) { - model.addElement(paths[i]); - } - } - _classpathList.setModel(model); - } - } catch (IOException ex) { - MainFrame.getInstance().warn(ex.getMessage()); - } - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.util.jar.Attributes; +import java.util.jar.JarFile; + +import javax.swing.DefaultListModel; +import javax.swing.JFileChooser; +import javax.swing.JTextField; +import javax.swing.ListSelectionModel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.binding.Validator; +import net.sf.launch4j.config.ClassPath; +import net.sf.launch4j.form.ClassPathForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class ClassPathFormImpl extends ClassPathForm { + private final JFileChooser _fileChooser; + private final FileChooserFilter _filter + = new FileChooserFilter("Executable jar", ".jar"); + + public ClassPathFormImpl(Bindings bindings, JFileChooser fc) { + bindings.addOptComponent("classPath", ClassPath.class, _classpathCheck) + .add("classPath.mainClass", _mainclassField) + .add("classPath.paths", _classpathList); + _fileChooser = fc; + + ClasspathCheckListener cpl = new ClasspathCheckListener(); + _classpathCheck.addChangeListener(cpl); + cpl.stateChanged(null); + + _classpathList.setModel(new DefaultListModel()); + _classpathList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + _classpathList.addListSelectionListener(new ClasspathSelectionListener()); + + _newClasspathButton.addActionListener(new NewClasspathListener()); + _acceptClasspathButton.addActionListener( + new AcceptClasspathListener(_classpathField)); + _removeClasspathButton.addActionListener(new RemoveClasspathListener()); + _importClasspathButton.addActionListener(new ImportClasspathListener()); + _classpathUpButton.addActionListener(new MoveUpListener()); + _classpathDownButton.addActionListener(new MoveDownListener()); + } + + private class ClasspathCheckListener implements ChangeListener { + public void stateChanged(ChangeEvent e) { + boolean on = _classpathCheck.isSelected(); + _importClasspathButton.setEnabled(on); + _classpathUpButton.setEnabled(on); + _classpathDownButton.setEnabled(on); + _classpathField.setEnabled(on); + _newClasspathButton.setEnabled(on); + _acceptClasspathButton.setEnabled(on); + _removeClasspathButton.setEnabled(on); + } + } + + private class NewClasspathListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + _classpathList.clearSelection(); + _classpathField.setText(""); + _classpathField.requestFocusInWindow(); + } + } + + private class AcceptClasspathListener extends AbstractAcceptListener { + public AcceptClasspathListener(JTextField f) { + super(f, true); + } + + public void actionPerformed(ActionEvent e) { + String cp = getText(); + if (Validator.isEmpty(cp)) { + signalViolation(Messages.getString("specifyClassPath")); + return; + } + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + if (_classpathList.isSelectionEmpty()) { + model.addElement(cp); + clear(); + } else { + model.setElementAt(cp, _classpathList.getSelectedIndex()); + } + } + } + + private class ClasspathSelectionListener implements ListSelectionListener { + public void valueChanged(ListSelectionEvent e) { + if (e.getValueIsAdjusting()) { + return; + } + if (_classpathList.isSelectionEmpty()) { + _classpathField.setText(""); + } else { + _classpathField.setText((String) _classpathList.getSelectedValue()); + } + _classpathField.requestFocusInWindow(); + } + } + + private class RemoveClasspathListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + if (_classpathList.isSelectionEmpty() + || !MainFrame.getInstance().confirm( + Messages.getString("confirmClassPathRemoval"))) { + return; + } + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + while (!_classpathList.isSelectionEmpty()) { + model.remove(_classpathList.getSelectedIndex()); + } + } + } + + private class MoveUpListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + int x = _classpathList.getSelectedIndex(); + if (x < 1) { + return; + } + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + String s = model.get(x - 1); + model.set(x - 1, model.get(x)); + model.set(x, s); + _classpathList.setSelectedIndex(x - 1); + } + } + + private class MoveDownListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + DefaultListModel model = (DefaultListModel) _classpathList.getModel(); + int x = _classpathList.getSelectedIndex(); + if (x == -1 || x >= model.getSize() - 1) { + return; + } + String s = model.get(x + 1); + model.set(x + 1, model.get(x)); + model.set(x, s); + _classpathList.setSelectedIndex(x + 1); + } + } + + private class ImportClasspathListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + try { + _fileChooser.setFileFilter(_filter); + _fileChooser.setSelectedFile(new File("")); + if (_fileChooser.showOpenDialog(MainFrame.getInstance()) + == JFileChooser.APPROVE_OPTION) { + JarFile jar = new JarFile(_fileChooser.getSelectedFile()); + if (jar.getManifest() == null) { + jar.close(); + MainFrame.getInstance().info(Messages.getString("noManifest")); + return; + } + Attributes attr = jar.getManifest().getMainAttributes(); + String mainClass = (String) attr.getValue("Main-Class"); + String classPath = (String) attr.getValue("Class-Path"); + jar.close(); + _mainclassField.setText(mainClass != null ? mainClass : ""); + DefaultListModel model = new DefaultListModel(); + if (classPath != null) { + String[] paths = classPath.split(" "); + for (int i = 0; i < paths.length; i++) { + model.addElement(paths[i]); + } + } + _classpathList.setModel(model); + } + } catch (IOException ex) { + MainFrame.getInstance().warn(ex.getMessage()); + } + } + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java index f028d98..5e905ba 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/ConfigFormImpl.java @@ -1,100 +1,100 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 10, 2005 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.BorderFactory; -import javax.swing.JFileChooser; -import javax.swing.JTextArea; - -import net.sf.launch4j.binding.Binding; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.binding.IValidatable; -import net.sf.launch4j.form.ConfigForm; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class ConfigFormImpl extends ConfigForm { - private final Bindings _bindings = new Bindings(); - private final JFileChooser _fileChooser = new FileChooser(ConfigFormImpl.class); - - public ConfigFormImpl() { - _tab.setBorder(BorderFactory.createMatteBorder(0, -1, -1, -1, getBackground())); - _tab.addTab(Messages.getString("tab.basic"), - new BasicFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.classpath"), - new ClassPathFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.header"), - new HeaderFormImpl(_bindings)); - _tab.addTab(Messages.getString("tab.singleInstance"), - new SingleInstanceFormImpl(_bindings)); - _tab.addTab(Messages.getString("tab.jre"), - new JreFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.envVars"), - new EnvironmentVarsFormImpl(_bindings)); - _tab.addTab(Messages.getString("tab.splash"), - new SplashFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.version"), - new VersionInfoFormImpl(_bindings, _fileChooser)); - _tab.addTab(Messages.getString("tab.messages"), - new MessagesFormImpl(_bindings)); - } - - public void clear(IValidatable bean) { - _bindings.clear(bean); - } - - public void put(IValidatable bean) { - _bindings.put(bean); - } - - public void get(IValidatable bean) { - _bindings.get(bean); - } - - public boolean isModified() { - return _bindings.isModified(); - } - - public JTextArea getLogTextArea() { - return _logTextArea; - } - - public Binding getBinding(String property) { - return _bindings.getBinding(property); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 10, 2005 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.BorderFactory; +import javax.swing.JFileChooser; +import javax.swing.JTextArea; + +import net.sf.launch4j.binding.Binding; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.binding.IValidatable; +import net.sf.launch4j.form.ConfigForm; + +/** + * @author Copyright (C) 2005 Grzegorz Kowal + */ +public class ConfigFormImpl extends ConfigForm { + private final Bindings _bindings = new Bindings(); + private final JFileChooser _fileChooser = new FileChooser(ConfigFormImpl.class); + + public ConfigFormImpl() { + _tab.setBorder(BorderFactory.createMatteBorder(0, -1, -1, -1, getBackground())); + _tab.addTab(Messages.getString("tab.basic"), + new BasicFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.classpath"), + new ClassPathFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.header"), + new HeaderFormImpl(_bindings)); + _tab.addTab(Messages.getString("tab.singleInstance"), + new SingleInstanceFormImpl(_bindings)); + _tab.addTab(Messages.getString("tab.jre"), + new JreFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.envVars"), + new EnvironmentVarsFormImpl(_bindings)); + _tab.addTab(Messages.getString("tab.splash"), + new SplashFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.version"), + new VersionInfoFormImpl(_bindings, _fileChooser)); + _tab.addTab(Messages.getString("tab.messages"), + new MessagesFormImpl(_bindings)); + } + + public void clear(IValidatable bean) { + _bindings.clear(bean); + } + + public void put(IValidatable bean) { + _bindings.put(bean); + } + + public void get(IValidatable bean) { + _bindings.get(bean); + } + + public boolean isModified() { + return _bindings.isModified(); + } + + public JTextArea getLogTextArea() { + return _logTextArea; + } + + public Binding getBinding(String property) { + return _bindings.getBinding(property); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java index e2fa1eb..0fe99d2 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/EnvironmentVarsFormImpl.java @@ -1,50 +1,50 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Jun 10, 2006 - */ -package net.sf.launch4j.formimpl; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.form.EnvironmentVarsForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class EnvironmentVarsFormImpl extends EnvironmentVarsForm { - - public EnvironmentVarsFormImpl(Bindings bindings) { - bindings.add("variables", _envVarsTextArea); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Jun 10, 2006 + */ +package net.sf.launch4j.formimpl; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.form.EnvironmentVarsForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class EnvironmentVarsFormImpl extends EnvironmentVarsForm { + + public EnvironmentVarsFormImpl(Bindings bindings) { + bindings.add("variables", _envVarsTextArea); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java b/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java index 6814a37..2cf0689 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java +++ b/launch4j/src/net/sf/launch4j/formimpl/FileChooser.java @@ -1,66 +1,66 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Jul 19, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.io.File; -import java.util.prefs.Preferences; - -import javax.swing.JFileChooser; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class FileChooser extends JFileChooser { - private final Preferences _prefs; - private final String _key; - - public FileChooser(Class clazz) { - _prefs = Preferences.userNodeForPackage(clazz); - _key = "currentDir-" - + clazz.getName().substring(clazz.getName().lastIndexOf('.') + 1); - String path = _prefs.get(_key, null); - - if (path != null) { - setCurrentDirectory(new File(path)); - } - } - - public void approveSelection() { - _prefs.put(_key, getCurrentDirectory().getPath()); - super.approveSelection(); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Jul 19, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.io.File; +import java.util.prefs.Preferences; + +import javax.swing.JFileChooser; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class FileChooser extends JFileChooser { + private final Preferences _prefs; + private final String _key; + + public FileChooser(Class clazz) { + _prefs = Preferences.userNodeForPackage(clazz); + _key = "currentDir-" + + clazz.getName().substring(clazz.getName().lastIndexOf('.') + 1); + String path = _prefs.get(_key, null); + + if (path != null) { + setCurrentDirectory(new File(path)); + } + } + + public void approveSelection() { + _prefs.put(_key, getCurrentDirectory().getPath()); + super.approveSelection(); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java index 1938fd4..b26aca4 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/HeaderFormImpl.java @@ -1,117 +1,117 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JRadioButton; - -import net.sf.launch4j.binding.Binding; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Config; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.form.HeaderForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class HeaderFormImpl extends HeaderForm { - private final Bindings _bindings; - - public HeaderFormImpl(Bindings bindings) { - _bindings = bindings; - _bindings.add("headerTypeIndex", new JRadioButton[] { _guiHeaderRadio, - _consoleHeaderRadio, - _jniGuiHeaderRadio, - _jniConsoleHeaderRadio }) - .add("headerObjects", "customHeaderObjects", _headerObjectsCheck, - _headerObjectsTextArea) - .add("libs", "customLibs", _libsCheck, _libsTextArea); - - _guiHeaderRadio.setActionCommand(Config.GUI_HEADER); - _consoleHeaderRadio.setActionCommand(Config.CONSOLE_HEADER); - _jniGuiHeaderRadio.setActionCommand(Config.JNI_GUI_HEADER_32); - _jniConsoleHeaderRadio.setActionCommand(Config.JNI_CONSOLE_HEADER_32); - - ActionListener headerTypeActionListener = new HeaderTypeActionListener(); - _guiHeaderRadio.addActionListener(headerTypeActionListener); - _consoleHeaderRadio.addActionListener(headerTypeActionListener); - _jniGuiHeaderRadio.addActionListener(headerTypeActionListener); - _jniConsoleHeaderRadio.addActionListener(headerTypeActionListener); - - _headerObjectsCheck.addActionListener(new HeaderObjectsActionListener()); - _libsCheck.addActionListener(new LibsActionListener()); - } - - private void updateLibs() { - if (!_libsCheck.isSelected()) { - ConfigPersister.getInstance().getConfig().setLibs(null); - Binding b = _bindings.getBinding("libs"); - b.put(ConfigPersister.getInstance().getConfig()); - } - } - - private class HeaderTypeActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - Config c = ConfigPersister.getInstance().getConfig(); - c.setHeaderType(e.getActionCommand()); - - if (!_headerObjectsCheck.isSelected()) { - Binding b = _bindings.getBinding("headerObjects"); - b.put(c); - updateLibs(); - } - } - } - - private class HeaderObjectsActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (!_headerObjectsCheck.isSelected()) { - ConfigPersister.getInstance().getConfig().setHeaderObjects(null); - Binding b = _bindings.getBinding("headerObjects"); - b.put(ConfigPersister.getInstance().getConfig()); - } - } - } - - private class LibsActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - updateLibs(); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JRadioButton; + +import net.sf.launch4j.binding.Binding; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.Config; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.form.HeaderForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class HeaderFormImpl extends HeaderForm { + private final Bindings _bindings; + + public HeaderFormImpl(Bindings bindings) { + _bindings = bindings; + _bindings.add("headerTypeIndex", new JRadioButton[] { _guiHeaderRadio, + _consoleHeaderRadio, + _jniGuiHeaderRadio, + _jniConsoleHeaderRadio }) + .add("headerObjects", "customHeaderObjects", _headerObjectsCheck, + _headerObjectsTextArea) + .add("libs", "customLibs", _libsCheck, _libsTextArea); + + _guiHeaderRadio.setActionCommand(Config.GUI_HEADER); + _consoleHeaderRadio.setActionCommand(Config.CONSOLE_HEADER); + _jniGuiHeaderRadio.setActionCommand(Config.JNI_GUI_HEADER_32); + _jniConsoleHeaderRadio.setActionCommand(Config.JNI_CONSOLE_HEADER_32); + + ActionListener headerTypeActionListener = new HeaderTypeActionListener(); + _guiHeaderRadio.addActionListener(headerTypeActionListener); + _consoleHeaderRadio.addActionListener(headerTypeActionListener); + _jniGuiHeaderRadio.addActionListener(headerTypeActionListener); + _jniConsoleHeaderRadio.addActionListener(headerTypeActionListener); + + _headerObjectsCheck.addActionListener(new HeaderObjectsActionListener()); + _libsCheck.addActionListener(new LibsActionListener()); + } + + private void updateLibs() { + if (!_libsCheck.isSelected()) { + ConfigPersister.getInstance().getConfig().setLibs(null); + Binding b = _bindings.getBinding("libs"); + b.put(ConfigPersister.getInstance().getConfig()); + } + } + + private class HeaderTypeActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + Config c = ConfigPersister.getInstance().getConfig(); + c.setHeaderType(e.getActionCommand()); + + if (!_headerObjectsCheck.isSelected()) { + Binding b = _bindings.getBinding("headerObjects"); + b.put(c); + updateLibs(); + } + } + } + + private class HeaderObjectsActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + if (!_headerObjectsCheck.isSelected()) { + ConfigPersister.getInstance().getConfig().setHeaderObjects(null); + Binding b = _bindings.getBinding("headerObjects"); + b.put(ConfigPersister.getInstance().getConfig()); + } + } + } + + private class LibsActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + updateLibs(); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java index ad25442..85d932b 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/JreFormImpl.java @@ -1,175 +1,161 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.JFileChooser; -import javax.swing.JTextField; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.binding.Validator; -import net.sf.launch4j.form.JreForm; -import net.sf.launch4j.config.Jre; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class JreFormImpl extends JreForm { - - public JreFormImpl(Bindings bindings, JFileChooser fc) { - _jdkPreferenceCombo.setModel(new DefaultComboBoxModel(new String[] { - Messages.getString("jdkPreference.jre.only"), - Messages.getString("jdkPreference.prefer.jre"), - Messages.getString("jdkPreference.prefer.jdk"), - Messages.getString("jdkPreference.jdk.only")})); - - _runtimeBitsCombo.setModel(new DefaultComboBoxModel(new String[] { - Messages.getString("runtimeBits.64"), - Messages.getString("runtimeBits.64And32"), - Messages.getString("runtimeBits.32And64"), - Messages.getString("runtimeBits.32")})); - - bindings.add("jre.path", _jrePathField) - .add("jre.bundledJre64Bit", _bundledJre64BitCheck) - .add("jre.bundledJreAsFallback", _bundledJreAsFallbackCheck) - .add("jre.minVersion", _jreMinField) - .add("jre.maxVersion", _jreMaxField) - .add("jre.jdkPreferenceIndex", _jdkPreferenceCombo, Jre.DEFAULT_JDK_PREFERENCE_INDEX) - .add("jre.runtimeBitsIndex", _runtimeBitsCombo, Jre.DEFAULT_JDK_PREFERENCE_INDEX) - .add("jre.initialHeapSize", _initialHeapSizeField) - .add("jre.initialHeapPercent", _initialHeapPercentField) - .add("jre.maxHeapSize", _maxHeapSizeField) - .add("jre.maxHeapPercent", _maxHeapPercentField) - .add("jre.options", _jvmOptionsTextArea); - - _varCombo.setModel(new DefaultComboBoxModel(new String[] { - "EXEDIR", "EXEFILE", "PWD", "OLDPWD", "JREHOMEDIR", - "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", - "HKEY_USERS", "HKEY_CURRENT_CONFIG" })); - - _varCombo.addActionListener(new VarComboActionListener()); - _varCombo.setSelectedIndex(0); - - _propertyButton.addActionListener(new PropertyActionListener()); - _optionButton.addActionListener(new OptionActionListener()); - - _envPropertyButton.addActionListener(new EnvPropertyActionListener(_envVarField)); - _envOptionButton.addActionListener(new EnvOptionActionListener(_envVarField)); - } - - private class VarComboActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - _optionButton.setEnabled(((String) _varCombo.getSelectedItem()) - .startsWith("HKEY_")); - } - } - - private class PropertyActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - final int pos = _jvmOptionsTextArea.getCaretPosition(); - final String var = (String) _varCombo.getSelectedItem(); - if (var.startsWith("HKEY_")) { - _jvmOptionsTextArea.insert("-Dreg.key=\"%" - + var + "\\...%\"\n", pos); - } else { - _jvmOptionsTextArea.insert("-Dlaunch4j." + var.toLowerCase() - + "=\"%" + var + "%\"\n", pos); - } - } - } - - private class OptionActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - final int pos = _jvmOptionsTextArea.getCaretPosition(); - final String var = (String) _varCombo.getSelectedItem(); - if (var.startsWith("HKEY_")) { - _jvmOptionsTextArea.insert("%" + var + "\\...%\n", pos); - } else { - _jvmOptionsTextArea.insert("%" + var + "%\n", pos); - } - } - } - - private abstract class EnvActionListener extends AbstractAcceptListener { - public EnvActionListener(JTextField f, boolean listen) { - super(f, listen); - } - - public void actionPerformed(ActionEvent e) { - final int pos = _jvmOptionsTextArea.getCaretPosition(); - final String var = getText() - .replaceAll("\"", "") - .replaceAll("%", ""); - if (Validator.isEmpty(var)) { - signalViolation(Messages.getString("specifyVar")); - return; - } - add(var, pos); - clear(); - } - - protected abstract void add(String var, int pos); - } - - private class EnvPropertyActionListener extends EnvActionListener { - public EnvPropertyActionListener(JTextField f) { - super(f, true); - } - - protected void add(String var, int pos) { - final String prop = var - .replaceAll(" ", ".") - .replaceAll("_", ".") - .toLowerCase(); - _jvmOptionsTextArea.insert("-Denv." + prop + "=\"%" + var - + "%\"\n", pos); - } - } - - private class EnvOptionActionListener extends EnvActionListener { - public EnvOptionActionListener(JTextField f) { - super(f, false); - } - - protected void add(String var, int pos) { - _jvmOptionsTextArea.insert("%" + var + "%\n", pos); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JFileChooser; +import javax.swing.JTextField; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.binding.Validator; +import net.sf.launch4j.config.Jre; +import net.sf.launch4j.form.JreForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class JreFormImpl extends JreForm { + + public JreFormImpl(Bindings bindings, JFileChooser fc) { + bindings.add("jre.path", _jrePathField, Jre.DEFAULT_PATH) + .add("jre.requiresJdk", _requiresJdkCheck) + .add("jre.requires64Bit", _requires64BitCheck) + .add("jre.minVersion", _jreMinField) + .add("jre.maxVersion", _jreMaxField) + .add("jre.initialHeapSize", _initialHeapSizeField) + .add("jre.initialHeapPercent", _initialHeapPercentField) + .add("jre.maxHeapSize", _maxHeapSizeField) + .add("jre.maxHeapPercent", _maxHeapPercentField) + .add("jre.options", _jvmOptionsTextArea); + + _varCombo.setModel(new DefaultComboBoxModel(new String[] { + "EXEDIR", "EXEFILE", "PWD", "OLDPWD", "JREHOMEDIR", + "HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", + "HKEY_USERS", "HKEY_CURRENT_CONFIG" })); + + _varCombo.addActionListener(new VarComboActionListener()); + _varCombo.setSelectedIndex(0); + + _propertyButton.addActionListener(new PropertyActionListener()); + _optionButton.addActionListener(new OptionActionListener()); + + _envPropertyButton.addActionListener(new EnvPropertyActionListener(_envVarField)); + _envOptionButton.addActionListener(new EnvOptionActionListener(_envVarField)); + } + + private class VarComboActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + _optionButton.setEnabled(((String) _varCombo.getSelectedItem()) + .startsWith("HKEY_")); + } + } + + private class PropertyActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + final int pos = _jvmOptionsTextArea.getCaretPosition(); + final String var = (String) _varCombo.getSelectedItem(); + if (var.startsWith("HKEY_")) { + _jvmOptionsTextArea.insert("-Dreg.key=\"%" + + var + "\\...%\"\n", pos); + } else { + _jvmOptionsTextArea.insert("-Dlaunch4j." + var.toLowerCase() + + "=\"%" + var + "%\"\n", pos); + } + } + } + + private class OptionActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + final int pos = _jvmOptionsTextArea.getCaretPosition(); + final String var = (String) _varCombo.getSelectedItem(); + if (var.startsWith("HKEY_")) { + _jvmOptionsTextArea.insert("%" + var + "\\...%\n", pos); + } else { + _jvmOptionsTextArea.insert("%" + var + "%\n", pos); + } + } + } + + private abstract class EnvActionListener extends AbstractAcceptListener { + public EnvActionListener(JTextField f, boolean listen) { + super(f, listen); + } + + public void actionPerformed(ActionEvent e) { + final int pos = _jvmOptionsTextArea.getCaretPosition(); + final String var = getText() + .replaceAll("\"", "") + .replaceAll("%", ""); + if (Validator.isEmpty(var)) { + signalViolation(Messages.getString("specifyVar")); + return; + } + add(var, pos); + clear(); + } + + protected abstract void add(String var, int pos); + } + + private class EnvPropertyActionListener extends EnvActionListener { + public EnvPropertyActionListener(JTextField f) { + super(f, true); + } + + protected void add(String var, int pos) { + final String prop = var + .replaceAll(" ", ".") + .replaceAll("_", ".") + .toLowerCase(); + _jvmOptionsTextArea.insert("-Denv." + prop + "=\"%" + var + + "%\"\n", pos); + } + } + + private class EnvOptionActionListener extends EnvActionListener { + public EnvOptionActionListener(JTextField f) { + super(f, false); + } + + protected void add(String var, int pos) { + _jvmOptionsTextArea.insert("%" + var + "%\n", pos); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java b/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java index 2799bdb..ecb18c2 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java +++ b/launch4j/src/net/sf/launch4j/formimpl/MainFrame.java @@ -1,359 +1,346 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on 2005-05-09 - */ -package net.sf.launch4j.formimpl; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.io.File; - -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JToolBar; -import javax.swing.UIManager; - -import com.jgoodies.looks.Options; -import com.jgoodies.looks.plastic.PlasticXPLookAndFeel; -import com.jgoodies.looks.windows.WindowsLookAndFeel; - -import foxtrot.Task; -import foxtrot.Worker; -import net.sf.launch4j.Builder; -import net.sf.launch4j.BuilderException; -import net.sf.launch4j.ExecException; -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.Log; -import net.sf.launch4j.Main; -import net.sf.launch4j.Util; -import net.sf.launch4j.binding.Binding; -import net.sf.launch4j.binding.BindingException; -import net.sf.launch4j.binding.InvariantViolationException; -import net.sf.launch4j.config.ConfigPersister; -import net.sf.launch4j.config.ConfigPersisterException; - -/** - * @author Copyright (C) 2005 Grzegorz Kowal - */ -public class MainFrame extends JFrame { - private static MainFrame _instance; - - private final JToolBar _toolBar; - private final JButton _runButton; - private final ConfigFormImpl _configForm; - private final JFileChooser _fileChooser = new FileChooser(MainFrame.class); - private File _outfile; - private boolean _saved = false; - - public static void createInstance() { - try { - Toolkit.getDefaultToolkit().setDynamicLayout(true); - System.setProperty("sun.awt.noerasebackground","true"); - - // JGoodies - Options.setDefaultIconSize(new Dimension(16, 16)); // menu icons - Options.setUseNarrowButtons(false); - Options.setPopupDropShadowEnabled(true); - - UIManager.setLookAndFeel(System.getProperty("os.name").toLowerCase().startsWith("windows") - ? new WindowsLookAndFeel() : new PlasticXPLookAndFeel()); - - _instance = new MainFrame(); - } catch (Exception e) { - System.err.println(e); - } - } - - public static MainFrame getInstance() { - return _instance; - } - - public MainFrame() { - showConfigName(null); - setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - addWindowListener(new MainFrameListener()); - setGlassPane(new GlassPane(this)); - _fileChooser.setFileFilter(new FileChooserFilter( - Messages.getString("MainFrame.config.files"), - new String[] {".xml", ".cfg"})); - - _toolBar = new JToolBar(); - _toolBar.setFloatable(false); - _toolBar.setRollover(true); - addButton("images/new.png", Messages.getString("MainFrame.new.config"), - new NewActionListener()); - addButton("images/open.png", Messages.getString("MainFrame.open.config"), - new OpenActionListener()); - addButton("images/save.png", Messages.getString("MainFrame.save.config"), - new SaveActionListener()); - _toolBar.addSeparator(); - addButton("images/build.png", Messages.getString("MainFrame.build.wrapper"), - new BuildActionListener()); - _runButton = addButton("images/run.png", - Messages.getString("MainFrame.test.wrapper"), - new RunActionListener()); - setRunEnabled(false); - _toolBar.addSeparator(); - addButton("images/info.png", Messages.getString("MainFrame.about.launch4j"), - new AboutActionListener()); - - _configForm = new ConfigFormImpl(); - getContentPane().setLayout(new BorderLayout()); - getContentPane().add(_toolBar, BorderLayout.NORTH); - getContentPane().add(_configForm, BorderLayout.CENTER); - pack(); - Dimension scr = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension fr = getSize(); - fr.width += 25; - fr.height += 100; - setBounds((scr.width - fr.width) / 2, (scr.height - fr.height) / 2, - fr.width, fr.height); - setVisible(true); - } - - private JButton addButton(String iconPath, String tooltip, ActionListener l) { - ImageIcon icon = new ImageIcon(MainFrame.class.getClassLoader() - .getResource(iconPath)); - JButton b = new JButton(icon); - b.setToolTipText(tooltip); - b.addActionListener(l); - _toolBar.add(b); - return b; - } - - public void info(String text) { - JOptionPane.showMessageDialog(this, - text, - Main.getName(), - JOptionPane.INFORMATION_MESSAGE); - } - - public void warn(String text) { - JOptionPane.showMessageDialog(this, - text, - Main.getName(), - JOptionPane.WARNING_MESSAGE); - } - - public void warn(InvariantViolationException e) { - Binding b = e.getBinding(); - if (b != null) { - b.markInvalid(); - } - warn(e.getMessage()); - if (b != null) { - e.getBinding().markValid(); - } - } - - public boolean confirm(String text) { - return JOptionPane.showConfirmDialog(MainFrame.this, - text, - Messages.getString("MainFrame.confirm"), - JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; - } - - private boolean canDiscardChanges() { - return (!_configForm.isModified()) - || confirm(Messages.getString("MainFrame.discard.changes")); - } - - private boolean save() { - try { - _configForm.get(ConfigPersister.getInstance().getConfig()); - if (_fileChooser.showSaveDialog(MainFrame.this) == JOptionPane.YES_OPTION) { - File f = _fileChooser.getSelectedFile(); - if (!f.getPath().endsWith(".xml")) { - f = new File(f.getPath() + ".xml"); - } - ConfigPersister.getInstance().save(f); - _saved = true; - showConfigName(f); - return true; - } - return false; - } catch (InvariantViolationException ex) { - warn(ex); - return false; - } catch (BindingException ex) { - warn(ex.getMessage()); - return false; - } catch (ConfigPersisterException ex) { - warn(ex.getMessage()); - return false; - } - } - - private void showConfigName(File config) { - setTitle(Main.getName() + " - " + (config != null ? config.getName() - : Messages.getString("MainFrame.untitled"))); - } - - private void setRunEnabled(boolean enabled) { - if (!enabled) { - _outfile = null; - } - _runButton.setEnabled(enabled); - } - - private void clearConfig() { - ConfigPersister.getInstance().createBlank(); - _configForm.clear(ConfigPersister.getInstance().getConfig()); - } - - private class MainFrameListener extends WindowAdapter { - public void windowOpened(WindowEvent e) { - clearConfig(); - } - - public void windowClosing(WindowEvent e) { - if (canDiscardChanges()) { - dispose(); - System.exit(0); - } - } - } - - private class NewActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - if (canDiscardChanges()) { - clearConfig(); - _saved = false; - showConfigName(null); - setRunEnabled(false); - } - } - } - - private class OpenActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - try { - if (canDiscardChanges() && _fileChooser.showOpenDialog(MainFrame.this) - == JOptionPane.YES_OPTION) { - final File f = _fileChooser.getSelectedFile(); - if (f.getPath().endsWith(".xml")) { - ConfigPersister.getInstance().load(f); - _saved = true; - } else { - ConfigPersister.getInstance().loadVersion1(f); - _saved = false; - } - _configForm.put(ConfigPersister.getInstance().getConfig()); - showConfigName(f); - setRunEnabled(false); - } - } catch (ConfigPersisterException ex) { - warn(ex.getMessage()); - } catch (BindingException ex) { - warn(ex.getMessage()); - } - } - } - - private class SaveActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - save(); - } - } - - private class BuildActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - final Log log = Log.getSwingLog(_configForm.getLogTextArea()); - try { - if ((!_saved || _configForm.isModified()) - && !save()) { - return; - } - log.clear(); - ConfigPersister.getInstance().getConfig().checkInvariants(); - Builder b = new Builder(log); - _outfile = b.build(); - setRunEnabled(ConfigPersister.getInstance().getConfig().isGuiApplication() - // TODO fix console app test - && (Util.WINDOWS_OS || !ConfigPersister.getInstance() - .getConfig().isDontWrapJar())); - } catch (InvariantViolationException ex) { - setRunEnabled(false); - ex.setBinding(_configForm.getBinding(ex.getProperty())); - warn(ex); - } catch (BuilderException ex) { - setRunEnabled(false); - log.append(ex.getMessage()); - } - } - } - - private class RunActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - try { - getGlassPane().setVisible(true); - Worker.post(new Task() { - public Object run() throws ExecException { - Log log = Log.getSwingLog(_configForm.getLogTextArea()); - log.clear(); - String path = _outfile.getPath(); - if (Util.WINDOWS_OS) { - log.append(Messages.getString("MainFrame.executing") + path); - Util.exec(new String[] { path, "--l4j-debug" }, log); - } else { - log.append(Messages.getString("MainFrame.jar.integrity.test") - + path); - Util.exec(new String[] { "java", "-jar", path }, log); - } - return null; - } - }); - } catch (Exception ex) { - // XXX errors logged by exec - } finally { - getGlassPane().setVisible(false); - } - }; - } - - private class AboutActionListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - info(Main.getDescription()); - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on 2005-05-09 + */ +package net.sf.launch4j.formimpl; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JToolBar; +import javax.swing.SwingWorker; +import javax.swing.UIManager; + +import com.formdev.flatlaf.FlatLightLaf; + +import net.sf.launch4j.Builder; +import net.sf.launch4j.BuilderException; +import net.sf.launch4j.ExecException; +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.Log; +import net.sf.launch4j.Main; +import net.sf.launch4j.Util; +import net.sf.launch4j.binding.Binding; +import net.sf.launch4j.binding.BindingException; +import net.sf.launch4j.binding.InvariantViolationException; +import net.sf.launch4j.config.ConfigPersister; +import net.sf.launch4j.config.ConfigPersisterException; + +/** + * @author Copyright (C) 2022 Grzegorz Kowal + */ +public class MainFrame extends JFrame { + private static MainFrame _instance; + + private final JToolBar _toolBar; + private final JButton _runButton; + private final ConfigFormImpl _configForm; + private final JFileChooser _fileChooser = new FileChooser(MainFrame.class); + private File _outfile; + private boolean _saved = false; + + public static void createInstance() { + try { + FlatLightLaf.install(); + _instance = new MainFrame(); + } catch (Exception e) { + System.err.println(e); + } + } + + public static MainFrame getInstance() { + return _instance; + } + + public MainFrame() { + showConfigName(null); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + addWindowListener(new MainFrameListener()); + setGlassPane(new GlassPane(this)); + _fileChooser.setFileFilter(new FileChooserFilter( + Messages.getString("MainFrame.config.files"), + new String[] { ".xml" })); + + _toolBar = new JToolBar(); + _toolBar.setFloatable(false); + _toolBar.setRollover(true); + addButton(UIManager.getIcon("Tree.leafIcon"), Messages.getString("MainFrame.new.config"), + new NewActionListener()); + addButton(UIManager.getIcon("Tree.openIcon"), Messages.getString("MainFrame.open.config"), + new OpenActionListener()); + addButton(UIManager.getIcon("FileView.floppyDriveIcon"), Messages.getString("MainFrame.save.config"), + new SaveActionListener()); + _toolBar.addSeparator(); + addButton(getLocalIcon("images/build.png"), Messages.getString("MainFrame.build.wrapper"), + new BuildActionListener()); + _runButton = addButton(getLocalIcon("images/run.png"), + Messages.getString("MainFrame.test.wrapper"), + new RunActionListener()); + setRunEnabled(false); + _toolBar.addSeparator(); + addButton(UIManager.getIcon("HelpButton.icon"), Messages.getString("MainFrame.about.launch4j"), + new AboutActionListener()); + + _configForm = new ConfigFormImpl(); + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(_toolBar, BorderLayout.NORTH); + getContentPane().add(_configForm, BorderLayout.CENTER); + pack(); + Dimension scr = Toolkit.getDefaultToolkit().getScreenSize(); + Dimension fr = getSize(); + fr.width = 900; + fr.height += 100; + setBounds((scr.width - fr.width) / 2, (scr.height - fr.height) / 2, + fr.width, fr.height); + setVisible(true); + } + + private ImageIcon getLocalIcon(String iconPath) { + return new ImageIcon(MainFrame.class.getClassLoader().getResource(iconPath)); + } + + private JButton addButton(Icon icon, String tooltip, ActionListener l) { + JButton b = new JButton(icon); + b.setToolTipText(tooltip); + b.addActionListener(l); + _toolBar.add(b); + return b; + } + + public void info(String text) { + JOptionPane.showMessageDialog(this, + text, + Main.getName(), + JOptionPane.INFORMATION_MESSAGE); + } + + public void warn(String text) { + JOptionPane.showMessageDialog(this, + text, + Main.getName(), + JOptionPane.WARNING_MESSAGE); + } + + public void warn(InvariantViolationException e) { + Binding b = e.getBinding(); + if (b != null) { + b.markInvalid(); + } + warn(e.getMessage()); + if (b != null) { + e.getBinding().markValid(); + } + } + + public boolean confirm(String text) { + return JOptionPane.showConfirmDialog(MainFrame.this, + text, + Messages.getString("MainFrame.confirm"), + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; + } + + private boolean canDiscardChanges() { + return (!_configForm.isModified()) + || confirm(Messages.getString("MainFrame.discard.changes")); + } + + private boolean save() { + try { + _configForm.get(ConfigPersister.getInstance().getConfig()); + if (_fileChooser.showSaveDialog(MainFrame.this) == JOptionPane.YES_OPTION) { + File f = _fileChooser.getSelectedFile(); + if (!f.getPath().endsWith(".xml")) { + f = new File(f.getPath() + ".xml"); + } + ConfigPersister.getInstance().save(f); + _saved = true; + showConfigName(f); + return true; + } + return false; + } catch (InvariantViolationException ex) { + warn(ex); + return false; + } catch (BindingException ex) { + warn(ex.getMessage()); + return false; + } catch (ConfigPersisterException ex) { + warn(ex.getMessage()); + return false; + } + } + + private void showConfigName(File config) { + setTitle(Main.getName() + " - " + (config != null ? config.getName() + : Messages.getString("MainFrame.untitled"))); + } + + private void setRunEnabled(boolean enabled) { + if (!enabled) { + _outfile = null; + } + _runButton.setEnabled(enabled); + } + + private void clearConfig() { + ConfigPersister.getInstance().createBlank(); + _configForm.clear(ConfigPersister.getInstance().getConfig()); + } + + private class MainFrameListener extends WindowAdapter { + public void windowOpened(WindowEvent e) { + clearConfig(); + } + + public void windowClosing(WindowEvent e) { + if (canDiscardChanges()) { + dispose(); + System.exit(0); + } + } + } + + private class NewActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + if (canDiscardChanges()) { + clearConfig(); + _saved = false; + showConfigName(null); + setRunEnabled(false); + } + } + } + + private class OpenActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + try { + if (canDiscardChanges() && _fileChooser.showOpenDialog(MainFrame.this) + == JOptionPane.YES_OPTION) { + final File f = _fileChooser.getSelectedFile(); + ConfigPersister.getInstance().load(f); + _saved = true; + _configForm.put(ConfigPersister.getInstance().getConfig()); + showConfigName(f); + setRunEnabled(false); + } + } catch (ConfigPersisterException ex) { + warn(ex.getMessage()); + } catch (BindingException ex) { + warn(ex.getMessage()); + } + } + } + + private class SaveActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + save(); + } + } + + private class BuildActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + final Log log = Log.getSwingLog(_configForm.getLogTextArea()); + try { + if ((!_saved || _configForm.isModified()) + && !save()) { + return; + } + log.clear(); + ConfigPersister.getInstance().getConfig().checkInvariants(); + Builder b = new Builder(log); + _outfile = b.build(); + setRunEnabled(ConfigPersister.getInstance().getConfig().isGuiApplication() + // TODO fix console app test + && (Util.WINDOWS_OS || !ConfigPersister.getInstance() + .getConfig().isDontWrapJar())); + } catch (InvariantViolationException ex) { + setRunEnabled(false); + ex.setBinding(_configForm.getBinding(ex.getProperty())); + warn(ex); + } catch (BuilderException ex) { + setRunEnabled(false); + log.append(ex.getMessage()); + } + } + } + + private class RunActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + try { + getGlassPane().setVisible(true); + new SwingWorker() { + @Override + protected Boolean doInBackground() throws ExecException + { + Log log = Log.getSwingLog(_configForm.getLogTextArea()); + log.clear(); + String path = _outfile.getPath(); + if (Util.WINDOWS_OS) { + log.append(Messages.getString("MainFrame.executing") + path); + Util.exec(new String[] { path, "--l4j-debug" }, log); + } else { + log.append(Messages.getString("MainFrame.jar.integrity.test") + + path); + Util.exec(new String[] { "java", "-jar", path }, log); + } + return true; + } + }.execute(); + } catch (Exception ex) { + // XXX errors logged by exec + } finally { + getGlassPane().setVisible(false); + } + }; + } + + private class AboutActionListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + info(Main.getDescription()); + } + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/Messages.java b/launch4j/src/net/sf/launch4j/formimpl/Messages.java index d4d045a..5a1e6f2 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/Messages.java +++ b/launch4j/src/net/sf/launch4j/formimpl/Messages.java @@ -1,55 +1,55 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package net.sf.launch4j.formimpl; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class Messages { - private static final String BUNDLE_NAME = "net.sf.launch4j.formimpl.messages"; - - private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle - .getBundle(BUNDLE_NAME); - - private Messages() { - } - - public static String getString(String key) { - try { - return RESOURCE_BUNDLE.getString(key); - } catch (MissingResourceException e) { - return '!' + key + '!'; - } - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package net.sf.launch4j.formimpl; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Messages { + private static final String BUNDLE_NAME = "net.sf.launch4j.formimpl.messages"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Messages() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java index ad9413d..4703803 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/MessagesFormImpl.java @@ -1,58 +1,58 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on Oct 7, 2006 - */ -package net.sf.launch4j.formimpl; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Msg; -import net.sf.launch4j.form.MessagesForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class MessagesFormImpl extends MessagesForm { - - public MessagesFormImpl(Bindings bindings) { - Msg m = new Msg(); - bindings.addOptComponent("messages", Msg.class, _messagesCheck) - .add("messages.startupErr", _startupErrTextArea, m.getStartupErr()) - .add("messages.bundledJreErr", _bundledJreErrTextArea, m.getBundledJreErr()) - .add("messages.jreVersionErr", _jreVersionErrTextArea, m.getJreVersionErr()) - .add("messages.launcherErr", _launcherErrTextArea, m.getLauncherErr()) - .add("messages.instanceAlreadyExistsMsg", _instanceAlreadyExistsMsgTextArea, - m.getInstanceAlreadyExistsMsg()); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on Oct 7, 2006 + */ +package net.sf.launch4j.formimpl; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.Msg; +import net.sf.launch4j.form.MessagesForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class MessagesFormImpl extends MessagesForm { + + public MessagesFormImpl(Bindings bindings) { + Msg m = new Msg(); + bindings.addOptComponent("messages", Msg.class, _messagesCheck) + .add("messages.startupErr", _startupErrTextArea, m.getStartupErr()) + .add("messages.jreNotFoundErr", _jreNotFoundErrTextArea, m.getJreNotFoundErr()) + .add("messages.jreVersionErr", _jreVersionErrTextArea, m.getJreVersionErr()) + .add("messages.launcherErr", _launcherErrTextArea, m.getLauncherErr()) + .add("messages.instanceAlreadyExistsMsg", _instanceAlreadyExistsMsgTextArea, + m.getInstanceAlreadyExistsMsg()); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/SingleInstanceFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/SingleInstanceFormImpl.java index 5e6dc40..2cfa5bd 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/SingleInstanceFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/SingleInstanceFormImpl.java @@ -1,54 +1,54 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/** - * Created on 2007-09-22 - */ -package net.sf.launch4j.formimpl; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.SingleInstance; -import net.sf.launch4j.form.SingleInstanceForm; - -/** - * @author Copyright (C) 2007 Grzegorz Kowal - */ -public class SingleInstanceFormImpl extends SingleInstanceForm { - - public SingleInstanceFormImpl(Bindings bindings) { - bindings.addOptComponent("singleInstance", SingleInstance.class, - _singleInstanceCheck) - .add("singleInstance.mutexName", _mutexNameField) - .add("singleInstance.windowTitle", _windowTitleField); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Created on 2007-09-22 + */ +package net.sf.launch4j.formimpl; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.SingleInstance; +import net.sf.launch4j.form.SingleInstanceForm; + +/** + * @author Copyright (C) 2007 Grzegorz Kowal + */ +public class SingleInstanceFormImpl extends SingleInstanceForm { + + public SingleInstanceFormImpl(Bindings bindings) { + bindings.addOptComponent("singleInstance", SingleInstance.class, + _singleInstanceCheck) + .add("singleInstance.mutexName", _mutexNameField) + .add("singleInstance.windowTitle", _windowTitleField); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java index b204bfd..839a981 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/SplashFormImpl.java @@ -1,61 +1,61 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.JFileChooser; - -import net.sf.launch4j.FileChooserFilter; -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.Splash; -import net.sf.launch4j.form.SplashForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class SplashFormImpl extends SplashForm { - - public SplashFormImpl(Bindings bindings, JFileChooser fc) { - bindings.addOptComponent("splash", Splash.class, _splashCheck) - .add("splash.file", _splashFileField) - .add("splash.waitForWindow", _waitForWindowCheck, true) - .add("splash.timeout", _timeoutField, "60") - .add("splash.timeoutErr", _timeoutErrCheck, true); - - _splashFileButton.addActionListener(new BrowseActionListener(false, fc, - new FileChooserFilter("Bitmap files (.bmp)", ".bmp"), _splashFileField)); - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.JFileChooser; + +import net.sf.launch4j.FileChooserFilter; +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.Splash; +import net.sf.launch4j.form.SplashForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class SplashFormImpl extends SplashForm { + + public SplashFormImpl(Bindings bindings, JFileChooser fc) { + bindings.addOptComponent("splash", Splash.class, _splashCheck) + .add("splash.file", _splashFileField) + .add("splash.waitForWindow", _waitForWindowCheck, true) + .add("splash.timeout", _timeoutField, "60") + .add("splash.timeoutErr", _timeoutErrCheck, true); + + _splashFileButton.addActionListener(new BrowseActionListener(false, fc, + new FileChooserFilter("Bitmap files (.bmp)", ".bmp"), _splashFileField)); + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java b/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java index 8e0e5f3..89e3369 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java +++ b/launch4j/src/net/sf/launch4j/formimpl/VersionInfoFormImpl.java @@ -1,69 +1,69 @@ -/* - Launch4j (http://launch4j.sourceforge.net/) - Cross-platform Java application wrapper for creating Windows native executables. - - Copyright (c) 2004, 2015 Grzegorz Kowal - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * Created on May 1, 2006 - */ -package net.sf.launch4j.formimpl; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.JFileChooser; - -import net.sf.launch4j.binding.Bindings; -import net.sf.launch4j.config.LanguageID; -import net.sf.launch4j.config.VersionInfo; -import net.sf.launch4j.form.VersionInfoForm; - -/** - * @author Copyright (C) 2006 Grzegorz Kowal - */ -public class VersionInfoFormImpl extends VersionInfoForm { - - public VersionInfoFormImpl(Bindings bindings, JFileChooser fc) { - _languageCombo.setModel(new DefaultComboBoxModel(LanguageID.sortedValues())); - bindings.addOptComponent("versionInfo", VersionInfo.class, _versionInfoCheck) - .add("versionInfo.fileVersion", _fileVersionField) - .add("versionInfo.productVersion", _productVersionField) - .add("versionInfo.fileDescription", _fileDescriptionField) - .add("versionInfo.internalName", _internalNameField) - .add("versionInfo.originalFilename", _originalFilenameField) - .add("versionInfo.productName", _productNameField) - .add("versionInfo.txtFileVersion", _txtFileVersionField) - .add("versionInfo.txtProductVersion", _txtProductVersionField) - .add("versionInfo.companyName", _companyNameField) - .add("versionInfo.copyright", _copyrightField) - .add("versionInfo.trademarks", _trademarksField) - .add("versionInfo.languageIndex", _languageCombo, VersionInfo.DEFAULT_LANGUAGE_INDEX) - ; - } -} +/* + Launch4j (http://launch4j.sourceforge.net/) + Cross-platform Java application wrapper for creating Windows native executables. + + Copyright (c) 2004, 2015 Grzegorz Kowal + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Created on May 1, 2006 + */ +package net.sf.launch4j.formimpl; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JFileChooser; + +import net.sf.launch4j.binding.Bindings; +import net.sf.launch4j.config.LanguageID; +import net.sf.launch4j.config.VersionInfo; +import net.sf.launch4j.form.VersionInfoForm; + +/** + * @author Copyright (C) 2006 Grzegorz Kowal + */ +public class VersionInfoFormImpl extends VersionInfoForm { + + public VersionInfoFormImpl(Bindings bindings, JFileChooser fc) { + _languageCombo.setModel(new DefaultComboBoxModel(LanguageID.sortedValues())); + bindings.addOptComponent("versionInfo", VersionInfo.class, _versionInfoCheck) + .add("versionInfo.fileVersion", _fileVersionField) + .add("versionInfo.productVersion", _productVersionField) + .add("versionInfo.fileDescription", _fileDescriptionField) + .add("versionInfo.internalName", _internalNameField) + .add("versionInfo.originalFilename", _originalFilenameField) + .add("versionInfo.productName", _productNameField) + .add("versionInfo.txtFileVersion", _txtFileVersionField) + .add("versionInfo.txtProductVersion", _txtProductVersionField) + .add("versionInfo.companyName", _companyNameField) + .add("versionInfo.copyright", _copyrightField) + .add("versionInfo.trademarks", _trademarksField) + .add("versionInfo.languageIndex", _languageCombo, VersionInfo.DEFAULT_LANGUAGE_INDEX) + ; + } +} diff --git a/launch4j/src/net/sf/launch4j/formimpl/messages.properties b/launch4j/src/net/sf/launch4j/formimpl/messages.properties index 385adbd..cd8f71d 100644 --- a/launch4j/src/net/sf/launch4j/formimpl/messages.properties +++ b/launch4j/src/net/sf/launch4j/formimpl/messages.properties @@ -1,80 +1,72 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2015 Grzegorz Kowal -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -tab.basic=Basic -tab.classpath=Classpath -tab.header=Header -tab.singleInstance=Single instance -tab.jre=JRE -tab.envVars=Set env. variables -tab.splash=Splash -tab.version=Version Info -tab.messages=Messages - -# Basic -jar=Jar: -jarPath=Jar runtime path: -jarTip=Application jar. -jarPathTip=Optional runtime path of the jar relative to the executable. For example, if the executable launcher and the application jar named calc.exe and calc.jar are in the same directory, it would be: calc.jar. - -# Classpath -specifyClassPath=Specify classpath item to add. -confirmClassPathRemoval=Remove selected classpath items? -noManifest=The selected jar does not have a manifest. - -# JRE -specifyVar=Specify environment variable to add. -otherVar=Other var - -jdkPreference.jre.only=Only use public JREs -jdkPreference.prefer.jre=Prefer public JRE, but use JDK runtime if newer -jdkPreference.prefer.jdk=Prefer JDK runtime, but use public JRE if newer -jdkPreference.jdk.only=Only use private JDK runtimes - -runtimeBits.64=64-bit only -runtimeBits.64And32=First 64-bit, then 32-bit -runtimeBits.32And64=First 32-bit, then 64-bit -runtimeBits.32=32-bit only - -MainFrame.config.files=launch4j config files (.xml, .cfg) -MainFrame.new.config=New configuration -MainFrame.open.config=Open configuration or import 1.x -MainFrame.save.config=Save configuration -MainFrame.build.wrapper=Build wrapper -MainFrame.test.wrapper=Test wrapper -MainFrame.about.launch4j=About launch4j -MainFrame.discard.changes=Discard changes? -MainFrame.confirm=Confirm -MainFrame.untitled=untitled -MainFrame.executing=Executing: -MainFrame.jar.integrity.test=Jar integrity test, executing: +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2015 Grzegorz Kowal +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +tab.basic=Basic +tab.classpath=Classpath +tab.header=Header +tab.singleInstance=Single instance +tab.jre=JRE +tab.envVars=Set env. variables +tab.splash=Splash +tab.version=Version Info +tab.messages=Messages + +# Basic +jar=Jar: +jarPath=Jar runtime path: +jarTip=Application jar. +jarPathTip=Optional runtime path of the jar relative to the executable. For example, if the executable launcher and the application jar named calc.exe and calc.jar are in the same directory, it would be: calc.jar. + +# Classpath +specifyClassPath=Specify classpath item to add. +confirmClassPathRemoval=Remove selected classpath items? +noManifest=The selected jar does not have a manifest. + +# JRE +specifyVar=Specify environment variable to add. +otherVar=Other var + +requiresJdk=Requires JDK + +MainFrame.config.files=launch4j config files (.xml) +MainFrame.new.config=New configuration +MainFrame.open.config=Open configuration or import 1.x +MainFrame.save.config=Save configuration +MainFrame.build.wrapper=Build wrapper +MainFrame.test.wrapper=Test wrapper +MainFrame.about.launch4j=About launch4j +MainFrame.discard.changes=Discard changes? +MainFrame.confirm=Confirm +MainFrame.untitled=untitled +MainFrame.executing=Executing: +MainFrame.jar.integrity.test=Jar integrity test, executing: diff --git a/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties b/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties deleted file mode 100644 index e856f38..0000000 --- a/launch4j/src/net/sf/launch4j/formimpl/messages_es.properties +++ /dev/null @@ -1,56 +0,0 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Martínez Ros -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -tab.basic = B\u00E1sico -tab.header = Cabecera -tab.jre = JRE -tab.splash = Pantalla de bienvenida -tab.version = Informaci\u00F3n de la versi\u00F3n - -jar = Jar -jarPath = Ruta del jar -jarTip = Jar de la aplicaci\u00F3n. -jarPathTip = Ruta del jar relativa al ejecutable. Por ejemplo, si el lanzador ejecutable y el jar de la aplicaci\u00F3n, llamados calc.exe y calc.jar respectivamente, est\u00E1n en el mismo directorio, ser\u00EDa\: calc.jar. - -MainFrame.config.files = Ficheros de configuraci\u00F3n de launch4j (.xml, .cfg) -MainFrame.new.config = Nueva configuraci\u00F3n -MainFrame.open.config = Abrir configuraci\u00F3n o importar 1.x -MainFrame.save.config = Guardar configuraci\u00F3n -MainFrame.build.wrapper = Construir el empaquetador -MainFrame.test.wrapper = Comprobar el empaquetador -MainFrame.about.launch4j = Acerca de launch4j -MainFrame.discard.changes = \u00BFDescartar cambios? -MainFrame.confirm = Confirmar -MainFrame.untitled = Sin nombre -MainFrame.executing = Ejecutando\: -MainFrame.jar.integrity.test = Prueba de integridad jar, ejecutando\: diff --git a/launch4j/src/net/sf/launch4j/messages.properties b/launch4j/src/net/sf/launch4j/messages.properties index db2f9cc..67e30c1 100644 --- a/launch4j/src/net/sf/launch4j/messages.properties +++ b/launch4j/src/net/sf/launch4j/messages.properties @@ -1,45 +1,45 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2015 Grzegorz Kowal -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -Main.usage=usage - -Builder.compiling.resources=Compiling resources -Builder.linking=Linking -Builder.wrapping=Wrapping\nWARNING: Sign the executable to minimize antivirus false positives or use launching instead of wrapping. -Builder.success=Successfully created -Builder.generated.resource.file=Generated resource file...\n -Builder.line.has.errors=Line {0} has errors... - -Util.exec.failed=Exec failed -Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. - +# +# Launch4j (http://launch4j.sourceforge.net/) +# Cross-platform Java application wrapper for creating Windows native executables. +# +# Copyright (c) 2004, 2015 Grzegorz Kowal +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors +# may be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +Main.usage=usage + +Builder.compiling.resources=Compiling resources +Builder.linking=Linking +Builder.wrapping=Wrapping\nWARNING: Sign the executable to minimize antivirus false positives or use launching instead of wrapping. +Builder.success=Successfully created +Builder.generated.resource.file=Generated resource file...\n +Builder.line.has.errors=Line {0} has errors... + +Util.exec.failed=Exec failed +Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. + diff --git a/launch4j/src/net/sf/launch4j/messages_es.properties b/launch4j/src/net/sf/launch4j/messages_es.properties deleted file mode 100644 index 8565cf4..0000000 --- a/launch4j/src/net/sf/launch4j/messages_es.properties +++ /dev/null @@ -1,44 +0,0 @@ -# -# Launch4j (http://launch4j.sourceforge.net/) -# Cross-platform Java application wrapper for creating Windows native executables. -# -# Copyright (c) 2004, 2007 Grzegorz Kowal, Patricio Martínez Ros -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -Main.usage=Uso - -Builder.compiling.resources=Compilando recursos -Builder.linking=Enlazando -Builder.wrapping=Empaquetando -Builder.success=Creado con \ufffdxito -Builder.generated.resource.file=Fichero de recursos generado...\n -Builder.line.has.errors=Line {0} has errors... - -Util.exec.failed=Fallo en la ejecuci\ufffd -Util.tmpdir=Temporary file directory path (launch4j.tmpdir) cannot contain spaces. diff --git a/launch4j/w32api/MinGW.LICENSE.txt b/launch4j/w32api/MinGW.LICENSE.txt index aea85bd..141412d 100644 --- a/launch4j/w32api/MinGW.LICENSE.txt +++ b/launch4j/w32api/MinGW.LICENSE.txt @@ -1,25 +1,25 @@ -MinGW - Licensing Terms - -Various pieces distributed with MinGW come with its own copyright and license: - -Basic MinGW runtime - MinGW base runtime package is uncopyrighted and placed in the public domain. - This basically means that you can do what you want with the code. - -w32api - You are free to use, modify and copy this package. - No restrictions are imposed on programs or object files compiled with this library. - You may not restrict the the usage of this library. - You may distribute this library as part of another package or as a modified package - if and only if you do not restrict the usage of the portions consisting - of this (optionally modified) library. - If distributed as a modified package then this file must be included. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty - of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -MinGW profiling code - MinGW profiling code is distributed under the GNU General Public License. - -The development tools such as GCC, GDB, GNU Make, etc all covered by GNU General Public License. +MinGW - Licensing Terms + +Various pieces distributed with MinGW come with its own copyright and license: + +Basic MinGW runtime + MinGW base runtime package is uncopyrighted and placed in the public domain. + This basically means that you can do what you want with the code. + +w32api + You are free to use, modify and copy this package. + No restrictions are imposed on programs or object files compiled with this library. + You may not restrict the the usage of this library. + You may distribute this library as part of another package or as a modified package + if and only if you do not restrict the usage of the portions consisting + of this (optionally modified) library. + If distributed as a modified package then this file must be included. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty + of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +MinGW profiling code + MinGW profiling code is distributed under the GNU General Public License. + +The development tools such as GCC, GDB, GNU Make, etc all covered by GNU General Public License. diff --git a/launch4j/w32api/crt2.o b/launch4j/w32api/crt2.o index f81f836cf0029d4af7b7db21e05a85add3ba4627..4f5f3be7d4c17e6f024467116c08045761f82580 100644 GIT binary patch literal 14751 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 diff --git a/launch4j/w32api/libadvapi32.a b/launch4j/w32api/libadvapi32.a index c471853c7d04274e3b24db67385e541d39ff128c..21a8d7b00f78e7183c0567ca2f91e8284b5c60f5 100644 GIT binary patch literal 411604 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 N$GzTbAQLtBQBizky@}YhV{6%E47wcj)sa6?&L4 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

  • bunwgjl&A7!Ll3srE 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 diff --git a/launch4j/w32api/libgcc.a b/launch4j/w32api/libgcc.a index d3f89479ee9608c634c996cc7548aabd0943631f..f98edb83f34262dff3df67443e66cb004522fc16 100644 GIT binary patch literal 3130938 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

    a+zKUX(EcAv?l$A4UrQOg% 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�N6`Lxpfjdqj9&ZP$Mn&bouAiFBH4mkNW zerTE@pHVYC^J%5|8|@~Iol6biHOUDApjg$t&!ql68AyfGAKjyJ{o(B~pJJhc9}j89 z3iSa5K(VTOpGp0DGLQKOWMI73u>BfMQkmK9lkn^_`4kHk{CG$+R;Ulq%#Dcr zsx8@MoWspDB_n%)m%5DUr zG5s8_RYL|qGdCjgm+O#OZp|UE%OHQM??1nCl-&qKWBNH@p{ssaUO zkCIMXMu`osz6u+_Z%zLpCNs=i5Poeo9F<|?RRs!r>9!Bw+JVm^CIX*X7OBhzZat4h z1LhSzpXzxn5di}B(rq8UwF93;Oawl&EK->b+xb-|14VYK>e5&WQL<9)eOSgUa)((6YF%kI8vPfk%aO-(28ZfW$`Bcwq zi3kvqb@An7k(}jfqc+R+R@<%De3eUYIHSDD{t&}R=rjW(>*CAFB00;|Ms1est+rdQ z`6`#*a7KBP{UL^t&}jxm*2R~TMRJy_joK{NTWz;q^Hnar;f(So`$G&Pq0utKwIA{oSJS`RJC^%RtZ5xsU=Jyy$PC=wNRVpNgyRSH-XL`nyHt^U*D- zmw}$Ab0Gydc+uZN(ZSv#J{4EruZmyg^>>TP=c8LvF9SVK=Ryh$7+uD5!zRYlayQ;z zR<*49{TEO5#~|N!31>fcVGRNoFuIKAhE0s8x(vZ`g(@4tAe zKL+`>OE~+n3u_R0Cdi{7pVtY7geCnliik(V{J*ig49+pWsBvZRn@9ukOpr%EKCcrD z2}}BA6cLYz`F~?~8JuH$QRB+sH<1S6nIMmTd|oFQ5|;GKC?Xya^Z&-~GC0ThqQ;fM zZz2uH9-tiN7)EZM10H0;q0`c7{r_6YqjAA8x+hV3RD4amJ#LT?v*q#Jz?Mt1S^=An7!~lei()0B7(3DWz?n@PDwoR2U{Bo7#EDe`wI1bN@TJbgE9*X_$Xo;b zfis&pR4$d3!JfFEi4&^?YCX!k;7gr}SJr(e613M8l_kQXZjZvl0?}%lCps)gD&cYS?-0=|J zni%@B2X-QA?)}s+8ly^~-x13OL16{QoP{g&x#J}mD)d|)*}TxHu>6Nike;fWGPV&uo0|x6l%ho- z!_v?BRp_}qvU#CXVfhc4AU#z#Wo#pSHa8Km9lF|VjgTp2MEmjBRv7I=;4uS*2HD-$ ztrZ7Mad87-J9M?#8X;54i1y>LtuWe$z+(mq4YIqhTPqHj;^GFucIaxeHA1G85$(rg zTVb>hfyWFK8f150w^kf5#l;OLelFr8aX=x21IhFg-+78@v-D_cI7fbY@u~%IC&2IW!~um64kXi0eCH{q&C;W( z;T-wp#j6&;odgSp{_(UN^qCsa0@TCY82h1zkC5#lEo{sBjaAW%A2b3B{o`pl=rc8- z1*nI)G4?|bA0gXATG*EL8>^xjKWGFM`p469&}V8u3s4VpW9)|>K0>yKw6HDfH&#V6 ze$WUi^pB_IpwHBR7N8#H#@G)%e1vQdX<=K|Z>)-D{GbsDWVTe4hAG4up1GgLC-~2$ z<$&VP;dw=oN$*bKn1%xp$ZV-74O56SJaa#fPw<~h%K^oo!}E$Flir=eF%1VIkl9jE z8m16uc;^#EwtI6q8i}@+;tR_ESdqX?4O7q1{C#$sX+oN z1*~>gT4=LBMK!_+xa%k;Su_J&**_6K3@GXgQ-cIk3Rvx~w9saMifV)taMw{xvS

    odsAGQ zYWFm5#_v<>;3=F*6f<-(aE9)0LYxEKp?O#G_NKTp)$VEBjNhl$!BaSsC}!wn;0)d0 zgg6JdL-VfW?M-oIs@>DL8NW}hgQsvNQOwZEz!|!~32_cs+GC0Ol@EPKRV?=;1@jMy zP40Zusr6haz@Cd)XyXE~w8s+lDjb3Y*`ZI?L1YA zPU;0@tF>ERleCi>D$WF4Ap(ivbc#)6*s>(Z+j*)Kozx5AyNX459VEAF2=)N12AWP_ z7lIEI_*MrfUl<|;xm^OncNL5BI!JEU5bOb14K$s=E(9Ma@U0F|zA!`xa=QeC?zj(vo^aP-Ud)sKBRQwIZS9*mum(CdN;DlQ>~PKtpa9s3A- z;pms^s~`JtrVa+tJQzDAq1OcyR9r#|ofHEHQa73ma%9lT^C_dmM5dRMLTmz57;xkc+V7hOh`voXrEWACzM6PaF43b6_AJd=)}y(|j@(B;%NDZ8};H@M$IHShu5c_tk{ds!9+pv%|A9r7s@P&yjkQg&+xZg9VaYTyI8^GrH^ z_OdJtK$owJJLFR+pma36rR>%Y+~9r-)xZaG=b3c;>}6RPfG%GbcgUwuK_}$a<^MObHWfvB6YBbNdt+55*!mi}PjC?imA=Tnd%`k@Z%inGz<} zVuPuM=JqKt9*RYB7U#>N-7^L#xfCk>BkQe3GbK!{#RgLi&FxcQJQR!MEY6ojyJrld zzMVVFpvWQ)*KI=YjWntPDajDv*w7o4qK{E@C3^xyeLHuUL6JoquG@s(8);MpQj#IS zv7t98MIWQ+O7;YY`gZOxgCdJKT(=3mH`1sIq$ERtV?%FHiatismFx){GJgC#8ajeL z-&bhAq{ATsR0pRSN7}Ec8>XlB9sB_{Wc>JfG;{=gzOT@JNryuOs18mujH%w3M zJNN@^$oTQ|Xy^#~d|#pck`9LmP#v6R9BIF%ZkV3hckl<-kn!W^(a;g}`MyH?B^?eC zpgK6sIMRMi-7r11@8Az#gJb%~_FT{~WmygXZJ*C+hS;RSaga>h#R=KH{44{#2FLV| z?YW>~%CZ{%+diMu46#Xt;~<&1ixaYY`B?^e4UXv_+jBv~lw~#iw|zdR8Df(P$3Zf2 z7bj%*^0N%G0=6#GD;EtXgh!-hzOp~=(MIadCk+aH(FYXEV~PS~1#DfWS1uY(2#-k1 zd}V*!qm9&^PZ|{Zq7NvR#}oy}3fQ_#uUs^o5FU}1`O5ydM;oa-pEM}+MITTsk0}a| zXkI1U?|2IAoS(M0{*KJ?r#OhE>~L<%+MlV_PY41X(Y#8y-|-aKIX`W0{T-R(PjL`S z+2P!jwLep<{BKgB^TWruT9*8WVbenJqj4VMTl<|lVXF3i31{TCFr48f+=t+cQZUYSC? ze?S9a8!i!A%unu&T$p?1`!6VL8G=o#TWMh-yfTG&|9}Rihqs{B8Bq~}B7~#&z|Cs{k6QsBztW9#E%oGA3t9c(zZo;CM%0jDO z{r~zpIee@{)T#EaS)1fSnJEN6R`Wib+=N9hm4#Nn`v3KHa`;$@s8j7-vo^_vGE)eB ztmb_luv!YkA_^{57yBU1kPV4>B1 zyVdaiU1nBR>hmW;r&1MTg;%I=>QN0J2de)u;JGU1i}(C8c@*BN`(tiE?shkN=XdU} z`>6sw4pjeRz;jj17w`FH@+iDj_s86T-0g1k&hOk`_frLV9H{=sfaj{1FW&RZltW7*mg(`CzWBvq>|a;N!Pmg@@WOILt#q zAZ&Qhi9)tqmnWmo6Ej*p@Mr^0z{hXB3JA|ECuX#I;L!$~ zfREpL6&`BC;4lvbfw190CkokeU7n0SPt0ibz@rVh8H4$LH#rq2V56Lx=DfzH)XtHx z5{7~dLyxY?S-JvoGY0ehZgMJ4z(zSW&3TPYshuNXB@6`_h8|s&vvdXGW(?;0-Q-l9 zfQ@o$n)4c)QaeY&N*D?<3_ZFkXXy%*6r9JHU&r0J8R-_{9+x;$-3!|$LThMn0@=Ph zt}X&7DL9WYzmB_cGtw=@JuY#ix)-)hgx1jD1hRd1TwMfDQg9w)ejRt?W~5t)dtBm3 zbuVn22(6*P31s{3xVi|Pq~JWp{5tN&%}BQp_qfE7>R#A35n4lo6Ug@6adi<>hsLER z%nO$E^>p!^WQ$r*m8_AZHbvUA(DcfZ<9!3B4vkAsm=`SR>*?Y-$riPsDp?~*ZHlyK zq3M++$NL6L9U7OOFfUlr*VDywk}YaMRkB8s+7xNeLenctj`t0z(w>CuJk~^AUMj(` zgKtPcM7^hj_|V~xKq_x_9LoYxr9BDRd8~=Lyi|f=2j7r@hvgd8q`$4!$7)5%r!9;zNf&0;#;!aV!gms2FPSW2?}8ONg4l&+<6{oys3J zEvK{$n(kP{7CZtDQ8Cou$5x^HmJl_8pXGA^I+Z_cT25&hG~Ka?EqDYQqGG7QkF7%Y zEg@ zDOLY@U45u1Ae9_JuOf8w2sNoYfA{t>1$Q>y;+y82L2Kq@(cUQG_8DY@CW zOf9+SL3<72GM$GCcZkd|^8VbZ*=`FOM%)5LQ*yI$nObtugZ3K4WjYTP?hu(_6c-t!WZ9Mqmu+~ zxPygH!d)FtIaglOqL53wNlshO(=WqPg)hFjMkfhMi%qoLCV8LSaS=u;y6M}C+d>k< zkO?QM8l%6yr_=$H7Mp0fP4Ygu<06bybknyNw}m8zArnqiHAa7ZPpJbXEjH0|o8*0R z$3+;a=%#NkZVO2aLnfT4YK;E+o>B)%T5O`_Hp%g3BPlDEV!$QX2_-asVv~@lZk)AR!+3f;^ie9HENgd0Mp9HP#hJ}p3 z@ztQ#XzP3+B0XhdvfBj*6}?VTk~)?hKM7jf4GS56x_9|s_+I}eX;8y}R)qWqkZ5KRpOr5<~(rR$bC#!&X?N!R= zwEa-%!LI~ts{KB6+b($Im^yo}q}AYa2Ng(bydLDAG|Xy@pn5?D*kg*&c6eS zyO(9d;)}+%;4b_n>Z*XPKX_+a;_r5(RQ%_roPP%tcQ4C^#TSij!Cm-E)KvjnfAG$< z#NX{msrb)LIsXpP7o#Xn^fw$yz!I2sDiO`AOk*h|^k4jRyD`H;*#82eFGf+E=x;cZ zfF&^NR3e&JnZ{B`=)d^sc4LNxu>S=^UyPzS(cf?+0ZU-ksYEodGL5B>(0}pM?ZylX zVgCz3Mo;ae_FvCVz#AzVeVmKE8rYwH1Ma2VnT@&BGQq=-GW#o}zo(w(KfLb!@z zEi1BL*VY5i;4s7w;{QEqND+H#i^bWFr8`S|g>V(cT2^GguB`{1!C{CW#Q%HJkRtZf z7K^hTOLvy`3gIe>wXDc~U0VUv6T4u7t=?4Cg1W$^esO0L(o5nk}iXtfHMG^zq zv%qQDw9I6O(+&I~37!-`QOVVnH;s2{6-7|YizEiIXMxkQX_?6mryKY~5qLQmC zZyN8^DvF?(7fB4g6iq6Md+Wi^hXt4oYH~Xnx`S1sd^naWq8lK%1a$&>DVkIi_tt}- z4+}6G)Z}(DbO)%L^nWi3F-v&QZ%V3?yUzu9~NLXsLAbQ=nhti^5Iyjh;D%3 z64VL)b_!KH$s(H!(`rU>?!jV5`vTs9FfDk9PD!)*HunMi?G&nZl0`Ndrqzt%+=IoA z_658HVOsDIoswqrZSDj2+bLA-B#Ue^Osg5ixd)3K?F)DZ!nEKaIwj5K+uR53w^OLv zNfy~;m{v22a}O3f+86K+glWM;bV{1dx492vz7UA`LD7+V9^RuH7XzNyUY^O%fP3?E zN_DuxBqamId?66=gQ6q#JiJFYE(ScYy*!hj0r%$TlXIE-)Mf|OBin1Gs(hS2$7R$9fShW zW3<`8oEx@X%E_OSzR~=^moVJ2XOe}v5F#hhItT@#$7r*GIX7&(l#@RteWUq-FJZW4 z&m;?TAw*81br1?vj;`<-rKAcO7UWI#)NSu%{3PKtgl9XN zb*_R*l-T6bj|&-)cQ^ytEy$bfsoUPk_({TP2+wvj>s$qsD6z?<9~Uwp?{EgOTaY)| zQ@6d7@sotp5T5O5*0~BMQDT!zKQ3fI-r)=+-y93Y5R1Q1Ft<%A&{F&qURX7ucHo0` z*`lr4l9K{QzBv|(Ar^n3U~ZdKpr!aJys&CQ?Z5}?vPE07B_{=qd~+-mLoEJ6!Q3{f zKuhsccwyCq+JO(&WsA0EOHK;5<>Lqhr`0mrSzmFx+1tqw7_BO_D@`_$M}j1-s1E{c z%f}H2POD|Kv%cbXv$vBWFj`e;SDI`hj|53vQ6B`@mX9M4oL0+dXMM%(W^X4$V6>{x zt~A+19to1TqCN<(Egwf9IIWh^&iabm&E8Iiz-U#WU1_q3JQ5^vMST!gJOg&PD~TT6$Jo zVOp|C)>yxmCsEeW6dH7zgYjoMJI*x~os9~Kco^Pz6B3FJUaO3Rp?1V61k$kUvzFm; zrH|L0QXB#j@i4scCL|OcyjB?rL+yxD2&7@xXD!3yN*}K~r8op6;$e8>O-Lv@c&#!L zhT0LQ5JGY(XMn-4WI(Q zKjP8ScbI-(2*CzA(9iR0Ne$X5jTKQ)qh0Bw8bAepf5fAu?=bzo5P}VI_K*F0+cm{* zPXyiEQ>-pj1wb?zvyJWTFL3|zoU;Pt>>vC0wrh&ro(Q_Rr&wL63V>)bW*ghvU*P`b zIcEjP*+2I0ZPygLJrQ(sPqDgC6#&s>%r>^Szrg*=bIuAV#SH#0NnSVdr8XBAL-4+- zYG%W&^$NZu^NjynN+|+RiW&T0lDux@OKmPLhTwfu)y#%l>lJ)S<{AIDlu`ts6f^k0 zBzfJ)m)cxh48i-Rs+kS9)+_ju%rpLPDWwQNDQ570N%FdpFSWV27=rgrRWloItyl0R znP>dpQc4jG)q0j0bujYjZ&z50p0i}!-J>{3yhLNvQLbgiLv;fhs`V^0>R{y4->$G0 zJ!i?dyGL=7c!|cSqg>03hw271RO?x0)WOK7zg=N1dd`w@caP#E@e++uN4b_657iBE zs>t4YDvgdI^F`p*eq0@Wu^jrKme93!L0C~ZHpBwrRFS>)R2m&a=8M3q{kS^%Vmb6d zEum}eg0P}+Y={NJsUmypsWdu<%ol-I`*C&j#d7F_T0+;_1z|*6yTf5?aCw^FmBA`qo+$0luFgf`H|L!iN7@LT57CiDc89~(;PN!TD}zZ_Yb4j%xejp@sC34Y$`MBh+1r-N=40J)!k)O}2fc3*=i2~kX{Xj_OO5~yg z^Kr>t3n~ugXi7kkgSlKHfR~L&=w>XfGC_( zAk~?s&-xa%ncoTq?dyq(C;&-fa&~}HWNuT(DntTsL8>!NpY<(jGrtuK+Sd~mQ2>&} z>Y$lRumRfq)Of>dXkKI>c5W_~Lew67;Bq5vd`$=Lx)k-1GBs}Kp4fT|Qy+54+q z;j#!gS5|Hax|wYo^^r4mgNqM2BG3UR0aYoaviDcJ!etR~uB_Y;bTivF>LX|B1{WW4 zM4$sr0;*C-W$&+ch07w~Tv@px=w`NU)JM+L4K6<9h(HIL1XQJv%HCh?3YSH|xw3LY z(9LYysE?ef8(e(I5rGc5%@83_^^$on0_zRHz9UN7TwJgCRJMh?INum3o#p~@n;}A= z>Lv4D1lAjXeMgkExwu~OscZ{(alSE7I?V;)HbaC!)l25R2&^{%`;I7Sb8)@mQ`r{o z;(TMEbean-KH7k$Di1DMn^itDGPa?vuohV@cPpMR`WQ!37g7RRe6#^gRUTZjHmiJQ zWNbrSVJ)&+?p8cs^f8X6E~Ess_-F%~syw)4ZC3fr$k>Lu!dhgt+^u-N=wlpBT}TNe zn63a)RX>Y*uXoG!^u*`B^WNaS#UdCc$ly5KMcV;LFkJzps(u#rUhkIc>50#M=e@yu zi$yR@kil`di?#!hV7dZGRsAgLz1}U?(-WWj&U=IR7K>n*AcNy@7i|Y1!E^f zd%at(rzbx5o%aUsEf&ErK?cX+F4_({z)Y5c%rjLP0xaj-|z+J0Qa5Q?k;;nmX~~s>{83c zLZ=xs7_ej-OdjP8b-B#3eC2MheAYVgyt2%|ua+(c5I={6vm^ z7~KsuNf6`O4;J`K)!?t+Tg?M5nu($sqqoV#`H39;FuEIRk|4&lA1v^fs=;5sx0(lA zG!sQNMsJge^AkDxVRSdtBteX8KUm-|RfE5NZ#56!aGlycK^C`8%FuC`6Xe&BIzUh2 zKdbp~cTFbduL=Xc;X1W@f-G*Gl%eA=C&;fMb%374e^&F~?wU-@Ulj&?!*y!+1XHs~7|E%V}-8Gq*zbXu~z)BU%%@HheJK86$4^T$hE&$nqnIbOp#R`QU z^KJrVft4zjn!EJGeunHixmnz=G_Fz0xMN4H%G9@?P#C0K0q01 zy8vVdW{SAX7b_Hc%)1GX0B?7qq;ytW{1j7H*$f30znQHx;ZBRf1aE2>T=D@P0p9LJ zN$IS%_$j8YvKb00eluHX!krd{3EtE&xa0#n0=(UclG0gi@l#A)Wiu31{ARY&ggY$? z6TGQmaLEUC1bDj>C8e|4;-{Fp%4R62_|0sk33pl)CU{fB;F1r1nz2}F2O(F*lOec^ zD6XL)n2+M^0ZTyVeG-I*U4nnSqCqr--QCveqFdxO+1D1+zLSrFLz&Zx_ zX~try9fVvJPln(wqPT{JU_Oes2P_rcgvLUgfOQO*d-O(#pH1JL+!|mBy73xL6Q&!B z0Xzixfb^z?=6wP%_vnofKbyWgxi!ENbmKLgCQLUL19%AX0qIQ(&HDsk?$H||el~q~ za%+Gk=*DX}O_**h2JjH%1Jauon)eB8y`�pLhIrP&itG$XOM*i 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

    8hC4rsnSfA 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�tA=IGKtHNZ@11R_q#t$AReOLga1u`2{Tgd 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

    HKm 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 %qtxQvRKhdHN<}ptWQp!9 zJmG=&?Jn?P)-_z}tfGmU{4Utc4@%P>lp||qjLd4Gqxr@+^lC}AL50J|zzP1<5$c3K zZ|6ltv>wK zZT(u6P!z@l9!OSQB>R`bxJ`<1#%qk$oTMfB2io#!q)xXguuR?*XlWtmm)fVv2lz*` z?+RbT;dWCan@q%?wNtc}@qDtYwp&b1E~|)}SM&77Id?tlD4>BkW8bWLv;{g=SmgQg zkg4C>v+`=mXCv>OB6YP$T4K8*-Ts3u9;5dly9^OU(ca(czxMx}w)5=_Ra-0VCJi&S zTAyWqsgpqrlb2PDz2^H#+iqX@xp|}U(j#5(>1%p(yc0mq%yny=o@@|3G`;uXPI3c< zbuS5@GL7%4=}UOA=PY2i7ip=dlfFr})bF~%UI$rgV9mq)o@eUb;43-Gj&yg`J}tVo zk~{v5ypDBx7*ochBch4`NJs{qyen5|*1eMOgA5v~R(SX(U` zYDF*n(BR{^ru?aDAqUiUjH*r$x+aKAD-vB<1qjDy*Fz0+Gm~BC9SI-}ydt(g6kn-G|{}9H$N}yc;XmqJfmV})R_wa7#u1_YVJGZNb1&VZM5Ij9eA2yE;J5c zrCu=sSRfRD@I@}4kE2&z)~)+#ck3_c7G~FF3G84)Wi}e|@jx90r-v3joP4Niz)DxS z?vd|sfccLQokZX*v*C8lEW*d_#`wT=BQcrOAx9Nqi`GAt03n#iEvY4meo;p40-_L> z@f-(paxn(7ks7F+jDcB}0giq1im=%&VrxCo1XjD8ggV?A5A`4jp?9&&@)Z|A2yXS3 zo)M0Y72Ys=6f7qgmBC#5xLzeA;hqPE%E69F%`Vz2m{NKBj$a5YMar^q&rVZqAW?Ct zADHfu6~_DIh>k}Wf3euoeJ7p#S(XJjyw{&ODy+!4JPLKA1Y^kmK)jj%`CediUvK;1+RU(+B8o{A zAp+QM^#V(I8m}d9Q?mg6ks)Crn+<)ds?T$>k%pfdign-$eBmZZka;$kYGsHrqh}3- zC}_&c8pEdV+MB#pX29tT67uo|F<_X46^_k?-wrXXk|;!OMw-GM zZRg2$AVFAhdNhSxwQ6sP{HQ#;w1M|(yo|CJp57A*PUdF_Cihq(VQx1EYL)EKO57$>!&!4hL^IqsNh}$QJ+oL|u6`+@4YpA>U)AzL1#! zDB|T5irTBk12-SdKKwl7n>DotkLp~lqE|WRt-hM0HZ+zUNUO&)o@jWtHD#m@Dw=EU zcb6l?%a);~B%5{b;qHUx>eGax7}=(_8Hn^hDy|XC?I}AiWQNFQY!|ZLELEEYX@#xS z@PK$xxrhfE51j9L&RKP-Ws?hM^GdxuHfc(_9$^f~S@bR=`f z9=k`!f9|PhdxHcw*>f!}&_B~AK}VI2x&5NUZ(0}Sb*Am|v&5!i${aS%hmM3Adw1dF z5l1WMgW~bMm#>fpv&d$>CREhY576clDN7O4!#yR2Ud2|Lf{E6-DN5P`4*~|ZwmM{R zH@K5UMdV&-G1;e)oi02AoT+iX_`$IhX*4tlI*j+3{9;$2wJ0gK&x^y6&`-($SST}s ztg%m;+O3sI%*~9at9@9kL3)KyTZ%~h$Vl%KIHvy-gHEUJPsQwj3&=iGmPWj(+FHsK zO@t+Cr!TH`!tUpjTu$aJt`XV-a~KBye!bE_Ei9Ke`{Z#p@NE!E)}>5EU=V-;lANxg zK5)Nlj(6|`kNAj>VIF>>Q8Y2XXt4v?`(90 zrmH}DQLuRK$QCnZ+zXbc2#;)|F2fY9$EhIJ$$q#qde#Qsb6~DvS4IMXMC9EJ)$xLE zRNWj6&3;Eh0jI*qmT%;d0vVcHw{eyYCb4h?dGA{I>sr=8MwAhtbLPs{8B0q z30bC)>fcDA=Y-$JLPnvuG6r zNxogc#NFp*r&v?n5CwBcVX^T&0LA9{8A$z6h7T z`vBfDlz7VzrOXh_DUT)6T;zk{e+o!is+sFcXRBD~;`C?aH66k<#tV$``*w)ihrFyl zY>w6drsiYU?XnpDY{2Lfj)#}9*Rt3m-z>w7E^$L}Qsu!6>WtXK!U}q&*utwKKR7e70to<|y>{WsNdh1@~*#oMl38hcHS>9=gy?rQ*LfR$zUo`lRCoI>=7&9z#HL_f9^1cWnv zoD|4o)g#32*BljabIr8?q|;JfNTRwj?K9&HsHnIfUmegAd>Sc~NBAQ!VFqrEy`HbLH624OM~O6zKecj2G=-HdW-Q@;0 z`6TyC9!XBvqqRu$m?~W)QkL$sJs!|AoSF0R1S(HaO6zvraU6jPS_v$D25WoF^@bd}Ixqqs1-IgOm-nY5 z<4)w|Va5kcJ3D`wN;tKQ5>w;0T!9t2rb&{a)+EIguf~OiejhhNDJc9br6t?;5#O}* zY;j?G8{UVHM!;%5SzA&8w+880xN!y1Prx8)1@ggMP`U9^Q!?&syB&DRo8p&9soL5u z%P!?AiXbCB5=IxWa6&(X?`uins1;>xnkhG$P0cmxkSdC$Mxu9DTV6<$hXpySZ&o-f zHFK1Xb%8N%Di4b+ChOJVy2ma{6EbLD#;83J|G@+hnn2Amq}i@9mQ*33?_v2iY-XB} zPkPynZW?SfeU?^G_g#8Lbx@nne(rfB|2E>1J%0AX5AOPkr}r7#&Yc9~vy1LTwP0gD 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 z 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⪤-NTELZy>dujtz>6SxALpo(PxUat!#{!HWi|Cds^ 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 z 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
    UYfd<%0aZ@XVmj88FS%!I)-GzW!&1)wz-FRs`v+ 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

    H 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