Compare commits

...

5 commits

Author SHA1 Message Date
Nikolay Borodin 0e48a87cea Added theme fix to calendar 2024-06-13 20:20:36 +02:00
Nikolay Borodin 5b021b6997 Code refactoring 2024-06-13 20:07:06 +02:00
Nikolay Borodin 5201c3c7e4 Updated project files 2024-06-13 19:53:44 +02:00
Nikolay Borodin c794c132ff Merge branch 'feat-calendar' into 'main'
Added date picker to InviteWindow

See merge request Monsterovich/lanemu!23
2024-06-13 16:25:23 +00:00
Nikolay Borodin fa526ad329 Added date picker to InviteWindow 2024-06-13 16:25:23 +00:00
9 changed files with 325 additions and 97 deletions

View file

@ -26,7 +26,7 @@
<property name="clib" value="clib"/>
<property name="lib" value="lib"/>
<property name="resources" value="resources"/>
<property name="classpath" value="${lib}/commons-jxpath-1.1.jar;${lib}/commons-logging-1.2.jar;${lib}/bcprov-jdk15on-1.70.jar;${lib}/junit-4.5.jar;${lib}/commons-codec-1.3.jar;${lib}/swing-layout-1.0.3.jar;${lib}/WaifUPnP.jar;${lib}/flatlaf-3.1.1.jar"/>
<property name="classpath" value="${lib}/commons-jxpath-1.1.jar;${lib}/commons-logging-1.2.jar;${lib}/bcprov-jdk15on-1.70.jar;${lib}/junit-4.5.jar;${lib}/commons-codec-1.3.jar;${lib}/swing-layout-1.0.3.jar;${lib}/WaifUPnP.jar;${lib}/flatlaf-3.1.1.jar;${lib}/LGoodDatePicker-11.2.1.jar"/>
<property name="ivy.install.version" value="2.5.2"/>
<condition property="ivy.home" value="${env.IVY_HOME}">
<isset property="env.IVY_HOME"/>
@ -110,7 +110,7 @@
<zipfileset dir="${resources}" prefix="resources"/>
<manifest>
<attribute name="Main-Class" value="org.p2pvpn.Main"/>
<attribute name="Class-Path" value="${lib}/commons-jxpath-1.1.jar ${lib}/commons-logging-1.2.jar ${lib}/bcprov-jdk15on-1.70.jar ${lib}/commons-codec-1.3.jar ${lib}/swing-layout-1.0.3.jar ${lib}/WaifUPnP.jar ${lib}/flatlaf-3.1.1.jar"/>
<attribute name="Class-Path" value="${lib}/commons-jxpath-1.1.jar ${lib}/commons-logging-1.2.jar ${lib}/bcprov-jdk15on-1.70.jar ${lib}/commons-codec-1.3.jar ${lib}/swing-layout-1.0.3.jar ${lib}/WaifUPnP.jar ${lib}/flatlaf-3.1.1.jar ${lib}/LGoodDatePicker-11.2.1.jar"/>
</manifest>
</jar>
</target>

View file

@ -14,5 +14,6 @@
<dependency org="com.formdev" name="flatlaf" rev="3.1.1"/>
<dependency org="org.swinglabs" name="swing-layout" rev="1.0.3"/>
<dependency org="junit" name="junit" rev="4.5"/>
<dependency org="com.github.lgooddatepicker" name="LGoodDatePicker" rev="11.2.1"/>
</dependencies>
</ivy-module>

View file

@ -19,7 +19,7 @@ is divided into following sections:
- cleanup
-->
<project xmlns:if="ant:if" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" xmlns:unless="ant:unless" basedir=".." default="default" name="P2PVPN-impl">
<project xmlns:if="ant:if" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" xmlns:unless="ant:unless" basedir=".." default="default" name="Lanemu-impl">
<fail message="Please build using Ant 1.8.0 or higher.">
<condition>
<not>
@ -119,7 +119,43 @@ is divided into following sections:
<property name="module.name" value=""/>
</target>
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property,-init-modules-supported" name="-do-init">
<property name="platform.java" value="${java.home}/bin/java"/>
<j2seproject1:property name="platform.home" value="platforms.${platform.active}.home"/>
<j2seproject1:property name="platform.bootcp" value="platforms.${platform.active}.bootclasspath"/>
<j2seproject1:property name="platform.compiler" value="platforms.${platform.active}.compile"/>
<j2seproject1:property name="platform.javac.tmp" value="platforms.${platform.active}.javac"/>
<condition property="platform.javac" value="${platform.home}/bin/javac">
<equals arg1="${platform.javac.tmp}" arg2="$${platforms.${platform.active}.javac}"/>
</condition>
<property name="platform.javac" value="${platform.javac.tmp}"/>
<j2seproject1:property name="platform.java.tmp" value="platforms.${platform.active}.java"/>
<condition property="platform.java" value="${platform.home}/bin/java">
<equals arg1="${platform.java.tmp}" arg2="$${platforms.${platform.active}.java}"/>
</condition>
<property name="platform.java" value="${platform.java.tmp}"/>
<j2seproject1:property name="platform.javadoc.tmp" value="platforms.${platform.active}.javadoc"/>
<condition property="platform.javadoc" value="${platform.home}/bin/javadoc">
<equals arg1="${platform.javadoc.tmp}" arg2="$${platforms.${platform.active}.javadoc}"/>
</condition>
<property name="platform.javadoc" value="${platform.javadoc.tmp}"/>
<condition property="platform.invalid" value="true">
<or>
<contains string="${platform.javac}" substring="$${platforms."/>
<contains string="${platform.java}" substring="$${platforms."/>
<contains string="${platform.javadoc}" substring="$${platforms."/>
</or>
</condition>
<fail unless="platform.home">Must set platform.home</fail>
<fail unless="platform.bootcp">Must set platform.bootcp</fail>
<fail unless="platform.java">Must set platform.java</fail>
<fail unless="platform.javac">Must set platform.javac</fail>
<fail if="platform.invalid">
The J2SE Platform is not correctly set up.
Your active platform is: ${platform.active}, but the corresponding property "platforms.${platform.active}.home" is not found in the project's properties files.
Either open the project in the IDE and setup the Platform with the same name or add it manually.
For example like this:
ant -Duser.properties.file=&lt;path_to_property_file&gt; jar (where you put the property "platforms.${platform.active}.home" in a .properties file)
or ant -Dplatforms.${platform.active}.home=&lt;path_to_JDK_home&gt; jar (where no properties file is used)
</fail>
<available file="${manifest.file}" property="manifest.available"/>
<condition property="splashscreen.available">
<and>
@ -242,20 +278,6 @@ is divided into following sections:
<condition else="" property="javac.profile.cmd.line.arg" value="-profile ${javac.profile}">
<isset property="profile.available"/>
</condition>
<condition else="false" property="jdkBug6558476">
<and>
<matches pattern="1\.[56]" string="${java.specification.version}"/>
<not>
<os family="unix"/>
</not>
</and>
</condition>
<condition else="false" property="javac.fork">
<or>
<istrue value="${jdkBug6558476}"/>
<istrue value="${javac.external.vm}"/>
</or>
</condition>
<property name="jar.index" value="false"/>
<property name="jar.index.metainf" value="${jar.index}"/>
<property name="copylibs.rebase" value="true"/>
@ -344,7 +366,7 @@ is divided into following sections:
</path>
</resourcecount>
</condition>
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
<src>
<dirset dir="@{gensrcdir}" erroronmissingdir="false">
<include name="*"/>
@ -395,7 +417,7 @@ is divided into following sections:
<property location="${build.dir}/empty" name="empty.dir"/>
<mkdir dir="${empty.dir}"/>
<mkdir dir="@{apgeneratedsrcdir}"/>
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
<src>
<dirset dir="@{gensrcdir}" erroronmissingdir="false">
<include name="*"/>
@ -437,7 +459,7 @@ is divided into following sections:
<sequential>
<property location="${build.dir}/empty" name="empty.dir"/>
<mkdir dir="${empty.dir}"/>
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
<src>
<dirset dir="@{gensrcdir}" erroronmissingdir="false">
<include name="*"/>
@ -516,7 +538,7 @@ is divided into following sections:
<element name="customizePrototype" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
@ -544,7 +566,7 @@ is divided into following sections:
<element name="customizePrototype" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
@ -613,7 +635,7 @@ is divided into following sections:
</condition>
<union id="test.set"/>
<taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
<testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="P2PVPN" testname="TestNG tests" workingDir="${work.dir}">
<testng classfilesetref="test.set" failureProperty="tests.failed" jvm="${platform.java}" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="Lanemu" testname="TestNG tests" workingDir="${work.dir}">
<xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
<propertyset>
<propertyref prefix="test-sys-prop."/>
@ -710,7 +732,7 @@ is divided into following sections:
<condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
<isset property="test.method"/>
</condition>
<condition else="-suitename P2PVPN -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
<condition else="-suitename Lanemu -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
<matches pattern=".*\.xml" string="@{testClass}"/>
</condition>
<delete dir="${build.test.results.dir}" quiet="true"/>
@ -844,6 +866,9 @@ is divided into following sections:
<classpath>
<path path="@{classpath}"/>
</classpath>
<bootclasspath>
<path path="${platform.bootcp}"/>
</bootclasspath>
</nbjpdastart>
</sequential>
</macrodef>
@ -893,7 +918,7 @@ is divided into following sections:
<attribute default="jvm" name="jvm"/>
<element name="customize" optional="true"/>
<sequential>
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true" module="@{modulename}">
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true" jvm="${platform.java}" module="@{modulename}">
<classpath>
<path path="@{classpath}"/>
</classpath>
@ -927,7 +952,7 @@ is divided into following sections:
<attribute default="jvm" name="jvm"/>
<element name="customize" optional="true"/>
<sequential>
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true" jvm="${platform.java}">
<classpath>
<path path="@{classpath}"/>
</classpath>
@ -959,7 +984,7 @@ is divided into following sections:
<attribute default="jvm" name="jvm"/>
<element name="customize" optional="true"/>
<sequential>
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
<java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true" jvm="${platform.java}">
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
@ -1051,7 +1076,7 @@ is divided into following sections:
<delete file="${built-jar.properties}" quiet="true"/>
</target>
<target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
<echo level="warn" message="Cycle detected: P2PVPN was already built"/>
<echo level="warn" message="Cycle detected: Lanemu was already built"/>
</target>
<target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
<mkdir dir="${build.dir}"/>
@ -1195,7 +1220,7 @@ is divided into following sections:
<j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
<echo level="info">To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<echo level="info">java -jar "${dist.jar.resolved}"</echo>
<echo level="info">${platform.java} -jar "${dist.jar.resolved}"</echo>
</target>
<target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-check-do-mkdist" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
<j2seproject1:jar manifest="${tmp.manifest.file}"/>
@ -1297,8 +1322,8 @@ is divided into following sections:
<isset property="main.class.available"/>
</and>
</condition>
<property name="platform.jlink" value="${jdk.home}/bin/jlink"/>
<property name="jlink.systemmodules.internal" value="${jdk.home}/jmods"/>
<property name="platform.jlink" value="${platform.home}/bin/jlink"/>
<property name="jlink.systemmodules.internal" value="${platform.home}/jmods"/>
<exec executable="${platform.jlink}">
<arg value="--module-path"/>
<arg path="${jlink.systemmodules.internal}:${run.modulepath}:${dist.jar}"/>
@ -1491,16 +1516,19 @@ is divided into following sections:
</not>
</and>
</condition>
<exec executable="${platform.java}" failonerror="false" outputproperty="platform.version.output">
<arg value="-version"/>
</exec>
<condition else="" property="bug5101868workaround" value="*.java">
<matches pattern="1\.[56](\..*)?" string="${java.version}"/>
<matches multiline="true" pattern="1\.[56](\..*)?" string="${platform.version.output}"/>
</condition>
<condition else="" property="javadoc.html5.cmd.line.arg" value="-html5">
<and>
<isset property="javadoc.html5"/>
<available file="${jdk.home}${file.separator}lib${file.separator}jrt-fs.jar"/>
<available file="${platform.home}${file.separator}lib${file.separator}jrt-fs.jar"/>
</and>
</condition>
<javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
<javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" executable="${platform.javadoc}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
<classpath>
<path path="${javac.classpath}"/>
</classpath>
@ -1732,7 +1760,7 @@ is divided into following sections:
<delete file="${built-clean.properties}" quiet="true"/>
</target>
<target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
<echo level="warn" message="Cycle detected: P2PVPN was already built"/>
<echo level="warn" message="Cycle detected: Lanemu was already built"/>
</target>
<target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
<mkdir dir="${build.dir}"/>

View file

@ -3,6 +3,6 @@ build.xml.script.CRC32=18fa743c
build.xml.stylesheet.CRC32=28e38971@1.38.2.45
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=60833d52
nbproject/build-impl.xml.script.CRC32=0262032a
nbproject/build-impl.xml.data.CRC32=7510f847
nbproject/build-impl.xml.script.CRC32=33b387ff
nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.107.0.48

View file

@ -1,9 +1,11 @@
annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false
annotation.processing.processors.list=
annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=P2PVPN
application.vendor=nerv
application.title=Lanemu
application.vendor=
auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
@ -26,22 +28,43 @@ debug.test.modulepath=\
${run.test.modulepath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/P2PVPN.jar
dist.jar=${dist.dir}/Lanemu.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
file.reference.bcprov-jdk15on-1.70.jar=lib/bcprov-jdk15on-1.70.jar
file.reference.commons-codec-1.3.jar=lib/commons-codec-1.3.jar
file.reference.commons-jxpath-1.1.jar=lib/commons-jxpath-1.1.jar
file.reference.commons-logging-1.2.jar=lib/commons-logging-1.2.jar
file.reference.flatlaf-3.1.1.jar=lib/flatlaf-3.1.1.jar
file.reference.junit-4.5.jar=lib/junit-4.5.jar
file.reference.LGoodDatePicker-11.2.1.jar=lib/LGoodDatePicker-11.2.1.jar
file.reference.swing-layout-1.0.3.jar=lib/swing-layout-1.0.3.jar
file.reference.WaifUPnP.jar=lib/WaifUPnP.jar
includes=**
jar.archive.disabled=${jnlp.enabled}
jar.compress=false
javac.classpath=
jar.index=${jnlp.enabled}
javac.classpath=\
${file.reference.LGoodDatePicker-11.2.1.jar}:\
${file.reference.WaifUPnP.jar}:\
${file.reference.bcprov-jdk15on-1.70.jar}:\
${file.reference.commons-codec-1.3.jar}:\
${file.reference.commons-jxpath-1.1.jar}:\
${file.reference.commons-logging-1.2.jar}:\
${file.reference.flatlaf-3.1.1.jar}:\
${file.reference.junit-4.5.jar}:\
${file.reference.swing-layout-1.0.3.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.external.vm=false
javac.modulepath=
javac.processormodulepath=
javac.processorpath=\
${javac.classpath}
javac.source=1.5
javac.target=1.5
javac.source=1.8
javac.target=1.8
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}:\
@ -54,6 +77,7 @@ javac.test.processorpath=\
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.html5=false
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
@ -62,10 +86,30 @@ javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
jlink.launcher=false
jlink.launcher.name=Lanemu
jnlp.codebase.type=no.codebase
jnlp.descriptor=application
jnlp.enabled=false
jnlp.mixed.code=default
jnlp.offline-allowed=false
jnlp.signed=false
jnlp.signing=
jnlp.signing.alias=
jnlp.signing.keystore=
main.class=
# Optional override of default Application-Library-Allowable-Codebase attribute identifying the locations where your signed RIA is expected to be found.
manifest.custom.application.library.allowable.codebase=
# Optional override of default Caller-Allowable-Codebase attribute identifying the domains from which JavaScript code can make calls to your RIA without security prompts.
manifest.custom.caller.allowable.codebase=
# Optional override of default Codebase manifest attribute, use to prevent RIAs from being repurposed
manifest.custom.codebase=
# Optional override of default Permissions manifest attribute (supported values: sandbox, all-permissions)
manifest.custom.permissions=
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
platform.active=default_platform
mkdist.disabled=false
platform.active=JDK_8__System_
run.classpath=\
${javac.classpath}:\
${build.classes.dir}

View file

@ -1,15 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>P2PVPN</name>
<source-roots>
<root id="src.resources.dir"/>
<root id="src.clib.dir"/>
<root id="src.src.dir"/>
</source-roots>
<test-roots/>
</data>
</configuration>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>Lanemu</name>
<explicit-platform explicit-source-supported="true"/>
<source-roots>
<root id="src.resources.dir"/>
<root id="src.clib.dir"/>
<root id="src.src.dir"/>
</source-roots>
<test-roots/>
</data>
</configuration>
</project>

View file

@ -0,0 +1,112 @@
/*
Copyright 2023-2024 Nikolay Borodin <Monsterovich>
This file is part of Lanemu.
Lanemu 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 3 of the License, or
(at your option) any later version.
Lanemu 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 Lanemu. If not, see <http://www.gnu.org/licenses/>.
*/
package org.p2pvpn.gui;
import com.github.lgooddatepicker.components.CalendarPanel;
import com.github.lgooddatepicker.components.DatePickerSettings;
import com.github.lgooddatepicker.components.DatePickerSettings.DateArea;
import com.github.lgooddatepicker.zinternaltools.CustomPopup;
import com.github.lgooddatepicker.zinternaltools.CalendarSelectionEvent;
import com.github.lgooddatepicker.zinternaltools.YearMonthChangeEvent;
import com.github.lgooddatepicker.optionalusertools.CalendarListener;
import java.awt.Component;
import java.awt.Point;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import javax.swing.JSpinner;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
* Calendar widget for the date entry field in InviteWindow.
* Uses internal library methods.
* @author monsterovich
*/
public class CalendarPopup implements CalendarListener {
private final CalendarPanel calendarPanel;
private CustomPopup calendarPopup;
private final Component parentComponent;
private final JSpinner inputField;
public CalendarPopup(Component component, JSpinner field) {
parentComponent = component;
inputField = field;
calendarPanel = new CalendarPanel();
DatePickerSettings settings = new DatePickerSettings();
applyTheme(settings);
calendarPanel.setSettings(settings);
calendarPanel.addCalendarListener(this);
}
public void show() {
Date originalDate = (Date) inputField.getModel().getValue();
calendarPanel.setSelectedDate(originalDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
calendarPopup =
new CustomPopup(
calendarPanel,
SwingUtilities.getWindowAncestor(parentComponent),
null,
null);
Point pointOnScreen = new Point();
SwingUtilities.convertPointToScreen(pointOnScreen, parentComponent);
calendarPopup.setLocation(pointOnScreen.x, pointOnScreen.y + parentComponent.getHeight() + 1);
calendarPopup.show();
calendarPanel.requestFocus();
}
// fixme: remove this function when this is fixed
// https://github.com/LGoodDatePicker/LGoodDatePicker/issues/195
private void applyTheme(DatePickerSettings settings) {
settings.setColor(DateArea.CalendarBackgroundNormalDates, UIManager.getColor("Panel.background"));
settings.setColor(DateArea.BackgroundOverallCalendarPanel, UIManager.getColor("Panel.background"));
settings.setColor(DateArea.TextFieldBackgroundValidDate, UIManager.getColor("TextField.background"));
settings.setColor(DateArea.CalendarBackgroundSelectedDate, UIManager.getColor("Table.selectionBackground"));
settings.setColor(DateArea.BackgroundTopLeftLabelAboveWeekNumbers, UIManager.getColor("Label.background"));
settings.setColor(DateArea.BackgroundMonthAndYearMenuLabels, UIManager.getColor("Label.background"));
settings.setColor(DateArea.BackgroundTodayLabel, UIManager.getColor("Label.background"));
settings.setColor(DateArea.BackgroundClearLabel, UIManager.getColor("Button.background"));
settings.setColor(DateArea.CalendarTextNormalDates, UIManager.getColor("Label.foreground"));
settings.setColor(DateArea.CalendarBorderSelectedDate, UIManager.getColor("Table.selectionBackground").darker());
settings.setColor(DateArea.BackgroundCalendarPanelLabelsOnHover, UIManager.getColor("ComboBox.buttonHighlight"));
settings.setColor(DateArea.CalendarTextWeekdays, UIManager.getColor("Button.foreground"));
settings.setColorBackgroundWeekdayLabels(UIManager.getColor("Button.background"), true);
}
@Override
public void selectedDateChanged(CalendarSelectionEvent event) {
LocalDate calendarDate = event.getSource().getSelectedDate();
if (calendarDate != null && event.isDuplicate()) {
LocalDateTime originalDateTime = ((Date) inputField.getModel().getValue()).toInstant()
.atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime newDateTime = calendarDate.atTime(originalDateTime.getHour(), originalDateTime.getMinute());
inputField.getModel().setValue(Date.from(newDateTime.atZone(ZoneId.systemDefault()).toInstant()));
calendarPopup.hide();
}
}
@Override
public void yearMonthChanged(YearMonthChangeEvent event) {
}
}

View file

@ -31,29 +31,35 @@
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="0" pref="338" max="32767" attributes="0"/>
<Component id="btnClose" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<Component id="lblDate" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="radDate" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="spnExpiryDate" pref="251" max="32767" attributes="0"/>
</Group>
<Component id="radNever" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="chkNetwork" min="-2" max="-2" attributes="0"/>
<Component id="lblNote" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="btnGenerate" alignment="0" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<Component id="lblDate" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="radDate" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="spnExpiryDate" pref="262" max="32767" attributes="0"/>
</Group>
<Component id="radNever" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="chkNetwork" min="-2" max="-2" attributes="0"/>
<Component id="lblNote" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="btnGenerate" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Component id="btnCalendar" min="-2" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="1" attributes="0">
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
<Component id="btnClose" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
@ -73,7 +79,10 @@
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="1" attributes="0">
<Component id="radDate" min="-2" max="-2" attributes="0"/>
<Component id="spnExpiryDate" min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="spnExpiryDate" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="btnCalendar" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
<Component id="lblNote" min="-2" max="-2" attributes="0"/>
@ -204,5 +213,14 @@
</Property>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="btnCalendar">
<Properties>
<Property name="text" type="java.lang.String" value="..."/>
<Property name="toolTipText" type="java.lang.String" value="Open calendar"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnCalendarActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Form>

View file

@ -1,6 +1,6 @@
/*
Copyright 2008, 2009 Wolfgang Ginolas
Copyright 2023 Nikolay Borodin <Monsterovich>
Copyright 2023-2024 Nikolay Borodin <Monsterovich>
This file is part of Lanemu.
@ -16,7 +16,7 @@
You should have received a copy of the GNU Lesser General Public License
along with Lanemu. If not, see <http://www.gnu.org/licenses/>.
*/
*/
package org.p2pvpn.gui;
import java.awt.Toolkit;
@ -39,6 +39,7 @@ import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import org.p2pvpn.tools.AdvProperties;
import org.p2pvpn.gui.CalendarPopup;
/**
* This window is shown, when the user wants to invite another persion.
@ -49,6 +50,8 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
MainControl mainControl;
JFileChooser fileChooser;
CalendarPopup calendarPopup;
/**
* Creates new form InviteWindow
@ -77,6 +80,7 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
});
menu.add(mitem);
txtInvitation.setComponentPopupMenu(menu);
calendarPopup = new CalendarPopup(btnCalendar, spnExpiryDate);
}
/**
@ -110,6 +114,7 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
lblNote = new javax.swing.JLabel();
radNever = new javax.swing.JRadioButton();
radDate = new javax.swing.JRadioButton();
btnCalendar = new javax.swing.JButton();
setTitle("Generate Invitation");
@ -177,6 +182,14 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
grpDate.add(radDate);
btnCalendar.setText("...");
btnCalendar.setToolTipText("Open calendar");
btnCalendar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCalendarActionPerformed(evt);
}
});
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
@ -185,24 +198,28 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.add(0, 338, Short.MAX_VALUE)
.add(btnClose))
.add(layout.createSequentialGroup()
.add(lblDate)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(radDate)
.add(lblDate)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(spnExpiryDate, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 251, Short.MAX_VALUE))
.add(radNever)))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(chkNetwork)
.add(lblNote)
.add(btnGenerate))
.add(0, 0, Short.MAX_VALUE)))
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(radDate)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(spnExpiryDate, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE))
.add(radNever)))
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(chkNetwork)
.add(lblNote)
.add(btnGenerate))
.add(0, 0, Short.MAX_VALUE)))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(btnCalendar))
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.add(0, 0, Short.MAX_VALUE)
.add(btnClose)))
.addContainerGap())
);
layout.setVerticalGroup(
@ -217,7 +234,9 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(radDate)
.add(spnExpiryDate, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(spnExpiryDate, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(btnCalendar)))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(lblNote)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
@ -232,6 +251,10 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
pack();
}// </editor-fold>//GEN-END:initComponents
private void btnCalendarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCalendarActionPerformed
calendarPopup.show();
}//GEN-LAST:event_btnCalendarActionPerformed
private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_btnCloseActionPerformed
setVisible(false);
}// GEN-LAST:event_btnCloseActionPerformed
@ -293,6 +316,7 @@ public class InviteWindow extends javax.swing.JDialog implements ClipboardOwner
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCalendar;
private javax.swing.JButton btnClose;
private javax.swing.JButton btnGenerate;
private javax.swing.JButton btnSave;