From 511fca147957107655bda156b372eed37fc765fb Mon Sep 17 00:00:00 2001 From: MJ Date: Fri, 3 Jun 2016 18:52:48 +0200 Subject: [PATCH 01/58] Refactored Gradle definitions. --- autumn/natives/android/build.gradle | 9 ++------- autumn/natives/gwt/build.gradle | 13 ++++--------- autumn/natives/jtransc/build.gradle | 2 +- build.gradle | 10 ++++++---- examples/gdx-autumn-mvc-simple/gradle.properties | 3 ++- examples/gdx-autumn-tests/gradle.properties | 3 ++- examples/gdx-lml-tests/gradle.properties | 3 ++- examples/gdx-lml-vis-tests/gradle.properties | 3 ++- examples/gdx-lml-vis-websocket/gradle.properties | 3 ++- examples/gdx-lml-vis-wiki/gradle.properties | 3 ++- examples/gdx-websocket-json/gradle.properties | 3 ++- .../gradle.properties | 3 ++- .../gradle.properties | 3 ++- examples/gdx-websocket-tests/gradle.properties | 3 ++- examples/gradle.properties | 3 ++- websocket/natives/gwt/build.gradle | 6 ++---- websocket/natives/serialization/build.gradle | 12 +----------- 17 files changed, 38 insertions(+), 47 deletions(-) diff --git a/autumn/natives/android/build.gradle b/autumn/natives/android/build.gradle index 0bfdfeb3..10a2d957 100644 --- a/autumn/natives/android/build.gradle +++ b/autumn/natives/android/build.gradle @@ -2,13 +2,8 @@ ext { androidVersion = '4.1.1.4' } -configurations { - provided - compile.extendsFrom provided -} - dependencies { - compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" - compile "com.github.czyzby:gdx-autumn:$libVersion" + provided "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" provided "com.google.android:android:$androidVersion" + compile "com.github.czyzby:gdx-autumn:$libVersion" } diff --git a/autumn/natives/gwt/build.gradle b/autumn/natives/gwt/build.gradle index c169f653..838df7da 100644 --- a/autumn/natives/gwt/build.gradle +++ b/autumn/natives/gwt/build.gradle @@ -1,5 +1,5 @@ ext { - gwtVersion = '2.6.0' + gwtVersion = '2.6.1' } javadoc { @@ -7,13 +7,8 @@ javadoc { } dependencies { - compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" - compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources" - compile "com.google.gwt:gwt-user:$gwtVersion" - compile "com.google.gwt:gwt-user:$gwtVersion:sources" - compile "com.google.gwt:gwt-dev:$gwtVersion" - compile "com.google.gwt:gwt-dev:$gwtVersion:sources" + provided "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" + provided "com.google.gwt:gwt-user:$gwtVersion" + provided "com.google.gwt:gwt-dev:$gwtVersion" compile "com.github.czyzby:gdx-autumn:$libVersion" - compile "com.github.czyzby:gdx-autumn:$libVersion:sources" - compile "com.github.czyzby:gdx-kiwi:$libVersion:sources" } diff --git a/autumn/natives/jtransc/build.gradle b/autumn/natives/jtransc/build.gradle index bd0a7e02..b361365c 100644 --- a/autumn/natives/jtransc/build.gradle +++ b/autumn/natives/jtransc/build.gradle @@ -3,6 +3,6 @@ ext { } dependencies { + provided "com.jtransc.gdx:gdx-backend-jtransc:$jtranscVersion" compile "com.github.czyzby:gdx-autumn:$libVersion" - compile "com.jtransc.gdx:gdx-backend-jtransc:$jtranscVersion" } diff --git a/build.gradle b/build.gradle index f9f67d5f..363b957b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ buildscript { } dependencies { classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3" + classpath 'com.netflix.nebula:gradle-extra-configurations-plugin:3.0.3' } } @@ -15,11 +16,12 @@ apply plugin: 'io.codearte.nexus-staging' allprojects { apply plugin: 'eclipse' apply plugin: 'idea' - + apply plugin: 'nebula.provided-base' + ext { - projectVersion = '1.7' + projectVersion = '1.8' gdxVersion = '1.9.3' - isSnapshot = '' + isSnapshot = '-SNAPSHOT' libVersion = "$projectVersion.$gdxVersion$isSnapshot" } } @@ -60,7 +62,7 @@ subprojects { } dependencies { - compile "com.badlogicgames.gdx:gdx:$gdxVersion" + provided "com.badlogicgames.gdx:gdx:$gdxVersion" testCompile "junit:junit:$junitVersion" deployerJars "org.apache.maven.wagon:wagon-ssh:$wagonVersion" deployerJars "org.apache.maven.wagon:wagon-http:$wagonVersion" diff --git a/examples/gdx-autumn-mvc-simple/gradle.properties b/examples/gdx-autumn-mvc-simple/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-autumn-mvc-simple/gradle.properties +++ b/examples/gdx-autumn-mvc-simple/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-autumn-tests/gradle.properties b/examples/gdx-autumn-tests/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-autumn-tests/gradle.properties +++ b/examples/gdx-autumn-tests/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-lml-tests/gradle.properties b/examples/gdx-lml-tests/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-lml-tests/gradle.properties +++ b/examples/gdx-lml-tests/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-lml-vis-tests/gradle.properties b/examples/gdx-lml-vis-tests/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-lml-vis-tests/gradle.properties +++ b/examples/gdx-lml-vis-tests/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-lml-vis-websocket/gradle.properties b/examples/gdx-lml-vis-websocket/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-lml-vis-websocket/gradle.properties +++ b/examples/gdx-lml-vis-websocket/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-lml-vis-wiki/gradle.properties b/examples/gdx-lml-vis-wiki/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-lml-vis-wiki/gradle.properties +++ b/examples/gdx-lml-vis-wiki/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-websocket-json/gradle.properties b/examples/gdx-websocket-json/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-websocket-json/gradle.properties +++ b/examples/gdx-websocket-json/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-websocket-serialization-compare/gradle.properties b/examples/gdx-websocket-serialization-compare/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-websocket-serialization-compare/gradle.properties +++ b/examples/gdx-websocket-serialization-compare/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-websocket-serialization-tests/gradle.properties b/examples/gdx-websocket-serialization-tests/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-websocket-serialization-tests/gradle.properties +++ b/examples/gdx-websocket-serialization-tests/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gdx-websocket-tests/gradle.properties b/examples/gdx-websocket-tests/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gdx-websocket-tests/gradle.properties +++ b/examples/gdx-websocket-tests/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/examples/gradle.properties b/examples/gradle.properties index 78efac96..083d786c 100644 --- a/examples/gradle.properties +++ b/examples/gradle.properties @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xms128m -Xmx512m org.gradle.configureondemand=true gdxVersion=1.9.3 -libVersion=1.7.1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 diff --git a/websocket/natives/gwt/build.gradle b/websocket/natives/gwt/build.gradle index 6528d7c1..8da489f0 100644 --- a/websocket/natives/gwt/build.gradle +++ b/websocket/natives/gwt/build.gradle @@ -1,5 +1,5 @@ ext { - gwtVersion = '2.6.0' + gwtVersion = '2.6.1' } javadoc { @@ -8,7 +8,5 @@ javadoc { dependencies { compile "com.github.czyzby:gdx-websocket:$libVersion" - compile "com.github.czyzby:gdx-websocket:$libVersion:sources" - compile "com.google.gwt:gwt-user:$gwtVersion" - compile "com.google.gwt:gwt-user:$gwtVersion:sources" + provided "com.google.gwt:gwt-user:$gwtVersion" } diff --git a/websocket/natives/serialization/build.gradle b/websocket/natives/serialization/build.gradle index 6528d7c1..3e3c241e 100644 --- a/websocket/natives/serialization/build.gradle +++ b/websocket/natives/serialization/build.gradle @@ -1,14 +1,4 @@ -ext { - gwtVersion = '2.6.0' -} - -javadoc { - options.addStringOption("sourcepath", "") -} - dependencies { compile "com.github.czyzby:gdx-websocket:$libVersion" - compile "com.github.czyzby:gdx-websocket:$libVersion:sources" - compile "com.google.gwt:gwt-user:$gwtVersion" - compile "com.google.gwt:gwt-user:$gwtVersion:sources" } + From 8066ff716f93789d19f2d70b04a23a85e7703226 Mon Sep 17 00:00:00 2001 From: MJ Date: Fri, 3 Jun 2016 18:59:14 +0200 Subject: [PATCH 02/58] Added UEDI projects. --- build.gradle | 6 ++++-- lml-uedi/build.gradle | 4 ++++ lml-uedi/gradle.properties | 2 ++ settings.gradle | 2 +- uedi/build.gradle | 8 ++++++++ uedi/gradle.properties | 2 ++ 6 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 lml-uedi/build.gradle create mode 100644 lml-uedi/gradle.properties create mode 100644 uedi/build.gradle create mode 100644 uedi/gradle.properties diff --git a/build.gradle b/build.gradle index 363b957b..a0f326c2 100644 --- a/build.gradle +++ b/build.gradle @@ -141,9 +141,11 @@ task installAll(dependsOn: ['installBase', 'lml-vis:build', 'lml-vis:install', 'autumn/natives/gwt:install', 'websocket/natives/common:build', 'websocket/natives/common:install', 'websocket/natives/gwt:build', 'websocket/natives/gwt:install', 'websocket/natives/serialization:build', - 'websocket/natives/serialization:install']) + 'websocket/natives/serialization:install', 'lml-uedi:build', + 'lml-uedi:install']) task installBase(dependsOn: ['installKiwi', 'lml:build', 'lml:install', - 'autumn:build', 'autumn:install', 'websocket:build', 'websocket:install']) + 'autumn:build', 'autumn:install', 'websocket:build', 'websocket:install', + 'uedi:build', 'uedi:install']) task installKiwi(dependsOn: ['kiwi:build', 'kiwi:install']) nexusStaging { diff --git a/lml-uedi/build.gradle b/lml-uedi/build.gradle new file mode 100644 index 00000000..a7b19e73 --- /dev/null +++ b/lml-uedi/build.gradle @@ -0,0 +1,4 @@ +dependencies { + compile "com.github.czyzby:gdx-lml:$libVersion" + compile "com.github.czyzby:gdx-uedi:$libVersion" +} diff --git a/lml-uedi/gradle.properties b/lml-uedi/gradle.properties new file mode 100644 index 00000000..dc115030 --- /dev/null +++ b/lml-uedi/gradle.properties @@ -0,0 +1,2 @@ +projectName=gdx-lu +projectDesc=Framework built on top of LibGDX, UEDI and LML. diff --git a/settings.gradle b/settings.gradle index a33b50d8..2629fe30 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'kiwi', 'lml', 'lml-vis', 'autumn', 'autumn/natives/android', 'autumn/natives/fcs', 'autumn/natives/gwt', 'autumn/natives/jtransc', 'mvc', 'websocket', 'websocket/natives/common', 'websocket/natives/gwt', 'websocket/natives/serialization' +include 'kiwi', 'lml', 'lml-vis', 'autumn', 'autumn/natives/android', 'autumn/natives/fcs', 'autumn/natives/gwt', 'autumn/natives/jtransc', 'mvc', 'websocket', 'websocket/natives/common', 'websocket/natives/gwt', 'websocket/natives/serialization', 'uedi', 'lml-uedi' diff --git a/uedi/build.gradle b/uedi/build.gradle new file mode 100644 index 00000000..bf4850da --- /dev/null +++ b/uedi/build.gradle @@ -0,0 +1,8 @@ +ext { + uediVersion = '0.2-SNAPSHOT' +} + +dependencies { + compile "com.github.czyzby:gdx-kiwi:$libVersion" + compile "com.github.czyzby:uedi-api:$uediVersion" +} diff --git a/uedi/gradle.properties b/uedi/gradle.properties new file mode 100644 index 00000000..ebc877c4 --- /dev/null +++ b/uedi/gradle.properties @@ -0,0 +1,2 @@ +projectName=gdx-uedi +projectDesc=Unsettlingly Easy Dependency Injection for LibGDX. From 122550bb41f21c5215d78d7e3782ca95167e4fd8 Mon Sep 17 00:00:00 2001 From: MJ Date: Fri, 3 Jun 2016 19:14:29 +0200 Subject: [PATCH 03/58] Added gdx-uedi implementation. --- .../com/github/czyzby/uedi/GdxUedi.gwt.xml | 8 + .../czyzby/uedi/impl/AbstractContext.java | 206 ++++++++ .../czyzby/uedi/impl/ConcurrentContext.java | 15 + .../czyzby/uedi/impl/DefaultContext.java | 494 ++++++++++++++++++ .../reflection/impl/ConstructorMember.java | 42 ++ .../uedi/reflection/impl/FieldMember.java | 42 ++ .../uedi/reflection/impl/MethodMember.java | 42 ++ .../uedi/reflection/impl/MockMember.java | 40 ++ .../czyzby/uedi/reflection/impl/Modifier.java | 90 ++++ .../scanner/impl/AbstractClassScanner.java | 37 ++ .../uedi/scanner/impl/FixedClassScanner.java | 42 ++ .../stereotype/impl/DelegateProvider.java | 16 + .../stereotype/impl/PropertyProvider.java | 78 +++ .../uedi/stereotype/impl/ProviderManager.java | 59 +++ .../uedi/stereotype/impl/Providers.java | 45 ++ .../stereotype/impl/ReflectionProvider.java | 80 +++ .../stereotype/impl/SingletonProvider.java | 52 ++ .../uedi/stereotype/impl/StringProvider.java | 20 + .../com/github/czyzby/uedi/ContextTest.java | 489 +++++++++++++++++ .../uedi/error/circular/CircularErrorA.java | 8 + .../uedi/error/circular/CircularErrorB.java | 8 + .../com/github/czyzby/uedi/test/Root.java | 7 + .../czyzby/uedi/test/TestComponent.java | 5 + .../github/czyzby/uedi/test/TestFactory.java | 6 + .../github/czyzby/uedi/test/TestProperty.java | 25 + .../github/czyzby/uedi/test/TestProvider.java | 20 + .../czyzby/uedi/test/TestSingleton.java | 6 + .../czyzby/uedi/test/ambiguous/Ambiguous.java | 5 + .../uedi/test/ambiguous/AmbiguousA.java | 6 + .../uedi/test/ambiguous/AmbiguousB.java | 6 + .../test/ambiguous/AmbiguousInjector.java | 21 + .../test/ambiguous/ListDefaultProvider.java | 20 + .../uedi/test/ambiguous/ListFactory.java | 12 + .../uedi/test/ambiguous/NamedAmbiguous.java | 13 + .../AbstractClassImplementingSingleton.java | 6 + .../test/classpath/AbstractClassUser.java | 4 + .../uedi/test/custom/CustomFactory.java | 13 + .../uedi/test/custom/CustomSingleton.java | 5 + .../uedi/test/inject/AbstractWithFields.java | 9 + .../github/czyzby/uedi/test/inject/Built.java | 4 + .../czyzby/uedi/test/inject/CircularA.java | 11 + .../czyzby/uedi/test/inject/CircularB.java | 11 + .../test/inject/ConstructorDependency.java | 26 + .../czyzby/uedi/test/inject/Ignored.java | 5 + .../uedi/test/inject/InjectFactory.java | 33 ++ .../uedi/test/inject/InjectProperty.java | 22 + .../uedi/test/inject/InjectProvider.java | 17 + .../czyzby/uedi/test/inject/Injected.java | 6 + .../czyzby/uedi/test/inject/Injector.java | 17 + .../czyzby/uedi/test/inject/Provided.java | 5 + .../test/inject/UsingAbstractWithFields.java | 11 + .../czyzby/uedi/test/lifecycle/Counter.java | 7 + .../uedi/test/lifecycle/DestroyedA.java | 40 ++ .../uedi/test/lifecycle/DestroyedB.java | 43 ++ .../uedi/test/lifecycle/DestroyedC.java | 39 ++ .../uedi/test/lifecycle/InitiatedA.java | 39 ++ .../uedi/test/lifecycle/InitiatedB.java | 40 ++ .../uedi/test/lifecycle/InitiatedC.java | 39 ++ 58 files changed, 2517 insertions(+) create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/GdxUedi.gwt.xml create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/impl/AbstractContext.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/impl/ConcurrentContext.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/ConstructorMember.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/FieldMember.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MethodMember.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MockMember.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/Modifier.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/AbstractClassScanner.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/FixedClassScanner.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/DelegateProvider.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ProviderManager.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/Providers.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ReflectionProvider.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/SingletonProvider.java create mode 100644 uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/StringProvider.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/ContextTest.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorA.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorB.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/Root.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/TestComponent.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/TestFactory.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/TestProperty.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/TestProvider.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/TestSingleton.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/Ambiguous.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousA.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousB.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousInjector.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListDefaultProvider.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListFactory.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/NamedAmbiguous.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassImplementingSingleton.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassUser.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomFactory.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomSingleton.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/AbstractWithFields.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/Built.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularA.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularB.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/ConstructorDependency.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/Ignored.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectFactory.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProperty.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProvider.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injected.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injector.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/Provided.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/inject/UsingAbstractWithFields.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/Counter.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedA.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedB.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedC.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedA.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedB.java create mode 100644 uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedC.java diff --git a/uedi/src/main/java/com/github/czyzby/uedi/GdxUedi.gwt.xml b/uedi/src/main/java/com/github/czyzby/uedi/GdxUedi.gwt.xml new file mode 100644 index 00000000..adac0fb4 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/GdxUedi.gwt.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/uedi/src/main/java/com/github/czyzby/uedi/impl/AbstractContext.java b/uedi/src/main/java/com/github/czyzby/uedi/impl/AbstractContext.java new file mode 100644 index 00000000..e4192799 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/impl/AbstractContext.java @@ -0,0 +1,206 @@ +package com.github.czyzby.uedi.impl; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.reflection.impl.MockMember; +import com.github.czyzby.uedi.reflection.impl.Modifier; +import com.github.czyzby.uedi.scanner.ClassScanner; +import com.github.czyzby.uedi.stereotype.Factory; +import com.github.czyzby.uedi.stereotype.Property; +import com.github.czyzby.uedi.stereotype.Provider; +import com.github.czyzby.uedi.stereotype.Singleton; + +/** Implements common functionalities of {@link Context} implementations. Holds preference. + * + * @author MJ + * @see DefaultContext */ +public abstract class AbstractContext implements Context { + private ClassScanner classScanner; + + private int fieldsIgnoreFilter = Modifier.TRANSIENT | Modifier.STATIC; + private int fieldsIgnoreSignature = Modifier.TRANSIENT; + private int methodsIgnoreFilter = Modifier.STATIC | Modifier.NATIVE; + private int methodsIgnoreSignature = Modifier.PUBLIC | Modifier.STATIC; + private int iterationsAmount = 15; + private boolean failIfUnknown = true; + private boolean failIfAmbiguous = true; + private boolean processSuperFields = true; + private boolean mapSuperTypes = true; + private boolean ignoreStrings; + + /** @param classScanner can be null, but {@link #scan(Class)} method will not work correctly. */ + public AbstractContext(final ClassScanner classScanner) { + this.classScanner = classScanner; + } + + @Override + public ClassScanner getClassScanner() { + return classScanner; + } + + @Override + public void setClassScanner(final ClassScanner classScanner) { + this.classScanner = classScanner; + } + + @Override + public void scan(final Class root) { + if (classScanner == null) { + throw new RuntimeException("Unable to scan root package: " + root.getName() + " without a scanner."); + } + processClasses(classScanner.getClassesImplementing(root, Factory.class, Property.class, Provider.class, + Singleton.class)); + } + + /** @param classes were scanned for. Should be created, initiated and processed. */ + protected abstract void processClasses(Iterable> classes); + + @Override + public Context initiate(final Object component) { + processComponent(component); + return this; + } + + /** @param component its non-primitive, empty, non-transient fields should be injected. Must be included for + * initiation and destruction if implements any life cycle interfaces. */ + protected abstract void processComponent(Object component); + + @Override + public void addProvider(final Provider provider) { + add(provider); + processProvider(provider); + } + + /** @param provider was registered as a provider component. Must be bound to the class tree of the supported + * type. */ + protected abstract void processProvider(Provider provider); + + @Override + public void addFactory(final Object factory) { + add(factory); + processFactory(factory); + } + + /** @param factory was registered as a factory component. Its public methods much be converted into providers. */ + protected abstract void processFactory(Object factory); + + @Override + public Component get(final Class type) { + return get(type, null, null); + } + + @Override + public Component get(final String id, final Class type) { + return get(type, null, new MockMember(id)); + } + + @Override + public Component get(final Class type, final Object forObject) { + return get(type, forObject, null); + } + + @Override + public Component getOrElse(final Class type, final Component alternative) { + final Component component = get(type); + return component != null ? component : alternative; + } + + @Override + public void setFailIfUnknownType(final boolean fail) { + failIfUnknown = fail; + } + + @Override + public boolean isFailIfAmbiguousDependency() { + return failIfAmbiguous; + } + + @Override + public void setFailIfAmbiguousDependency(final boolean fail) { + failIfAmbiguous = fail; + } + + @Override + public boolean isFailIfUnknownType() { + return failIfUnknown; + } + + @Override + public void setProcessSuperFields(final boolean process) { + processSuperFields = process; + } + + @Override + public boolean isProcessSuperFields() { + return processSuperFields; + } + + @Override + public void setMapSuperTypes(final boolean process) { + mapSuperTypes = process; + } + + @Override + public boolean isMapSuperTypes() { + return mapSuperTypes; + } + + @Override + public int getFieldsIgnoreFilter() { + return fieldsIgnoreFilter; + } + + @Override + public void setFieldsIgnoreFilter(final int filter) { + fieldsIgnoreFilter = filter; + } + + @Override + public int getFieldsIgnoreSignature() { + return fieldsIgnoreSignature; + } + + @Override + public void setFieldsIgnoreSignature(final int signature) { + fieldsIgnoreSignature = signature; + } + + @Override + public void setIgnoreStrings(final boolean ignore) { + ignoreStrings = ignore; + } + + @Override + public boolean isIgnoreStrings() { + return ignoreStrings; + } + + @Override + public void setIterationsAmount(final int iterations) { + iterationsAmount = iterations; + } + + @Override + public void setMethodsIgnoreFilter(final int filter) { + methodsIgnoreFilter = filter; + } + + @Override + public void setMethodsIgnoreSignature(final int signature) { + methodsIgnoreSignature = signature; + } + + @Override + public int getMethodsIgnoreFilter() { + return methodsIgnoreFilter; + } + + @Override + public int getMethodsIgnoreSignature() { + return methodsIgnoreSignature; + } + + @Override + public int getIterationsAmount() { + return iterationsAmount; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/impl/ConcurrentContext.java b/uedi/src/main/java/com/github/czyzby/uedi/impl/ConcurrentContext.java new file mode 100644 index 00000000..2c48c3fa --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/impl/ConcurrentContext.java @@ -0,0 +1,15 @@ +package com.github.czyzby.uedi.impl; + +import com.github.czyzby.uedi.scanner.ClassScanner; + +/** This is a mock-up class and does NOT actually provide thread-safe API on LibGDX platform. It was created for + * compatibility with uedi-core. + * + * @author MJ */ +@Deprecated +public class ConcurrentContext extends DefaultContext { + /** @param classScanner will be used to scan the context. */ + public ConcurrentContext(final ClassScanner classScanner) { + super(classScanner); + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java b/uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java new file mode 100644 index 00000000..c4c582aa --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java @@ -0,0 +1,494 @@ +package com.github.czyzby.uedi.impl; + +import java.lang.reflect.Member; +import java.util.Comparator; + +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.IdentityMap; +import com.badlogic.gdx.utils.ObjectSet; +import com.badlogic.gdx.utils.reflect.ClassReflection; +import com.badlogic.gdx.utils.reflect.Constructor; +import com.badlogic.gdx.utils.reflect.Field; +import com.badlogic.gdx.utils.reflect.Method; +import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.kiwi.util.gdx.collection.GdxSets; +import com.github.czyzby.kiwi.util.gdx.collection.pooled.PooledList; +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.reflection.impl.ConstructorMember; +import com.github.czyzby.uedi.reflection.impl.FieldMember; +import com.github.czyzby.uedi.reflection.impl.Modifier; +import com.github.czyzby.uedi.scanner.ClassScanner; +import com.github.czyzby.uedi.stereotype.Destructible; +import com.github.czyzby.uedi.stereotype.Factory; +import com.github.czyzby.uedi.stereotype.Initiated; +import com.github.czyzby.uedi.stereotype.Property; +import com.github.czyzby.uedi.stereotype.Provider; +import com.github.czyzby.uedi.stereotype.impl.PropertyProvider; +import com.github.czyzby.uedi.stereotype.impl.ProviderManager; +import com.github.czyzby.uedi.stereotype.impl.Providers; +import com.github.czyzby.uedi.stereotype.impl.ReflectionProvider; +import com.github.czyzby.uedi.stereotype.impl.SingletonProvider; +import com.github.czyzby.uedi.stereotype.impl.StringProvider; + +/** Core implementation of context management. LibGDX-compatible: uses LibGDX reflection API wrappers rather than + * regular Java API. Not thread-safe. + * + * @author MJ */ +public class DefaultContext extends AbstractContext { + /** These methods will be ignored when processing factories. */ + public static final ObjectSet FORBIDDEN_METHOD_NAMES = GdxSets.newSet(); + + private final IdentityMap, Provider> context = GdxMaps.newIdentityMap(); + private final ObjectSet destructibles = GdxSets.newSet(); + private final StringProvider propertyProvider = getPropertyProvider(); + + static { + // Forbidden method names: + FORBIDDEN_METHOD_NAMES.add("toString"); + FORBIDDEN_METHOD_NAMES.add("wait"); + FORBIDDEN_METHOD_NAMES.add("clone"); + FORBIDDEN_METHOD_NAMES.add("equals"); + FORBIDDEN_METHOD_NAMES.add("finalize"); + FORBIDDEN_METHOD_NAMES.add("notify"); + FORBIDDEN_METHOD_NAMES.add("notifyAll"); + FORBIDDEN_METHOD_NAMES.add("hashCode"); + FORBIDDEN_METHOD_NAMES.add("getClass"); + } + + /** @param classScanner can be null, but {@link #scan(Class)} method will not work correctly. */ + public DefaultContext(final ClassScanner classScanner) { + super(classScanner); + addCoreProviders(); + } + + /** @return default provider of {@link String} instances. */ + protected StringProvider getPropertyProvider() { + return new PropertyProvider(); + } + + /** Registers {@link Context} (so it can be injected) and binds {@link PropertyProvider} to {@link String} + * injections. */ + protected void addCoreProviders() { + context.put(String.class, propertyProvider); + context.put(Context.class, new SingletonProvider(this)); + } + + @Override + public void add(final Object component) { + processProvider(new SingletonProvider(component)); + } + + @Override + public boolean isAvailable(final Class type) { + return context.containsKey(type); + } + + @Override + public String getProperty(final String name) { + return propertyProvider.hasProperty(name) ? propertyProvider.getProperty(name).getValue() : null; + } + + @Override + public void setProperty(final String key, final String value) { + if (propertyProvider.hasProperty(key)) { + propertyProvider.getProperty(key).setValue(value); + } else { + addProperty(new Property() { + private String property = value; + + @Override + public String setValue(final String value) { + return property = value; + } + + @Override + public String getValue() { + return property; + } + + @Override + public String getKey() { + return key; + } + }); + } + } + + @Override + public void addProperty(final Property property) { + propertyProvider.addProperty(property); + } + + @Override + public void addDestructible(final Destructible destructible) { + destructibles.add(destructible); + } + + @Override + @SuppressWarnings("unchecked") + public Component get(final Class type, final Object forObject, final Member member) { + if (!context.containsKey(type)) { + if (isFailIfUnknownType()) { + throw new RuntimeException("Unknown component type: " + type.getName()); + } + return create(type); + } + return (Component) context.get(type).provide(forObject, member); + } + + @Override + @SuppressWarnings("unchecked") + public Component create(final Class type) { + final Constructor constructor = getConstructor(type); + final Object component = createObject(constructor, constructor.getParameterTypes()); + initiate(component); + return (Component) component; + } + + @Override + public void destroy() { + final Array sortedDestructibles = GdxArrays.newArray(destructibles); + sortedDestructibles.sort(new Comparator() { + @Override + public int compare(final Destructible o1, final Destructible o2) { + return o1.getDestructionOrder() - o2.getDestructionOrder(); + } + }); + destructibles.clear(); + try { + for (final Destructible destructible : sortedDestructibles) { + destructible.destroy(); + } + } catch (final Exception exception) { + throw new RuntimeException("Unable to destroy context.", exception); + } + } + + @Override + public void destroy(final Destructible component) { + if (component != null) { + destructibles.remove(component); + try { + component.destroy(); + } catch (final Exception exception) { + throw new RuntimeException("Unable to destroy: " + component, exception); + } + } + } + + @Override + protected void processClasses(final Iterable> classes) { + try { + final Array componentsToInitiate = gatherComponents(gatherConstructors(classes)); + componentsToInitiate.sort(new Comparator() { + @Override + public int compare(final Initiated o1, final Initiated o2) { + return o1.getInitiationOrder() - o2.getInitiationOrder(); + } + }); + for (final Initiated initiated : componentsToInitiate) { + initiated.initiate(); + } + } catch (final RuntimeException exception) { + throw exception; + } catch (final Exception exception) { + throw new RuntimeException("Unable to create components.", exception); + } + } + + /** @param constructors list of gathered constructors. Will be used to create the components. + * @return sorting collection of components to initiate. Should be initiated. + * @throws Exception due to reflection issues. */ + protected Array gatherComponents(final PooledList constructors) throws Exception { + final Array componentsToInitiate = GdxArrays.newArray(); + final Array components = createComponents(constructors, componentsToInitiate); + for (final Object component : components) { + injectFields(component); + } + return componentsToInitiate; + } + + /** @param constructors list of gathered constructors of classes to initiate. + * @param componentsToInitiate a reference to sorting collection of components to initiate. Should be filled. + * @return list of constructed components. + * @throws Exception due to reflection issues. */ + protected Array createComponents(final PooledList constructors, + final Array componentsToInitiate) throws Exception { + final Array components = GdxArrays.newArray(); + for (int index = 0, iterations = getIterationsAmount(); constructors.isNotEmpty() + && index < iterations; index++) { + for (final Constructor constructor : constructors) { + final Object component; + if (constructor.getParameterTypes().length == 0) { + component = constructor.newInstance(Providers.EMPTY_ARRAY); + } else { + final Class[] parameterTypes = constructor.getParameterTypes(); + if (isAnyProviderMissing(parameterTypes)) { + continue; + } + component = createObject(constructor, parameterTypes); + } + processScannedComponent(component, componentsToInitiate); + components.add(component); + constructors.remove(); + } + } + if (!constructors.isEmpty()) { + if (isFailIfUnknownType()) { + final Array classNames = GdxArrays.newArray(); + for (final Constructor constructor : constructors) { + classNames.add(constructor.getDeclaringClass().getName()); + } + throw new RuntimeException( + "Unknown or circular dependencies detected. Unable to create instances of: " + classNames); + } + for (final Constructor constructor : constructors) { + final Object component = createObject(constructor, constructor.getParameterTypes()); + processScannedComponent(component, componentsToInitiate); + components.add(component); + } + } + return components; + } + + /** @param constructor will be used to construct the instance. + * @param parameterTypes will be used to extract constructor parameters from the context. + * @return an instance of the class. + * @throws RuntimeException due to reflection issues. */ + protected Object createObject(final Constructor constructor, final Class[] parameterTypes) { + try { + if (parameterTypes.length == 0) { + return constructor.newInstance(Providers.EMPTY_ARRAY); + } + final Object[] dependencies = new Object[parameterTypes.length]; + for (int index = 0, length = dependencies.length; index < length; index++) { + dependencies[index] = get(parameterTypes[index], null, new ConstructorMember(constructor)); + } + return constructor.newInstance(dependencies); + } catch (final Exception exception) { + throw new RuntimeException("Unable to create an instance of: " + constructor.getDeclaringClass(), + exception); + } + } + + /** @param types array of requested types. + * @return true if context currently has no provider that could supply an instance of any of the passed classes. */ + protected boolean isAnyProviderMissing(final Class... types) { + for (final Class type : types) { + if (!context.containsKey(type)) { + return true; + } + } + return false; + } + + /** @param component its interfaces will be inspected. Depending on its type, it might be initiated, scheduled for + * destruction or registered as a factory, provider or property. + * @param componentsToInitiate will be used to schedule initiations. */ + protected void processScannedComponent(final Object component, final Array componentsToInitiate) { + processProvider(new SingletonProvider(component)); + if (component instanceof Destructible) { + destructibles.add((Destructible) component); + } + if (component instanceof Factory) { + processFactory(component); + } + if (component instanceof Initiated) { + componentsToInitiate.add((Initiated) component); + } + if (component instanceof Property) { + propertyProvider.addProperty((Property) component); + } + if (component instanceof Provider) { + processProvider((Provider) component); + } + } + + /** @param classes will have their constructors extracted. Should not contain interfaces or abstract classes. + * @return a collection of constructors allowing to create passed classes' instances. */ + protected PooledList gatherConstructors(final Iterable> classes) { + final PooledList constructors = PooledList.newList(); + for (final Class componentClass : classes) { + constructors.add(getConstructor(componentClass)); + } + return constructors; + } + + /** @param componentClass is requested to be constructed. + * @return the first found constructor for the class. */ + protected Constructor getConstructor(final Class componentClass) { + final Constructor[] constructors = ClassReflection.getConstructors(componentClass); + if (constructors.length == 0) { + throw new RuntimeException("No public constructors found for component class: " + componentClass); + } + return constructors[0]; + } + + /** Note: this method should be invoked only with externally registered components. + * + * @param component will be initiated. + * @see #processScannedComponent(Object, Array) */ + @Override + protected void processComponent(final Object component) { + injectFields(component); + if (component instanceof Initiated) { + try { + ((Initiated) component).initiate(); + } catch (final Exception exception) { + throw new RuntimeException("Unable to initiate component: " + component, exception); + } + } + if (component instanceof Destructible) { + destructibles.add((Destructible) component); + } + } + + /** @return direct reference to component providers. */ + protected IdentityMap, Provider> getComponentProviders() { + return context; + } + + /** @param component its injectable fields will be filled with values provided by the context. + * @see #isInjectable(Field, Object) */ + @SuppressWarnings("unchecked") + protected void injectFields(final Object component) { + Class processedClass = component.getClass(); + try { + while (processedClass != null && processedClass != Object.class) { + for (final Field field : ClassReflection.getDeclaredFields(processedClass)) { + if (isInjectable(field, component)) { + field.set(component, get(field.getType(), component, new FieldMember(field))); + } + } + if (!isProcessSuperFields()) { + break; + } + processedClass = processedClass.getSuperclass(); + } + } catch (final Exception exception) { + throw new RuntimeException("Unable to inject fields of component: " + component, exception); + } + } + + /** @param field reflected field data. + * @param component owner of the field. + * @return true if the field is empty, accepted by the modifier filter, does not match modifier signature, not + * primitive and - if strings are ignored - not a string. + * @throws Exception due to reflection issues. */ + protected boolean isInjectable(final Field field, final Object component) throws Exception { + if (field.isSynthetic() || field.getType().isPrimitive() + || isIgnoreStrings() && field.getType() == String.class) { + return false; + } + final int modifier = Modifier.getModifiers(field); + if ((modifier & getFieldsIgnoreFilter()) != 0 || modifier == getFieldsIgnoreSignature()) { + return false; + } + field.setAccessible(true); + return field.get(component) == null; + } + + @Override + protected void processProvider(final Provider provider) { + if (!isMapSuperTypes()) { + putProvider(provider.getType(), provider); + return; + } + final PooledList> classesToProcess = new PooledList>(); + classesToProcess.add(provider.getType()); + while (classesToProcess.isNotEmpty()) { + final Class processed = classesToProcess.removeFirst(); + putProvider(processed, provider); + final Class parent = processed.getSuperclass(); + if (parent != null && parent != Object.class) { + classesToProcess.add(parent); + } + } + } + + /** @param key provided class type. + * @param provider will be assigned as a provider of the chosen class instances. */ + protected void putProvider(final Class key, final Provider provider) { + final Provider currentProvider = context.get(key); + if (currentProvider == null) { // Unique - setting as the default provider: + context.put(key, provider); + } else if (currentProvider instanceof ProviderManager) { // Already ambiguous - adding another provider: + ((ProviderManager) currentProvider).addProvider(provider); + } else { + @SuppressWarnings({ "rawtypes", "unchecked" }) // Ambiguous - switching to manager: + final ProviderManager manager = new ProviderManager(key, this); + // Registering existing providers: + manager.addProvider(currentProvider); + manager.addProvider(provider); + // Replacing current provider with the manager: + context.put(key, manager); + } + } + + @Override + public void remove(final Class type) { + context.remove(type); + } + + @Override + public void replace(final Class type, final Provider provider) { + remove(type); + putProvider(type, provider); + } + + @Override + protected void processFactory(final Object factory) { + // Registering public methods as providers: + for (final Method method : ClassReflection.getMethods(factory.getClass())) { + if (isValidFactoryMethod(method)) { + processProvider(newFactoryMethodWrapper(factory, method)); + } + } + } + + /** @param method cannot be synthetic, return void, have a forbidden name or have any filtered modifiers. + * @return true if the method is valid and should be converted to a provider. */ + protected boolean isValidFactoryMethod(final Method method) { + final int modifiers = Modifier.getModifiers(method); + return (modifiers & getMethodsIgnoreFilter()) == 0 && modifiers != getMethodsIgnoreSignature() + && method.getReturnType() != void.class && method.getReturnType() != Void.class + && !FORBIDDEN_METHOD_NAMES.contains(method.getName()); + } + + /** @param factory owner of the method. + * @param method should be wrapped. + * @return method wrapped in a {@link Provider} implementation. */ + protected Provider newFactoryMethodWrapper(final Object factory, final Method method) { + return new ReflectionProvider(this, factory, method); + } + + @Override + public boolean isParameterAware() { + return false; + } + + @Override + public void clear(final Class classTree) { + if (!isMapSuperTypes()) { + remove(classTree); + return; + } + final PooledList> classesToProcess = new PooledList>(); + classesToProcess.add(classTree); + while (classesToProcess.isNotEmpty()) { + final Class processed = classesToProcess.removeFirst(); + remove(processed); + final Class parent = processed.getSuperclass(); + if (parent != null && parent != Object.class) { + classesToProcess.add(parent); + } + } + } + + @Override + public void clear() { + context.clear(); + addCoreProviders(); + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/ConstructorMember.java b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/ConstructorMember.java new file mode 100644 index 00000000..d52083d5 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/ConstructorMember.java @@ -0,0 +1,42 @@ +package com.github.czyzby.uedi.reflection.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.reflect.Constructor; + +/** Wraps around {@link Constructor} to mock {@link Member} interface. + * + * @author MJ */ +public class ConstructorMember implements Member { + private final Constructor constructor; + + /** @param constructor will be wrapped. */ + public ConstructorMember(final Constructor constructor) { + this.constructor = constructor; + } + + @Override + public Class getDeclaringClass() { + return constructor.getDeclaringClass(); + } + + @Override + public String getName() { + return constructor.getDeclaringClass().getSimpleName(); + } + + @Override + public int getModifiers() { + return Modifier.PUBLIC; // Unknown. + } + + @Override + public boolean isSynthetic() { + return false; + } + + /** @return wrapped {@link Constructor} instance. */ + public Constructor getConstructor() { + return constructor; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/FieldMember.java b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/FieldMember.java new file mode 100644 index 00000000..69d5620c --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/FieldMember.java @@ -0,0 +1,42 @@ +package com.github.czyzby.uedi.reflection.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.reflect.Field; + +/** Wraps around {@link Field} to mock {@link Member} interface. + * + * @author MJ */ +public class FieldMember implements Member { + private final Field field; + + /** @param field will be wrapped. */ + public FieldMember(final Field field) { + this.field = field; + } + + @Override + public Class getDeclaringClass() { + return field.getDeclaringClass(); + } + + @Override + public String getName() { + return field.getName(); + } + + @Override + public int getModifiers() { + return Modifier.getModifiers(field); + } + + @Override + public boolean isSynthetic() { + return field.isSynthetic(); + } + + /** @return wrapped {@link Field} instance. */ + public Field getField() { + return field; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MethodMember.java b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MethodMember.java new file mode 100644 index 00000000..b838d60f --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MethodMember.java @@ -0,0 +1,42 @@ +package com.github.czyzby.uedi.reflection.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.reflect.Method; + +/** Wraps around {@link Method} to mock {@link Member} interface. + * + * @author MJ */ +public class MethodMember implements Member { + private final Method method; + + /** @param method will be wrapped. */ + public MethodMember(final Method method) { + this.method = method; + } + + @Override + public Class getDeclaringClass() { + return method.getDeclaringClass(); + } + + @Override + public String getName() { + return method.getName(); + } + + @Override + public int getModifiers() { + return Modifier.getModifiers(method); + } + + @Override + public boolean isSynthetic() { + return false; + } + + /** @return wrapped {@link Method} instance. */ + public Method getMethod() { + return method; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MockMember.java b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MockMember.java new file mode 100644 index 00000000..7ad84b1a --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/MockMember.java @@ -0,0 +1,40 @@ +package com.github.czyzby.uedi.reflection.impl; + +import java.lang.reflect.Member; + +/** Mock up implementation of {@link Member} that allows to store and retrieve a chosen member name. + * + * @author MJ */ +public final class MockMember implements Member { + private final String name; + + /** @param name will be always returned by {@link #getName()}. */ + public MockMember(final String name) { + this.name = name; + } + + /** @return always null. */ + @Override + public Class getDeclaringClass() { + return null; + } + + /** @return stored member name. + * @see #MockMember(String) */ + @Override + public String getName() { + return name; + } + + /** @return always none (0). */ + @Override + public int getModifiers() { + return 0; + } + + /** @return always {@code true}. */ + @Override + public boolean isSynthetic() { + return true; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/Modifier.java b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/Modifier.java new file mode 100644 index 00000000..0b9c0d82 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/reflection/impl/Modifier.java @@ -0,0 +1,90 @@ +package com.github.czyzby.uedi.reflection.impl; + +import com.badlogic.gdx.utils.reflect.Field; +import com.badlogic.gdx.utils.reflect.Method; + +/** Mocks {@link java.lang.reflect.Modifier} API. + * + * @author MJ */ +public class Modifier { + /** The {@code int} value representing the {@code public} modifier. */ + public static final int PUBLIC = 0x00000001; + /** The {@code int} value representing the {@code private} modifier. */ + public static final int PRIVATE = 0x00000002; + /** The {@code int} value representing the {@code protected} modifier. */ + public static final int PROTECTED = 0x00000004; + /** The {@code int} value representing the {@code static} modifier. */ + public static final int STATIC = 0x00000008; + /** The {@code int} value representing the {@code final} modifier. */ + public static final int FINAL = 0x00000010; + /** The {@code int} value representing the {@code synchronized} modifier. */ + public static final int SYNCHRONIZED = 0x00000020; + /** The {@code int} value representing the {@code volatile} modifier. */ + public static final int VOLATILE = 0x00000040; + /** The {@code int} value representing the {@code transient} modifier. */ + public static final int TRANSIENT = 0x00000080; + /** The {@code int} value representing the {@code native} modifier. */ + public static final int NATIVE = 0x00000100; + /** The {@code int} value representing the {@code interface} modifier. */ + public static final int INTERFACE = 0x00000200; + /** The {@code int} value representing the {@code abstract} modifier. */ + public static final int ABSTRACT = 0x00000400; + /** The {@code int} value representing the {@code strictfp} modifier. */ + public static final int STRICT = 0x00000800; + + /** @param method will be inspected. + * @return modifiers representing the method state. */ + public static int getModifiers(final Method method) { + int modifiers = 0; + if (method.isAbstract()) { + modifiers |= ABSTRACT; + } + if (method.isFinal()) { + modifiers |= FINAL; + } + if (method.isNative()) { + modifiers |= NATIVE; + } + if (method.isPrivate()) { + modifiers |= PRIVATE; + } + if (method.isProtected()) { + modifiers |= PROTECTED; + } + if (method.isPublic()) { + modifiers |= PUBLIC; + } + if (method.isStatic()) { + modifiers |= STATIC; + } + return modifiers; + } + + /** @param field will be inspected. + * @return modifiers represending field's state. */ + public static int getModifiers(final Field field) { + int modifiers = 0; + if (field.isFinal()) { + modifiers |= FINAL; + } + if (field.isPrivate()) { + modifiers |= PRIVATE; + } + if (field.isProtected()) { + modifiers |= PROTECTED; + } + if (field.isPublic()) { + modifiers |= PUBLIC; + } + if (field.isStatic()) { + modifiers |= STATIC; + } + if (field.isTransient()) { + modifiers |= TRANSIENT; + } + if (field.isVolatile()) { + modifiers |= VOLATILE; + } + return modifiers; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/AbstractClassScanner.java b/uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/AbstractClassScanner.java new file mode 100644 index 00000000..4c09a741 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/AbstractClassScanner.java @@ -0,0 +1,37 @@ +package com.github.czyzby.uedi.scanner.impl; + +import java.lang.reflect.Modifier; + +import com.github.czyzby.uedi.scanner.ClassScanner; + +/** Provides utilities for {@link ClassScanner} implementations. + * + * @author MJ */ +public abstract class AbstractClassScanner implements ClassScanner { + /** GWT-friendly way of extracting package name. + * + * @param root scanning root. + * @return name of the package of the root class. */ + protected String getPackageName(final Class root) { + return root.getName().substring(0, root.getName().length() - root.getSimpleName().length() - 1); + } + + /** @param testedClass will be validated + * @return true if the class is not abstract or anonymous and not an interface. */ + protected boolean isNotAbstract(final Class testedClass) { + return !Modifier.isAbstract(testedClass.getModifiers()) && !testedClass.isAnonymousClass() + && !testedClass.isInterface(); + } + + /** @param testedClass will be validated. + * @param interfaces set of interfaces to be checked against. + * @return true if the class implements any of the passed interfaces. */ + protected boolean isInstanceOfAny(final Class testedClass, final Class[] interfaces) { + for (final Class possibleMatch : interfaces) { + if (possibleMatch.isAssignableFrom(testedClass)) { + return true; + } + } + return false; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/FixedClassScanner.java b/uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/FixedClassScanner.java new file mode 100644 index 00000000..9de9e6a8 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/scanner/impl/FixedClassScanner.java @@ -0,0 +1,42 @@ +package com.github.czyzby.uedi.scanner.impl; + +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.ObjectSet; +import com.github.czyzby.kiwi.util.gdx.collection.GdxSets; + +/** Does not support automatic scanning. Instead, a fixed pool of scannable classes is provided and scanned when + * requested. While heavily relying on reflection, this might actually be a faster solution in case of huge contexts (if + * the components are not in separate root package, which they should be). Use when absolutely necessary. + * + * @author MJ */ +public class FixedClassScanner extends AbstractClassScanner { + private final ObjectSet> context = GdxSets.newSet(); + + /** @param scannableClasses will be available for scanning. */ + public FixedClassScanner(final Class... scannableClasses) { + add(scannableClasses); + } + + /** @param scannableClasses will be available for scanning. */ + public void add(final Class... scannableClasses) { + context.addAll(scannableClasses); + } + + /** @param scannableClasses will be available for scanning. */ + public void add(final Array> scannableClasses) { + context.addAll(scannableClasses); + } + + @Override + public Iterable> getClassesImplementing(final Class root, final Class... interfaces) { + final ObjectSet> implementingClasses = GdxSets.newSet(); + final String rootPackage = getPackageName(root); + for (final Class scannableClass : context) { + if (getPackageName(scannableClass).startsWith(rootPackage) && isNotAbstract(scannableClass) + && isInstanceOfAny(scannableClass, interfaces)) { + implementingClasses.add(scannableClass); + } + } + return implementingClasses; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/DelegateProvider.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/DelegateProvider.java new file mode 100644 index 00000000..63e80c32 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/DelegateProvider.java @@ -0,0 +1,16 @@ +package com.github.czyzby.uedi.stereotype.impl; + +import com.github.czyzby.uedi.stereotype.Provider; + +/** Should be implemented by all providers that delegate their functionality to another object. + * + * @author MJ + * + * @param type of provided values. */ +public interface DelegateProvider extends Provider { + /** @return true if the wrapped object is marked as default. */ + boolean isDefault(); + + /** @return instance of the wrapped object which performs the actual providing. */ + Object getWrappedObject(); +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java new file mode 100644 index 00000000..98f05971 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java @@ -0,0 +1,78 @@ +package com.github.czyzby.uedi.stereotype.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.Preferences; +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.common.Exceptions; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.uedi.stereotype.Default; +import com.github.czyzby.uedi.stereotype.Property; + +/** Provides string properties using {@link Property} API. When property for the given string is not present, fallbacks + * to values from main application {@link Preferences}. + * + * @author MJ */ +public class PropertyProvider implements Default, StringProvider { + private final ObjectMap properties = GdxMaps.newObjectMap(); + private final Preferences preferences = getPreferences(); + + protected Preferences getPreferences() { + try { + return ApplicationPreferences.getPreferences(); + } catch (final Exception exception) { + Exceptions.ignore(exception); + return null; + } + } + + @Override + public boolean hasProperty(final String key) { + return properties.containsKey(key) || preferences != null && preferences.contains(key); + } + + @Override + public Property getProperty(final String key) { + if (properties.containsKey(key)) { + return properties.get(key); + } + return new Property() { + @Override + public String setValue(final String value) { + final String previous = preferences.getString(key); + preferences.putString(key, value); + return previous; + } + + @Override + public String getValue() { + return preferences.getString(key); + } + + @Override + public String getKey() { + return key; + } + }; + } + + @Override + public void addProperty(final Property property) { + properties.put(property.getKey(), property); + } + + @Override + public Class getType() { + return String.class; + } + + @Override + public String provide(final Object target, final Member member) { + final String key = Providers.getName(member); + if (properties.containsKey(key)) { + return properties.get(key).getValue(); + } + return preferences.getString(key, null); + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ProviderManager.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ProviderManager.java new file mode 100644 index 00000000..cc7d0471 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ProviderManager.java @@ -0,0 +1,59 @@ +package com.github.czyzby.uedi.stereotype.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Allows to resolve ambiguous dependencies. + * + * @author MJ + * + * @param type of provided objects. */ +public class ProviderManager implements Provider { + private final ObjectMap> providers = GdxMaps.newObjectMap(); + private final Class type; + private final Context context; + private Provider defaultProvider; + + /** @param type type of provided values. + * @param context parent context. Used to resolve depedendencies. */ + public ProviderManager(final Class type, final Context context) { + this.type = type; + this.context = context; + } + + /** @param provider will be included in the providers collection. Must provide the same type of values. */ + @SuppressWarnings("unchecked") + public void addProvider(final Provider provider) { + providers.put(Providers.getName(provider), (Provider) provider); + if (Providers.isDefault(provider)) { + defaultProvider = (Provider) provider; + } + } + + @Override + public Class getType() { + return type; + } + + @Override + public Type provide(final Object target, final Member member) { + if (member != null) { + final Provider provider = providers.get(Providers.getName(member)); + if (provider != null) { + return provider.provide(target, member); + } + } + if (defaultProvider == null) { + if (context.isFailIfAmbiguousDependency() || context.isFailIfUnknownType()) { + throw new RuntimeException("Ambiguous dependency: '" + target + "' component requested '" + + type.getName() + "' instance, found multiple providers and no default one."); + } + return context.create(type); + } + return defaultProvider.provide(target, member); + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/Providers.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/Providers.java new file mode 100644 index 00000000..0c1028eb --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/Providers.java @@ -0,0 +1,45 @@ +package com.github.czyzby.uedi.stereotype.impl; + +import java.lang.reflect.Member; + +import com.github.czyzby.uedi.stereotype.Default; +import com.github.czyzby.uedi.stereotype.Named; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Static utilities for provider-related operations. + * + * @author MJ */ +public class Providers { + /** 0-element object array. Pass to methods to avoid creating var-arg arrays when using reflection API. */ + public static final Object[] EMPTY_ARRAY = new Object[0]; + + /** Do not initiate. */ + private Providers() { + } + + /** @param member will determine its ID. Can be null. + * @return member name or null if unavailable. */ + public static String getName(final Member member) { + return member == null ? "default" : member.getName(); + } + + /** @param component will determine its ID. + * @return name of the component if its {@link Named} or normalized simple name of its class. */ + public static String getName(final Object component) { + if (component instanceof Named) { + return ((Named) component).getName(); + } + final String className = component.getClass().getSimpleName(); + if (className == null || className.isEmpty()) { // Anonymous class. + return "unknown"; + } + return Character.toLowerCase(className.charAt(0)) + className.substring(1); + } + + /** @param provider will be validated. + * @return whether the provider should be treated as the default one in case of ambiguous dependencies. */ + public static boolean isDefault(final Provider provider) { + return provider instanceof Default + || provider instanceof DelegateProvider && ((DelegateProvider) provider).isDefault(); + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ReflectionProvider.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ReflectionProvider.java new file mode 100644 index 00000000..2260c2d0 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/ReflectionProvider.java @@ -0,0 +1,80 @@ +package com.github.czyzby.uedi.stereotype.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.reflect.Method; +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.reflection.impl.MethodMember; +import com.github.czyzby.uedi.stereotype.Default; +import com.github.czyzby.uedi.stereotype.Named; + +/** Wraps around a method, converting it into a provider. + * + * @author MJ */ +public class ReflectionProvider implements DelegateProvider, Named { + private final Context context; + private final Method method; + private final Class type; + private final Object owner; + private final Class[] parameterTypes; + private final Object[] parameters; + private final String name; + private final boolean isDefault; + private final Member methodMember; + + /** @param context parent context. + * @param owner instance of the class with the method. + * @param method will be wrapped and converted into a provider. */ + public ReflectionProvider(final Context context, final Object owner, final Method method) { + this.context = context; + this.owner = owner; + this.method = method; + type = method.getReturnType(); + parameterTypes = method.getParameterTypes(); + parameters = parameterTypes.length == 0 ? Providers.EMPTY_ARRAY : new Object[parameterTypes.length]; + name = Providers.getName(method); + isDefault = owner instanceof Default; + methodMember = new MethodMember(method); + } + + @Override + public boolean isDefault() { + return isDefault; + } + + @Override + public Object getWrappedObject() { + return owner; + } + + @Override + public String getName() { + return name; + } + + @Override + public Class getType() { + return type; + } + + @Override + public Object provide(final Object target, final Member member) { + try { + if (parameters.length == 0) { + return method.invoke(owner, parameters); + } + final Class targetType = target == null ? null : target.getClass(); + for (int index = 0, length = parameters.length; index < length; index++) { + final Class parameterType = parameterTypes[index]; + parameters[index] = parameterType == Object.class || parameterType == targetType ? target + : context.get(parameterType, owner, methodMember); + } + return method.invoke(owner, parameters); + } catch (final RuntimeException exception) { + throw exception; + } catch (final Exception exception) { + throw new RuntimeException("Unable to invoke method: '" + method.getName() + "' of component: " + owner, + exception); + } + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/SingletonProvider.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/SingletonProvider.java new file mode 100644 index 00000000..3c6783af --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/SingletonProvider.java @@ -0,0 +1,52 @@ +package com.github.czyzby.uedi.stereotype.impl; + +import java.lang.reflect.Member; + +import com.github.czyzby.uedi.stereotype.Default; +import com.github.czyzby.uedi.stereotype.Named; + +/** Always provides the same object. + * + * @author MJ + * + * @param type of singleton instance. */ +public class SingletonProvider implements DelegateProvider, Named { + private final Type instance; + private final Class type; + private final String name; + private final boolean isDefault; + + /** @param instance will always be provided. */ + @SuppressWarnings("unchecked") + public SingletonProvider(final Type instance) { + this.instance = instance; + type = (Class) instance.getClass(); + name = Providers.getName(instance); + isDefault = instance instanceof Default; + } + + @Override + public boolean isDefault() { + return isDefault; + } + + @Override + public Object getWrappedObject() { + return instance; + } + + @Override + public String getName() { + return name; + } + + @Override + public Class getType() { + return type; + } + + @Override + public Type provide(final Object target, final Member member) { + return instance; + } +} diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/StringProvider.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/StringProvider.java new file mode 100644 index 00000000..deea7e33 --- /dev/null +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/StringProvider.java @@ -0,0 +1,20 @@ +package com.github.czyzby.uedi.stereotype.impl; + +import com.github.czyzby.uedi.stereotype.Property; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link String} instances. Manages {@link Property} instances. + * + * @author MJ */ +public interface StringProvider extends Provider { + /** @param key unique ID of the property. + * @return true if a property instance was registered to the key. */ + boolean hasProperty(String key); + + /** @param key unique ID of the property. + * @return {@link Property} instance mapped to the ID or null if not registered. */ + Property getProperty(String key); + + /** @param property will be mapped to its {@link Property#getKey() key}. */ + void addProperty(Property property); +} \ No newline at end of file diff --git a/uedi/src/test/java/com/github/czyzby/uedi/ContextTest.java b/uedi/src/test/java/com/github/czyzby/uedi/ContextTest.java new file mode 100644 index 00000000..db80f882 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/ContextTest.java @@ -0,0 +1,489 @@ +package com.github.czyzby.uedi; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.lang.reflect.Member; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.github.czyzby.uedi.error.circular.CircularErrorA; +import com.github.czyzby.uedi.error.circular.CircularErrorB; +import com.github.czyzby.uedi.impl.DefaultContext; +import com.github.czyzby.uedi.scanner.ClassScanner; +import com.github.czyzby.uedi.scanner.impl.FixedClassScanner; +import com.github.czyzby.uedi.stereotype.Provider; +import com.github.czyzby.uedi.test.Root; +import com.github.czyzby.uedi.test.TestComponent; +import com.github.czyzby.uedi.test.TestFactory; +import com.github.czyzby.uedi.test.TestProperty; +import com.github.czyzby.uedi.test.TestProvider; +import com.github.czyzby.uedi.test.TestSingleton; +import com.github.czyzby.uedi.test.ambiguous.Ambiguous; +import com.github.czyzby.uedi.test.ambiguous.AmbiguousA; +import com.github.czyzby.uedi.test.ambiguous.AmbiguousB; +import com.github.czyzby.uedi.test.ambiguous.AmbiguousInjector; +import com.github.czyzby.uedi.test.ambiguous.ListDefaultProvider; +import com.github.czyzby.uedi.test.ambiguous.ListFactory; +import com.github.czyzby.uedi.test.ambiguous.NamedAmbiguous; +import com.github.czyzby.uedi.test.classpath.AbstractClassImplementingSingleton; +import com.github.czyzby.uedi.test.classpath.AbstractClassUser; +import com.github.czyzby.uedi.test.custom.CustomFactory; +import com.github.czyzby.uedi.test.custom.CustomFactory.CustomComponent; +import com.github.czyzby.uedi.test.custom.CustomSingleton; +import com.github.czyzby.uedi.test.inject.AbstractWithFields; +import com.github.czyzby.uedi.test.inject.Built; +import com.github.czyzby.uedi.test.inject.CircularA; +import com.github.czyzby.uedi.test.inject.CircularB; +import com.github.czyzby.uedi.test.inject.ConstructorDependency; +import com.github.czyzby.uedi.test.inject.Ignored; +import com.github.czyzby.uedi.test.inject.InjectFactory; +import com.github.czyzby.uedi.test.inject.InjectProperty; +import com.github.czyzby.uedi.test.inject.InjectProvider; +import com.github.czyzby.uedi.test.inject.Injected; +import com.github.czyzby.uedi.test.inject.Injector; +import com.github.czyzby.uedi.test.inject.Provided; +import com.github.czyzby.uedi.test.inject.UsingAbstractWithFields; +import com.github.czyzby.uedi.test.lifecycle.Counter; +import com.github.czyzby.uedi.test.lifecycle.DestroyedA; +import com.github.czyzby.uedi.test.lifecycle.DestroyedB; +import com.github.czyzby.uedi.test.lifecycle.DestroyedC; +import com.github.czyzby.uedi.test.lifecycle.InitiatedA; +import com.github.czyzby.uedi.test.lifecycle.InitiatedB; +import com.github.czyzby.uedi.test.lifecycle.InitiatedC; + +/** Should be extended to test every {@link Context} variant with every {@link ClassScanner} implementation. + * + * @author MJ */ +public class ContextTest { + private final Context context = new DefaultContext( + new FixedClassScanner(CircularErrorA.class, CircularErrorB.class, Root.class, TestComponent.class, + TestFactory.class, TestProperty.class, TestProvider.class, TestSingleton.class, Ambiguous.class, + AmbiguousA.class, AmbiguousB.class, AmbiguousInjector.class, ListDefaultProvider.class, + ListFactory.class, NamedAmbiguous.class, AbstractClassImplementingSingleton.class, + AbstractClassUser.class, CustomFactory.class, CustomSingleton.class, AbstractWithFields.class, + Built.class, CircularA.class, CircularB.class, ConstructorDependency.class, Ignored.class, + Injected.class, InjectFactory.class, Injector.class, InjectProperty.class, InjectProvider.class, + Provided.class, UsingAbstractWithFields.class, Counter.class, DestroyedA.class, DestroyedB.class, + DestroyedC.class, InitiatedA.class, InitiatedB.class, InitiatedC.class)); + + @Before + public void scan() { + context.scan(Root.class); + } + + @Test + public void shouldFindSingletons() { + assertNotNull(context.get(TestSingleton.class)); + assertEquals(context.get(TestSingleton.class), context.get(TestSingleton.class)); + } + + @Test + public void shouldFindFactories() { + assertNotNull(context.get(TestFactory.class)); + assertEquals(context.get(TestFactory.class), context.get(TestFactory.class)); + } + + @Test + public void shouldFindProviders() { + assertNotNull(context.get(TestProvider.class)); + assertEquals(context.get(TestProvider.class), context.get(TestProvider.class)); + } + + @Test + public void shouldFindProperties() { + assertNotNull(context.get(TestProperty.class)); + assertEquals(context.get(TestProperty.class), context.get(TestProperty.class)); + assertEquals(TestProperty.VALUE, context.getProperty(TestProperty.ID)); + } + + @Test + public void shouldFindClassesWithImplementingSuperClass() { + assertNotNull(context.get(AbstractClassUser.class)); + } + + @Test + public void shouldNotInitiateAbstractClassesAndInterfaces() { + assertEquals(context.get(AbstractClassImplementingSingleton.class), context.get(AbstractClassUser.class)); + } + + @Test + public void shouldInjectContext() { + final Injector injector = context.get(Injector.class); + assertNotNull(injector.context); + assertEquals(context, injector.context); + assertEquals(context.get(Context.class), injector.context); + assertEquals(context.get(Context.class), context.get(Context.class)); + } + + @Test + public void shouldInjectSingletons() { + final Injector injector = context.get(Injector.class); + assertNotNull(injector.injected); + assertEquals(context.get(Injected.class), injector.injected); + assertEquals(context.get(Injected.class), context.get(Injected.class)); + } + + @Test + public void shouldInjectObjectsBuiltByFactories() { + final Injector injector = context.get(Injector.class); + assertNotNull(injector.built); + assertNotEquals(context.get(Built.class), injector.built); + assertNotEquals(context.get(Built.class), context.get(Built.class)); + } + + @Test + public void shouldAllowPassingConsumersToFactoryMethods() { + final float consumer = 2f; + // InjectFactory contains square method, which consumes a Float parameter and returns a Double. Since this call + // requests a Double instance for (boxed) Float object, consumer should be injected as factory method parameter. + final double result = context.get(Double.class, consumer); + assertEquals(4, result, 0.001); + } + + @Test(expected = RuntimeException.class) + public void shouldNotConvertStaticFactoryMethodsToProviders() { + assertNotNull(context.get(InjectFactory.class)); + context.get(BigDecimal.class); // Type returned by a static method in InjectFactory. + } + + @Test(expected = RuntimeException.class) + public void shouldNotConvertNonPublicFactoryMethodsToProviders() { + assertNotNull(context.get(InjectFactory.class)); + context.get(BigInteger.class); // Type returned by non-public methods in InjectFactory. + } + + @Test + public void shouldInjectObjectsProvidedByProviders() { + final Injector injector = context.get(Injector.class); + assertNotNull(injector.provided); + assertNotEquals(context.get(Provided.class), injector.provided); + assertNotEquals(context.get(Provided.class), context.get(Provided.class)); + } + + @Test + public void shouldInjectProperties() { + final Injector injector = context.get(Injector.class); + assertNotNull(injector.property); + assertEquals(context.getProperty("property"), injector.property); + assertEquals(InjectProperty.VALUE, injector.property); + assertEquals(context.getProperty("property"), context.getProperty("property")); + } + + @Test + public void shouldInjectIntoFieldsFromSuperTypes() { + final UsingAbstractWithFields child = context.get(UsingAbstractWithFields.class); + assertNotNull(child.getChildField()); + assertNotNull(child.getSuperField()); + assertNotNull(((AbstractWithFields) child).getSuperField()); + } + + @Test + public void shouldNotInjectIntoTransientFields() { + assertNull(context.get(Injector.class).transientValue); + } + + @Test + public void shouldNotInjectIntoNotNullFields() { + final Injector injector = context.get(Injector.class); + assertNotNull(injector.notNull); + assertEquals(Ignored.TEST_INSTANCE, injector.notNull); + } + + @Test + public void shouldNotInjectIntoStaticFields() { + assertNull(Injector.staticValue); + } + + @Test + public void shouldNotInjectIntoPrimitiveFields() { + assertEquals(42, context.get(Injector.class).primitive); + } + + @Test + public void shouldResolveCircularFieldInjections() { + assertEquals(context.get(CircularA.class), context.get(CircularB.class).getA()); + assertEquals(context.get(CircularB.class), context.get(CircularA.class).getB()); + } + + @Test + public void shouldResolveConstructorInjections() { + final ConstructorDependency constructor = context.get(ConstructorDependency.class); + assertEquals(context.get(CircularA.class), constructor.getA()); + assertEquals(context.get(CircularB.class), constructor.getB()); + } + + @Test + public void shouldConstructInstanceOnDemand() { + final ConstructorDependency created = context.create(ConstructorDependency.class); + assertEquals(context.get(CircularA.class), created.getA()); + assertEquals(context.get(CircularB.class), created.getB()); + assertEquals(context.get(Injected.class), created.getInjected()); + assertNotEquals(context.get(ConstructorDependency.class), created); + } + + @Test + public void shouldInitiateMarkedComponents() { + assertTrue(context.get(InitiatedA.class).wasInitiated()); + assertTrue(context.get(InitiatedB.class).wasInitiated()); + assertTrue(context.get(InitiatedC.class).wasInitiated()); + } + + @Test + public void shouldInitiateMarkedComponentsAfterDependenciesAreInjected() { + assertTrue(context.get(InitiatedA.class).wereDependenciesNotNull()); + assertTrue(context.get(InitiatedB.class).wereDependenciesNotNull()); + assertTrue(context.get(InitiatedC.class).wereDependenciesNotNull()); + } + + @Test + public void shouldInitiateMarkedComponentsInTheChosenOrder() { + assertTrue(context.get(InitiatedA.class).getActualOrder() < context.get(InitiatedB.class).getActualOrder()); + assertTrue(context.get(InitiatedB.class).getActualOrder() < context.get(InitiatedC.class).getActualOrder()); + } + + @Test + public void shouldInitiateOnDemand() { + final InitiatedA initiatedA = new InitiatedA(context.get(InitiatedB.class)); + assertFalse(initiatedA.wasInitiated()); + context.initiate(initiatedA); + assertTrue(initiatedA.wasInitiated()); + } + + @Test + public void shouldInitiateComponentsCreatedOnDemand() { + final InitiatedA initiatedA = context.create(InitiatedA.class); + assertTrue(initiatedA.wasInitiated()); + assertNotEquals(context.get(InitiatedA.class), initiatedA); + } + + @Test + public void shouldDestroyMarkedComponents() { + assertFalse(context.get(DestroyedA.class).wasDestroyed()); + assertFalse(context.get(DestroyedB.class).wasDestroyed()); + assertFalse(context.get(DestroyedC.class).wasDestroyed()); + context.destroy(); + assertTrue(context.get(DestroyedA.class).wasDestroyed()); + assertTrue(context.get(DestroyedB.class).wasDestroyed()); + assertTrue(context.get(DestroyedC.class).wasDestroyed()); + } + + @Test + public void shouldDestroyMarkedComponentsAfterDependenciesAreInjected() { + context.destroy(); + assertTrue(context.get(DestroyedA.class).wereDependenciesNotNull()); + assertTrue(context.get(DestroyedB.class).wereDependenciesNotNull()); + assertTrue(context.get(DestroyedC.class).wereDependenciesNotNull()); + } + + @Test + public void shouldDestroyMarkedComponentsInTheChosenOrder() { + context.destroy(); + assertTrue(context.get(DestroyedA.class).getActualOrder() < context.get(DestroyedB.class).getActualOrder()); + assertTrue(context.get(DestroyedB.class).getActualOrder() < context.get(DestroyedC.class).getActualOrder()); + } + + @Test + public void shouldDestroyOnDemand() { + final DestroyedA destroyedA = context.get(DestroyedA.class); + assertFalse(destroyedA.wasDestroyed()); + context.destroy(destroyedA); + assertTrue(destroyedA.wasDestroyed()); + } + + @Test + public void shouldDestroyComponentsCreatedOnDemand() { + final DestroyedA destroyedA = context.create(DestroyedA.class); + assertFalse(destroyedA.wasDestroyed()); + context.destroy(destroyedA); + assertTrue(destroyedA.wasDestroyed()); + assertNotEquals(context.get(DestroyedA.class), destroyedA); + + final DestroyedB destroyedB = new DestroyedB(context.create(InitiatedB.class)); + assertFalse(destroyedB.wasDestroyed()); + assertNull(destroyedB.getInjectedDependency()); + context.initiate(destroyedB); + assertFalse(destroyedB.wasDestroyed()); + assertNotNull(destroyedB.getInjectedDependency()); + context.destroy(); + assertTrue(destroyedB.wasDestroyed()); + } + + @Test(expected = RuntimeException.class) + public void shouldThrowExceptionWhenAmbiguousDependencyWithNoDefaultIsRequested() { + context.get(Ambiguous.class); + } + + @Test + public void shouldReturnValidAmbiguousDependencyWhenGivenCorrectID() { + final Ambiguous ambiguous = context.get("ambiguousA", Ambiguous.class); + assertTrue(ambiguous instanceof AmbiguousA); + assertEquals(context.get(AmbiguousA.class), ambiguous); + } + + @Test(expected = RuntimeException.class) + public void shouldThrowExceptionWhenNamedDependencyIsRequestedByLowerCamelCaseClassName() { + context.get("namedAmbiguous", Ambiguous.class); + } + + @Test + public void shouldReturnValidAmbiguousDependencyWhenGivenCorrectNameOfNamedComponent() { + final String name = NamedAmbiguous.NAME; + final Ambiguous ambiguous = context.get(name, Ambiguous.class); + assertTrue(ambiguous instanceof NamedAmbiguous); + assertEquals(context.get(NamedAmbiguous.class), ambiguous); + } + + @Test + public void shouldInjectCorrectAmbiguousDependenciesWhenFieldNamesMatchComponentIds() { + final AmbiguousInjector injector = context.get(AmbiguousInjector.class); + assertTrue(injector.getA() instanceof AmbiguousA); + assertEquals(context.get(AmbiguousA.class), injector.getA()); + assertTrue(injector.getB() instanceof AmbiguousB); + assertEquals(context.get(AmbiguousB.class), injector.getB()); + assertTrue(injector.getNamed() instanceof NamedAmbiguous); + assertEquals(context.get(NamedAmbiguous.class), injector.getNamed()); + } + + @Test + public void shouldResolveAmbiguousDependencyGivenDefaultProvider() { + // ListDefaultProvider implements Default interface, so it should be automatically used when trying to inject a + // value without an ID. It returns array lists. + assertTrue(context.get(AbstractList.class) instanceof ArrayList); + } + + @Test + public void shouldTreatFactoryMethodNamesAsProviderIds() { + // ListFactory contains a "linkedList" method which returns instances of linked lists. + assertTrue(context.get("linkedList", List.class) instanceof LinkedList); + } + + @Test(expected = RuntimeException.class) + public void shouldRemoveProvidersAfterContextClearing() { + try { + context.get(TestComponent.class); + } catch (final Exception exception) { + fail(exception + " should not be thrown yet."); + } + context.clear(); + context.get(TestComponent.class); + } + + @Test(expected = RuntimeException.class) + public void shouldRemoveProviderForClass() { + try { + context.get(TestComponent.class); + } catch (final Exception exception) { + fail(exception + " should not be thrown yet."); + } + context.remove(TestComponent.class); + context.get(TestComponent.class); + } + + @Test + public void shouldStillProvideContextInstanceEvenAfterClearing() { + context.clear(); + assertEquals(context, context.get(Context.class)); + } + + @Test(expected = RuntimeException.class) + public void shouldClearProvidersForClassTree() { + try { + context.get(AbstractList.class); + } catch (final Exception exception) { + fail(exception + " should not be thrown yet."); + } + context.clear(ArrayList.class); + context.get(AbstractList.class); + } + + @Test + public void shouldReplaceProvider() { + final TestComponent previous = context.get(TestComponent.class); + final Provider newProvider = new Provider() { + @Override + public Class getType() { + return TestComponent.class; + } + + @Override + public TestComponent provide(final Object target, final Member member) { + return new TestComponent(); + } + }; + context.replace(TestComponent.class, newProvider); + final TestComponent current = context.get(TestComponent.class); + assertNotEquals(previous, current); + } + + @Test + public void shouldAddCustomProperty() { + context.setProperty("custom", "custom value"); + assertEquals("custom value", context.getProperty("custom")); + context.setProperty("custom", "new value"); + assertEquals("new value", context.getProperty("custom")); + } + + @Test + public void shouldAddCustomSingleton() { + assertFalse(context.isAvailable(CustomSingleton.class)); + final CustomSingleton custom = new CustomSingleton(); + context.add(custom); + assertTrue(context.isAvailable(CustomSingleton.class)); + assertEquals(custom, context.get(CustomSingleton.class)); + assertEquals(context.get(CustomSingleton.class), context.get(CustomSingleton.class)); + } + + @Test + public void shouldAddCustomFactory() { + assertFalse(context.isAvailable(CustomFactory.class)); + assertFalse(context.isAvailable(CustomComponent.class)); + final CustomFactory custom = new CustomFactory(); + context.addFactory(custom); + assertTrue(context.isAvailable(CustomFactory.class)); + assertTrue(context.isAvailable(CustomComponent.class)); + // CustomFactory always returns the same instance of CustomComponent. + assertEquals(custom.getComponent(), context.get(CustomComponent.class)); + } + + @Test + public void shouldAddCustomProvider() { + assertFalse(context.isAvailable(CustomComponent.class)); + context.addProvider(new Provider() { + @Override + public Class getType() { + return CustomComponent.class; + } + + @Override + public CustomComponent provide(final Object target, final Member member) { + return new CustomComponent(); + } + }); + assertTrue(context.isAvailable(CustomComponent.class)); + assertNotEquals(context.get(CustomComponent.class), context.get(CustomComponent.class)); + } + + @Test(expected = RuntimeException.class) + public void shouldThrowExceptionForUnknownComponent() { + context.get(Assert.class); + } + + @Test(expected = RuntimeException.class) + public void shouldThrowExceptionWhenCircularConstructorDependencyIsDetected() { + context.scan(CircularErrorA.class); + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorA.java b/uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorA.java new file mode 100644 index 00000000..c651c893 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorA.java @@ -0,0 +1,8 @@ +package com.github.czyzby.uedi.error.circular; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class CircularErrorA implements Singleton { + public CircularErrorA(final CircularErrorB circularErrorB) { + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorB.java b/uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorB.java new file mode 100644 index 00000000..28b15141 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/error/circular/CircularErrorB.java @@ -0,0 +1,8 @@ +package com.github.czyzby.uedi.error.circular; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class CircularErrorB implements Singleton { + public CircularErrorB(final CircularErrorA circularErrorA) { + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/Root.java b/uedi/src/test/java/com/github/czyzby/uedi/test/Root.java new file mode 100644 index 00000000..b2e4bdd8 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/Root.java @@ -0,0 +1,7 @@ +package com.github.czyzby.uedi.test; + +/** Classpath scanning root. Classes in this package and its subpackages will be scanned for. + * + * @author MJ */ +public class Root { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/TestComponent.java b/uedi/src/test/java/com/github/czyzby/uedi/test/TestComponent.java new file mode 100644 index 00000000..08fcdd76 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/TestComponent.java @@ -0,0 +1,5 @@ +package com.github.czyzby.uedi.test; + +public class TestComponent { + +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/TestFactory.java b/uedi/src/test/java/com/github/czyzby/uedi/test/TestFactory.java new file mode 100644 index 00000000..79b89aaf --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/TestFactory.java @@ -0,0 +1,6 @@ +package com.github.czyzby.uedi.test; + +import com.github.czyzby.uedi.stereotype.Factory; + +public class TestFactory implements Factory { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/TestProperty.java b/uedi/src/test/java/com/github/czyzby/uedi/test/TestProperty.java new file mode 100644 index 00000000..dc05a8c1 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/TestProperty.java @@ -0,0 +1,25 @@ +package com.github.czyzby.uedi.test; + +import com.github.czyzby.uedi.stereotype.Property; + +public class TestProperty implements Property { + public static final String ID = "someProperty", VALUE = "initialValue"; + private String value = VALUE; + + @Override + public String getKey() { + return ID; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String setValue(final String value) { + final String previous = this.value; + this.value = value; + return previous; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/TestProvider.java b/uedi/src/test/java/com/github/czyzby/uedi/test/TestProvider.java new file mode 100644 index 00000000..514f79e5 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/TestProvider.java @@ -0,0 +1,20 @@ +package com.github.czyzby.uedi.test; + +import java.lang.reflect.Member; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Provider; + +public class TestProvider implements Provider { + private Context context; + + @Override + public Class getType() { + return TestComponent.class; + } + + @Override + public TestComponent provide(final Object target, final Member member) { + return context.create(TestComponent.class); + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/TestSingleton.java b/uedi/src/test/java/com/github/czyzby/uedi/test/TestSingleton.java new file mode 100644 index 00000000..3acc2a2b --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/TestSingleton.java @@ -0,0 +1,6 @@ +package com.github.czyzby.uedi.test; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class TestSingleton implements Singleton { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/Ambiguous.java b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/Ambiguous.java new file mode 100644 index 00000000..4b21a961 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/Ambiguous.java @@ -0,0 +1,5 @@ +package com.github.czyzby.uedi.test.ambiguous; + +public abstract class Ambiguous { + +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousA.java b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousA.java new file mode 100644 index 00000000..3542abd4 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousA.java @@ -0,0 +1,6 @@ +package com.github.czyzby.uedi.test.ambiguous; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class AmbiguousA extends Ambiguous implements Singleton { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousB.java b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousB.java new file mode 100644 index 00000000..83357ab6 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousB.java @@ -0,0 +1,6 @@ +package com.github.czyzby.uedi.test.ambiguous; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class AmbiguousB extends Ambiguous implements Singleton { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousInjector.java b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousInjector.java new file mode 100644 index 00000000..567e6d8d --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/AmbiguousInjector.java @@ -0,0 +1,21 @@ +package com.github.czyzby.uedi.test.ambiguous; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class AmbiguousInjector implements Singleton { + private Ambiguous ambiguousA; + private Ambiguous ambiguousB; + private Ambiguous named; + + public Ambiguous getA() { + return ambiguousA; + } + + public Ambiguous getB() { + return ambiguousB; + } + + public Ambiguous getNamed() { + return named; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListDefaultProvider.java b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListDefaultProvider.java new file mode 100644 index 00000000..cb9f7d65 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListDefaultProvider.java @@ -0,0 +1,20 @@ +package com.github.czyzby.uedi.test.ambiguous; + +import java.lang.reflect.Member; +import java.util.ArrayList; + +import com.github.czyzby.uedi.stereotype.Default; +import com.github.czyzby.uedi.stereotype.Provider; + +public class ListDefaultProvider implements Default, Provider> { + @Override + @SuppressWarnings("unchecked") + public Class> getType() { + return (Class>) (Object) ArrayList.class; + } + + @Override + public ArrayList provide(final Object target, final Member member) { + return new ArrayList(); + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListFactory.java b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListFactory.java new file mode 100644 index 00000000..5250c52e --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/ListFactory.java @@ -0,0 +1,12 @@ +package com.github.czyzby.uedi.test.ambiguous; + +import java.util.LinkedList; +import java.util.List; + +import com.github.czyzby.uedi.stereotype.Factory; + +public class ListFactory implements Factory { + public List linkedList() { + return new LinkedList(); + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/NamedAmbiguous.java b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/NamedAmbiguous.java new file mode 100644 index 00000000..2ff98e28 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/ambiguous/NamedAmbiguous.java @@ -0,0 +1,13 @@ +package com.github.czyzby.uedi.test.ambiguous; + +import com.github.czyzby.uedi.stereotype.Named; +import com.github.czyzby.uedi.stereotype.Singleton; + +public class NamedAmbiguous extends Ambiguous implements Named, Singleton { + public static final String NAME = "named"; + + @Override + public String getName() { + return NAME; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassImplementingSingleton.java b/uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassImplementingSingleton.java new file mode 100644 index 00000000..1d28e45e --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassImplementingSingleton.java @@ -0,0 +1,6 @@ +package com.github.czyzby.uedi.test.classpath; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public abstract class AbstractClassImplementingSingleton implements Singleton { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassUser.java b/uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassUser.java new file mode 100644 index 00000000..ad78b873 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/classpath/AbstractClassUser.java @@ -0,0 +1,4 @@ +package com.github.czyzby.uedi.test.classpath; + +public class AbstractClassUser extends AbstractClassImplementingSingleton { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomFactory.java b/uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomFactory.java new file mode 100644 index 00000000..e36b7d49 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomFactory.java @@ -0,0 +1,13 @@ +package com.github.czyzby.uedi.test.custom; + +// Not scanned by the context, added manually. +public class CustomFactory { + private final CustomComponent component = new CustomComponent(); + + public CustomComponent getComponent() { + return component; + } + + public static class CustomComponent { + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomSingleton.java b/uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomSingleton.java new file mode 100644 index 00000000..7842b482 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/custom/CustomSingleton.java @@ -0,0 +1,5 @@ +package com.github.czyzby.uedi.test.custom; + +// Not found by scanning, added manually. +public class CustomSingleton { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/AbstractWithFields.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/AbstractWithFields.java new file mode 100644 index 00000000..c212c9db --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/AbstractWithFields.java @@ -0,0 +1,9 @@ +package com.github.czyzby.uedi.test.inject; + +public abstract class AbstractWithFields { + private Injected superField; + + public Injected getSuperField() { + return superField; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Built.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Built.java new file mode 100644 index 00000000..047a4c13 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Built.java @@ -0,0 +1,4 @@ +package com.github.czyzby.uedi.test.inject; + +public class Built { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularA.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularA.java new file mode 100644 index 00000000..01a7572a --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularA.java @@ -0,0 +1,11 @@ +package com.github.czyzby.uedi.test.inject; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class CircularA implements Singleton { + CircularB b; + + public CircularB getB() { + return b; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularB.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularB.java new file mode 100644 index 00000000..170dcbee --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/CircularB.java @@ -0,0 +1,11 @@ +package com.github.czyzby.uedi.test.inject; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class CircularB implements Singleton { + private CircularA a; + + public CircularA getA() { + return a; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/ConstructorDependency.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/ConstructorDependency.java new file mode 100644 index 00000000..d4da8637 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/ConstructorDependency.java @@ -0,0 +1,26 @@ +package com.github.czyzby.uedi.test.inject; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class ConstructorDependency implements Singleton { + private final CircularA a; + private final CircularB b; + private final Injected injected = null; + + public ConstructorDependency(final CircularA a, final CircularB b) { + this.a = a; + this.b = b; + } + + public CircularA getA() { + return a; + } + + public CircularB getB() { + return b; + } + + public Injected getInjected() { + return injected; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Ignored.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Ignored.java new file mode 100644 index 00000000..ae48c0d0 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Ignored.java @@ -0,0 +1,5 @@ +package com.github.czyzby.uedi.test.inject; + +public class Ignored { + public static final Ignored TEST_INSTANCE = new Ignored(); +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectFactory.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectFactory.java new file mode 100644 index 00000000..823ca0bb --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectFactory.java @@ -0,0 +1,33 @@ +package com.github.czyzby.uedi.test.inject; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import com.github.czyzby.uedi.stereotype.Factory; + +public class InjectFactory implements Factory { + public Built getBuilt() { + return new Built(); + } + + public Double square(final Float parameter) { + return (double) parameter * parameter; + } + + // Ignored - static or not public: + public static BigDecimal getZero() { + return BigDecimal.ZERO; + } + + private BigInteger getValue() { + return new BigInteger(String.valueOf(hashCode())); + } + + BigInteger getThisValue() { + return getValue(); + } + + protected BigInteger getThatValue() { + return getThisValue(); + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProperty.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProperty.java new file mode 100644 index 00000000..c80521dc --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProperty.java @@ -0,0 +1,22 @@ +package com.github.czyzby.uedi.test.inject; + +import com.github.czyzby.uedi.stereotype.Property; + +public class InjectProperty implements Property { + public static final String VALUE = "value"; + + @Override + public String getKey() { + return "property"; + } + + @Override + public String getValue() { + return VALUE; + } + + @Override + public String setValue(final String value) { + return VALUE; // Not implemented. + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProvider.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProvider.java new file mode 100644 index 00000000..7155e604 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/InjectProvider.java @@ -0,0 +1,17 @@ +package com.github.czyzby.uedi.test.inject; + +import java.lang.reflect.Member; + +import com.github.czyzby.uedi.stereotype.Provider; + +public class InjectProvider implements Provider { + @Override + public Class getType() { + return Provided.class; + } + + @Override + public Provided provide(final Object target, final Member member) { + return new Provided(); + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injected.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injected.java new file mode 100644 index 00000000..45a97679 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injected.java @@ -0,0 +1,6 @@ +package com.github.czyzby.uedi.test.inject; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class Injected implements Singleton { +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injector.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injector.java new file mode 100644 index 00000000..9be0d8ce --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Injector.java @@ -0,0 +1,17 @@ +package com.github.czyzby.uedi.test.inject; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Singleton; + +public class Injector implements Singleton { + public transient Ignored transientValue; + public Ignored notNull = Ignored.TEST_INSTANCE; + public static Ignored staticValue = null; + public long primitive = 42; + + public Context context; // via Context (always available to inject) + public Injected injected; // via Injected + public Built built; // via InjectFactory + public String property; // via InjectProperty + public Provided provided; // via InjectProvider +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Provided.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Provided.java new file mode 100644 index 00000000..d92f7ce7 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/Provided.java @@ -0,0 +1,5 @@ +package com.github.czyzby.uedi.test.inject; + +public class Provided { + +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/inject/UsingAbstractWithFields.java b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/UsingAbstractWithFields.java new file mode 100644 index 00000000..ba036042 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/inject/UsingAbstractWithFields.java @@ -0,0 +1,11 @@ +package com.github.czyzby.uedi.test.inject; + +import com.github.czyzby.uedi.stereotype.Singleton; + +public class UsingAbstractWithFields extends AbstractWithFields implements Singleton { + private Injected childField; + + public Injected getChildField() { + return childField; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/Counter.java b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/Counter.java new file mode 100644 index 00000000..ff0f0529 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/Counter.java @@ -0,0 +1,7 @@ +package com.github.czyzby.uedi.test.lifecycle; + +import java.util.concurrent.atomic.AtomicInteger; + +public class Counter { + public static final AtomicInteger COUNTER = new AtomicInteger(100); +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedA.java b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedA.java new file mode 100644 index 00000000..8abb3956 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedA.java @@ -0,0 +1,40 @@ +package com.github.czyzby.uedi.test.lifecycle; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Destructible; +import com.github.czyzby.uedi.stereotype.Singleton; + +public class DestroyedA implements Destructible, Singleton { + private final InitiatedB constructorDependency; + private Context context; + private boolean notNull; + private int order; + + public DestroyedA(final InitiatedB constructorDependency) { + this.constructorDependency = constructorDependency; + } + + @Override + public int getDestructionOrder() { + return 0; + } + + @Override + public void destroy() { + notNull = context != null && constructorDependency != null; + order = Counter.COUNTER.getAndIncrement(); + } + + public boolean wereDependenciesNotNull() { + return notNull; + } + + public boolean wasDestroyed() { + return order != 0; // Counter starts at 100. + } + + public int getActualOrder() { + return order; + } + +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedB.java b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedB.java new file mode 100644 index 00000000..79475d10 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedB.java @@ -0,0 +1,43 @@ +package com.github.czyzby.uedi.test.lifecycle; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Destructible; +import com.github.czyzby.uedi.stereotype.Singleton; + +public class DestroyedB implements Destructible, Singleton { + private final InitiatedB constructorDependency; + private Context context; + private boolean notNull; + private int order; + + public DestroyedB(final InitiatedB constructorDependency) { + this.constructorDependency = constructorDependency; + } + + @Override + public int getDestructionOrder() { + return 1; + } + + @Override + public void destroy() { + notNull = context != null && constructorDependency != null; + order = Counter.COUNTER.getAndIncrement(); + } + + public boolean wereDependenciesNotNull() { + return notNull; + } + + public boolean wasDestroyed() { + return order != 0; // Counter starts at 100. + } + + public int getActualOrder() { + return order; + } + + public Context getInjectedDependency() { + return context; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedC.java b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedC.java new file mode 100644 index 00000000..b5f5f2a8 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/DestroyedC.java @@ -0,0 +1,39 @@ +package com.github.czyzby.uedi.test.lifecycle; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Destructible; +import com.github.czyzby.uedi.stereotype.Singleton; + +public class DestroyedC implements Destructible, Singleton { + private final InitiatedB constructorDependency; + private Context context; + private boolean notNull; + private int order; + + public DestroyedC(final InitiatedB constructorDependency) { + this.constructorDependency = constructorDependency; + } + + @Override + public int getDestructionOrder() { + return 2; + } + + @Override + public void destroy() { + notNull = context != null && constructorDependency != null; + order = Counter.COUNTER.getAndIncrement(); + } + + public boolean wereDependenciesNotNull() { + return notNull; + } + + public boolean wasDestroyed() { + return order != 0; // Counter starts at 100. + } + + public int getActualOrder() { + return order; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedA.java b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedA.java new file mode 100644 index 00000000..6196e1da --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedA.java @@ -0,0 +1,39 @@ +package com.github.czyzby.uedi.test.lifecycle; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Initiated; +import com.github.czyzby.uedi.stereotype.Singleton; + +public class InitiatedA implements Initiated, Singleton { + private final InitiatedB constructorDependency; + private Context context; + private boolean notNull; + private int order; + + public InitiatedA(final InitiatedB constructorDependency) { + this.constructorDependency = constructorDependency; + } + + @Override + public int getInitiationOrder() { + return 0; + } + + @Override + public void initiate() { + notNull = context != null && constructorDependency != null; + order = Counter.COUNTER.getAndIncrement(); + } + + public boolean wereDependenciesNotNull() { + return notNull; + } + + public boolean wasInitiated() { + return order != 0; // Counter starts at 100. + } + + public int getActualOrder() { + return order; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedB.java b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedB.java new file mode 100644 index 00000000..e3690367 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedB.java @@ -0,0 +1,40 @@ +package com.github.czyzby.uedi.test.lifecycle; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Initiated; +import com.github.czyzby.uedi.stereotype.Singleton; +import com.github.czyzby.uedi.test.inject.Injected; + +public class InitiatedB implements Initiated, Singleton { + private final Injected constructorDependency; + private Context context; + private boolean notNull; + private int order; + + public InitiatedB(final Injected constructorDependency) { + this.constructorDependency = constructorDependency; + } + + @Override + public int getInitiationOrder() { + return 1; + } + + @Override + public void initiate() { + notNull = context != null && constructorDependency != null; + order = Counter.COUNTER.getAndIncrement(); + } + + public boolean wereDependenciesNotNull() { + return notNull; + } + + public boolean wasInitiated() { + return order != 0; // Counter starts at 100. + } + + public int getActualOrder() { + return order; + } +} diff --git a/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedC.java b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedC.java new file mode 100644 index 00000000..d274e905 --- /dev/null +++ b/uedi/src/test/java/com/github/czyzby/uedi/test/lifecycle/InitiatedC.java @@ -0,0 +1,39 @@ +package com.github.czyzby.uedi.test.lifecycle; + +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.stereotype.Initiated; +import com.github.czyzby.uedi.stereotype.Singleton; + +public class InitiatedC implements Initiated, Singleton { + private final InitiatedA constructorDependency; + private Context context; + private boolean notNull; + private int order; + + public InitiatedC(final InitiatedA constructorDependency) { + this.constructorDependency = constructorDependency; + } + + @Override + public int getInitiationOrder() { + return 2; + } + + @Override + public void initiate() { + notNull = context != null && constructorDependency != null; + order = Counter.COUNTER.getAndIncrement(); + } + + public boolean wereDependenciesNotNull() { + return notNull; + } + + public boolean wasInitiated() { + return order != 0; // Counter starts at 100. + } + + public int getActualOrder() { + return order; + } +} From 21bb6997f612c1554febcc4acc33a1e94f18601e Mon Sep 17 00:00:00 2001 From: MJ Date: Fri, 3 Jun 2016 20:09:37 +0200 Subject: [PATCH 04/58] Basic LML UEDI implementation. --- .../github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml | 31 ++ .../czyzby/lml/uedi/LmlApplication.java | 333 ++++++++++++++++++ .../lml/uedi/assets/AssetManagerProvider.java | 43 +++ .../lml/uedi/assets/BitmapFontProvider.java | 32 ++ .../github/czyzby/lml/uedi/assets/Loaded.java | 14 + .../czyzby/lml/uedi/assets/ModelProvider.java | 32 ++ .../czyzby/lml/uedi/assets/MusicProvider.java | 32 ++ .../uedi/assets/Particle3dEffectProvider.java | 32 ++ .../uedi/assets/ParticleEffectProvider.java | 33 ++ .../lml/uedi/assets/PixmapProvider.java | 32 ++ .../czyzby/lml/uedi/assets/SoundProvider.java | 32 ++ .../lml/uedi/assets/TextureAtlasProvider.java | 45 +++ .../lml/uedi/assets/TextureProvider.java | 32 ++ .../assets/impl/AbstractAssetProvider.java | 121 +++++++ .../impl/AbstractEagerAssetProvider.java | 55 +++ .../lml/uedi/assets/impl/AssetInjection.java | 53 +++ .../assets/impl/EagerTextureAtlasLoader.java | 52 +++ .../assets/impl/InjectingAssetManager.java | 46 +++ .../lml/uedi/collections/ArrayProvider.java | 24 ++ .../lml/uedi/collections/ListProvider.java | 24 ++ .../lml/uedi/collections/MapProvider.java | 25 ++ .../lml/uedi/collections/SetProvider.java | 24 ++ .../lml/uedi/i18n/I18NBundleProvider.java | 156 ++++++++ .../lml/uedi/i18n/LocalePreference.java | 119 +++++++ .../lml/uedi/i18n/impl/BundleInjection.java | 17 + .../uedi/i18n/impl/EagerI18NBundleLoader.java | 100 ++++++ .../czyzby/lml/uedi/impl/LmlContext.java | 52 +++ .../lml/uedi/logger/LoggerProvider.java | 43 +++ .../czyzby/lml/uedi/music/MusicService.java | 8 + .../czyzby/lml/uedi/music/VolumeAction.java | 113 ++++++ .../uedi/preferences/AbstractPreference.java | 42 +++ .../uedi/preferences/PreferenceProvider.java | 52 +++ .../uedi/preferences/PreferencesProvider.java | 35 ++ .../czyzby/lml/uedi/ui/BatchProvider.java | 38 ++ .../czyzby/lml/uedi/ui/SkinProvider.java | 48 +++ .../lml/uedi/ui/SpriteBatchProvider.java | 45 +++ .../czyzby/lml/uedi/ui/StageProvider.java | 38 ++ .../lml/uedi/ui/impl/EagerSkinLoader.java | 53 +++ .../github/czyzby/lml/uedi/views/View.java | 82 +++++ .../lml/util/LmlApplicationListener.java | 28 +- .../stereotype/impl/PropertyProvider.java | 42 +-- 41 files changed, 2213 insertions(+), 45 deletions(-) create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/BitmapFontProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Loaded.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ModelProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/MusicProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Particle3dEffectProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/PixmapProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/SoundProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AssetInjection.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/EagerTextureAtlasLoader.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/InjectingAssetManager.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ArrayProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ListProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/MapProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/SetProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/BundleInjection.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/EagerI18NBundleLoader.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/impl/LmlContext.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/logger/LoggerProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/VolumeAction.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/AbstractPreference.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferencesProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/BatchProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SkinProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SpriteBatchProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/StageProvider.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/impl/EagerSkinLoader.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml new file mode 100644 index 00000000..247a5ce6 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java new file mode 100644 index 00000000..c75e8844 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java @@ -0,0 +1,333 @@ +package com.github.czyzby.lml.uedi; + +import java.util.Locale; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.scenes.scene2d.Action; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.viewport.ScreenViewport; +import com.badlogic.gdx.utils.viewport.Viewport; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.kiwi.util.gdx.viewport.LetterboxingViewport; +import com.github.czyzby.lml.parser.LmlData; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.action.ActorConsumer; +import com.github.czyzby.lml.parser.impl.AbstractLmlView; +import com.github.czyzby.lml.uedi.assets.AssetManagerProvider; +import com.github.czyzby.lml.uedi.assets.BitmapFontProvider; +import com.github.czyzby.lml.uedi.assets.ModelProvider; +import com.github.czyzby.lml.uedi.assets.MusicProvider; +import com.github.czyzby.lml.uedi.assets.Particle3dEffectProvider; +import com.github.czyzby.lml.uedi.assets.ParticleEffectProvider; +import com.github.czyzby.lml.uedi.assets.PixmapProvider; +import com.github.czyzby.lml.uedi.assets.SoundProvider; +import com.github.czyzby.lml.uedi.assets.TextureAtlasProvider; +import com.github.czyzby.lml.uedi.assets.TextureProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; +import com.github.czyzby.lml.uedi.collections.ArrayProvider; +import com.github.czyzby.lml.uedi.collections.ListProvider; +import com.github.czyzby.lml.uedi.collections.MapProvider; +import com.github.czyzby.lml.uedi.collections.SetProvider; +import com.github.czyzby.lml.uedi.i18n.I18NBundleProvider; +import com.github.czyzby.lml.uedi.i18n.LocalePreference; +import com.github.czyzby.lml.uedi.impl.LmlContext; +import com.github.czyzby.lml.uedi.logger.LoggerProvider; +import com.github.czyzby.lml.uedi.preferences.PreferencesProvider; +import com.github.czyzby.lml.uedi.ui.BatchProvider; +import com.github.czyzby.lml.uedi.ui.SkinProvider; +import com.github.czyzby.lml.uedi.ui.SpriteBatchProvider; +import com.github.czyzby.lml.uedi.ui.StageProvider; +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.lml.util.Lml; +import com.github.czyzby.lml.util.LmlApplicationListener; +import com.github.czyzby.lml.util.LmlUtilities; +import com.github.czyzby.uedi.Context; +import com.github.czyzby.uedi.scanner.ClassScanner; + +/** Default implementation of {@link com.badlogic.gdx.ApplicationListener ApplicationListener} for UEDI-based + * applications using LML to manage their views. Additionally to managing LML view controllers, initiates UEDI context + * and registers some default components and providers. + * + * @author MJ */ +public class LmlApplication extends LmlApplicationListener { + private final Class root; + private final ClassScanner classScanner; + private final String preferences; + private Context context; + // GUI data: + private Stage stage; + private boolean centerCamera; + // Locale data: + private I18NBundleProvider i18nBundleProvider; + private LocalePreference localePreference; + + /** @param root a class in the base package of the application. All classes implementing UEDI stereotype interfaces + * in its subpackages will be found and initiated. + * @param classScanner used to automatically scan the classpath. Has to be platform-specific, as there is no unified + * way of accessing class pool. */ + public LmlApplication(final Class root, final ClassScanner classScanner) { + this(root, classScanner, Lml.LOGGER_TAG); + } + + /** @param root a class in the base package of the application. All classes implementing UEDI stereotype interfaces + * in its subpackages will be found and initiated. + * @param classScanner used to automatically scan the classpath. Has to be platform-specific, as there is no unified + * way of accessing class pool. + * @param preferences default path to application's preferences. Should generally match application's name. Will be + * set as default preferences in {@link LmlParser}. */ + public LmlApplication(final Class root, final ClassScanner classScanner, final String preferences) { + this.root = root; + this.classScanner = classScanner; + this.preferences = preferences; + } + + @Override + public void create() { + ApplicationPreferences.setDefaultPreferences(getPreferences()); + context = createContext(classScanner); + addDefaultComponents(); + context.scan(root); + doAfterScan(); + super.create(); + setStageViewport(); + final LmlParser parser = getParser(); + parser.getData().setDefaultPreferences(ApplicationPreferences.getPreferences()); + i18nBundleProvider.fill(parser); + setFirstView(); + } + + /** Called by the {@link #create()} method to set {@link Viewport} instance of the GUI {@link Stage}. */ + protected void setStageViewport() { + if (context.isAvailable(Viewport.class)) { + stage.setViewport(context.get(Viewport.class, stage)); + } else { + Gdx.app.debug(Lml.LOGGER_TAG, "No provider found for Viewport.class. Using default Stage viewport."); + } + final Viewport viewport = stage.getViewport(); + centerCamera = viewport instanceof ScreenViewport || viewport instanceof LetterboxingViewport; + } + + /** Used to construct {@link Context} instance in {@link #create()} method. + * + * @param classScanner will be used to scan for components. + * @return {@link LmlContext} by default. */ + protected Context createContext(final ClassScanner classScanner) { + return new LmlContext(this, classScanner); + } + + /** This method is invoked after the context is fully scanned and initiated. Can be safely overridden - the method + * does nothing by default. */ + protected void doAfterScan() { + } + + /** It is assumed that the first view was set using {@link #forceCurrentView(View)} method during context + * initiation. This method ensures smooth showing of the first view. + * + * @throws GdxRuntimeException if first view was not set. */ + protected void setFirstView() { + final AbstractLmlView firstView = getCurrentView(); + if (firstView == null) { + throw new GdxRuntimeException("No view marked as first. Unable to start application."); + } + setCurrentView(null); + initiateView(firstView); + setView(firstView); + } + + @Override + protected boolean isCenteringCameraOnResize() { + return centerCamera; + } + + /** Also available as "setLocale" action in LML views. Will extract locale from actor's ID. + * + * @param locale will be set as the current application's locale. If is not equal to the current locale, will hide + * current view, reload all referenced {@link com.badlogic.gdx.utils.I18NBundle i18n bundles}, recreate + * all views and reshow the current view. */ + public void setLocale(final Locale locale) { + if (!localePreference.isCurrent(locale)) { + setView(getCurrentView(), new Action() { + private boolean reloaded = false; + + @Override + public boolean act(final float delta) { + if (!reloaded) { + reloaded = true; + localePreference.setLocale(locale); + localePreference.save(); + reloadViews(); + } + return true; + } + }); + } + } + + @Override + protected AbstractLmlView getInstanceOf(final Class viewClass) { + return context.get(viewClass); + } + + /** Registers multiple providers and singletons that produce LibGDX-related object instances. */ + protected void addDefaultComponents() { + // Creating components manually to speed up the start-up. + final boolean mapSuper = context.isMapSuperTypes(); + context.setMapSuperTypes(false); + // Assets: + final AssetManagerProvider assetManagerProvider = new AssetManagerProvider(); + context.addProvider(assetManagerProvider); + context.addDestructible(assetManagerProvider); + final InjectingAssetManager assetManager = assetManagerProvider.getAssetManager(); + context.addProvider(new BitmapFontProvider(assetManager)); + context.addProvider(new ModelProvider(assetManager)); + context.addProvider(new MusicProvider(assetManager)); + context.addProvider(new Particle3dEffectProvider(assetManager)); + context.addProvider(new ParticleEffectProvider(assetManager)); + context.addProvider(new PixmapProvider(assetManager)); + context.addProvider(new SoundProvider(assetManager)); + context.addProvider(new TextureAtlasProvider(assetManager)); + context.addProvider(new TextureProvider(assetManager)); + // Collections: + context.addProvider(new ArrayProvider()); + context.addProvider(new ListProvider()); + context.addProvider(new MapProvider()); + context.addProvider(new SetProvider()); + // I18n: + i18nBundleProvider = new I18NBundleProvider(assetManager); + localePreference = new LocalePreference(i18nBundleProvider); + i18nBundleProvider.setLocalePreference(localePreference); + context.addProvider(i18nBundleProvider); + context.addProperty(localePreference); + context.addProvider(localePreference); + // Logging: + context.addProvider(new LoggerProvider()); + // Music: + // TODO music service + // Preferences: + context.addProvider(new PreferencesProvider()); + // UI: + final SpriteBatchProvider spriteBatchProvider = new SpriteBatchProvider(); + context.addProvider(new BatchProvider(spriteBatchProvider)); + context.addProvider(spriteBatchProvider); + context.addDestructible(spriteBatchProvider); + context.addProvider(new SkinProvider(assetManager)); + final StageProvider stageProvider = new StageProvider(spriteBatchProvider.getBatch()); + stage = stageProvider.getStage(); + context.addProvider(stageProvider); + + context.setMapSuperTypes(mapSuper); + // Application listener: + context.add(this); + } + + @Override + protected void addDefaultActions() { + super.addDefaultActions(); + final LmlData data = getParser().getData(); + // Extracts ID from the actor, parses it as Locale instance. Tries to change current locale. + data.addActorConsumer("setLocale", new ActorConsumer() { + @Override + public Void consume(final Actor actor) { + setLocale(LocalePreference.fromString(LmlUtilities.getActorId(actor))); + return null; + } + }); + // Returns current locale serialized as string. + data.addActorConsumer("getLocale", new ActorConsumer() { + @Override + public String consume(final Actor actor) { + return LocalePreference.toString(localePreference.getLocale()); + } + }); + // Reload current view. Useful for rapid GUI prototyping. + data.addActorConsumer("reloadView", new ActorConsumer() { + @Override + public Void consume(final Object actor) { + reloadView(getCurrentView()); + return null; + } + }); + } + + /** @param view will be immediately set as the current view. Note that this should not be generally used to change + * screens - to ensure smooth transitions, use {@code setView} methods instead. + * @see #setView(AbstractLmlView) + * @see #setView(Class) */ + public void forceCurrentView(final View view) { + setCurrentView(view); + } + + /** @return path to application's preferences. Will be set as default preferences in {@link LmlParser}. */ + protected String getPreferences() { + return preferences; + } + + @Override + protected void initiateView(final AbstractLmlView view) { + getViews().put(view.getClass(), view); + final String viewId = view.getViewId(); + if (Strings.isNotEmpty(viewId)) { + addClassAlias(viewId, view.getClass()); + } + view.setStage(null); + final Array actors = getParser().createView(view, view.getTemplateFile()); + if (view instanceof View) { + ((View) view).clearActors(); + ((View) view).addActors(actors); + } else { + throw new GdxRuntimeException("LmlApplication can handle only View instances."); + } + view.setStage(stage); + } + + @Override + protected LmlParser createParser() { + if (!context.isAvailable(LmlParser.class)) { + throw new GdxRuntimeException( + "No singleton, provider or factory producing LmlParser. Unable to construct views."); + } + return context.get(LmlParser.class); + } + + /** @return application's UEDI context, which allows to construct and inject components. */ + public Context getContext() { + return context; + } + + @Override + public void reloadView(final AbstractLmlView lmlView) { + final View view = (View) lmlView; + final boolean isCurrent = getCurrentView() == view; + if (isCurrent) { + view.getStage().getRoot().clearChildren(); + } + view.setStage(null); + view.clearActors(); + getParser().createView(view, view.getTemplateFile()); + view.setStage(stage); + if (isCurrent) { + view.show(); + } + } + + @Override + public void addClassAlias(final String alias, final Class viewClass) { + super.addClassAlias(alias, viewClass); + } + + @Override + public void dispose() { + super.dispose(); + if (context != null) { + try { + context.destroy(); + } catch (final Exception exception) { + Gdx.app.log(Lml.LOGGER_TAG, "Unable to destroy the context.", exception); + } + } + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java new file mode 100644 index 00000000..6e211890 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java @@ -0,0 +1,43 @@ +package com.github.czyzby.lml.uedi.assets; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.assets.AssetManager; +import com.github.czyzby.kiwi.util.gdx.asset.Disposables; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; +import com.github.czyzby.uedi.stereotype.Destructible; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Holds a unique instance of {@link AssetManager} that will be used to load all automatically injected assets. Handles + * assets disposing. + * + * @author MJ */ +public class AssetManagerProvider implements Destructible, Provider { + public static final int ASSET_DISPOSING_PRIORITY = 10; + private final InjectingAssetManager assetManager = new InjectingAssetManager(); + + @Override + public Class getType() { + return InjectingAssetManager.class; + } + + @Override + public AssetManager provide(final Object target, final Member member) { + return assetManager; + } + + /** @return the only instance of the {@link AssetManager}. */ + public InjectingAssetManager getAssetManager() { + return assetManager; + } + + @Override + public int getDestructionOrder() { + return ASSET_DISPOSING_PRIORITY; + } + + @Override + public void destroy() { + Disposables.gracefullyDisposeOf(assetManager); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/BitmapFontProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/BitmapFontProvider.java new file mode 100644 index 00000000..9c10563a --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/BitmapFontProvider.java @@ -0,0 +1,32 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link BitmapFont} instances. + * + * @author MJ */ +public class BitmapFontProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "fnt" }; + + /** @param assetManager will be used to load the assets. */ + public BitmapFontProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return BitmapFont.class; + } + + @Override + protected String getFolder() { + return "font"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Loaded.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Loaded.java new file mode 100644 index 00000000..db9acc9b --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Loaded.java @@ -0,0 +1,14 @@ +package com.github.czyzby.lml.uedi.assets; + +/** Allows the class with assets to listen to asset injection events. Invoked each time a field is modified. + * + * @author MJ */ +public interface Loaded { + /** Called each time an asset is injected into the class. Note that the method requires additional checks which + * asset was actually loaded - make sure to write null-safe code. + * + * @param path the exact path of the loaded asset. + * @param type type of the loaded asset. + * @param asset was just loaded and injected. */ + void onLoad(String path, Class type, Object asset); +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ModelProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ModelProvider.java new file mode 100644 index 00000000..1cea7d8b --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ModelProvider.java @@ -0,0 +1,32 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.graphics.g3d.Model; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link Model} instances. + * + * @author MJ */ +public class ModelProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "g3db", "g3dj", "obj" }; + + /** @param assetManager will be used to load the assets. */ + public ModelProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return Model.class; + } + + @Override + protected String getFolder() { + return "model"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/MusicProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/MusicProvider.java new file mode 100644 index 00000000..27346eb9 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/MusicProvider.java @@ -0,0 +1,32 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.audio.Music; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link Music} instances. + * + * @author MJ */ +public class MusicProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "ogg", "mp3", "wav" }; + + /** @param assetManager will be used to load the assets. */ + public MusicProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return Music.class; + } + + @Override + protected String getFolder() { + return "music"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Particle3dEffectProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Particle3dEffectProvider.java new file mode 100644 index 00000000..3522fcb6 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/Particle3dEffectProvider.java @@ -0,0 +1,32 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.graphics.g3d.particles.ParticleEffect; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link ParticleEffect} instances. + * + * @author MJ */ +public class Particle3dEffectProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "pfx" }; + + /** @param assetManager will be used to load the assets. */ + public Particle3dEffectProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return ParticleEffect.class; + } + + @Override + protected String getFolder() { + return "effect"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java new file mode 100644 index 00000000..14707c4a --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java @@ -0,0 +1,33 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.graphics.g2d.ParticleEffect; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link ParticleEffect} instances. + * + * @author MJ */ +public class ParticleEffectProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "p", "pfx" }; + // TODO $ to separate name from atlas + + /** @param assetManager will be used to load the assets. */ + public ParticleEffectProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return ParticleEffect.class; + } + + @Override + protected String getFolder() { + return "effect"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/PixmapProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/PixmapProvider.java new file mode 100644 index 00000000..9c3c15f1 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/PixmapProvider.java @@ -0,0 +1,32 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.graphics.Pixmap; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link Pixmap} instances. + * + * @author MJ */ +public class PixmapProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "png", "jpg" }; + + /** @param assetManager will be used to load the assets. */ + public PixmapProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return Pixmap.class; + } + + @Override + protected String getFolder() { + return "image"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/SoundProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/SoundProvider.java new file mode 100644 index 00000000..22b5e534 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/SoundProvider.java @@ -0,0 +1,32 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.audio.Sound; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link Sound} instances. + * + * @author MJ */ +public class SoundProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "ogg", "mp3", "wav" }; + + /** @param assetManager will be used to load the assets. */ + public SoundProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return Sound.class; + } + + @Override + protected String getFolder() { + return "sound"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java new file mode 100644 index 00000000..cde00333 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java @@ -0,0 +1,45 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link TextureAtlas} instances. + * + * @author MJ */ +public class TextureAtlasProvider extends AbstractAssetProvider { + public static final String ATLAS_FOLDER = "atlas"; + public static final String[] EXTENSIONS = new String[] { "atlas", "pack" }; + + /** @param assetManager will be used to load the assets. */ + public TextureAtlasProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return TextureAtlas.class; + } + + @Override + protected String getFolder() { + return ATLAS_FOLDER; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } + + /** @param id ID of the texture atlas file. + * @return path of the atlas with the default extension in the default atlas folder. */ + public static String getTextureAtlasPath(final String id) { + final String extension = EXTENSIONS[0]; + final StringBuilder builder = new StringBuilder(ATLAS_FOLDER.length() + 1 + id + 1 + extension); + builder.append(ATLAS_FOLDER).append('/').append(id); + Strings.replace(builder, '_', '/'); + builder.append('.').append(extension); + return builder.toString(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureProvider.java new file mode 100644 index 00000000..885a6aa8 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureProvider.java @@ -0,0 +1,32 @@ +package com.github.czyzby.lml.uedi.assets; + +import com.badlogic.gdx.graphics.Texture; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; + +/** Provides {@link Texture} instances. + * + * @author MJ */ +public class TextureProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "png", "jpg" }; + + /** @param assetManager will be used to load the textures. */ + public TextureProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return Texture.class; + } + + @Override + protected String getFolder() { + return "image"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java new file mode 100644 index 00000000..17314c97 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java @@ -0,0 +1,121 @@ +package com.github.czyzby.lml.uedi.assets.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.common.Exceptions; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.lml.uedi.assets.Loaded; +import com.github.czyzby.lml.util.Lml; +import com.github.czyzby.uedi.reflection.impl.FieldMember; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Abstract base for asset providers. + * + * @author MJ + * + * @param type of provided assets. */ +public abstract class AbstractAssetProvider implements Provider { + private final InjectingAssetManager assetManager; + private final ObjectMap idsToPaths = GdxMaps.newObjectMap(); + + /** @param assetManager will be used to load the assets and schedule field injections. */ + public AbstractAssetProvider(final InjectingAssetManager assetManager) { + this.assetManager = assetManager; + } + + @Override + public Asset provide(final Object target, final Member member) { + if (member == null) { + throwUnknownPathException(); + } + final String id = member.getName(); + if (Strings.isEmpty(id)) { + throwUnknownPathException(); + } + final Asset asset = getOrLoad(id); + if (member instanceof FieldMember) { + if (asset == null) { + assetManager.addInjection( // Delayed asset injection - field will be filled when assets are loaded: + new AssetInjection(idsToPaths.get(id), getType(), ((FieldMember) member).getField(), target)); + } else if (target instanceof Loaded) { + ((Loaded) target).onLoad(idsToPaths.get(id), getType(), asset); + } + } else if (asset == null) { + Gdx.app.log(Lml.LOGGER_TAG, "Warn: requested instance of unloaded asset: " + id); + } + return asset; + } + + /** @throws GdxRuntimeException on each call. */ + protected void throwUnknownPathException() { + throw new GdxRuntimeException("Unable to determine asset path."); + } + + /** @param id name of the asset file (without extension or folder). "_" are replaced with "/" to support nested + * folders. Cannot be empty or null. + * @return an instance of the asset (if its already loaded) or null if it was scheduled for loading. + * @throws GdxRuntimeException if ID is invalid. */ + public Asset getOrLoad(final String id) { + final String path = determinePath(id); + if (assetManager.isLoaded(path)) { + return assetManager.get(path, getType()); + } + assetManager.load(path, getType()); + return null; + } + + /** @param id name of the asset file (without extension or folder). "_" are replaced with "/" to support nested + * folders. Cannot be empty or null. + * @return a cached path assigned to the ID or a new determined path to an existing file. + * @throws GdxRuntimeException if unable to find existing file. */ + protected String determinePath(final String id) { + String path = idsToPaths.get(id); + if (path != null) { + return path; + } + final String fileName = getFileName(getFolder(), id); + for (final String extension : getExtensions()) { + path = fileName + extension; + try { + final FileHandle file = Gdx.files.internal(path); + if (file.exists()) { + idsToPaths.put(id, path); + return path; + } + } catch (final Exception exception) { + Exceptions.ignore(exception); // Invalid FileHandle implementation, throws errors for missing files. + } + } + throw new GdxRuntimeException("Unable to find file in folder: '" + getFolder() + "' matching name: '" + id + + "' with any of the supported extensions."); + } + + /** @param folder can contain the asset. + * @param id might contain '_', which should be converted to '/' to support nested paths. + * @return file name (supporting nested paths) proceeded with a slash and with a dot appended at the end. */ + protected String getFileName(final String folder, final String id) { + final StringBuilder builder = new StringBuilder(folder.length() + 1 + id.length() + 1); + builder.append(folder); + builder.append('/'); + builder.append(id); + Strings.replace(builder, '_', '/'); + builder.append('.'); + return builder.toString(); + } + + /** @return an array of supported file extensions. */ + protected abstract String[] getExtensions(); + + /** @return the expected path of the asset. */ + protected abstract String getFolder(); + + /** @return instance of {@link InjectingAssetManager} managing the assets. */ + protected InjectingAssetManager getAssetManager() { + return assetManager; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java new file mode 100644 index 00000000..6f50d705 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java @@ -0,0 +1,55 @@ +package com.github.czyzby.lml.uedi.assets.impl; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.lml.uedi.assets.Loaded; +import com.github.czyzby.uedi.reflection.impl.FieldMember; + +/** Loads assets immediately. Caches for further reuse. + * + * @author MJ + * + * @param type of loaded assets. */ +public abstract class AbstractEagerAssetProvider extends AbstractAssetProvider { + private final ObjectMap idsToAssets = GdxMaps.newObjectMap(); + + public AbstractEagerAssetProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Asset provide(final Object target, final Member member) { + if (member == null) { + throwUnknownPathException(); + } + final String id = member.getName(); + if (Strings.isEmpty(id)) { + throwUnknownPathException(); + } + final Asset asset = getOrLoad(id); + if (member instanceof FieldMember && target instanceof Loaded) { + ((Loaded) target).onLoad(determinePath(id), getType(), idsToAssets.get(id)); + } + return asset; + } + + @Override + public Asset getOrLoad(final String id) { + if (idsToAssets.containsKey(id)) { + return idsToAssets.get(id); + } + final Asset asset = load(id, determinePath(id), getAssetManager()); + idsToAssets.put(id, asset); + return asset; + } + + /** @param id ID of the asset. + * @param path determined asset path. + * @param assetManager asset manager, which should include the asset. + * @return loaded asset instance. */ + protected abstract Asset load(String id, String path, AssetManager assetManager); +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AssetInjection.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AssetInjection.java new file mode 100644 index 00000000..ac49cffc --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AssetInjection.java @@ -0,0 +1,53 @@ +package com.github.czyzby.lml.uedi.assets.impl; + +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.reflect.Field; +import com.github.czyzby.lml.uedi.assets.Loaded; + +/** Contains necessary data to inject an asset into a field. + * + * @author MJ */ +public class AssetInjection { + private final String path; + private final Class type; + private final Field field; + private final Object owner; + private final Loaded loadListener; + + /** @param path path to the asset. + * @param type type of stored value. + * @param field reference to the field that needs to be filled. + * @param owner instance of the class containing the field. */ + public AssetInjection(final String path, final Class type, final Field field, final Object owner) { + this.path = path; + this.type = type; + this.field = field; + this.owner = owner; + loadListener = owner instanceof Loaded ? (Loaded) owner : null; + } + + /** @param asset will be injected into the field. */ + public void inject(final Object asset) { + field.setAccessible(true); + try { + field.set(owner, asset); + } catch (final Exception exception) { + throw new GdxRuntimeException("Unable to inject loaded asset: " + path + " into component: " + owner, + exception); + } + if (loadListener != null) { + loadListener.onLoad(path, type, asset); + } + } + + /** @param assetManager will be used to retrieve the asset. + * @return true if injection was successful. */ + public boolean inject(final AssetManager assetManager) { + if (assetManager.isLoaded(path)) { + inject(assetManager.get(path, type)); + return true; + } + return false; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/EagerTextureAtlasLoader.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/EagerTextureAtlasLoader.java new file mode 100644 index 00000000..4f98dc21 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/EagerTextureAtlasLoader.java @@ -0,0 +1,52 @@ +package com.github.czyzby.lml.uedi.assets.impl; + +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.FileHandleResolver; +import com.badlogic.gdx.assets.loaders.TextureAtlasLoader; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.Array; + +/** Allows to eagerly load a {@link TextureAtlas}. + * + * @author MJ */ +public class EagerTextureAtlasLoader extends TextureAtlasLoader { + public EagerTextureAtlasLoader(final FileHandleResolver resolver) { + super(resolver); + } + + @Override + public TextureAtlas load(final AssetManager assetManager, final String fileName, final FileHandle file, + final TextureAtlasParameter parameter) { + if (parameter instanceof EagerTextureAtlasParameter) { + final TextureAtlas atlas = ((EagerTextureAtlasParameter) parameter).atlas; + if (atlas != null) { + return atlas; + } + } + return super.load(assetManager, fileName, file, parameter); + } + + @Override + @SuppressWarnings("rawtypes") + public Array getDependencies(final String fileName, final FileHandle atlasFile, + final TextureAtlasParameter parameter) { + if (parameter instanceof EagerTextureAtlasParameter && ((EagerTextureAtlasParameter) parameter).atlas != null) { + return null; + } + return super.getDependencies(fileName, atlasFile, parameter); + } + + /** Allows to eagerly load the assets. + * + * @author MJ */ + public static class EagerTextureAtlasParameter extends TextureAtlasLoader.TextureAtlasParameter { + private final TextureAtlas atlas; + + /** @param atlas was eagerly loaded, but should still be managed by an asset manager. */ + public EagerTextureAtlasParameter(final TextureAtlas atlas) { + this.atlas = atlas; + } + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/InjectingAssetManager.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/InjectingAssetManager.java new file mode 100644 index 00000000..621da1ea --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/InjectingAssetManager.java @@ -0,0 +1,46 @@ +package com.github.czyzby.lml.uedi.assets.impl; + +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.FileHandleResolver; +import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.utils.I18NBundle; +import com.github.czyzby.kiwi.util.gdx.collection.pooled.PooledList; +import com.github.czyzby.lml.uedi.i18n.impl.EagerI18NBundleLoader; +import com.github.czyzby.lml.uedi.ui.impl.EagerSkinLoader; + +/** Hooks up a semi-listener to {@link #update()} method, allowing to inject into fields as soon as assets are loaded. + * + * @author MJ */ +public class InjectingAssetManager extends AssetManager { + private final PooledList injections = PooledList.newList(); + + /** Creates a new {@link InjectingAssetManager} using the {@link InternalFileHandleResolver}. */ + public InjectingAssetManager() { + super(new InternalFileHandleResolver(), true); // Using default loaders. + final FileHandleResolver resolver = getFileHandleResolver(); + setLoader(I18NBundle.class, new EagerI18NBundleLoader(resolver)); + setLoader(Skin.class, new EagerSkinLoader(resolver)); + setLoader(TextureAtlas.class, new EagerTextureAtlasLoader(resolver)); + } + + @Override + public synchronized boolean update() { + final boolean result = super.update(); + if (result && injections.isNotEmpty()) { + for (final AssetInjection injection : injections) { + if (injection.inject(this)) { + injections.remove(); + } + } + } + return result; + } + + /** @param injection will be scheduled and executed as soon as the requested assets are loaded. The assets must have + * been already scheduled for loading. */ + public void addInjection(final AssetInjection injection) { + injections.add(injection); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ArrayProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ArrayProvider.java new file mode 100644 index 00000000..889c4081 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ArrayProvider.java @@ -0,0 +1,24 @@ +package com.github.czyzby.lml.uedi.collections; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.Array; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link Array} instances without reflection usage. + * + * @author MJ + * + * @param type of stored values. */ +public class ArrayProvider implements Provider> { + @Override + @SuppressWarnings("unchecked") + public Class> getType() { + return (Class>) (Object) Array.class; + } + + @Override + public Array provide(final Object target, final Member member) { + return new Array(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ListProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ListProvider.java new file mode 100644 index 00000000..63f78ec3 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/ListProvider.java @@ -0,0 +1,24 @@ +package com.github.czyzby.lml.uedi.collections; + +import java.lang.reflect.Member; + +import com.github.czyzby.kiwi.util.gdx.collection.pooled.PooledList; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link PooledList} instances without reflection usage. + * + * @author MJ + * + * @param type of stored values. */ +public class ListProvider implements Provider> { + @Override + @SuppressWarnings("unchecked") + public Class> getType() { + return (Class>) (Object) PooledList.class; + } + + @Override + public PooledList provide(final Object target, final Member member) { + return new PooledList(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/MapProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/MapProvider.java new file mode 100644 index 00000000..b93fe47f --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/MapProvider.java @@ -0,0 +1,25 @@ +package com.github.czyzby.lml.uedi.collections; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link ObjectMap} instances without reflection usage. + * + * @author MJ + * + * @param type of stored keys. + * @param type of stored values. */ +public class MapProvider implements Provider> { + @Override + @SuppressWarnings("unchecked") + public Class> getType() { + return (Class>) (Object) ObjectMap.class; + } + + @Override + public ObjectMap provide(final Object target, final Member member) { + return new ObjectMap(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/SetProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/SetProvider.java new file mode 100644 index 00000000..29dc0c60 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/collections/SetProvider.java @@ -0,0 +1,24 @@ +package com.github.czyzby.lml.uedi.collections; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.utils.ObjectSet; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link ObjectSet} instances without reflection usage. + * + * @author MJ + * + * @param type of stored values. */ +public class SetProvider implements Provider> { + @Override + @SuppressWarnings("unchecked") + public Class> getType() { + return (Class>) (Object) ObjectSet.class; + } + + @Override + public ObjectSet provide(final Object target, final Member member) { + return new ObjectSet(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java new file mode 100644 index 00000000..6e8fbd28 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java @@ -0,0 +1,156 @@ +package com.github.czyzby.lml.uedi.i18n; + +import java.lang.reflect.Member; +import java.util.Locale; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.I18NBundle; +import com.badlogic.gdx.utils.ObjectMap; +import com.badlogic.gdx.utils.ObjectMap.Entry; +import com.github.czyzby.kiwi.util.common.Exceptions; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.kiwi.util.gdx.collection.lazy.LazyObjectMap; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.uedi.assets.Loaded; +import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; +import com.github.czyzby.lml.uedi.i18n.impl.BundleInjection; +import com.github.czyzby.lml.uedi.i18n.impl.EagerI18NBundleLoader.EagerI18NBundleParameter; +import com.github.czyzby.uedi.reflection.impl.FieldMember; + +/** Provides {@link I18NBundle} instances. Automatically adds bundles to {@link LmlParser}. + * + * @author MJ */ +public class I18NBundleProvider extends AbstractAssetProvider { + public static final String[] EXTENSIONS = new String[] { "" }; + private final ObjectMap bundles = GdxMaps.newObjectMap(); + private final ObjectMap> bundlesData = LazyObjectMap.newMapOfArrays(); + private LocalePreference localePreference; + private LmlParser parser; + private String encoding = "UTF-8"; + + /** @param assetManager will be used to load the textures. */ + public I18NBundleProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + /** @param localePreference will be used to determine current {@link Locale}. */ + public void setLocalePreference(final LocalePreference localePreference) { + this.localePreference = localePreference; + } + + /** @return preference used to determine current {@link Locale}. */ + public LocalePreference getLocalePreference() { + return localePreference; + } + + @Override + public I18NBundle provide(final Object target, final Member member) { + if (member == null) { + throwUnknownPathException(); + } + final String id = member.getName(); + if (id.isEmpty()) { + throwUnknownPathException(); + } + final I18NBundle asset = getOrLoad(id); + if (member instanceof FieldMember) { + final BundleInjection injection = new BundleInjection(determinePath(id), ((FieldMember) member).getField(), + target); + if (target instanceof Loaded) { + ((Loaded) target).onLoad(determinePath(id), I18NBundle.class, asset); + } + bundlesData.get(id).add(injection); + } + return asset; + } + + @Override + public Class getType() { + return I18NBundle.class; + } + + @Override + public I18NBundle getOrLoad(final String id) { + if (bundles.containsKey(id)) { + return bundles.get(id); + } + final String path = determinePath(id); + final I18NBundle bundle = I18NBundle.createBundle(Gdx.files.internal(path), localePreference.getLocale(), + encoding); + bundles.put(id, bundle); + final EagerI18NBundleParameter parameters = new EagerI18NBundleParameter(bundle); + getAssetManager().load(path, I18NBundle.class, parameters); + return bundle; + } + + /** @return encoding used to read {@link I18NBundle} files. Defaults to UTF-8. */ + public String getEncoding() { + return encoding; + } + + /** @param encoding will be used to read {@link I18NBundle} files. */ + public void setEncoding(final String encoding) { + this.encoding = encoding; + } + + @Override + protected String getFileName(final String folder, final String id) { + final StringBuilder builder = new StringBuilder(folder.length() + 1 + id.length()); + builder.append(folder); + builder.append('/'); + builder.append(id); + Strings.replace(builder, '_', '/'); + return builder.toString(); // No extension, no dot required. + } + + /** Should be called after bundles are loaded. + * + * @param parser will have the bundles attached in its parsing data. Will be updated on bundle reloads. */ + public void fill(final LmlParser parser) { + this.parser = parser; + for (final Entry bundle : bundles) { + parser.getData().addI18nBundle(bundle.key, bundle.value); + } + } + + /** Reloads all managed {@link I18NBundle} instances according to the current state of {@link LocalePreference}. */ + public void reloadBundles() { + reloadBundles(localePreference.getLocale()); + } + + /** @param locale will be used to reload all managed {@link I18NBundle} instances. */ + public void reloadBundles(final Locale locale) { + final AssetManager assetManager = getAssetManager(); + for (final String id : bundles.keys()) { + final String path = determinePath(id); + try { + assetManager.unload(path); + } catch (final Exception exception) { + Exceptions.ignore(exception); // Asset not loaded. Somewhat expected. + } + final I18NBundle bundle = I18NBundle.createBundle(Gdx.files.internal(path), locale, encoding); + bundles.put(id, bundle); + final EagerI18NBundleParameter parameters = new EagerI18NBundleParameter(bundle); + assetManager.load(path, I18NBundle.class, parameters); + assetManager.finishLoadingAsset(path); + for (final BundleInjection injection : bundlesData.get(id)) { + injection.inject(bundle); + } + parser.getData().addI18nBundle(id, bundle); + } + } + + @Override + protected String getFolder() { + return "i18n"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java new file mode 100644 index 00000000..80b3b71e --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java @@ -0,0 +1,119 @@ +package com.github.czyzby.lml.uedi.i18n; + +import java.lang.reflect.Member; +import java.util.Locale; + +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.lml.uedi.preferences.AbstractPreference; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Manages application's locale preference. Reloads i18n bundles on preference change. + * + * @author MJ */ +public class LocalePreference extends AbstractPreference implements Provider { + private final I18NBundleProvider i18nBundleProvider; + private Locale locale; + + /** Constructs locale preference with the default preferences object. + * + * @param i18nBundleProvider will be used to reload i18n bundles on locale change. */ + public LocalePreference(final I18NBundleProvider i18nBundleProvider) { + super(ApplicationPreferences.getPreferences()); + locale = fromString(getValue()); + this.i18nBundleProvider = i18nBundleProvider; + } + + @Override + public String getKey() { + return "locale"; + } + + @Override + public String getDefault() { + return "en"; + } + + @Override + public Class getType() { + return Locale.class; + } + + @Override + public Locale provide(final Object target, final Member member) { + return locale; + } + + @Override + public String setValue(final String value) { + final String previous = super.setValue(Strings.isEmpty(value) ? getDefault() : value); + if (!Strings.equals(previous, value)) { + setLocale(fromString(value)); + } + return previous; + } + + /** Reloads {@link com.badlogic.gdx.utils.I18NBundle i18n bundles} managed by the application if the locale changed. + * + * @param locale will become current locale. */ + public void setLocale(final Locale locale) { + if (!equals(this.locale, locale)) { + this.locale = locale; + i18nBundleProvider.reloadBundles(locale); + } + } + + /** @return current locale used by the {@link com.badlogic.gdx.utils.I18NBundle i18n bundles}. */ + public Locale getLocale() { + return locale; + } + + /** @param locale will be checked. + * @return true if the passed locale is current application's locale. */ + public boolean isCurrent(final Locale locale) { + return equals(this.locale, locale); + } + + /** A safe, cross-platform way of converting serialized locale string to {@link Locale} instance. Matches + * {@link #toString(Locale)} serialization implementation. + * + * @param locale locale converted to string. + * @return {@link Locale} stored the deserialized data. */ + public static Locale fromString(final String locale) { + final String[] data = Strings.split(locale, '_'); + if (data.length == 1) { + return new Locale(data[0]); + } else if (data.length == 2) { + return new Locale(data[0], data[1]); + } else if (data.length == 3) { + return new Locale(data[0], data[1], data[2]); + } + throw new IllegalArgumentException("Invalid locale string: " + locale); + } + + /** A safe, cross-platform way of converting {@link Locale} to string. Matches {@link #fromString(String)} + * deserialization implementation. + * + * @param locale will be serialized to string. + * @return passed locale serialized as string using '_' to separate locale parts. */ + public static String toString(final Locale locale) { + // String language, String country, String variant + if (Strings.isEmpty(locale.getCountry())) { + return locale.getLanguage(); + } else if (Strings.isEmpty(locale.getVariant())) { + return locale.getLanguage() + '_' + locale.getCountry(); + } + return locale.getLanguage() + '_' + locale.getCountry() + "_" + locale.getVariant(); + } + + /** Safe cross-platform way of comparing locales. + * + * @param localeA will be compared. + * @param localeB will be compared. + * @return true if the passed locales are the same object or represent the same locale. */ + public static boolean equals(final Locale localeA, final Locale localeB) { + return localeA == localeB || Strings.equals(localeA.getLanguage(), localeB.getLanguage()) + && Strings.equals(localeA.getCountry(), localeB.getCountry()) + && Strings.equals(localeA.getVariant(), localeB.getVariant()); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/BundleInjection.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/BundleInjection.java new file mode 100644 index 00000000..c639e9da --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/BundleInjection.java @@ -0,0 +1,17 @@ +package com.github.czyzby.lml.uedi.i18n.impl; + +import com.badlogic.gdx.utils.I18NBundle; +import com.badlogic.gdx.utils.reflect.Field; +import com.github.czyzby.lml.uedi.assets.impl.AssetInjection; + +/** Contains necessary data to inject a {@link I18NBundle} into a field. + * + * @author MJ */ +public class BundleInjection extends AssetInjection { + /** @param path path to the bundle. + * @param field reference to the field that needs to be filled. + * @param owner instance of the class containing the field. */ + public BundleInjection(final String path, final Field field, final Object owner) { + super(path, I18NBundle.class, field, owner); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/EagerI18NBundleLoader.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/EagerI18NBundleLoader.java new file mode 100644 index 00000000..27669cef --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/impl/EagerI18NBundleLoader.java @@ -0,0 +1,100 @@ +package com.github.czyzby.lml.uedi.i18n.impl; + +import java.util.Locale; + +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.AsynchronousAssetLoader; +import com.badlogic.gdx.assets.loaders.FileHandleResolver; +import com.badlogic.gdx.assets.loaders.I18NBundleLoader; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.I18NBundle; +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; + +/** Allows to eagerly load {@link I18NBundle} instances. Thread-safe and prepared to load multiple bundles at once, + * contrary to the default loader. + * + * @author MJ + * @see com.badlogic.gdx.assets.loaders.I18NBundleLoader */ +public class EagerI18NBundleLoader extends AsynchronousAssetLoader { + private final ObjectMap bundles = GdxMaps.newObjectMap(); + + /** @param resolver will be used to load bundle files. */ + public EagerI18NBundleLoader(final FileHandleResolver resolver) { + super(resolver); + } + + @Override + public void loadAsync(final AssetManager manager, final String fileName, final FileHandle file, + final I18NBundleLoader.I18NBundleParameter parameter) { + I18NBundle bundle; + if (parameter instanceof EagerI18NBundleParameter && ((EagerI18NBundleParameter) parameter).bundle != null) { + return; + } else if (parameter.encoding == null) { + bundle = I18NBundle.createBundle(file, parameter.locale); + } else { + bundle = I18NBundle.createBundle(file, parameter.locale, parameter.encoding); + } + synchronized (bundles) { + bundles.put(fileName, bundle); + } + } + + @Override + public I18NBundle loadSync(final AssetManager manager, final String fileName, final FileHandle file, + final I18NBundleLoader.I18NBundleParameter parameter) { + if (parameter instanceof EagerI18NBundleParameter && ((EagerI18NBundleParameter) parameter).bundle != null) { + return ((EagerI18NBundleParameter) parameter).bundle; + } + final I18NBundle bundle; + synchronized (bundles) { + bundle = bundles.remove(fileName); + } + return bundle; + } + + @Override + @SuppressWarnings("rawtypes") // Raw types due to ugly API. + public Array getDependencies(final String fileName, final FileHandle file, + final I18NBundleLoader.I18NBundleParameter parameter) { + return null; + } + + /** See {@link com.badlogic.gdx.assets.loaders.I18NBundleLoader.I18NBundleParameter}. + * + * @author davebaol + * @author MJ */ + public static class EagerI18NBundleParameter + extends com.badlogic.gdx.assets.loaders.I18NBundleLoader.I18NBundleParameter { + private final I18NBundle bundle; + + /** Loads the bundle with default locale and encoding. */ + public EagerI18NBundleParameter() { + this(null, null); + } + + /** @param locale determines bundle locale. */ + public EagerI18NBundleParameter(final Locale locale) { + this(locale, null); + } + + /** @param locale determines bundle locale. + * @param encoding determines how files are loaded. */ + public EagerI18NBundleParameter(final Locale locale, final String encoding) { + this(locale == null ? Locale.getDefault() : locale, encoding, null); + } + + /** @param bundle eagerly loaded. Will be immediately returned by the loader. Allows to have a managed bundle + * without actually loading it asynchronously with an asset manager. */ + public EagerI18NBundleParameter(final I18NBundle bundle) { + this(null, null, bundle); + } + + private EagerI18NBundleParameter(final Locale locale, final String encoding, final I18NBundle bundle) { + super(locale, encoding); + this.bundle = bundle; + } + } +} \ No newline at end of file diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/impl/LmlContext.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/impl/LmlContext.java new file mode 100644 index 00000000..5e92af59 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/impl/LmlContext.java @@ -0,0 +1,52 @@ +package com.github.czyzby.lml.uedi.impl; + +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.reflect.Field; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.lml.annotation.LmlActor; +import com.github.czyzby.lml.parser.impl.AbstractLmlView; +import com.github.czyzby.lml.uedi.LmlApplication; +import com.github.czyzby.lml.uedi.preferences.PreferenceProvider; +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.uedi.impl.DefaultContext; +import com.github.czyzby.uedi.scanner.ClassScanner; +import com.github.czyzby.uedi.stereotype.Initiated; +import com.github.czyzby.uedi.stereotype.impl.StringProvider; + +/** Extends LibGDX {@link com.github.czyzby.uedi.Context context} implementation with LML-specific utilities. + * + * @author MJ */ +public class LmlContext extends DefaultContext { + private final LmlApplication applicationListener; + + /** @param applicationListener constructed the context. + * @param classScanner should be specific to the current platform. */ + public LmlContext(final LmlApplication applicationListener, final ClassScanner classScanner) { + super(classScanner); + this.applicationListener = applicationListener; + } + + @Override + protected boolean isInjectable(final Field field, final Object component) throws Exception { + return super.isInjectable(field, component) && !field.isAnnotationPresent(LmlActor.class); + } + + @Override + protected StringProvider getPropertyProvider() { + return new PreferenceProvider(ApplicationPreferences.getPreferences()); + } + + @Override + @SuppressWarnings("unchecked") + protected void processScannedComponent(final Object component, final Array componentsToInitiate) { + super.processScannedComponent(component, componentsToInitiate); + if (component instanceof View) { + final View view = (View) component; + applicationListener.addClassAlias(view.getViewId(), + (Class) component.getClass()); + if (view.isFirst()) { + applicationListener.forceCurrentView(view); + } + } + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/logger/LoggerProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/logger/LoggerProvider.java new file mode 100644 index 00000000..22a766b8 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/logger/LoggerProvider.java @@ -0,0 +1,43 @@ +package com.github.czyzby.lml.uedi.logger; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.Gdx; +import com.github.czyzby.kiwi.log.Logger; +import com.github.czyzby.kiwi.log.LoggerService; +import com.github.czyzby.uedi.reflection.impl.ConstructorMember; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link Logger} instances aware of the class of component that they are injected into. Supports both field + * and constructor injection. Logging utility. + * + * @author MJ */ +public class LoggerProvider implements Provider { + @Override + public Class getType() { + return Logger.class; + } + + @Override + public Logger provide(final Object target, final Member member) { + if (target != null) { + return getLogger(target.getClass()); + } else if (member instanceof ConstructorMember) { // Extracting component class from constructor: + final ConstructorMember constructor = (ConstructorMember) member; + return getLogger(constructor.getConstructor().getDeclaringClass()); + } + return getGlobalLogger(); + } + + /** @return {@link Logger} assigned to the current application listener implementation. Can be treated as global + * logger. */ + public Logger getGlobalLogger() { + return getLogger(Gdx.app.getApplicationListener().getClass()); + } + + /** @param forClass will be included in the logs. + * @return a {@link Logger} instance unique to the selected class. */ + public Logger getLogger(final Class forClass) { + return LoggerService.forClass(forClass); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java new file mode 100644 index 00000000..42edce51 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java @@ -0,0 +1,8 @@ +package com.github.czyzby.lml.uedi.music; + +import com.github.czyzby.uedi.stereotype.Singleton; + +// TODO implement music service and preferences. +public class MusicService implements Singleton { + +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/VolumeAction.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/VolumeAction.java new file mode 100644 index 00000000..27e3026b --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/VolumeAction.java @@ -0,0 +1,113 @@ +package com.github.czyzby.lml.uedi.music; + +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.math.Interpolation; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.actions.TemporalAction; + +/** Allows to easily handle {@link Music} volume transitions. + * + * @author MJ */ +public class VolumeAction extends TemporalAction { + private float start, end; + private Music music; + + @Override + protected void begin() { + music.setVolume(start); + } + + @Override + protected void update(final float percent) { + music.setVolume(start + (end - start) * percent); + } + + @Override + protected void end() { + music.setVolume(end); + music = null; + } + + @Override + public void reset() { + super.reset(); + music = null; + } + + /** @return managed {@link Music} instance. */ + public Music getMusic() { + return music; + } + + /** @param music managed {@link Music} instance. */ + public void setMusic(final Music music) { + this.music = music; + } + + /** @return initial volume. */ + public float getStart() { + return start; + } + + /** @param start initial volume. */ + public void setStart(final float start) { + this.start = start; + } + + /** @return target volume. */ + public float getEnd() { + return end; + } + + /** @param end target volume. */ + public void setEnd(final float end) { + this.end = end; + } + + /** @param music its volume will go from 0 to 1. + * @param duration length of the transition. + * @return {@link VolumeAction} which should be added to a stage. */ + public static VolumeAction fadeIn(final Music music, final float duration) { + return fadeIn(music, duration, Interpolation.fade); + } + + /** @param music its volume will go from 0 to 1. + * @param duration length of the transition. + * @param interpolation handles how the volume is changed in time. + * @return {@link VolumeAction} which should be added to a stage. */ + public static VolumeAction fadeIn(final Music music, final float duration, final Interpolation interpolation) { + return setVolume(music, 0f, 1f, duration, interpolation); + } + + /** @param music its volume will go from current value to 0. + * @param duration length of the transition. + * @return {@link VolumeAction} which should be added to a stage. */ + public static VolumeAction fadeOut(final Music music, final float duration) { + return fadeOut(music, duration, Interpolation.fade); + } + + /** @param music its volume will go from current value to 0. + * @param duration length of the transition. + * @param interpolation handles how the volume is changed in time. + * @return {@link VolumeAction} which should be added to a stage. */ + public static VolumeAction fadeOut(final Music music, final float duration, final Interpolation interpolation) { + return setVolume(music, music.getVolume(), 0f, duration, interpolation); + } + + /** @param music its volume will be modified. + * @param from starting volume value. + * @param to target volume value. + * @param duration length of the transition. + * @param interpolation decides how the volume is changed in time. + * @return {@link VolumeAction} instance which should be added to a stage. */ + public static VolumeAction setVolume(final Music music, final float from, final float to, final float duration, + final Interpolation interpolation) { + final VolumeAction action = Actions.action(VolumeAction.class); + action.start = from; + action.end = to; + action.music = music; + action.setDuration(duration); + action.setInterpolation(interpolation); + return action; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/AbstractPreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/AbstractPreference.java new file mode 100644 index 00000000..f2646dab --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/AbstractPreference.java @@ -0,0 +1,42 @@ +package com.github.czyzby.lml.uedi.preferences; + +import com.badlogic.gdx.Preferences; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.uedi.stereotype.Property; + +/** Simple base for properties maintained by {@link Preferences}. + * + * @author MJ */ +public abstract class AbstractPreference implements Property { + private final Preferences preferences; + + /** Constructs a new preference using the default application's {@link Preferences}. */ + public AbstractPreference() { + this(ApplicationPreferences.getPreferences()); + } + + /** @param preferences will be used to extract and save the preference. */ + public AbstractPreference(final Preferences preferences) { + this.preferences = preferences; + } + + @Override + public String getValue() { + return preferences.getString(getKey(), getDefault()); + } + + @Override + public String setValue(final String value) { + final String previous = getValue(); + preferences.putString(getKey(), value); + return previous; + } + + /** @return default preference value. */ + public abstract String getDefault(); + + /** Forces flushing of the preferences. */ + public void save() { + preferences.flush(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java new file mode 100644 index 00000000..f6fb512e --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java @@ -0,0 +1,52 @@ +package com.github.czyzby.lml.uedi.preferences; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.Preferences; +import com.github.czyzby.uedi.stereotype.Property; +import com.github.czyzby.uedi.stereotype.impl.PropertyProvider; + +/** Default {@link String} provider. Stores and retrieves preferences from {@link Preferences} object specific to each + * platform. + * + * @author MJ */ +public class PreferenceProvider extends PropertyProvider { + private final Preferences preferences; + + /** @param preferences will be used to store the properties. */ + public PreferenceProvider(final Preferences preferences) { + this.preferences = preferences; + } + + @Override + public String provide(final Object target, final Member member) { + final String property = super.provide(target, member); + return property == null ? preferences.getString(member.getName(), null) : property; + } + + @Override + public boolean hasProperty(final String key) { + return super.hasProperty(key) || preferences.contains(key); + } + + @Override + public Property getProperty(final String key) { + final Property property = super.getProperty(key); + return property != null ? property : new AbstractPreference() { + @Override + public String getDefault() { + return null; + } + + @Override + public String getKey() { + return key; + } + }; + } + + /** Saves all currently stored preferences. */ + public void save() { + preferences.flush(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferencesProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferencesProvider.java new file mode 100644 index 00000000..ec2eedf1 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferencesProvider.java @@ -0,0 +1,35 @@ +package com.github.czyzby.lml.uedi.preferences; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.Preferences; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link Preferences} instances. + * + * @author MJ */ +public class PreferencesProvider implements Provider { + @Override + public Class getType() { + return Preferences.class; + } + + @Override + public Preferences provide(final Object target, final Member member) { + return member == null || Strings.isEmpty(member.getName()) ? getPreferences() + : getPreferences(member.getName()); + } + + /** @return the default {@link Preferences} instance. */ + public Preferences getPreferences() { + return ApplicationPreferences.getPreferences(); + } + + /** @param path unique ID of the preferences. + * @return {@link Preferences} instance with the selected path. */ + public Preferences getPreferences(final String path) { + return ApplicationPreferences.getPreferences(path); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/BatchProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/BatchProvider.java new file mode 100644 index 00000000..854956a1 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/BatchProvider.java @@ -0,0 +1,38 @@ +package com.github.czyzby.lml.uedi.ui; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Provides {@link Batch} instance. + * + * @author MJ */ +public class BatchProvider implements Provider { + private final BatchProvider delegate; + + protected BatchProvider() { + delegate = null; + } + + /** @param delegate will be used to provide {@link Batch} instance. Workaround to map an interface in the + * context. */ + public BatchProvider(final BatchProvider delegate) { + this.delegate = delegate; + } + + @Override + public Class getType() { + return Batch.class; + } + + @Override + public Batch provide(final Object target, final Member member) { + return delegate.provide(target, member); + } + + /** @return application's only {@link Batch} instance. */ + public Batch getBatch() { + return delegate.getBatch(); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SkinProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SkinProvider.java new file mode 100644 index 00000000..00cd8485 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SkinProvider.java @@ -0,0 +1,48 @@ +package com.github.czyzby.lml.uedi.ui; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.github.czyzby.lml.uedi.assets.TextureAtlasProvider; +import com.github.czyzby.lml.uedi.assets.impl.AbstractEagerAssetProvider; +import com.github.czyzby.lml.uedi.assets.impl.EagerTextureAtlasLoader; +import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; +import com.github.czyzby.lml.uedi.ui.impl.EagerSkinLoader; + +/** Provides {@link Skin} instances. + * + * @author MJ */ +public class SkinProvider extends AbstractEagerAssetProvider { + public static final String[] EXTENSIONS = new String[] { "json" }; + + /** @param assetManager will be used to load the assets. */ + public SkinProvider(final InjectingAssetManager assetManager) { + super(assetManager); + } + + @Override + public Class getType() { + return Skin.class; + } + + @Override + protected String getFolder() { + return "skin"; + } + + @Override + protected String[] getExtensions() { + return EXTENSIONS; + } + + @Override + protected Skin load(final String id, final String path, final AssetManager assetManager) { + final String atlasPath = TextureAtlasProvider.getTextureAtlasPath(id); + final TextureAtlas atlas = new TextureAtlas(atlasPath); + assetManager.load(atlasPath, TextureAtlas.class, new EagerTextureAtlasLoader.EagerTextureAtlasParameter(atlas)); + final Skin skin = new Skin(Gdx.files.internal(path), atlas); + assetManager.load(path, Skin.class, new EagerSkinLoader.EagerSkinParameter(skin)); + return skin; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SpriteBatchProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SpriteBatchProvider.java new file mode 100644 index 00000000..f8e47cb1 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/SpriteBatchProvider.java @@ -0,0 +1,45 @@ +package com.github.czyzby.lml.uedi.ui; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.github.czyzby.kiwi.util.gdx.asset.Disposables; +import com.github.czyzby.uedi.stereotype.Destructible; + +/** Manages and provides a single {@link SpriteBatch} instance. + * + * @author MJ */ +public class SpriteBatchProvider extends BatchProvider implements Destructible { + private final SpriteBatch batch = new SpriteBatch(); + + @Override + public Class getType() { + return SpriteBatch.class; + } + + @Override + public Batch provide(final Object target, final Member member) { + return batch; + } + + @Override + public Batch getBatch() { + return batch; + } + + /** @return application's only {@link SpriteBatch} instance. */ + public SpriteBatch getSpriteBatch() { + return batch; + } + + @Override + public int getDestructionOrder() { + return 0; + } + + @Override + public void destroy() { + Disposables.gracefullyDisposeOf(batch); + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/StageProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/StageProvider.java new file mode 100644 index 00000000..39bd5493 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/StageProvider.java @@ -0,0 +1,38 @@ +package com.github.czyzby.lml.uedi.ui; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.github.czyzby.kiwi.util.gdx.GdxUtilities; +import com.github.czyzby.kiwi.util.gdx.viewport.LetterboxingViewport; +import com.github.czyzby.uedi.stereotype.Provider; + +/** Manages and provides a single {@link Stage} instance (dedicated to GUI). + * + * @author MJ */ +public class StageProvider implements Provider { + private final Stage stage; + + /** @param batch will be used to draw the GUI. */ + public StageProvider(final Batch batch) { + stage = new Stage(new LetterboxingViewport(GdxUtilities.isMobile() ? 160f : 96f, + Gdx.graphics.getWidth() / (float) Gdx.graphics.getHeight()), batch); + } + + @Override + public Class getType() { + return Stage.class; + } + + @Override + public Stage provide(final Object target, final Member member) { + return stage; + } + + /** @return the only {@link Stage} instance dedicated to GUI. */ + public Stage getStage() { + return stage; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/impl/EagerSkinLoader.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/impl/EagerSkinLoader.java new file mode 100644 index 00000000..831484bc --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/ui/impl/EagerSkinLoader.java @@ -0,0 +1,53 @@ +package com.github.czyzby.lml.uedi.ui.impl; + +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.FileHandleResolver; +import com.badlogic.gdx.assets.loaders.SkinLoader; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.utils.Array; + +/** Allows to pass an eagerly constructed {@link Skin} instance to an asset manager. + * + * @author MJ */ +public class EagerSkinLoader extends SkinLoader { + /** @param resolver will be used to resolve skin files. */ + public EagerSkinLoader(final FileHandleResolver resolver) { + super(resolver); + } + + @Override + @SuppressWarnings("rawtypes") // Raw types due to ugly API. + public Array getDependencies(final String fileName, final FileHandle file, + final SkinParameter parameter) { + if (parameter instanceof EagerSkinParameter && ((EagerSkinParameter) parameter).skin != null) { + return null; + } + return super.getDependencies(fileName, file, parameter); + } + + @Override + public Skin loadSync(final AssetManager manager, final String fileName, final FileHandle file, + final SkinParameter parameter) { + if (parameter instanceof EagerSkinParameter) { + final Skin skin = ((EagerSkinParameter) parameter).skin; + if (skin != null) { + return skin; + } + } + return super.loadSync(manager, fileName, file, parameter); + } + + /** Allows to pass eagerly loaded skin into the asset manager. + * + * @author MJ */ + public static class EagerSkinParameter extends SkinLoader.SkinParameter { + private final Skin skin; + + /** @param skin was eagerly loaded, but should still be managed by an asset manager. */ + public EagerSkinParameter(final Skin skin) { + this.skin = skin; + } + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java new file mode 100644 index 00000000..7194d794 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java @@ -0,0 +1,82 @@ +package com.github.czyzby.lml.uedi.views; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.Array; +import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; +import com.github.czyzby.lml.parser.impl.AbstractLmlView; +import com.github.czyzby.lml.util.LmlUtilities; +import com.github.czyzby.uedi.stereotype.Named; + +/** Abstract base for LML views managed by UEDI. The views should also implement + * {@link com.github.czyzby.uedi.stereotype.Singleton Singleton} interface if you want them to be found by the class + * scanner. + * + *

+ * Note that this view's {@link Stage} will be cleared during LML template parsing. Instead, parsed actors will be added + * using {@link #addActors(Array)} method and appended to a shared application's stage once the view is shown. You can + * still inject a stage instance to one of the fields to get a reference to the global stage, but be aware that it will + * be shared among all views. + * + * @author MJ */ +public abstract class View extends AbstractLmlView implements Named { + private final Array actors = GdxArrays.newArray(); + + /** Creates a new empty {@link View}. */ + public View() { + super(null); + } + + @Override + public FileHandle getTemplateFile() { + return Gdx.files.internal(getPath()); + } + + /** @return path to the LML template file. */ + protected abstract String getPath(); + + @Override + public String getName() { + return getViewId(); + } + + /** Override this method and return {@code true} if this view should be displayed first. Usually the first view + * would inject the {@link com.badlogic.gdx.assets.AssetManager AssetManager} and update it until all assets are + * loaded. + * + * @return true if the view should be displayed first. */ + public boolean isFirst() { + return false; + } + + /** @param actor will be added to the view's root actors. Might be cleared during locale change. */ + public void addActor(final Actor actor) { + actors.add(actor); + } + + /** @return direct reference to collection storing all current root actors of the view. */ + public Array getActors() { + return actors; + } + + /** Removes all root actors managed by the view. */ + public void clearActors() { + actors.clear(); + } + + /** @param actors will be added to the view's root actors. Might be cleared during locale change. */ + public void addActors(final Array actors) { + this.actors.addAll(actors); + } + + /** Invoked after previous view is hidden and this view is about to show. Might be called when the view is being + * reloaded. Clears previous stage actors and adds managed actor to stage. If overridden, call super. */ + @Override + public void show() { + final Stage stage = getStage(); + stage.getRoot().clearChildren(); + LmlUtilities.appendActorsToStage(stage, actors); + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/util/LmlApplicationListener.java b/lml/src/main/java/com/github/czyzby/lml/util/LmlApplicationListener.java index 2d54cdb0..e17081d0 100644 --- a/lml/src/main/java/com/github/czyzby/lml/util/LmlApplicationListener.java +++ b/lml/src/main/java/com/github/czyzby/lml/util/LmlApplicationListener.java @@ -191,7 +191,8 @@ public Void consume(final Object actor) { @Override public Void consume(final Actor actor) { final String viewClassName = LmlUtilities.getActorId(actor); - final Class viewClass = LmlApplicationListener.this.getViewClass(viewClassName); + final Class viewClass = LmlApplicationListener.this + .getViewClass(viewClassName); setView(viewClass); return null; } @@ -387,7 +388,7 @@ protected AbstractLmlView getInstanceOf(final Class v * become the current view after view transition. * @see #setView(AbstractLmlView) */ public void setView(final Class viewClass) { - setView(getView(viewClass)); + setView(getView(viewClass), null); } /** @param view will be set as the current view after view transition. Current screen (if any exists) will receive a @@ -397,12 +398,25 @@ public void setView(final Class viewClass) { * @see #getViewShowingAction(AbstractLmlView) * @see #getViewHidingAction(AbstractLmlView) */ public void setView(final AbstractLmlView view) { - // Note that this method uses static imports of actions. + setView(view, null); + } + + /** @param view will be set as the current view after view transition. Current screen (if any exists) will receive a + * {@link AbstractLmlView#hide()} call. The new screen will be resized using + * {@link AbstractLmlView#resize(int, int, boolean)} and then will receive a + * {@link AbstractLmlView#show()} call. + * @param doAfterHide will be executed after the current view is fully hidden. Is never executed if there was no + * current view. + * @see #getViewShowingAction(AbstractLmlView) + * @see #getViewHidingAction(AbstractLmlView) */ + public void setView(final AbstractLmlView view, final Action doAfterHide) { if (currentView != null) { viewChangeRunnable.setView(view); currentView.hide(); - currentView.getStage() - .addAction(Actions.sequence(getViewHidingAction(currentView), Actions.run(viewChangeRunnable))); + final Action hideAction = doAfterHide == null + ? Actions.sequence(getViewHidingAction(currentView), Actions.run(viewChangeRunnable)) + : Actions.sequence(getViewHidingAction(currentView), doAfterHide, Actions.run(viewChangeRunnable)); + currentView.getStage().addAction(hideAction); } else { currentView = view; currentView.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), isCenteringCameraOnResize()); @@ -448,7 +462,7 @@ public void setView(final AbstractLmlView view) { @Override public void run() { currentView = null; - LmlApplicationListener.this.setView(view); + LmlApplicationListener.this.setView(view, null); } } -} +} \ No newline at end of file diff --git a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java index 98f05971..6cef6bd4 100644 --- a/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java +++ b/uedi/src/main/java/com/github/czyzby/uedi/stereotype/impl/PropertyProvider.java @@ -2,59 +2,25 @@ import java.lang.reflect.Member; -import com.badlogic.gdx.Preferences; import com.badlogic.gdx.utils.ObjectMap; -import com.github.czyzby.kiwi.util.common.Exceptions; import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; -import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; import com.github.czyzby.uedi.stereotype.Default; import com.github.czyzby.uedi.stereotype.Property; -/** Provides string properties using {@link Property} API. When property for the given string is not present, fallbacks - * to values from main application {@link Preferences}. +/** Provides string properties using {@link Property} API. * * @author MJ */ public class PropertyProvider implements Default, StringProvider { private final ObjectMap properties = GdxMaps.newObjectMap(); - private final Preferences preferences = getPreferences(); - - protected Preferences getPreferences() { - try { - return ApplicationPreferences.getPreferences(); - } catch (final Exception exception) { - Exceptions.ignore(exception); - return null; - } - } @Override public boolean hasProperty(final String key) { - return properties.containsKey(key) || preferences != null && preferences.contains(key); + return properties.containsKey(key); } @Override public Property getProperty(final String key) { - if (properties.containsKey(key)) { - return properties.get(key); - } - return new Property() { - @Override - public String setValue(final String value) { - final String previous = preferences.getString(key); - preferences.putString(key, value); - return previous; - } - - @Override - public String getValue() { - return preferences.getString(key); - } - - @Override - public String getKey() { - return key; - } - }; + return properties.get(key); } @Override @@ -73,6 +39,6 @@ public String provide(final Object target, final Member member) { if (properties.containsKey(key)) { return properties.get(key).getValue(); } - return preferences.getString(key, null); + return null; } } From eeeecf3b725b9cf50ba0b0919279fe85a91878ac Mon Sep 17 00:00:00 2001 From: MJ Date: Fri, 3 Jun 2016 21:42:34 +0200 Subject: [PATCH 05/58] Refactored tests. Added random macro. --- examples/gdx-lml-tests/README.md | 2 +- .../{core => }/assets/fonts/hack.fnt | 0 .../{core => }/assets/i18n/bundle.properties | 1 + .../{core => }/assets/i18n/custom.properties | 0 .../{core => }/assets/skin.atlas | 0 .../gdx-lml-tests/{core => }/assets/skin.json | 0 .../gdx-lml-tests/{core => }/assets/skin.png | Bin .../assets/templates/dialogs/error.lml | 0 .../assets/templates/examples/actions.lml | 0 .../assets/templates/examples/actor.lml | 0 .../assets/templates/examples/actorMacro.lml | 0 .../templates/examples/animatedImage.lml | 0 .../assets/templates/examples/anyNotNull.lml | 0 .../assets/templates/examples/argument.lml | 0 .../templates/examples/argumentReplace.lml | 0 .../assets/templates/examples/arguments.lml | 0 .../assets/templates/examples/arrays.lml | 0 .../assets/templates/examples/assign.lml | 0 .../assets/templates/examples/button.lml | 0 .../assets/templates/examples/buttonGroup.lml | 0 .../assets/templates/examples/calculate.lml | 0 .../templates/examples/changeListener.lml | 0 .../examples/changeListenerMacro.lml | 0 .../assets/templates/examples/checkBox.lml | 0 .../templates/examples/clickListener.lml | 0 .../templates/examples/clickListenerMacro.lml | 0 .../assets/templates/examples/comment.lml | 0 .../assets/templates/examples/conditional.lml | 0 .../assets/templates/examples/conditions.lml | 0 .../assets/templates/examples/container.lml | 0 .../templates/examples/customAttribute.lml | 0 .../assets/templates/examples/customMacro.lml | 0 .../assets/templates/examples/customTag.lml | 0 .../assets/templates/examples/dialog.lml | 0 .../assets/templates/examples/equations.lml | 0 .../assets/templates/examples/evaluate.lml | 0 .../assets/templates/examples/exception.lml | 0 .../assets/templates/examples/forEach.lml | 0 .../templates/examples/horizontalGroup.lml | 0 .../assets/templates/examples/i18n.lml | 0 .../assets/templates/examples/image.lml | 0 .../assets/templates/examples/imageButton.lml | 0 .../templates/examples/imageTextButton.lml | 0 .../assets/templates/examples/import.lml | 0 .../templates/examples/importExample.lml | 0 .../templates/examples/inputListener.lml | 0 .../templates/examples/inputListenerMacro.lml | 0 .../assets/templates/examples/isolate.lml | 0 .../assets/templates/examples/label.lml | 0 .../assets/templates/examples/list.lml | 0 .../assets/templates/examples/logger.lml | 0 .../assets/templates/examples/loop.lml | 0 .../assets/templates/examples/meta.lml | 0 .../templates/examples/nestedForEach.lml | 0 .../templates/examples/newAttribute.lml | 0 .../assets/templates/examples/newTag.lml | 0 .../assets/templates/examples/nullCheck.lml | 0 .../assets/templates/examples/preferences.lml | 0 .../assets/templates/examples/progressBar.lml | 0 .../assets/templates/examples/random.lml | 26 +++ .../assets/templates/examples/scrollPane.lml | 0 .../assets/templates/examples/selectBox.lml | 0 .../assets/templates/examples/slider.lml | 0 .../assets/templates/examples/splitPane.lml | 0 .../assets/templates/examples/stack.lml | 0 .../assets/templates/examples/table.lml | 0 .../assets/templates/examples/tableCell.lml | 0 .../assets/templates/examples/tableColumn.lml | 0 .../assets/templates/examples/tableRow.lml | 0 .../assets/templates/examples/textArea.lml | 0 .../assets/templates/examples/textButton.lml | 0 .../assets/templates/examples/textField.lml | 0 .../assets/templates/examples/tooltip.lml | 0 .../assets/templates/examples/touchpad.lml | 0 .../assets/templates/examples/tree.lml | 0 .../templates/examples/verticalGroup.lml | 0 .../assets/templates/examples/while.lml | 0 .../assets/templates/examples/window.lml | 0 .../{core => }/assets/templates/main.lml | 0 examples/gdx-lml-tests/build.gradle | 89 ++++------ examples/gdx-lml-tests/core/build.gradle | 13 +- .../com/github/czyzby/tests}/Main.gwt.xml | 0 .../java}/com/github/czyzby/tests/Main.java | 2 +- .../czyzby/tests/reflected/ButtonManager.java | 0 .../reflected/CustomActionContainer.java | 0 .../czyzby/tests/reflected/MainView.java | 0 .../reflected/widgets/BlinkingLabel.java | 0 examples/gdx-lml-tests/desktop/build.gradle | 57 ++---- .../czyzby/tests/desktop/DesktopLauncher.java | 0 examples/gdx-lml-tests/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53556 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + examples/gdx-lml-tests/gradlew | 164 ++++++++++++++++++ examples/gdx-lml-tests/gradlew.bat | 90 ++++++++++ examples/gdx-lml-tests/gwt/build.gradle | 73 ++++++++ .../github/czyzby/tests/GdxDefinition.gwt.xml | 2 +- .../tests/GdxDefinitionSuperdev.gwt.xml | 0 .../czyzby/tests/client/HtmlLauncher.java | 0 .../{html => gwt}/webapp/WEB-INF/web.xml | 0 .../gwt}/webapp/index.html | 2 +- .../{html => gwt}/webapp/refresh.png | Bin .../webapp/soundmanager2-jsmin.js | 0 .../webapp/soundmanager2-setup.js | 0 .../{html => gwt}/webapp/styles.css | 0 examples/gdx-lml-tests/html/build.gradle | 70 -------- .../{core => }/raw/check-off.png | Bin .../gdx-lml-tests/{core => }/raw/check-on.png | Bin .../gdx-lml-tests/{core => }/raw/cursor.png | Bin .../gdx-lml-tests/{core => }/raw/frame.9.png | Bin .../gdx-lml-tests/{core => }/raw/hack.png | Bin .../gdx-lml-tests/{core => }/raw/pack.json | 0 .../raw/progress-background-vertical.9.png | Bin .../{core => }/raw/progress-background.9.png | Bin .../raw/progress-knob-vertical.9.png | Bin .../{core => }/raw/progress-knob.9.png | Bin .../gdx-lml-tests/{core => }/raw/select.9.png | Bin examples/gdx-lml-tests/{core => }/raw/tip.png | Bin .../{core => }/raw/tree-minus.png | Bin .../{core => }/raw/tree-plus.png | Bin .../gdx-lml-tests/{core => }/raw/warn.png | Bin .../gdx-lml-tests/{core => }/raw/white.9.png | Bin .../gdx-lml-tests/{core => }/raw/window.9.png | Bin examples/gdx-lml-tests/settings.gradle | 2 +- .../{core => }/assets/fonts/hackFont.fnt | 0 .../{core => }/assets/fonts/hackFont.png | Bin .../{core => }/assets/i18n/bundle.properties | 1 + .../{core => }/assets/i18n/custom.properties | 0 .../assets/templates/dialogs/error.lml | 0 .../assets/templates/examples/actions.lml | 0 .../assets/templates/examples/actor.lml | 0 .../assets/templates/examples/actorMacro.lml | 0 .../templates/examples/animatedImage.lml | 0 .../assets/templates/examples/anyNotNull.lml | 0 .../assets/templates/examples/argument.lml | 0 .../templates/examples/argumentReplace.lml | 0 .../assets/templates/examples/arguments.lml | 0 .../assets/templates/examples/arrays.lml | 0 .../assets/templates/examples/assign.lml | 0 .../assets/templates/examples/button.lml | 0 .../assets/templates/examples/buttonGroup.lml | 0 .../assets/templates/examples/calculate.lml | 0 .../templates/examples/changeListener.lml | 0 .../examples/changeListenerMacro.lml | 0 .../assets/templates/examples/checkBox.lml | 0 .../templates/examples/clickListener.lml | 0 .../templates/examples/clickListenerMacro.lml | 0 .../assets/templates/examples/comment.lml | 0 .../assets/templates/examples/conditional.lml | 0 .../assets/templates/examples/conditions.lml | 0 .../assets/templates/examples/container.lml | 0 .../templates/examples/customAttribute.lml | 0 .../assets/templates/examples/customMacro.lml | 0 .../assets/templates/examples/customTag.lml | 0 .../assets/templates/examples/dialog.lml | 0 .../assets/templates/examples/equations.lml | 0 .../assets/templates/examples/evaluate.lml | 0 .../assets/templates/examples/exception.lml | 0 .../assets/templates/examples/forEach.lml | 0 .../templates/examples/horizontalGroup.lml | 0 .../assets/templates/examples/i18n.lml | 0 .../assets/templates/examples/image.lml | 0 .../assets/templates/examples/imageButton.lml | 0 .../templates/examples/imageTextButton.lml | 0 .../assets/templates/examples/import.lml | 0 .../templates/examples/importExample.lml | 0 .../templates/examples/inputListener.lml | 0 .../templates/examples/inputListenerMacro.lml | 0 .../assets/templates/examples/isolate.lml | 0 .../assets/templates/examples/label.lml | 0 .../assets/templates/examples/list.lml | 0 .../assets/templates/examples/logger.lml | 0 .../assets/templates/examples/loop.lml | 0 .../assets/templates/examples/meta.lml | 0 .../templates/examples/nestedForEach.lml | 0 .../templates/examples/newAttribute.lml | 0 .../assets/templates/examples/newTag.lml | 0 .../assets/templates/examples/nullCheck.lml | 0 .../assets/templates/examples/preferences.lml | 0 .../assets/templates/examples/progressBar.lml | 0 .../assets/templates/examples/random.lml | 26 +++ .../assets/templates/examples/scrollPane.lml | 0 .../assets/templates/examples/selectBox.lml | 0 .../assets/templates/examples/slider.lml | 0 .../assets/templates/examples/splitPane.lml | 0 .../assets/templates/examples/stack.lml | 0 .../assets/templates/examples/table.lml | 0 .../assets/templates/examples/tableCell.lml | 0 .../assets/templates/examples/tableColumn.lml | 0 .../assets/templates/examples/tableRow.lml | 0 .../assets/templates/examples/textArea.lml | 0 .../assets/templates/examples/textButton.lml | 0 .../assets/templates/examples/textField.lml | 0 .../assets/templates/examples/tooltip.lml | 0 .../assets/templates/examples/touchpad.lml | 0 .../assets/templates/examples/tree.lml | 0 .../templates/examples/verticalGroup.lml | 0 .../examples/vis/basicColorPicker.lml | 0 .../examples/vis/collapsibleWidget.lml | 0 .../templates/examples/vis/colorPicker.lml | 0 .../templates/examples/vis/dragPane.lml | 0 .../templates/examples/vis/draggable.lml | 0 .../examples/vis/fixedSizeGridGroup.lml | 0 .../templates/examples/vis/floatingGroup.lml | 0 .../templates/examples/vis/formValidator.lml | 0 .../templates/examples/vis/gridGroup.lml | 0 .../templates/examples/vis/horizontalFlow.lml | 0 .../templates/examples/vis/linkLabel.lml | 0 .../templates/examples/vis/listView.lml | 0 .../assets/templates/examples/vis/menu.lml | 0 .../templates/examples/vis/radioButton.lml | 0 .../templates/examples/vis/separator.lml | 0 .../assets/templates/examples/vis/spinner.lml | 0 .../templates/examples/vis/tabbedPane.lml | 0 .../assets/templates/examples/vis/toast.lml | 0 .../assets/templates/examples/vis/tooltip.lml | 0 .../examples/vis/validatableTextField.lml | 0 .../templates/examples/vis/verticalFlow.lml | 0 .../assets/templates/examples/while.lml | 0 .../assets/templates/examples/window.lml | 0 .../{core => }/assets/templates/main.lml | 0 examples/gdx-lml-vis-tests/build.gradle | 83 +++------ examples/gdx-lml-vis-tests/core/build.gradle | 13 +- .../com/github/czyzby/tests}/Main.gwt.xml | 0 .../java}/com/github/czyzby/tests/Main.java | 2 +- .../czyzby/tests/reflected/ButtonManager.java | 0 .../reflected/CustomActionContainer.java | 0 .../czyzby/tests/reflected/MainView.java | 0 .../reflected/widgets/BlinkingLabel.java | 0 .../tests/reflected/widgets/CodeTextArea.java | 0 .../gdx-lml-vis-tests/desktop/build.gradle | 57 ++---- .../czyzby/tests/desktop/DesktopLauncher.java | 0 examples/gdx-lml-vis-tests/gradle.properties | 1 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53556 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + examples/gdx-lml-vis-tests/gradlew | 164 ++++++++++++++++++ examples/gdx-lml-vis-tests/gradlew.bat | 90 ++++++++++ examples/gdx-lml-vis-tests/gwt/build.gradle | 75 ++++++++ .../github/czyzby/tests/GdxDefinition.gwt.xml | 4 +- .../tests/GdxDefinitionSuperdev.gwt.xml | 0 .../czyzby/tests/client/HtmlLauncher.java | 0 .../{html => gwt}/webapp/WEB-INF/web.xml | 0 .../gwt}/webapp/index.html | 2 +- .../{html => gwt}/webapp/refresh.png | Bin .../webapp/soundmanager2-jsmin.js | 0 .../webapp/soundmanager2-setup.js | 0 .../{html => gwt}/webapp/styles.css | 0 examples/gdx-lml-vis-tests/html/build.gradle | 70 -------- examples/gdx-lml-vis-tests/settings.gradle | 2 +- .../czyzby/lml/uedi/LmlApplication.java | 2 +- lml/README.md | 4 + .../lml/parser/impl/DefaultLmlSyntax.java | 2 + .../impl/tag/macro/AssignLmlMacroTag.java | 19 +- .../impl/tag/macro/RandomLmlMacroTag.java | 119 +++++++++++++ .../provider/RandomLmlMacroTagProvider.java | 16 ++ 254 files changed, 995 insertions(+), 361 deletions(-) rename examples/gdx-lml-tests/{core => }/assets/fonts/hack.fnt (100%) rename examples/gdx-lml-tests/{core => }/assets/i18n/bundle.properties (99%) rename examples/gdx-lml-tests/{core => }/assets/i18n/custom.properties (100%) rename examples/gdx-lml-tests/{core => }/assets/skin.atlas (100%) rename examples/gdx-lml-tests/{core => }/assets/skin.json (100%) rename examples/gdx-lml-tests/{core => }/assets/skin.png (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/dialogs/error.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/actions.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/actor.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/actorMacro.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/animatedImage.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/anyNotNull.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/argument.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/argumentReplace.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/arguments.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/arrays.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/assign.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/button.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/buttonGroup.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/calculate.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/changeListener.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/changeListenerMacro.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/checkBox.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/clickListener.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/clickListenerMacro.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/comment.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/conditional.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/conditions.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/container.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/customAttribute.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/customMacro.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/customTag.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/dialog.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/equations.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/evaluate.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/exception.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/forEach.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/horizontalGroup.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/i18n.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/image.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/imageButton.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/imageTextButton.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/import.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/importExample.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/inputListener.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/inputListenerMacro.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/isolate.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/label.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/list.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/logger.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/loop.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/meta.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/nestedForEach.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/newAttribute.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/newTag.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/nullCheck.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/preferences.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/progressBar.lml (100%) create mode 100644 examples/gdx-lml-tests/assets/templates/examples/random.lml rename examples/gdx-lml-tests/{core => }/assets/templates/examples/scrollPane.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/selectBox.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/slider.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/splitPane.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/stack.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/table.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/tableCell.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/tableColumn.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/tableRow.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/textArea.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/textButton.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/textField.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/tooltip.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/touchpad.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/tree.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/verticalGroup.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/while.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/examples/window.lml (100%) rename examples/gdx-lml-tests/{core => }/assets/templates/main.lml (100%) rename examples/gdx-lml-tests/core/src/{ => main/java/com/github/czyzby/tests}/Main.gwt.xml (100%) rename examples/gdx-lml-tests/core/src/{ => main/java}/com/github/czyzby/tests/Main.java (99%) rename examples/gdx-lml-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/ButtonManager.java (100%) rename examples/gdx-lml-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/CustomActionContainer.java (100%) rename examples/gdx-lml-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/MainView.java (100%) rename examples/gdx-lml-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java (100%) rename examples/gdx-lml-tests/desktop/src/{ => main/java}/com/github/czyzby/tests/desktop/DesktopLauncher.java (100%) create mode 100644 examples/gdx-lml-tests/gradle/wrapper/gradle-wrapper.jar create mode 100644 examples/gdx-lml-tests/gradle/wrapper/gradle-wrapper.properties create mode 100755 examples/gdx-lml-tests/gradlew create mode 100755 examples/gdx-lml-tests/gradlew.bat create mode 100644 examples/gdx-lml-tests/gwt/build.gradle rename examples/gdx-lml-tests/{html/src => gwt/src/main/java}/com/github/czyzby/tests/GdxDefinition.gwt.xml (84%) rename examples/gdx-lml-tests/{html/src => gwt/src/main/java}/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml (100%) rename examples/gdx-lml-tests/{html/src => gwt/src/main/java}/com/github/czyzby/tests/client/HtmlLauncher.java (100%) rename examples/gdx-lml-tests/{html => gwt}/webapp/WEB-INF/web.xml (100%) rename examples/{gdx-lml-vis-tests/html => gdx-lml-tests/gwt}/webapp/index.html (96%) rename examples/gdx-lml-tests/{html => gwt}/webapp/refresh.png (100%) rename examples/gdx-lml-tests/{html => gwt}/webapp/soundmanager2-jsmin.js (100%) rename examples/gdx-lml-tests/{html => gwt}/webapp/soundmanager2-setup.js (100%) rename examples/gdx-lml-tests/{html => gwt}/webapp/styles.css (100%) delete mode 100644 examples/gdx-lml-tests/html/build.gradle rename examples/gdx-lml-tests/{core => }/raw/check-off.png (100%) rename examples/gdx-lml-tests/{core => }/raw/check-on.png (100%) rename examples/gdx-lml-tests/{core => }/raw/cursor.png (100%) rename examples/gdx-lml-tests/{core => }/raw/frame.9.png (100%) rename examples/gdx-lml-tests/{core => }/raw/hack.png (100%) rename examples/gdx-lml-tests/{core => }/raw/pack.json (100%) rename examples/gdx-lml-tests/{core => }/raw/progress-background-vertical.9.png (100%) rename examples/gdx-lml-tests/{core => }/raw/progress-background.9.png (100%) rename examples/gdx-lml-tests/{core => }/raw/progress-knob-vertical.9.png (100%) rename examples/gdx-lml-tests/{core => }/raw/progress-knob.9.png (100%) rename examples/gdx-lml-tests/{core => }/raw/select.9.png (100%) rename examples/gdx-lml-tests/{core => }/raw/tip.png (100%) rename examples/gdx-lml-tests/{core => }/raw/tree-minus.png (100%) rename examples/gdx-lml-tests/{core => }/raw/tree-plus.png (100%) rename examples/gdx-lml-tests/{core => }/raw/warn.png (100%) rename examples/gdx-lml-tests/{core => }/raw/white.9.png (100%) rename examples/gdx-lml-tests/{core => }/raw/window.9.png (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/fonts/hackFont.fnt (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/fonts/hackFont.png (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/i18n/bundle.properties (99%) rename examples/gdx-lml-vis-tests/{core => }/assets/i18n/custom.properties (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/dialogs/error.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/actions.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/actor.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/actorMacro.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/animatedImage.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/anyNotNull.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/argument.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/argumentReplace.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/arguments.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/arrays.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/assign.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/button.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/buttonGroup.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/calculate.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/changeListener.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/changeListenerMacro.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/checkBox.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/clickListener.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/clickListenerMacro.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/comment.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/conditional.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/conditions.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/container.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/customAttribute.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/customMacro.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/customTag.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/dialog.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/equations.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/evaluate.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/exception.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/forEach.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/horizontalGroup.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/i18n.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/image.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/imageButton.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/imageTextButton.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/import.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/importExample.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/inputListener.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/inputListenerMacro.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/isolate.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/label.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/list.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/logger.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/loop.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/meta.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/nestedForEach.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/newAttribute.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/newTag.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/nullCheck.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/preferences.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/progressBar.lml (100%) create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/random.lml rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/scrollPane.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/selectBox.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/slider.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/splitPane.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/stack.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/table.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/tableCell.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/tableColumn.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/tableRow.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/textArea.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/textButton.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/textField.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/tooltip.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/touchpad.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/tree.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/verticalGroup.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/basicColorPicker.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/collapsibleWidget.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/colorPicker.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/dragPane.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/draggable.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/fixedSizeGridGroup.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/floatingGroup.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/formValidator.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/gridGroup.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/horizontalFlow.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/linkLabel.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/listView.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/menu.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/radioButton.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/separator.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/spinner.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/tabbedPane.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/toast.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/tooltip.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/validatableTextField.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/vis/verticalFlow.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/while.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/examples/window.lml (100%) rename examples/gdx-lml-vis-tests/{core => }/assets/templates/main.lml (100%) rename examples/gdx-lml-vis-tests/core/src/{ => main/java/com/github/czyzby/tests}/Main.gwt.xml (100%) rename examples/gdx-lml-vis-tests/core/src/{ => main/java}/com/github/czyzby/tests/Main.java (99%) rename examples/gdx-lml-vis-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/ButtonManager.java (100%) rename examples/gdx-lml-vis-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/CustomActionContainer.java (100%) rename examples/gdx-lml-vis-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/MainView.java (100%) rename examples/gdx-lml-vis-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java (100%) rename examples/gdx-lml-vis-tests/core/src/{ => main/java}/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java (100%) rename examples/gdx-lml-vis-tests/desktop/src/{ => main/java}/com/github/czyzby/tests/desktop/DesktopLauncher.java (100%) create mode 100644 examples/gdx-lml-vis-tests/gradle/wrapper/gradle-wrapper.jar create mode 100644 examples/gdx-lml-vis-tests/gradle/wrapper/gradle-wrapper.properties create mode 100755 examples/gdx-lml-vis-tests/gradlew create mode 100755 examples/gdx-lml-vis-tests/gradlew.bat create mode 100644 examples/gdx-lml-vis-tests/gwt/build.gradle rename examples/gdx-lml-vis-tests/{html/src => gwt/src/main/java}/com/github/czyzby/tests/GdxDefinition.gwt.xml (76%) rename examples/gdx-lml-vis-tests/{html/src => gwt/src/main/java}/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml (100%) rename examples/gdx-lml-vis-tests/{html/src => gwt/src/main/java}/com/github/czyzby/tests/client/HtmlLauncher.java (100%) rename examples/gdx-lml-vis-tests/{html => gwt}/webapp/WEB-INF/web.xml (100%) rename examples/{gdx-lml-tests/html => gdx-lml-vis-tests/gwt}/webapp/index.html (96%) rename examples/gdx-lml-vis-tests/{html => gwt}/webapp/refresh.png (100%) rename examples/gdx-lml-vis-tests/{html => gwt}/webapp/soundmanager2-jsmin.js (100%) rename examples/gdx-lml-vis-tests/{html => gwt}/webapp/soundmanager2-setup.js (100%) rename examples/gdx-lml-vis-tests/{html => gwt}/webapp/styles.css (100%) delete mode 100644 examples/gdx-lml-vis-tests/html/build.gradle create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/RandomLmlMacroTag.java create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/RandomLmlMacroTagProvider.java diff --git a/examples/gdx-lml-tests/README.md b/examples/gdx-lml-tests/README.md index 93da202d..ed3d19b9 100644 --- a/examples/gdx-lml-tests/README.md +++ b/examples/gdx-lml-tests/README.md @@ -5,6 +5,6 @@ This is an example project using LML templates to create GUI. Java part of the c Check it out [on-line](http://czyzby.github.io/gdx-lml/lml) (be careful through: on-line version might be slightly outdated or use latest snapshot with new features). -It uses a simple, custom UI skin defined at `core/assets/skin.json`. The design is (somewhat) based on the great `VisUI` library, but obviously not as complex or polished. It has pre-defined styles for all default `Scene2D` actors, so it can be useful for quick prototyping - if you want to use these assets in your project, feel free to do so. You can modify raw skin assets at `core/raw` and run `gradle pack` task to recreate the atlas file with your changes. +It uses a simple, custom UI skin defined at `assets/skin.json`. The design is (somewhat) based on the great `VisUI` library, but obviously not as complex or polished. It has pre-defined styles for all default `Scene2D` actors, so it can be useful for quick prototyping - if you want to use these assets in your project, feel free to do so. You can modify raw skin assets at `core/raw` and run `gradle pack` task to recreate the atlas file with your changes. ![gdx-lml-tests](gdx-lml-tests.png) diff --git a/examples/gdx-lml-tests/core/assets/fonts/hack.fnt b/examples/gdx-lml-tests/assets/fonts/hack.fnt similarity index 100% rename from examples/gdx-lml-tests/core/assets/fonts/hack.fnt rename to examples/gdx-lml-tests/assets/fonts/hack.fnt diff --git a/examples/gdx-lml-tests/core/assets/i18n/bundle.properties b/examples/gdx-lml-tests/assets/i18n/bundle.properties similarity index 99% rename from examples/gdx-lml-tests/core/assets/i18n/bundle.properties rename to examples/gdx-lml-tests/assets/i18n/bundle.properties index 891877d9..48dd7dae 100644 --- a/examples/gdx-lml-tests/core/assets/i18n/bundle.properties +++ b/examples/gdx-lml-tests/assets/i18n/bundle.properties @@ -83,6 +83,7 @@ nestedForEach=Macro: nestedLoop newAttribute=Macro: newAttribute newTag=Macro: newTag nullCheck=Macro: notNull +random=Macro: random tableCell=Macro: tableCell tableColumn=Macro: tableColumn tableRow=Macro: tableRow diff --git a/examples/gdx-lml-tests/core/assets/i18n/custom.properties b/examples/gdx-lml-tests/assets/i18n/custom.properties similarity index 100% rename from examples/gdx-lml-tests/core/assets/i18n/custom.properties rename to examples/gdx-lml-tests/assets/i18n/custom.properties diff --git a/examples/gdx-lml-tests/core/assets/skin.atlas b/examples/gdx-lml-tests/assets/skin.atlas similarity index 100% rename from examples/gdx-lml-tests/core/assets/skin.atlas rename to examples/gdx-lml-tests/assets/skin.atlas diff --git a/examples/gdx-lml-tests/core/assets/skin.json b/examples/gdx-lml-tests/assets/skin.json similarity index 100% rename from examples/gdx-lml-tests/core/assets/skin.json rename to examples/gdx-lml-tests/assets/skin.json diff --git a/examples/gdx-lml-tests/core/assets/skin.png b/examples/gdx-lml-tests/assets/skin.png similarity index 100% rename from examples/gdx-lml-tests/core/assets/skin.png rename to examples/gdx-lml-tests/assets/skin.png diff --git a/examples/gdx-lml-tests/core/assets/templates/dialogs/error.lml b/examples/gdx-lml-tests/assets/templates/dialogs/error.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/dialogs/error.lml rename to examples/gdx-lml-tests/assets/templates/dialogs/error.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/actions.lml b/examples/gdx-lml-tests/assets/templates/examples/actions.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/actions.lml rename to examples/gdx-lml-tests/assets/templates/examples/actions.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/actor.lml b/examples/gdx-lml-tests/assets/templates/examples/actor.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/actor.lml rename to examples/gdx-lml-tests/assets/templates/examples/actor.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/actorMacro.lml b/examples/gdx-lml-tests/assets/templates/examples/actorMacro.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/actorMacro.lml rename to examples/gdx-lml-tests/assets/templates/examples/actorMacro.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/animatedImage.lml b/examples/gdx-lml-tests/assets/templates/examples/animatedImage.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/animatedImage.lml rename to examples/gdx-lml-tests/assets/templates/examples/animatedImage.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/anyNotNull.lml b/examples/gdx-lml-tests/assets/templates/examples/anyNotNull.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/anyNotNull.lml rename to examples/gdx-lml-tests/assets/templates/examples/anyNotNull.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/argument.lml b/examples/gdx-lml-tests/assets/templates/examples/argument.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/argument.lml rename to examples/gdx-lml-tests/assets/templates/examples/argument.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/argumentReplace.lml b/examples/gdx-lml-tests/assets/templates/examples/argumentReplace.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/argumentReplace.lml rename to examples/gdx-lml-tests/assets/templates/examples/argumentReplace.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/arguments.lml b/examples/gdx-lml-tests/assets/templates/examples/arguments.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/arguments.lml rename to examples/gdx-lml-tests/assets/templates/examples/arguments.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/arrays.lml b/examples/gdx-lml-tests/assets/templates/examples/arrays.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/arrays.lml rename to examples/gdx-lml-tests/assets/templates/examples/arrays.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/assign.lml b/examples/gdx-lml-tests/assets/templates/examples/assign.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/assign.lml rename to examples/gdx-lml-tests/assets/templates/examples/assign.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/button.lml b/examples/gdx-lml-tests/assets/templates/examples/button.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/button.lml rename to examples/gdx-lml-tests/assets/templates/examples/button.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/buttonGroup.lml b/examples/gdx-lml-tests/assets/templates/examples/buttonGroup.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/buttonGroup.lml rename to examples/gdx-lml-tests/assets/templates/examples/buttonGroup.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/calculate.lml b/examples/gdx-lml-tests/assets/templates/examples/calculate.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/calculate.lml rename to examples/gdx-lml-tests/assets/templates/examples/calculate.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/changeListener.lml b/examples/gdx-lml-tests/assets/templates/examples/changeListener.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/changeListener.lml rename to examples/gdx-lml-tests/assets/templates/examples/changeListener.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/changeListenerMacro.lml b/examples/gdx-lml-tests/assets/templates/examples/changeListenerMacro.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/changeListenerMacro.lml rename to examples/gdx-lml-tests/assets/templates/examples/changeListenerMacro.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/checkBox.lml b/examples/gdx-lml-tests/assets/templates/examples/checkBox.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/checkBox.lml rename to examples/gdx-lml-tests/assets/templates/examples/checkBox.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/clickListener.lml b/examples/gdx-lml-tests/assets/templates/examples/clickListener.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/clickListener.lml rename to examples/gdx-lml-tests/assets/templates/examples/clickListener.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/clickListenerMacro.lml b/examples/gdx-lml-tests/assets/templates/examples/clickListenerMacro.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/clickListenerMacro.lml rename to examples/gdx-lml-tests/assets/templates/examples/clickListenerMacro.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/comment.lml b/examples/gdx-lml-tests/assets/templates/examples/comment.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/comment.lml rename to examples/gdx-lml-tests/assets/templates/examples/comment.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/conditional.lml b/examples/gdx-lml-tests/assets/templates/examples/conditional.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/conditional.lml rename to examples/gdx-lml-tests/assets/templates/examples/conditional.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/conditions.lml b/examples/gdx-lml-tests/assets/templates/examples/conditions.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/conditions.lml rename to examples/gdx-lml-tests/assets/templates/examples/conditions.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/container.lml b/examples/gdx-lml-tests/assets/templates/examples/container.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/container.lml rename to examples/gdx-lml-tests/assets/templates/examples/container.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/customAttribute.lml b/examples/gdx-lml-tests/assets/templates/examples/customAttribute.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/customAttribute.lml rename to examples/gdx-lml-tests/assets/templates/examples/customAttribute.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/customMacro.lml b/examples/gdx-lml-tests/assets/templates/examples/customMacro.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/customMacro.lml rename to examples/gdx-lml-tests/assets/templates/examples/customMacro.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/customTag.lml b/examples/gdx-lml-tests/assets/templates/examples/customTag.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/customTag.lml rename to examples/gdx-lml-tests/assets/templates/examples/customTag.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/dialog.lml b/examples/gdx-lml-tests/assets/templates/examples/dialog.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/dialog.lml rename to examples/gdx-lml-tests/assets/templates/examples/dialog.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/equations.lml b/examples/gdx-lml-tests/assets/templates/examples/equations.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/equations.lml rename to examples/gdx-lml-tests/assets/templates/examples/equations.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/evaluate.lml b/examples/gdx-lml-tests/assets/templates/examples/evaluate.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/evaluate.lml rename to examples/gdx-lml-tests/assets/templates/examples/evaluate.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/exception.lml b/examples/gdx-lml-tests/assets/templates/examples/exception.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/exception.lml rename to examples/gdx-lml-tests/assets/templates/examples/exception.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/forEach.lml b/examples/gdx-lml-tests/assets/templates/examples/forEach.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/forEach.lml rename to examples/gdx-lml-tests/assets/templates/examples/forEach.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/horizontalGroup.lml b/examples/gdx-lml-tests/assets/templates/examples/horizontalGroup.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/horizontalGroup.lml rename to examples/gdx-lml-tests/assets/templates/examples/horizontalGroup.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/i18n.lml b/examples/gdx-lml-tests/assets/templates/examples/i18n.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/i18n.lml rename to examples/gdx-lml-tests/assets/templates/examples/i18n.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/image.lml b/examples/gdx-lml-tests/assets/templates/examples/image.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/image.lml rename to examples/gdx-lml-tests/assets/templates/examples/image.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/imageButton.lml b/examples/gdx-lml-tests/assets/templates/examples/imageButton.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/imageButton.lml rename to examples/gdx-lml-tests/assets/templates/examples/imageButton.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/imageTextButton.lml b/examples/gdx-lml-tests/assets/templates/examples/imageTextButton.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/imageTextButton.lml rename to examples/gdx-lml-tests/assets/templates/examples/imageTextButton.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/import.lml b/examples/gdx-lml-tests/assets/templates/examples/import.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/import.lml rename to examples/gdx-lml-tests/assets/templates/examples/import.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/importExample.lml b/examples/gdx-lml-tests/assets/templates/examples/importExample.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/importExample.lml rename to examples/gdx-lml-tests/assets/templates/examples/importExample.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/inputListener.lml b/examples/gdx-lml-tests/assets/templates/examples/inputListener.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/inputListener.lml rename to examples/gdx-lml-tests/assets/templates/examples/inputListener.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/inputListenerMacro.lml b/examples/gdx-lml-tests/assets/templates/examples/inputListenerMacro.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/inputListenerMacro.lml rename to examples/gdx-lml-tests/assets/templates/examples/inputListenerMacro.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/isolate.lml b/examples/gdx-lml-tests/assets/templates/examples/isolate.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/isolate.lml rename to examples/gdx-lml-tests/assets/templates/examples/isolate.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/label.lml b/examples/gdx-lml-tests/assets/templates/examples/label.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/label.lml rename to examples/gdx-lml-tests/assets/templates/examples/label.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/list.lml b/examples/gdx-lml-tests/assets/templates/examples/list.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/list.lml rename to examples/gdx-lml-tests/assets/templates/examples/list.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/logger.lml b/examples/gdx-lml-tests/assets/templates/examples/logger.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/logger.lml rename to examples/gdx-lml-tests/assets/templates/examples/logger.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/loop.lml b/examples/gdx-lml-tests/assets/templates/examples/loop.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/loop.lml rename to examples/gdx-lml-tests/assets/templates/examples/loop.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/meta.lml b/examples/gdx-lml-tests/assets/templates/examples/meta.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/meta.lml rename to examples/gdx-lml-tests/assets/templates/examples/meta.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/nestedForEach.lml b/examples/gdx-lml-tests/assets/templates/examples/nestedForEach.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/nestedForEach.lml rename to examples/gdx-lml-tests/assets/templates/examples/nestedForEach.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/newAttribute.lml b/examples/gdx-lml-tests/assets/templates/examples/newAttribute.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/newAttribute.lml rename to examples/gdx-lml-tests/assets/templates/examples/newAttribute.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/newTag.lml b/examples/gdx-lml-tests/assets/templates/examples/newTag.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/newTag.lml rename to examples/gdx-lml-tests/assets/templates/examples/newTag.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/nullCheck.lml b/examples/gdx-lml-tests/assets/templates/examples/nullCheck.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/nullCheck.lml rename to examples/gdx-lml-tests/assets/templates/examples/nullCheck.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/preferences.lml b/examples/gdx-lml-tests/assets/templates/examples/preferences.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/preferences.lml rename to examples/gdx-lml-tests/assets/templates/examples/preferences.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/progressBar.lml b/examples/gdx-lml-tests/assets/templates/examples/progressBar.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/progressBar.lml rename to examples/gdx-lml-tests/assets/templates/examples/progressBar.lml diff --git a/examples/gdx-lml-tests/assets/templates/examples/random.lml b/examples/gdx-lml-tests/assets/templates/examples/random.lml new file mode 100644 index 00000000..51f3ffd8 --- /dev/null +++ b/examples/gdx-lml-tests/assets/templates/examples/random.lml @@ -0,0 +1,26 @@ + + +<:random key Some Random Value/> + + + +<:random key Some;Random;Value/> + +<:random key>Some;Random;Value + + + +<:random key="key" value="Some;Random;Value"/> + +<:random key="key">Some;Random;Value + + + +<:random key="key" value="[100, 200]"/> + +<:random key="key">0.[0,999] + \ No newline at end of file diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/scrollPane.lml b/examples/gdx-lml-tests/assets/templates/examples/scrollPane.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/scrollPane.lml rename to examples/gdx-lml-tests/assets/templates/examples/scrollPane.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/selectBox.lml b/examples/gdx-lml-tests/assets/templates/examples/selectBox.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/selectBox.lml rename to examples/gdx-lml-tests/assets/templates/examples/selectBox.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/slider.lml b/examples/gdx-lml-tests/assets/templates/examples/slider.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/slider.lml rename to examples/gdx-lml-tests/assets/templates/examples/slider.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/splitPane.lml b/examples/gdx-lml-tests/assets/templates/examples/splitPane.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/splitPane.lml rename to examples/gdx-lml-tests/assets/templates/examples/splitPane.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/stack.lml b/examples/gdx-lml-tests/assets/templates/examples/stack.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/stack.lml rename to examples/gdx-lml-tests/assets/templates/examples/stack.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/table.lml b/examples/gdx-lml-tests/assets/templates/examples/table.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/table.lml rename to examples/gdx-lml-tests/assets/templates/examples/table.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/tableCell.lml b/examples/gdx-lml-tests/assets/templates/examples/tableCell.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/tableCell.lml rename to examples/gdx-lml-tests/assets/templates/examples/tableCell.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/tableColumn.lml b/examples/gdx-lml-tests/assets/templates/examples/tableColumn.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/tableColumn.lml rename to examples/gdx-lml-tests/assets/templates/examples/tableColumn.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/tableRow.lml b/examples/gdx-lml-tests/assets/templates/examples/tableRow.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/tableRow.lml rename to examples/gdx-lml-tests/assets/templates/examples/tableRow.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/textArea.lml b/examples/gdx-lml-tests/assets/templates/examples/textArea.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/textArea.lml rename to examples/gdx-lml-tests/assets/templates/examples/textArea.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/textButton.lml b/examples/gdx-lml-tests/assets/templates/examples/textButton.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/textButton.lml rename to examples/gdx-lml-tests/assets/templates/examples/textButton.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/textField.lml b/examples/gdx-lml-tests/assets/templates/examples/textField.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/textField.lml rename to examples/gdx-lml-tests/assets/templates/examples/textField.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/tooltip.lml b/examples/gdx-lml-tests/assets/templates/examples/tooltip.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/tooltip.lml rename to examples/gdx-lml-tests/assets/templates/examples/tooltip.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/touchpad.lml b/examples/gdx-lml-tests/assets/templates/examples/touchpad.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/touchpad.lml rename to examples/gdx-lml-tests/assets/templates/examples/touchpad.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/tree.lml b/examples/gdx-lml-tests/assets/templates/examples/tree.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/tree.lml rename to examples/gdx-lml-tests/assets/templates/examples/tree.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/verticalGroup.lml b/examples/gdx-lml-tests/assets/templates/examples/verticalGroup.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/verticalGroup.lml rename to examples/gdx-lml-tests/assets/templates/examples/verticalGroup.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/while.lml b/examples/gdx-lml-tests/assets/templates/examples/while.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/while.lml rename to examples/gdx-lml-tests/assets/templates/examples/while.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/examples/window.lml b/examples/gdx-lml-tests/assets/templates/examples/window.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/examples/window.lml rename to examples/gdx-lml-tests/assets/templates/examples/window.lml diff --git a/examples/gdx-lml-tests/core/assets/templates/main.lml b/examples/gdx-lml-tests/assets/templates/main.lml similarity index 100% rename from examples/gdx-lml-tests/core/assets/templates/main.lml rename to examples/gdx-lml-tests/assets/templates/main.lml diff --git a/examples/gdx-lml-tests/build.gradle b/examples/gdx-lml-tests/build.gradle index 85eca826..81b81f5f 100644 --- a/examples/gdx-lml-tests/build.gradle +++ b/examples/gdx-lml-tests/build.gradle @@ -1,72 +1,45 @@ buildscript { - repositories { - mavenLocal() - mavenCentral() - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } - jcenter() - } - dependencies { - classpath "de.richsource.gradle.plugins:gwt-gradle-plugin:0.6" - classpath "com.badlogicgames.gdx:gdx-tools:$gdxVersion" - } + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + } + dependencies { + classpath "com.badlogicgames.gdx:gdx-tools:$gdxVersion" + classpath "de.richsource.gradle.plugins:gwt-gradle-plugin:$gwtPluginVersion" + } } allprojects { - apply plugin: "eclipse" - apply plugin: "idea" - - version = libVersion - ext.appName = 'gdx-lml-tests' - - repositories { - mavenLocal() - mavenCentral() - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } - maven { url "https://oss.sonatype.org/content/repositories/releases/" } - } + apply plugin: 'eclipse' + apply plugin: 'idea' } -project(":desktop") { - apply plugin: "java" - - dependencies { - compile project(":core") - compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" - compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" - } +configure(subprojects) { + apply plugin: 'java' + sourceCompatibility = 1.6 } -project(":html") { - apply plugin: "gwt" - apply plugin: "war" - - dependencies { - compile project(":core") - compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" - compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources" - compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources" - compile "com.github.czyzby:gdx-lml:$libVersion:sources" - compile "com.github.czyzby:gdx-kiwi:$libVersion:sources" - } +subprojects { + version = libVersion + ext.appName = 'gdx-lml-tests' + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + } } -project(":core") { - apply plugin: "java" - - dependencies { - compile "com.github.czyzby:gdx-lml:$libVersion" - compile "com.badlogicgames.gdx:gdx:$gdxVersion" - } +// Clearing Eclipse project data in root folder: +tasks.eclipse.doLast { + delete '.project' + delete '.classpath' + delete '.settings/' } +import com.badlogic.gdx.tools.texturepacker.TexturePacker task pack << { - // Packing raw assets into an atlas: - com.badlogic.gdx.tools.texturepacker.TexturePacker.process(project(":core") - .file("raw").absolutePath, project(":core").file("assets").absolutePath, "skin") -} - -tasks.eclipse.doLast { - delete ".project" - delete ".classpath" - delete ".settings/" + TexturePacker.process('raw', 'assets', 'skin') } diff --git a/examples/gdx-lml-tests/core/build.gradle b/examples/gdx-lml-tests/core/build.gradle index 03cd1bea..a9cd7b0d 100644 --- a/examples/gdx-lml-tests/core/build.gradle +++ b/examples/gdx-lml-tests/core/build.gradle @@ -1,11 +1,8 @@ -apply plugin: "java" - -sourceCompatibility = 1.6 [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' +eclipse.project.name = appName + '-core' -sourceSets.main.java.srcDirs = [ "src/" ] - - -eclipse.project { - name = appName + "-core" +dependencies { + compile "com.badlogicgames.gdx:gdx:$gdxVersion" + compile "com.github.czyzby:gdx-lml:$libVersion" } + diff --git a/examples/gdx-lml-tests/core/src/Main.gwt.xml b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml similarity index 100% rename from examples/gdx-lml-tests/core/src/Main.gwt.xml rename to examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml diff --git a/examples/gdx-lml-tests/core/src/com/github/czyzby/tests/Main.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java similarity index 99% rename from examples/gdx-lml-tests/core/src/com/github/czyzby/tests/Main.java rename to examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java index 9e88baef..42e4b298 100644 --- a/examples/gdx-lml-tests/core/src/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -47,7 +47,7 @@ public class Main extends AbstractApplicationListener { "actorMacro", "anyNotNull", "argument", "argumentReplace", "assign", "calculate", "changeListenerMacro", "clickListenerMacro", "comment", "conditional", "evaluate", "exception", "forEach", "import", "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", "newTag", "nullCheck", - "tableCell", "tableColumn", "tableRow", "while", + "random", "tableCell", "tableColumn", "tableRow", "while", // Custom elements: "customAttribute", "customMacro", "customTag"); private static final String MAIN_VIEW_TEMPLATE = "templates/main.lml"; diff --git a/examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/ButtonManager.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/ButtonManager.java similarity index 100% rename from examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/ButtonManager.java rename to examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/ButtonManager.java diff --git a/examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/CustomActionContainer.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/CustomActionContainer.java similarity index 100% rename from examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/CustomActionContainer.java rename to examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/CustomActionContainer.java diff --git a/examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/MainView.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java similarity index 100% rename from examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/MainView.java rename to examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java diff --git a/examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java similarity index 100% rename from examples/gdx-lml-tests/core/src/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java rename to examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java diff --git a/examples/gdx-lml-tests/desktop/build.gradle b/examples/gdx-lml-tests/desktop/build.gradle index 1a27d823..4dd3c2f1 100644 --- a/examples/gdx-lml-tests/desktop/build.gradle +++ b/examples/gdx-lml-tests/desktop/build.gradle @@ -1,47 +1,24 @@ -apply plugin: "java" +apply plugin: 'application' -sourceCompatibility = 1.6 -sourceSets.main.java.srcDirs = [ "src/" ] -sourceSets.main.resources.srcDirs = [ "../core/assets/" ] +sourceSets.main.resources.srcDirs += [ rootProject.file('assets').absolutePath ] +mainClassName = 'com.github.czyzby.tests.desktop.DesktopLauncher' +eclipse.project.name = appName + '-desktop' +sourceCompatibility = 1.7 -project.ext.mainClassName = "com.github.czyzby.tests.desktop.DesktopLauncher" -project.ext.assetsDir = new File("../core/assets"); - -task run(dependsOn: classes, type: JavaExec) { - main = project.mainClassName - classpath = sourceSets.main.runtimeClasspath - standardInput = System.in - workingDir = project.assetsDir - ignoreExitValue = true -} - -task dist(type: Jar) { - from files(sourceSets.main.output.classesDir) - from files(sourceSets.main.output.resourcesDir) - from {configurations.compile.collect {zipTree(it)}} - from files(project.assetsDir); - - manifest { - attributes 'Main-Class': project.mainClassName - } +dependencies { + compile project(':core') + compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" } -dist.dependsOn classes - -eclipse { - project { - name = appName + "-desktop" - linkedResource name: 'assets', type: '2', location: 'PARENT-1-PROJECT_LOC/core/assets' - } +jar { + archiveName "${appName}-${version}.jar" + from { configurations.compile.collect { zipTree(it) } } + manifest { + attributes 'Main-Class': project.mainClassName + } } -task afterEclipseImport(description: "Post processing after project generation", group: "IDE") { - doLast { - def classpath = new XmlParser().parse(file(".classpath")) - new Node(classpath, "classpathentry", [ kind: 'src', path: 'assets' ]); - def writer = new FileWriter(file(".classpath")) - def printer = new XmlNodePrinter(new PrintWriter(writer)) - printer.setPreserveWhitespace(true) - printer.print(classpath) - } +run { + ignoreExitValue = true } diff --git a/examples/gdx-lml-tests/desktop/src/com/github/czyzby/tests/desktop/DesktopLauncher.java b/examples/gdx-lml-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java similarity index 100% rename from examples/gdx-lml-tests/desktop/src/com/github/czyzby/tests/desktop/DesktopLauncher.java rename to examples/gdx-lml-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java diff --git a/examples/gdx-lml-tests/gradle.properties b/examples/gdx-lml-tests/gradle.properties index 083d786c..3a4c04a7 100644 --- a/examples/gdx-lml-tests/gradle.properties +++ b/examples/gdx-lml-tests/gradle.properties @@ -7,3 +7,4 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 diff --git a/examples/gdx-lml-tests/gradle/wrapper/gradle-wrapper.jar b/examples/gdx-lml-tests/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..ca78035ef0501d802d4fc55381ef2d5c3ce0ec6e GIT binary patch literal 53556 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�H$uJM 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/examples/gdx-lml-tests/gradlew.bat b/examples/gdx-lml-tests/gradlew.bat new file mode 100755 index 00000000..f6d5974e --- /dev/null +++ b/examples/gdx-lml-tests/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/gdx-lml-tests/gwt/build.gradle b/examples/gdx-lml-tests/gwt/build.gradle new file mode 100644 index 00000000..356c2f20 --- /dev/null +++ b/examples/gdx-lml-tests/gwt/build.gradle @@ -0,0 +1,73 @@ +apply plugin: 'gwt' +apply plugin: 'war' +apply plugin: 'jetty' + +gwt { + gwtVersion = gwtFrameworkVersion // Should match the version used for building the GWT backend. See gradle.properties. + maxHeapSize = '1G' // Default 256m is not enough for the GWT compiler. GWT is HUNGRY. + minHeapSize = '1G' + + src = files(file('src/main/java')) // Needs to be in front of "modules" below. + modules 'com.github.czyzby.tests.GdxDefinition' + devModules 'com.github.czyzby.tests.GdxDefinitionSuperdev' + project.webAppDirName = 'webapp' + + compiler { + strict = true + enableClosureCompiler = true + disableCastChecking = true + } +} + +dependencies { + compile project(':core') + compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources" + compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources" + compile "com.github.czyzby:gdx-lml:$libVersion:sources" + compile "com.github.czyzby:gdx-kiwi:$libVersion:sources" +} + +task draftRun(type: JettyRunWar) { + dependsOn draftWar + dependsOn.remove('war') + webApp = draftWar.archivePath + daemon = true +} + +task superDev(type: de.richsource.gradle.plugins.gwt.GwtSuperDev) { + dependsOn draftRun + doFirst { + gwt.modules = gwt.devModules + } +} + +task dist(dependsOn: [clean, compileGwt]) { + doLast { + file("build/dist").mkdirs() + copy { + from "build/gwt/out" + into "build/dist" + } + copy { + from "webapp" + into "build/dist" + } + copy { + from "war" + into "build/dist" + } + } +} + +draftWar { + from "war" +} + +task addSource << { + sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs) +} + +tasks.compileGwt.dependsOn(addSource) +tasks.draftCompileGwt.dependsOn(addSource) +eclipse.project.name = appName + '-gwt' diff --git a/examples/gdx-lml-tests/html/src/com/github/czyzby/tests/GdxDefinition.gwt.xml b/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml similarity index 84% rename from examples/gdx-lml-tests/html/src/com/github/czyzby/tests/GdxDefinition.gwt.xml rename to examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml index 9e6349da..b4d4c035 100644 --- a/examples/gdx-lml-tests/html/src/com/github/czyzby/tests/GdxDefinition.gwt.xml +++ b/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml @@ -7,5 +7,5 @@ - + diff --git a/examples/gdx-lml-tests/html/src/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml b/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml similarity index 100% rename from examples/gdx-lml-tests/html/src/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml rename to examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml diff --git a/examples/gdx-lml-tests/html/src/com/github/czyzby/tests/client/HtmlLauncher.java b/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/client/HtmlLauncher.java similarity index 100% rename from examples/gdx-lml-tests/html/src/com/github/czyzby/tests/client/HtmlLauncher.java rename to examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/client/HtmlLauncher.java diff --git a/examples/gdx-lml-tests/html/webapp/WEB-INF/web.xml b/examples/gdx-lml-tests/gwt/webapp/WEB-INF/web.xml similarity index 100% rename from examples/gdx-lml-tests/html/webapp/WEB-INF/web.xml rename to examples/gdx-lml-tests/gwt/webapp/WEB-INF/web.xml diff --git a/examples/gdx-lml-vis-tests/html/webapp/index.html b/examples/gdx-lml-tests/gwt/webapp/index.html similarity index 96% rename from examples/gdx-lml-vis-tests/html/webapp/index.html rename to examples/gdx-lml-tests/gwt/webapp/index.html index 19f5984f..43d7e5c5 100644 --- a/examples/gdx-lml-vis-tests/html/webapp/index.html +++ b/examples/gdx-lml-tests/gwt/webapp/index.html @@ -1,7 +1,7 @@ - gdx-lml-vis-tests + LibGDX application diff --git a/examples/gdx-lml-tests/html/webapp/refresh.png b/examples/gdx-lml-tests/gwt/webapp/refresh.png similarity index 100% rename from examples/gdx-lml-tests/html/webapp/refresh.png rename to examples/gdx-lml-tests/gwt/webapp/refresh.png diff --git a/examples/gdx-lml-tests/html/webapp/soundmanager2-jsmin.js b/examples/gdx-lml-tests/gwt/webapp/soundmanager2-jsmin.js similarity index 100% rename from examples/gdx-lml-tests/html/webapp/soundmanager2-jsmin.js rename to examples/gdx-lml-tests/gwt/webapp/soundmanager2-jsmin.js diff --git a/examples/gdx-lml-tests/html/webapp/soundmanager2-setup.js b/examples/gdx-lml-tests/gwt/webapp/soundmanager2-setup.js similarity index 100% rename from examples/gdx-lml-tests/html/webapp/soundmanager2-setup.js rename to examples/gdx-lml-tests/gwt/webapp/soundmanager2-setup.js diff --git a/examples/gdx-lml-tests/html/webapp/styles.css b/examples/gdx-lml-tests/gwt/webapp/styles.css similarity index 100% rename from examples/gdx-lml-tests/html/webapp/styles.css rename to examples/gdx-lml-tests/gwt/webapp/styles.css diff --git a/examples/gdx-lml-tests/html/build.gradle b/examples/gdx-lml-tests/html/build.gradle deleted file mode 100644 index 75359c18..00000000 --- a/examples/gdx-lml-tests/html/build.gradle +++ /dev/null @@ -1,70 +0,0 @@ -apply plugin: "java" -apply plugin: "jetty" - -gwt { - gwtVersion='2.6.0' // Should match the gwt version used for building the gwt backend - maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY - minHeapSize="1G" - - src = files(file("src/")) // Needs to be in front of "modules" below. - modules 'com.github.czyzby.tests.GdxDefinition' - devModules 'com.github.czyzby.tests.GdxDefinitionSuperdev' - project.webAppDirName = 'webapp' - - compiler { - strict = true; - enableClosureCompiler = true; - disableCastChecking = true; - } -} - -task draftRun(type: JettyRunWar) { - dependsOn draftWar - dependsOn.remove('war') - webApp=draftWar.archivePath - daemon=true -} - -task superDev(type: de.richsource.gradle.plugins.gwt.GwtSuperDev) { - dependsOn draftRun - doFirst { - gwt.modules = gwt.devModules - } -} - -task dist(dependsOn: [clean, compileGwt]) { - doLast { - file("build/dist").mkdirs() - copy { - from "build/gwt/out" - into "build/dist" - } - copy { - from "webapp" - into "build/dist" - } - copy { - from "war" - into "build/dist" - } - } -} - -draftWar { - from "war" -} - -task addSource << { - sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs) -} - -tasks.compileGwt.dependsOn(addSource) -tasks.draftCompileGwt.dependsOn(addSource) - -sourceCompatibility = 1.6 -sourceSets.main.java.srcDirs = [ "src/" ] - - -eclipse.project { - name = appName + "-html" -} diff --git a/examples/gdx-lml-tests/core/raw/check-off.png b/examples/gdx-lml-tests/raw/check-off.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/check-off.png rename to examples/gdx-lml-tests/raw/check-off.png diff --git a/examples/gdx-lml-tests/core/raw/check-on.png b/examples/gdx-lml-tests/raw/check-on.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/check-on.png rename to examples/gdx-lml-tests/raw/check-on.png diff --git a/examples/gdx-lml-tests/core/raw/cursor.png b/examples/gdx-lml-tests/raw/cursor.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/cursor.png rename to examples/gdx-lml-tests/raw/cursor.png diff --git a/examples/gdx-lml-tests/core/raw/frame.9.png b/examples/gdx-lml-tests/raw/frame.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/frame.9.png rename to examples/gdx-lml-tests/raw/frame.9.png diff --git a/examples/gdx-lml-tests/core/raw/hack.png b/examples/gdx-lml-tests/raw/hack.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/hack.png rename to examples/gdx-lml-tests/raw/hack.png diff --git a/examples/gdx-lml-tests/core/raw/pack.json b/examples/gdx-lml-tests/raw/pack.json similarity index 100% rename from examples/gdx-lml-tests/core/raw/pack.json rename to examples/gdx-lml-tests/raw/pack.json diff --git a/examples/gdx-lml-tests/core/raw/progress-background-vertical.9.png b/examples/gdx-lml-tests/raw/progress-background-vertical.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/progress-background-vertical.9.png rename to examples/gdx-lml-tests/raw/progress-background-vertical.9.png diff --git a/examples/gdx-lml-tests/core/raw/progress-background.9.png b/examples/gdx-lml-tests/raw/progress-background.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/progress-background.9.png rename to examples/gdx-lml-tests/raw/progress-background.9.png diff --git a/examples/gdx-lml-tests/core/raw/progress-knob-vertical.9.png b/examples/gdx-lml-tests/raw/progress-knob-vertical.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/progress-knob-vertical.9.png rename to examples/gdx-lml-tests/raw/progress-knob-vertical.9.png diff --git a/examples/gdx-lml-tests/core/raw/progress-knob.9.png b/examples/gdx-lml-tests/raw/progress-knob.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/progress-knob.9.png rename to examples/gdx-lml-tests/raw/progress-knob.9.png diff --git a/examples/gdx-lml-tests/core/raw/select.9.png b/examples/gdx-lml-tests/raw/select.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/select.9.png rename to examples/gdx-lml-tests/raw/select.9.png diff --git a/examples/gdx-lml-tests/core/raw/tip.png b/examples/gdx-lml-tests/raw/tip.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/tip.png rename to examples/gdx-lml-tests/raw/tip.png diff --git a/examples/gdx-lml-tests/core/raw/tree-minus.png b/examples/gdx-lml-tests/raw/tree-minus.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/tree-minus.png rename to examples/gdx-lml-tests/raw/tree-minus.png diff --git a/examples/gdx-lml-tests/core/raw/tree-plus.png b/examples/gdx-lml-tests/raw/tree-plus.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/tree-plus.png rename to examples/gdx-lml-tests/raw/tree-plus.png diff --git a/examples/gdx-lml-tests/core/raw/warn.png b/examples/gdx-lml-tests/raw/warn.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/warn.png rename to examples/gdx-lml-tests/raw/warn.png diff --git a/examples/gdx-lml-tests/core/raw/white.9.png b/examples/gdx-lml-tests/raw/white.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/white.9.png rename to examples/gdx-lml-tests/raw/white.9.png diff --git a/examples/gdx-lml-tests/core/raw/window.9.png b/examples/gdx-lml-tests/raw/window.9.png similarity index 100% rename from examples/gdx-lml-tests/core/raw/window.9.png rename to examples/gdx-lml-tests/raw/window.9.png diff --git a/examples/gdx-lml-tests/settings.gradle b/examples/gdx-lml-tests/settings.gradle index 7c74fc5e..b2801262 100644 --- a/examples/gdx-lml-tests/settings.gradle +++ b/examples/gdx-lml-tests/settings.gradle @@ -1 +1 @@ -include 'desktop', 'html', 'core' \ No newline at end of file +include 'desktop', 'core', 'gwt' diff --git a/examples/gdx-lml-vis-tests/core/assets/fonts/hackFont.fnt b/examples/gdx-lml-vis-tests/assets/fonts/hackFont.fnt similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/fonts/hackFont.fnt rename to examples/gdx-lml-vis-tests/assets/fonts/hackFont.fnt diff --git a/examples/gdx-lml-vis-tests/core/assets/fonts/hackFont.png b/examples/gdx-lml-vis-tests/assets/fonts/hackFont.png similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/fonts/hackFont.png rename to examples/gdx-lml-vis-tests/assets/fonts/hackFont.png diff --git a/examples/gdx-lml-vis-tests/core/assets/i18n/bundle.properties b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties similarity index 99% rename from examples/gdx-lml-vis-tests/core/assets/i18n/bundle.properties rename to examples/gdx-lml-vis-tests/assets/i18n/bundle.properties index 99448231..fa3a72a6 100644 --- a/examples/gdx-lml-vis-tests/core/assets/i18n/bundle.properties +++ b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties @@ -83,6 +83,7 @@ nestedForEach=Macro: nestedLoop newAttribute=Macro: newAttribute newTag=Macro: newTag nullCheck=Macro: notNull +random=Macro: random tableCell=Macro: tableCell tableColumn=Macro: tableColumn tableRow=Macro: tableRow diff --git a/examples/gdx-lml-vis-tests/core/assets/i18n/custom.properties b/examples/gdx-lml-vis-tests/assets/i18n/custom.properties similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/i18n/custom.properties rename to examples/gdx-lml-vis-tests/assets/i18n/custom.properties diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/dialogs/error.lml b/examples/gdx-lml-vis-tests/assets/templates/dialogs/error.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/dialogs/error.lml rename to examples/gdx-lml-vis-tests/assets/templates/dialogs/error.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/actions.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/actions.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/actions.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/actions.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/actor.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/actor.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/actor.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/actor.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/actorMacro.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/actorMacro.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/actorMacro.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/actorMacro.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/animatedImage.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/animatedImage.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/animatedImage.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/animatedImage.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/anyNotNull.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/anyNotNull.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/anyNotNull.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/anyNotNull.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/argument.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/argument.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/argument.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/argument.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/argumentReplace.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/argumentReplace.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/argumentReplace.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/argumentReplace.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/arguments.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/arguments.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/arguments.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/arguments.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/arrays.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/arrays.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/arrays.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/arrays.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/assign.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/assign.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/assign.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/assign.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/button.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/button.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/button.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/button.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/buttonGroup.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/buttonGroup.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/buttonGroup.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/buttonGroup.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/calculate.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/calculate.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/calculate.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/calculate.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/changeListener.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/changeListener.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/changeListener.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/changeListener.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/changeListenerMacro.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/changeListenerMacro.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/changeListenerMacro.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/changeListenerMacro.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/checkBox.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/checkBox.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/checkBox.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/checkBox.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/clickListener.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/clickListener.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/clickListener.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/clickListener.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/clickListenerMacro.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/clickListenerMacro.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/clickListenerMacro.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/clickListenerMacro.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/comment.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/comment.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/comment.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/comment.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/conditional.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/conditional.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/conditional.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/conditional.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/conditions.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/conditions.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/conditions.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/conditions.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/container.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/container.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/container.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/container.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/customAttribute.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/customAttribute.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/customAttribute.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/customAttribute.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/customMacro.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/customMacro.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/customMacro.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/customMacro.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/customTag.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/customTag.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/customTag.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/customTag.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/dialog.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/dialog.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/dialog.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/dialog.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/equations.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/equations.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/equations.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/equations.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/evaluate.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/evaluate.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/evaluate.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/evaluate.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/exception.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/exception.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/exception.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/exception.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/forEach.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/forEach.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/forEach.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/forEach.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/horizontalGroup.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/horizontalGroup.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/horizontalGroup.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/horizontalGroup.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/i18n.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/i18n.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/i18n.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/i18n.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/image.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/image.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/image.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/image.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/imageButton.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/imageButton.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/imageButton.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/imageButton.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/imageTextButton.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/imageTextButton.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/imageTextButton.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/imageTextButton.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/import.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/import.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/import.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/import.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/importExample.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/importExample.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/importExample.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/importExample.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/inputListener.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/inputListener.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/inputListener.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/inputListener.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/inputListenerMacro.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/inputListenerMacro.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/inputListenerMacro.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/inputListenerMacro.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/isolate.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/isolate.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/isolate.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/isolate.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/label.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/label.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/label.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/label.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/list.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/list.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/list.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/list.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/logger.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/logger.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/logger.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/logger.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/loop.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/loop.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/loop.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/loop.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/meta.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/meta.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/meta.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/meta.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/nestedForEach.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/nestedForEach.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/nestedForEach.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/nestedForEach.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/newAttribute.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/newAttribute.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/newAttribute.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/newAttribute.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/newTag.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/newTag.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/newTag.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/newTag.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/nullCheck.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/nullCheck.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/nullCheck.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/nullCheck.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/preferences.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/preferences.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/preferences.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/preferences.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/progressBar.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/progressBar.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/progressBar.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/progressBar.lml diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/random.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/random.lml new file mode 100644 index 00000000..225e4ce7 --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/random.lml @@ -0,0 +1,26 @@ + + +<:random key Some Random Value/> + + + +<:random key Some;Random;Value/> + +<:random key>Some;Random;Value + + + +<:random key="key" value="Some;Random;Value"/> + +<:random key="key">Some;Random;Value + + + +<:random key="key" value="[100, 200]"/> + +<:random key="key">0.[0,999] + \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/scrollPane.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/scrollPane.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/scrollPane.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/scrollPane.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/selectBox.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/selectBox.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/selectBox.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/selectBox.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/slider.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/slider.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/slider.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/slider.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/splitPane.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/splitPane.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/splitPane.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/splitPane.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/stack.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/stack.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/stack.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/stack.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/table.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/table.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/table.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/table.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/tableCell.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/tableCell.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/tableCell.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/tableCell.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/tableColumn.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/tableColumn.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/tableColumn.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/tableColumn.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/tableRow.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/tableRow.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/tableRow.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/tableRow.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/textArea.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/textArea.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/textArea.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/textArea.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/textButton.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/textButton.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/textButton.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/textButton.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/textField.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/textField.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/textField.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/textField.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/tooltip.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/tooltip.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/tooltip.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/tooltip.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/touchpad.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/touchpad.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/touchpad.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/touchpad.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/tree.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/tree.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/tree.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/tree.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/verticalGroup.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/verticalGroup.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/verticalGroup.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/verticalGroup.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/basicColorPicker.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/basicColorPicker.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/basicColorPicker.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/basicColorPicker.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/collapsibleWidget.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/collapsibleWidget.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/collapsibleWidget.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/collapsibleWidget.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/colorPicker.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/colorPicker.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/colorPicker.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/colorPicker.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/dragPane.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/dragPane.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/dragPane.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/dragPane.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/draggable.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/draggable.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/draggable.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/draggable.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/fixedSizeGridGroup.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/fixedSizeGridGroup.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/fixedSizeGridGroup.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/fixedSizeGridGroup.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/floatingGroup.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/floatingGroup.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/floatingGroup.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/floatingGroup.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/formValidator.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/formValidator.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/formValidator.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/formValidator.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/gridGroup.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/gridGroup.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/gridGroup.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/gridGroup.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/horizontalFlow.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/horizontalFlow.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/horizontalFlow.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/horizontalFlow.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/linkLabel.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/linkLabel.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/linkLabel.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/linkLabel.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/listView.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/listView.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/listView.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/listView.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/menu.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/menu.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/menu.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/menu.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/radioButton.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/radioButton.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/radioButton.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/radioButton.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/separator.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/separator.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/separator.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/separator.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/spinner.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/spinner.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/spinner.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/spinner.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/tabbedPane.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/tabbedPane.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/tabbedPane.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/tabbedPane.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/toast.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/toast.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/toast.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/toast.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/tooltip.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/tooltip.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/tooltip.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/tooltip.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/validatableTextField.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/validatableTextField.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/validatableTextField.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/validatableTextField.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/verticalFlow.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/verticalFlow.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/vis/verticalFlow.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/vis/verticalFlow.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/while.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/while.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/while.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/while.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/examples/window.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/window.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/examples/window.lml rename to examples/gdx-lml-vis-tests/assets/templates/examples/window.lml diff --git a/examples/gdx-lml-vis-tests/core/assets/templates/main.lml b/examples/gdx-lml-vis-tests/assets/templates/main.lml similarity index 100% rename from examples/gdx-lml-vis-tests/core/assets/templates/main.lml rename to examples/gdx-lml-vis-tests/assets/templates/main.lml diff --git a/examples/gdx-lml-vis-tests/build.gradle b/examples/gdx-lml-vis-tests/build.gradle index 6ea2c57e..cc8c80a6 100644 --- a/examples/gdx-lml-vis-tests/build.gradle +++ b/examples/gdx-lml-vis-tests/build.gradle @@ -1,67 +1,40 @@ buildscript { - repositories { - mavenLocal() - mavenCentral() - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } - jcenter() - } - dependencies { - classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6' - } + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + } + dependencies { + classpath "com.badlogicgames.gdx:gdx-tools:$gdxVersion" + classpath "de.richsource.gradle.plugins:gwt-gradle-plugin:$gwtPluginVersion" + } } allprojects { - apply plugin: "eclipse" - apply plugin: "idea" - - version = libVersion - ext.appName = 'gdx-lml-vis-tests' - - repositories { - mavenLocal() - mavenCentral() - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } - maven { url "https://oss.sonatype.org/content/repositories/releases/" } - } + apply plugin: 'eclipse' + apply plugin: 'idea' } -project(":desktop") { - apply plugin: "java" - - dependencies { - compile project(":core") - compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" - compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" - } +configure(subprojects) { + apply plugin: 'java' + sourceCompatibility = 1.6 } -project(":html") { - apply plugin: "gwt" - apply plugin: "war" - - dependencies { - compile project(":core") - compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" - compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources" - compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources" - compile "com.github.czyzby:gdx-kiwi:$libVersion:sources" - compile "com.github.czyzby:gdx-lml:$libVersion:sources" - compile "com.github.czyzby:gdx-lml-vis:$libVersion:sources" - compile "com.kotcrab.vis:vis-ui:$visVersion:sources" - } -} - -project(":core") { - apply plugin: "java" - - dependencies { - compile "com.github.czyzby:gdx-lml-vis:$libVersion" - compile "com.badlogicgames.gdx:gdx:$gdxVersion" - } +subprojects { + version = libVersion + ext.appName = 'gdx-lml-vis-tests' + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + } } +// Clearing Eclipse project data in root folder: tasks.eclipse.doLast { - delete ".project" - delete ".classpath" - delete ".settings/" + delete '.project' + delete '.classpath' + delete '.settings/' } diff --git a/examples/gdx-lml-vis-tests/core/build.gradle b/examples/gdx-lml-vis-tests/core/build.gradle index 03cd1bea..95f4c5ca 100644 --- a/examples/gdx-lml-vis-tests/core/build.gradle +++ b/examples/gdx-lml-vis-tests/core/build.gradle @@ -1,11 +1,8 @@ -apply plugin: "java" - -sourceCompatibility = 1.6 [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' +eclipse.project.name = appName + '-core' -sourceSets.main.java.srcDirs = [ "src/" ] - - -eclipse.project { - name = appName + "-core" +dependencies { + compile "com.badlogicgames.gdx:gdx:$gdxVersion" + compile "com.github.czyzby:gdx-lml-vis:$libVersion" } + diff --git a/examples/gdx-lml-vis-tests/core/src/Main.gwt.xml b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml similarity index 100% rename from examples/gdx-lml-vis-tests/core/src/Main.gwt.xml rename to examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml diff --git a/examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/Main.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java similarity index 99% rename from examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/Main.java rename to examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java index ad098a31..50c583f3 100644 --- a/examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -53,7 +53,7 @@ public class Main extends AbstractApplicationListener { "actorMacro", "anyNotNull", "argument", "argumentReplace", "assign", "calculate", "changeListenerMacro", "clickListenerMacro", "comment", "conditional", "evaluate", "exception", "forEach", "import", "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", "newTag", "nullCheck", - "tableCell", "tableColumn", "tableRow", "while", + "random", "tableCell", "tableColumn", "tableRow", "while", // Custom elements: "customAttribute", "customMacro", "customTag", // Vis unique tags: diff --git a/examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/ButtonManager.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/ButtonManager.java similarity index 100% rename from examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/ButtonManager.java rename to examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/ButtonManager.java diff --git a/examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/CustomActionContainer.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/CustomActionContainer.java similarity index 100% rename from examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/CustomActionContainer.java rename to examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/CustomActionContainer.java diff --git a/examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/MainView.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java similarity index 100% rename from examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/MainView.java rename to examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java diff --git a/examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java similarity index 100% rename from examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java rename to examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/BlinkingLabel.java diff --git a/examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java similarity index 100% rename from examples/gdx-lml-vis-tests/core/src/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java rename to examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java diff --git a/examples/gdx-lml-vis-tests/desktop/build.gradle b/examples/gdx-lml-vis-tests/desktop/build.gradle index 1a27d823..4dd3c2f1 100644 --- a/examples/gdx-lml-vis-tests/desktop/build.gradle +++ b/examples/gdx-lml-vis-tests/desktop/build.gradle @@ -1,47 +1,24 @@ -apply plugin: "java" +apply plugin: 'application' -sourceCompatibility = 1.6 -sourceSets.main.java.srcDirs = [ "src/" ] -sourceSets.main.resources.srcDirs = [ "../core/assets/" ] +sourceSets.main.resources.srcDirs += [ rootProject.file('assets').absolutePath ] +mainClassName = 'com.github.czyzby.tests.desktop.DesktopLauncher' +eclipse.project.name = appName + '-desktop' +sourceCompatibility = 1.7 -project.ext.mainClassName = "com.github.czyzby.tests.desktop.DesktopLauncher" -project.ext.assetsDir = new File("../core/assets"); - -task run(dependsOn: classes, type: JavaExec) { - main = project.mainClassName - classpath = sourceSets.main.runtimeClasspath - standardInput = System.in - workingDir = project.assetsDir - ignoreExitValue = true -} - -task dist(type: Jar) { - from files(sourceSets.main.output.classesDir) - from files(sourceSets.main.output.resourcesDir) - from {configurations.compile.collect {zipTree(it)}} - from files(project.assetsDir); - - manifest { - attributes 'Main-Class': project.mainClassName - } +dependencies { + compile project(':core') + compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" } -dist.dependsOn classes - -eclipse { - project { - name = appName + "-desktop" - linkedResource name: 'assets', type: '2', location: 'PARENT-1-PROJECT_LOC/core/assets' - } +jar { + archiveName "${appName}-${version}.jar" + from { configurations.compile.collect { zipTree(it) } } + manifest { + attributes 'Main-Class': project.mainClassName + } } -task afterEclipseImport(description: "Post processing after project generation", group: "IDE") { - doLast { - def classpath = new XmlParser().parse(file(".classpath")) - new Node(classpath, "classpathentry", [ kind: 'src', path: 'assets' ]); - def writer = new FileWriter(file(".classpath")) - def printer = new XmlNodePrinter(new PrintWriter(writer)) - printer.setPreserveWhitespace(true) - printer.print(classpath) - } +run { + ignoreExitValue = true } diff --git a/examples/gdx-lml-vis-tests/desktop/src/com/github/czyzby/tests/desktop/DesktopLauncher.java b/examples/gdx-lml-vis-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java similarity index 100% rename from examples/gdx-lml-vis-tests/desktop/src/com/github/czyzby/tests/desktop/DesktopLauncher.java rename to examples/gdx-lml-vis-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java diff --git a/examples/gdx-lml-vis-tests/gradle.properties b/examples/gdx-lml-vis-tests/gradle.properties index 083d786c..3a4c04a7 100644 --- a/examples/gdx-lml-vis-tests/gradle.properties +++ b/examples/gdx-lml-vis-tests/gradle.properties @@ -7,3 +7,4 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 diff --git a/examples/gdx-lml-vis-tests/gradle/wrapper/gradle-wrapper.jar b/examples/gdx-lml-vis-tests/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..ca78035ef0501d802d4fc55381ef2d5c3ce0ec6e GIT binary patch literal 53556 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�H$uJM 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/examples/gdx-lml-vis-tests/gradlew.bat b/examples/gdx-lml-vis-tests/gradlew.bat new file mode 100755 index 00000000..f6d5974e --- /dev/null +++ b/examples/gdx-lml-vis-tests/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/gdx-lml-vis-tests/gwt/build.gradle b/examples/gdx-lml-vis-tests/gwt/build.gradle new file mode 100644 index 00000000..1bd8b16a --- /dev/null +++ b/examples/gdx-lml-vis-tests/gwt/build.gradle @@ -0,0 +1,75 @@ +apply plugin: 'gwt' +apply plugin: 'war' +apply plugin: 'jetty' + +gwt { + gwtVersion = gwtFrameworkVersion // Should match the version used for building the GWT backend. See gradle.properties. + maxHeapSize = '1G' // Default 256m is not enough for the GWT compiler. GWT is HUNGRY. + minHeapSize = '1G' + + src = files(file('src/main/java')) // Needs to be in front of "modules" below. + modules 'com.github.czyzby.tests.GdxDefinition' + devModules 'com.github.czyzby.tests.GdxDefinitionSuperdev' + project.webAppDirName = 'webapp' + + compiler { + strict = true + enableClosureCompiler = true + disableCastChecking = true + } +} + +dependencies { + compile project(':core') + compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources" + compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources" + compile "com.github.czyzby:gdx-lml-vis:$libVersion:sources" + compile "com.github.czyzby:gdx-lml:$libVersion:sources" + compile "com.github.czyzby:gdx-kiwi:$libVersion:sources" + compile "com.kotcrab.vis:vis-ui:$visVersion:sources" +} + +task draftRun(type: JettyRunWar) { + dependsOn draftWar + dependsOn.remove('war') + webApp = draftWar.archivePath + daemon = true +} + +task superDev(type: de.richsource.gradle.plugins.gwt.GwtSuperDev) { + dependsOn draftRun + doFirst { + gwt.modules = gwt.devModules + } +} + +task dist(dependsOn: [clean, compileGwt]) { + doLast { + file("build/dist").mkdirs() + copy { + from "build/gwt/out" + into "build/dist" + } + copy { + from "webapp" + into "build/dist" + } + copy { + from "war" + into "build/dist" + } + } +} + +draftWar { + from "war" +} + +task addSource << { + sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs) +} + +tasks.compileGwt.dependsOn(addSource) +tasks.draftCompileGwt.dependsOn(addSource) +eclipse.project.name = appName + '-gwt' diff --git a/examples/gdx-lml-vis-tests/html/src/com/github/czyzby/tests/GdxDefinition.gwt.xml b/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml similarity index 76% rename from examples/gdx-lml-vis-tests/html/src/com/github/czyzby/tests/GdxDefinition.gwt.xml rename to examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml index 5d6b0162..152fd41b 100644 --- a/examples/gdx-lml-vis-tests/html/src/com/github/czyzby/tests/GdxDefinition.gwt.xml +++ b/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml @@ -4,8 +4,8 @@ - + - + diff --git a/examples/gdx-lml-vis-tests/html/src/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml b/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml similarity index 100% rename from examples/gdx-lml-vis-tests/html/src/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml rename to examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml diff --git a/examples/gdx-lml-vis-tests/html/src/com/github/czyzby/tests/client/HtmlLauncher.java b/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/client/HtmlLauncher.java similarity index 100% rename from examples/gdx-lml-vis-tests/html/src/com/github/czyzby/tests/client/HtmlLauncher.java rename to examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/client/HtmlLauncher.java diff --git a/examples/gdx-lml-vis-tests/html/webapp/WEB-INF/web.xml b/examples/gdx-lml-vis-tests/gwt/webapp/WEB-INF/web.xml similarity index 100% rename from examples/gdx-lml-vis-tests/html/webapp/WEB-INF/web.xml rename to examples/gdx-lml-vis-tests/gwt/webapp/WEB-INF/web.xml diff --git a/examples/gdx-lml-tests/html/webapp/index.html b/examples/gdx-lml-vis-tests/gwt/webapp/index.html similarity index 96% rename from examples/gdx-lml-tests/html/webapp/index.html rename to examples/gdx-lml-vis-tests/gwt/webapp/index.html index ed990d1d..43d7e5c5 100644 --- a/examples/gdx-lml-tests/html/webapp/index.html +++ b/examples/gdx-lml-vis-tests/gwt/webapp/index.html @@ -1,7 +1,7 @@ - gdx-lml-tests + LibGDX application diff --git a/examples/gdx-lml-vis-tests/html/webapp/refresh.png b/examples/gdx-lml-vis-tests/gwt/webapp/refresh.png similarity index 100% rename from examples/gdx-lml-vis-tests/html/webapp/refresh.png rename to examples/gdx-lml-vis-tests/gwt/webapp/refresh.png diff --git a/examples/gdx-lml-vis-tests/html/webapp/soundmanager2-jsmin.js b/examples/gdx-lml-vis-tests/gwt/webapp/soundmanager2-jsmin.js similarity index 100% rename from examples/gdx-lml-vis-tests/html/webapp/soundmanager2-jsmin.js rename to examples/gdx-lml-vis-tests/gwt/webapp/soundmanager2-jsmin.js diff --git a/examples/gdx-lml-vis-tests/html/webapp/soundmanager2-setup.js b/examples/gdx-lml-vis-tests/gwt/webapp/soundmanager2-setup.js similarity index 100% rename from examples/gdx-lml-vis-tests/html/webapp/soundmanager2-setup.js rename to examples/gdx-lml-vis-tests/gwt/webapp/soundmanager2-setup.js diff --git a/examples/gdx-lml-vis-tests/html/webapp/styles.css b/examples/gdx-lml-vis-tests/gwt/webapp/styles.css similarity index 100% rename from examples/gdx-lml-vis-tests/html/webapp/styles.css rename to examples/gdx-lml-vis-tests/gwt/webapp/styles.css diff --git a/examples/gdx-lml-vis-tests/html/build.gradle b/examples/gdx-lml-vis-tests/html/build.gradle deleted file mode 100644 index 75359c18..00000000 --- a/examples/gdx-lml-vis-tests/html/build.gradle +++ /dev/null @@ -1,70 +0,0 @@ -apply plugin: "java" -apply plugin: "jetty" - -gwt { - gwtVersion='2.6.0' // Should match the gwt version used for building the gwt backend - maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY - minHeapSize="1G" - - src = files(file("src/")) // Needs to be in front of "modules" below. - modules 'com.github.czyzby.tests.GdxDefinition' - devModules 'com.github.czyzby.tests.GdxDefinitionSuperdev' - project.webAppDirName = 'webapp' - - compiler { - strict = true; - enableClosureCompiler = true; - disableCastChecking = true; - } -} - -task draftRun(type: JettyRunWar) { - dependsOn draftWar - dependsOn.remove('war') - webApp=draftWar.archivePath - daemon=true -} - -task superDev(type: de.richsource.gradle.plugins.gwt.GwtSuperDev) { - dependsOn draftRun - doFirst { - gwt.modules = gwt.devModules - } -} - -task dist(dependsOn: [clean, compileGwt]) { - doLast { - file("build/dist").mkdirs() - copy { - from "build/gwt/out" - into "build/dist" - } - copy { - from "webapp" - into "build/dist" - } - copy { - from "war" - into "build/dist" - } - } -} - -draftWar { - from "war" -} - -task addSource << { - sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs) -} - -tasks.compileGwt.dependsOn(addSource) -tasks.draftCompileGwt.dependsOn(addSource) - -sourceCompatibility = 1.6 -sourceSets.main.java.srcDirs = [ "src/" ] - - -eclipse.project { - name = appName + "-html" -} diff --git a/examples/gdx-lml-vis-tests/settings.gradle b/examples/gdx-lml-vis-tests/settings.gradle index 7c74fc5e..b2801262 100644 --- a/examples/gdx-lml-vis-tests/settings.gradle +++ b/examples/gdx-lml-vis-tests/settings.gradle @@ -1 +1 @@ -include 'desktop', 'html', 'core' \ No newline at end of file +include 'desktop', 'core', 'gwt' diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java index c75e8844..01ab1a36 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java @@ -93,10 +93,10 @@ public void create() { context.scan(root); doAfterScan(); super.create(); - setStageViewport(); final LmlParser parser = getParser(); parser.getData().setDefaultPreferences(ApplicationPreferences.getPreferences()); i18nBundleProvider.fill(parser); + setStageViewport(); setFirstView(); } diff --git a/lml/README.md b/lml/README.md index 1a073893..68095358 100644 --- a/lml/README.md +++ b/lml/README.md @@ -32,6 +32,10 @@ If you want to use LML with GWT, you have to add this module to your `GdxDefinit ## What's new +1.7 -> 1.8 + +- Added `<:random>` macro, which allows to choose a random value from the passed array. + 1.6 -> 1.7 - A new mechanism - isolation - was introduced through `` tag. Isolated actors are parsed along with the rest of the templates, but are not immediately added to stage or they tag parents. This basically allows to create actors with LML without adding them to the stage - something that previously wasn't achievable with `fillStage` or `createView` methods. `ActorStorage` is an `Actor` extension that keeps track of a list of actors, but does not draw them in any way: this actor is used internally by isolation tags and can be injected if you want to access the list of its parsed children actors. diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java index 9b945949..fff4642f 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java @@ -282,6 +282,7 @@ import com.github.czyzby.lml.parser.impl.tag.macro.provider.NewAttributeLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.NewTagLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.NullCheckLmlMacroTagProvider; +import com.github.czyzby.lml.parser.impl.tag.macro.provider.RandomLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableCellLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableColumnLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableRowLmlMacroTagProvider; @@ -387,6 +388,7 @@ protected void registerMacroTags() { addMacroTagProvider(new NewAttributeLmlMacroTagProvider(), "newAttribute", "attribute"); addMacroTagProvider(new NewTagLmlMacroTagProvider(), "newTag", "tag"); addMacroTagProvider(new NullCheckLmlMacroTagProvider(), "notNull", "ifNotNull", "exists"); + addMacroTagProvider(new RandomLmlMacroTagProvider(), "random"); addMacroTagProvider(new TableCellLmlMacroTagProvider(), "cell", "tableCell"); addMacroTagProvider(new TableColumnLmlMacroTagProvider(), "column", "tableColumn"); addMacroTagProvider(new TableRowLmlMacroTagProvider(), "row", "tableRow"); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/AssignLmlMacroTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/AssignLmlMacroTag.java index 6b973560..219332dc 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/AssignLmlMacroTag.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/AssignLmlMacroTag.java @@ -28,6 +28,17 @@ * Of course, data between assignment macro tags can contain any other tags (including nested assign macros) and can be * used to effectively assign template parts to convenient-to-use arguments. * + *

+ * Assignment macro supports optional named attributes:

+ * + *
+ * <:assign key="arg0" value="Value"/>
+ * <:assign key="arg1" value="Complex value with many parts."/>
+ * <:assign key="arg2">Data between macro tags.</:assign>
+ * 
+ * + *
+ * * @author MJ */ public class AssignLmlMacroTag extends AbstractMacroLmlTag { /** Optional name of the first attribute: name of the argument to set. */ @@ -106,15 +117,21 @@ protected String getArgumentValueFromAttributes() { return attributes.get(1); } final StringBuilder builder = new StringBuilder(); + final char separator = getAttributeSeparator(); for (int index = 1, length = GdxArrays.sizeOf(attributes); index < length; index++) { if (builder.length() > 0) { - builder.append(' '); + builder.append(separator); } builder.append(attributes.get(index)); } return builder.toString(); } + /** @return character will be used to separate multiple macro attributes. */ + protected char getAttributeSeparator() { + return ' '; + } + @Override public String[] getExpectedAttributes() { return new String[] { KEY_ATTRIBUTE, VALUE_ATTRIBUTE }; diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/RandomLmlMacroTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/RandomLmlMacroTag.java new file mode 100644 index 00000000..169bc30e --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/RandomLmlMacroTag.java @@ -0,0 +1,119 @@ +package com.github.czyzby.lml.parser.impl.tag.macro; + +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.utils.Array; +import com.github.czyzby.kiwi.util.common.Nullables; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.LmlSyntax; +import com.github.czyzby.lml.parser.action.ActorConsumer; +import com.github.czyzby.lml.parser.tag.LmlTag; + +/** Allows to assign LML parser arguments from within LML templates. Arguments will be available after macro evaluation + * with the given name, by default: {accessedLikeThis}. First macro attribute is the name of the argument to assign. + * Other arguments will be joined to an array and a random value will be extracted. Alternatively, argument value can be + * the data between macro tags. For example:
+ * + *
+ * <:random key Random;Value/>
+ * <:random key Random  Value./>
+ * <:random key>Random;Value</:assign>
+ * 
+ * + *
All of these macro invocations would use assign either "Random" or "Value" to "key" argument. + *

+ * Assignment macro supports optional named attributes:

+ * + *
+ * <:assign key="name" value="Random;Value"/>
+ * <:assign key="name">Random;Value</:assign>
+ * 
+ * + *
+ * + * @author MJ */ +public class RandomLmlMacroTag extends AssignLmlMacroTag { + public RandomLmlMacroTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { + super(parser, parentTag, rawTagData); + } + + @Override + protected String processArgumentValue(final CharSequence argumentValue) { + final String[] arguments = Strings.split(argumentValue, getParser().getSyntax().getArrayElementSeparator()); + if (arguments.length == 0) { + return Strings.EMPTY_STRING; + } + String argument; + if (arguments.length == 1) { + argument = arguments[0]; + } else { + argument = arguments[MathUtils.random(0, arguments.length - 1)]; + } + return extractRandomValue(argument); + } + + /** @param argument random array element. + * @return random range value (if range) or random result value (if method) or the passed element (if + * unparseable). */ + protected String extractRandomValue(final String argument) { + final LmlSyntax syntax = getParser().getSyntax(); + if (Strings.startsWith(argument, syntax.getMethodInvocationMarker())) { + // Action: + final ActorConsumer action = getParser().parseAction(argument, getActor()); + if (action == null) { + getParser().throwError("Unable to find action for ID: " + argument); + } + return extractRandomObject(action.consume(getActor())); + } // Range or plain: + final int openingIndex = argument.indexOf(syntax.getRangeArrayOpening()); + if (Strings.isCharacterAbsent(openingIndex)) { + return argument; // Plain. + } + final int separatorIndex = argument.indexOf(syntax.getRangeArraySeparator()); + if (Strings.isCharacterAbsent(separatorIndex) || separatorIndex < openingIndex) { + return argument; // Plain. + } + final int closingIndex = argument.indexOf(syntax.getRangeArrayClosing()); + if (Strings.isCharacterAbsent(closingIndex) || closingIndex < separatorIndex || closingIndex < openingIndex) { + return argument; // Plain. + } + // Range: + final String rangeBase = argument.substring(0, openingIndex); + int rangeStart = getRangeValue(argument.substring(openingIndex + 1, separatorIndex)); + int rangeEnd = getRangeValue(argument.substring(separatorIndex + 1, closingIndex)); + if (rangeStart > rangeEnd) { + final int temp = rangeStart; + rangeStart = rangeEnd; + rangeEnd = temp; + } + return rangeBase + MathUtils.random(rangeStart, rangeEnd); + } + + /** @param rawData raw string data of range start or end. Expected to be a number (or a value that can be parsed + * into an int). + * @return parsed value of the range. */ + protected int getRangeValue(final String rawData) { + if (Strings.isInt(rawData)) { + return Integer.parseInt(rawData); + } + return getParser().parseInt(rawData, getActor()); + } + + /** @param result method result. + * @return random element (if a collection) or result to string. */ + protected String extractRandomObject(final Object result) { + if (result instanceof Object[]) { + final Object[] array = (Object[]) result; + return Nullables.toString(array[MathUtils.random(0, array.length - 1)]); + } else if (result instanceof Array) { + return Nullables.toString(((Array) result).random()); + } + return Nullables.toString(result); + } + + @Override + protected char getAttributeSeparator() { + return getParser().getSyntax().getArrayElementSeparator(); + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/RandomLmlMacroTagProvider.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/RandomLmlMacroTagProvider.java new file mode 100644 index 00000000..07a078e6 --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/RandomLmlMacroTagProvider.java @@ -0,0 +1,16 @@ +package com.github.czyzby.lml.parser.impl.tag.macro.provider; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.macro.RandomLmlMacroTag; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.parser.tag.LmlTagProvider; + +/** Provides random macro tag. + * + * @author MJ */ +public class RandomLmlMacroTagProvider implements LmlTagProvider { + @Override + public LmlTag create(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { + return new RandomLmlMacroTag(parser, parentTag, rawTagData); + } +} From c3f982fb58000fbbd244120df15bf130b17c1158 Mon Sep 17 00:00:00 2001 From: MJ Date: Fri, 3 Jun 2016 21:47:48 +0200 Subject: [PATCH 06/58] Tests projects clean-up. --- examples/gdx-autumn-mvc-simple/gradle.properties | 2 ++ examples/gdx-autumn-tests/gradle.properties | 2 ++ .../core/src/main/java/com/github/czyzby/tests/Main.gwt.xml | 2 +- examples/gdx-lml-tests/gradle.properties | 1 + .../src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml | 2 +- .../core/src/main/java/com/github/czyzby/tests/Main.gwt.xml | 2 +- examples/gdx-lml-vis-tests/gradle.properties | 1 + examples/gdx-lml-vis-websocket/gradle.properties | 2 ++ examples/gdx-lml-vis-wiki/gradle.properties | 2 ++ examples/gdx-websocket-json/gradle.properties | 2 ++ examples/gdx-websocket-serialization-compare/gradle.properties | 2 ++ examples/gdx-websocket-serialization-tests/gradle.properties | 2 ++ examples/gdx-websocket-tests/gradle.properties | 2 ++ examples/gradle.properties | 2 ++ 14 files changed, 23 insertions(+), 3 deletions(-) diff --git a/examples/gdx-autumn-mvc-simple/gradle.properties b/examples/gdx-autumn-mvc-simple/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-autumn-mvc-simple/gradle.properties +++ b/examples/gdx-autumn-mvc-simple/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-autumn-tests/gradle.properties b/examples/gdx-autumn-tests/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-autumn-tests/gradle.properties +++ b/examples/gdx-autumn-tests/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml index 10b1aa77..5f3ef620 100644 --- a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml +++ b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/examples/gdx-lml-tests/gradle.properties b/examples/gdx-lml-tests/gradle.properties index 3a4c04a7..fe473aa3 100644 --- a/examples/gdx-lml-tests/gradle.properties +++ b/examples/gdx-lml-tests/gradle.properties @@ -8,3 +8,4 @@ visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml b/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml index b4d4c035..8eacfd29 100644 --- a/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml +++ b/examples/gdx-lml-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml @@ -4,7 +4,7 @@ - + diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml index 10b1aa77..5f3ef620 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.gwt.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/gradle.properties b/examples/gdx-lml-vis-tests/gradle.properties index 3a4c04a7..fe473aa3 100644 --- a/examples/gdx-lml-vis-tests/gradle.properties +++ b/examples/gdx-lml-vis-tests/gradle.properties @@ -8,3 +8,4 @@ visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-lml-vis-websocket/gradle.properties b/examples/gdx-lml-vis-websocket/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-lml-vis-websocket/gradle.properties +++ b/examples/gdx-lml-vis-websocket/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-lml-vis-wiki/gradle.properties b/examples/gdx-lml-vis-wiki/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-lml-vis-wiki/gradle.properties +++ b/examples/gdx-lml-vis-wiki/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-websocket-json/gradle.properties b/examples/gdx-websocket-json/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-websocket-json/gradle.properties +++ b/examples/gdx-websocket-json/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-websocket-serialization-compare/gradle.properties b/examples/gdx-websocket-serialization-compare/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-websocket-serialization-compare/gradle.properties +++ b/examples/gdx-websocket-serialization-compare/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-websocket-serialization-tests/gradle.properties b/examples/gdx-websocket-serialization-tests/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-websocket-serialization-tests/gradle.properties +++ b/examples/gdx-websocket-serialization-tests/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gdx-websocket-tests/gradle.properties b/examples/gdx-websocket-tests/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gdx-websocket-tests/gradle.properties +++ b/examples/gdx-websocket-tests/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 diff --git a/examples/gradle.properties b/examples/gradle.properties index 083d786c..fe473aa3 100644 --- a/examples/gradle.properties +++ b/examples/gradle.properties @@ -7,3 +7,5 @@ libVersion=1.8.1.9.3-SNAPSHOT visVersion=1.1.1 uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 From de16bfbcff96cf762f1dd83c1db79d1ec17f6d5b Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 4 Jun 2016 10:05:30 +0200 Subject: [PATCH 07/58] Particle effects can reference atlases. Default I18N bundle setting. --- .../czyzby/lml/uedi/LmlApplication.java | 7 ++--- .../uedi/assets/ParticleEffectProvider.java | 27 ++++++++++++++++++- .../assets/impl/AbstractAssetProvider.java | 5 ++++ .../lml/uedi/i18n/I18NBundleProvider.java | 19 +++++++++++++ .../lml/uedi/i18n/LocalePreference.java | 2 +- .../uedi/preferences/PreferenceProvider.java | 1 + .../{ => impl}/AbstractPreference.java | 2 +- 7 files changed, 57 insertions(+), 6 deletions(-) rename lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/{ => impl}/AbstractPreference.java (95%) diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java index 01ab1a36..4e4e2609 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java @@ -135,7 +135,7 @@ protected void setFirstView() { } setCurrentView(null); initiateView(firstView); - setView(firstView); + setView(firstView, null); } @Override @@ -307,7 +307,7 @@ public void reloadView(final AbstractLmlView lmlView) { } view.setStage(null); view.clearActors(); - getParser().createView(view, view.getTemplateFile()); + view.addActors(getParser().createView(view, view.getTemplateFile())); view.setStage(stage); if (isCurrent) { view.show(); @@ -325,8 +325,9 @@ public void dispose() { if (context != null) { try { context.destroy(); + ApplicationPreferences.saveAllPreferences(); } catch (final Exception exception) { - Gdx.app.log(Lml.LOGGER_TAG, "Unable to destroy the context.", exception); + Gdx.app.error(Lml.LOGGER_TAG, "Unable to destroy the context.", exception); } } } diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java index 14707c4a..2bf4ca2a 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/ParticleEffectProvider.java @@ -1,6 +1,9 @@ package com.github.czyzby.lml.uedi.assets; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.assets.loaders.ParticleEffectLoader.ParticleEffectParameter; import com.badlogic.gdx.graphics.g2d.ParticleEffect; +import com.github.czyzby.kiwi.util.common.Strings; import com.github.czyzby.lml.uedi.assets.impl.AbstractAssetProvider; import com.github.czyzby.lml.uedi.assets.impl.InjectingAssetManager; @@ -9,7 +12,6 @@ * @author MJ */ public class ParticleEffectProvider extends AbstractAssetProvider { public static final String[] EXTENSIONS = new String[] { "p", "pfx" }; - // TODO $ to separate name from atlas /** @param assetManager will be used to load the assets. */ public ParticleEffectProvider(final InjectingAssetManager assetManager) { @@ -21,6 +23,29 @@ public Class getType() { return ParticleEffect.class; } + @Override + public ParticleEffect getOrLoad(final String id) { + final String[] data = Strings.split(id, '$'); + if (data.length == 0) { + throwUnknownPathException(); + } + final String path = determinePath(data[0]); + getIdsToPaths().put(id, path); + final AssetManager assetManager = getAssetManager(); + if (assetManager.isLoaded(path)) { + return assetManager.get(path, getType()); + } + if (data.length > 1) { + final String atlasName = TextureAtlasProvider.getTextureAtlasPath(data[1]); + final ParticleEffectParameter parameters = new ParticleEffectParameter(); + parameters.atlasFile = atlasName; + assetManager.load(path, ParticleEffect.class, parameters); + } else { + assetManager.load(path, ParticleEffect.class); + } + return null; + } + @Override protected String getFolder() { return "effect"; diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java index 17314c97..3a9a648d 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractAssetProvider.java @@ -51,6 +51,11 @@ public Asset provide(final Object target, final Member member) { return asset; } + /** @return internal map used to store file paths mapped to their asset IDs. */ + protected ObjectMap getIdsToPaths() { + return idsToPaths; + } + /** @throws GdxRuntimeException on each call. */ protected void throwUnknownPathException() { throw new GdxRuntimeException("Unable to determine asset path."); diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java index 6e8fbd28..8329b533 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java @@ -25,12 +25,15 @@ * * @author MJ */ public class I18NBundleProvider extends AbstractAssetProvider { + /** This is the initial default bundle name, which will be set as the main bundle in {@link LmlParser}. */ + public static final String DEFAULT_BUNDLE = "nls"; public static final String[] EXTENSIONS = new String[] { "" }; private final ObjectMap bundles = GdxMaps.newObjectMap(); private final ObjectMap> bundlesData = LazyObjectMap.newMapOfArrays(); private LocalePreference localePreference; private LmlParser parser; private String encoding = "UTF-8"; + private String defaultBundle = DEFAULT_BUNDLE; /** @param assetManager will be used to load the textures. */ public I18NBundleProvider(final InjectingAssetManager assetManager) { @@ -47,6 +50,16 @@ public LocalePreference getLocalePreference() { return localePreference; } + /** @return default bundle name, which will be set as the main bundle in {@link LmlParser}. */ + public String getDefaultBundle() { + return defaultBundle; + } + + /** @param defaultBundle default bundle name, which will be set as the main bundle in {@link LmlParser}. */ + public void setDefaultBundle(final String defaultBundle) { + this.defaultBundle = defaultBundle; + } + @Override public I18NBundle provide(final Object target, final Member member) { if (member == null) { @@ -114,6 +127,9 @@ public void fill(final LmlParser parser) { this.parser = parser; for (final Entry bundle : bundles) { parser.getData().addI18nBundle(bundle.key, bundle.value); + if (defaultBundle.equals(bundle.key)) { + parser.getData().setDefaultI18nBundle(bundle.value); + } } } @@ -141,6 +157,9 @@ public void reloadBundles(final Locale locale) { injection.inject(bundle); } parser.getData().addI18nBundle(id, bundle); + if (defaultBundle.equals(id)) { + parser.getData().setDefaultI18nBundle(bundle); + } } } diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java index 80b3b71e..e029d246 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/LocalePreference.java @@ -5,7 +5,7 @@ import com.github.czyzby.kiwi.util.common.Strings; import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; -import com.github.czyzby.lml.uedi.preferences.AbstractPreference; +import com.github.czyzby.lml.uedi.preferences.impl.AbstractPreference; import com.github.czyzby.uedi.stereotype.Provider; /** Manages application's locale preference. Reloads i18n bundles on preference change. diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java index f6fb512e..aee15571 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/PreferenceProvider.java @@ -3,6 +3,7 @@ import java.lang.reflect.Member; import com.badlogic.gdx.Preferences; +import com.github.czyzby.lml.uedi.preferences.impl.AbstractPreference; import com.github.czyzby.uedi.stereotype.Property; import com.github.czyzby.uedi.stereotype.impl.PropertyProvider; diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/AbstractPreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/impl/AbstractPreference.java similarity index 95% rename from lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/AbstractPreference.java rename to lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/impl/AbstractPreference.java index f2646dab..f92211d4 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/AbstractPreference.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/preferences/impl/AbstractPreference.java @@ -1,4 +1,4 @@ -package com.github.czyzby.lml.uedi.preferences; +package com.github.czyzby.lml.uedi.preferences.impl; import com.badlogic.gdx.Preferences; import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; From a8152252762bdd7c0bf6d0146231fe21433508ce Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 4 Jun 2016 10:40:02 +0200 Subject: [PATCH 08/58] Added sounds support. --- .../czyzby/lml/uedi/LmlApplication.java | 26 +++- .../lml/uedi/music/MusicOnPreference.java | 13 ++ .../czyzby/lml/uedi/music/MusicService.java | 127 +++++++++++++++++- .../lml/uedi/music/MusicVolumePreference.java | 13 ++ .../lml/uedi/music/SoundOnPreference.java | 13 ++ .../lml/uedi/music/SoundVolumePreference.java | 13 ++ .../music/impl/AbstractPercentPreference.java | 46 +++++++ .../music/impl/AbstractTogglePreference.java | 50 +++++++ 8 files changed, 298 insertions(+), 3 deletions(-) create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicOnPreference.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicVolumePreference.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundOnPreference.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundVolumePreference.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractPercentPreference.java create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractTogglePreference.java diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java index 4e4e2609..31aa1512 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java @@ -36,6 +36,11 @@ import com.github.czyzby.lml.uedi.i18n.LocalePreference; import com.github.czyzby.lml.uedi.impl.LmlContext; import com.github.czyzby.lml.uedi.logger.LoggerProvider; +import com.github.czyzby.lml.uedi.music.MusicOnPreference; +import com.github.czyzby.lml.uedi.music.MusicService; +import com.github.czyzby.lml.uedi.music.MusicVolumePreference; +import com.github.czyzby.lml.uedi.music.SoundOnPreference; +import com.github.czyzby.lml.uedi.music.SoundVolumePreference; import com.github.czyzby.lml.uedi.preferences.PreferencesProvider; import com.github.czyzby.lml.uedi.ui.BatchProvider; import com.github.czyzby.lml.uedi.ui.SkinProvider; @@ -205,8 +210,6 @@ protected void addDefaultComponents() { context.addProvider(localePreference); // Logging: context.addProvider(new LoggerProvider()); - // Music: - // TODO music service // Preferences: context.addProvider(new PreferencesProvider()); // UI: @@ -218,12 +221,28 @@ protected void addDefaultComponents() { final StageProvider stageProvider = new StageProvider(spriteBatchProvider.getBatch()); stage = stageProvider.getStage(); context.addProvider(stageProvider); + if (includeMusicService()) { // Music: + final MusicOnPreference musicOn = new MusicOnPreference(); + final SoundOnPreference soundOn = new SoundOnPreference(); + final MusicVolumePreference musicVolume = new MusicVolumePreference(); + final SoundVolumePreference soundVolume = new SoundVolumePreference(); + context.addProperty(musicOn); + context.addProperty(soundOn); + context.addProperty(musicVolume); + context.addProperty(soundVolume); + context.add(new MusicService(stage, musicOn, soundOn, musicVolume, soundVolume)); + } context.setMapSuperTypes(mapSuper); // Application listener: context.add(this); } + /** @return true by default. Override and return false to omit {@link MusicService} in the context. */ + protected boolean includeMusicService() { + return true; + } + @Override protected void addDefaultActions() { super.addDefaultActions(); @@ -251,6 +270,9 @@ public Void consume(final Object actor) { return null; } }); + if (includeMusicService()) { + context.get(MusicService.class).addDefaultActions(data); + } } /** @param view will be immediately set as the current view. Note that this should not be generally used to change diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicOnPreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicOnPreference.java new file mode 100644 index 00000000..94b2134a --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicOnPreference.java @@ -0,0 +1,13 @@ +package com.github.czyzby.lml.uedi.music; + +import com.github.czyzby.lml.uedi.music.impl.AbstractTogglePreference; + +/** Allows to turn the music on and off. + * + * @author MJ */ +public class MusicOnPreference extends AbstractTogglePreference { + @Override + public String getKey() { + return "musicOn"; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java index 42edce51..e6e84ae2 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java @@ -1,8 +1,133 @@ package com.github.czyzby.lml.uedi.music; +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Button; +import com.badlogic.gdx.scenes.scene2d.ui.ProgressBar; +import com.github.czyzby.lml.parser.LmlData; +import com.github.czyzby.lml.parser.action.ActorConsumer; import com.github.czyzby.uedi.stereotype.Singleton; -// TODO implement music service and preferences. +/** Allows to manage music and sounds settings. Eases playing of {@link Music} and {@link Sound} instances. + * + * @author MJ */ public class MusicService implements Singleton { + private final Stage stage; + private final MusicOnPreference musicOn; + private final SoundOnPreference soundOn; + private final MusicVolumePreference musicVolume; + private final SoundVolumePreference soundVolume; + /** @param stage will be used to add music transition actions. + * @param musicOn decides whether music is on. + * @param soundOn decides whether sounds are on. + * @param musicVolume decides how loud the music is played. + * @param soundVolume decides how loud the sounds are played. */ + public MusicService(final Stage stage, final MusicOnPreference musicOn, final SoundOnPreference soundOn, + final MusicVolumePreference musicVolume, final SoundVolumePreference soundVolume) { + this.stage = stage; + this.musicOn = musicOn; + this.soundOn = soundOn; + this.musicVolume = musicVolume; + this.soundVolume = soundVolume; + } + + /** @param data will include a few useful {@link ActorConsumer} instances that allow to set up current music and + * sound preferences. */ + public void addDefaultActions(final LmlData data) { + // Allows to turn the music on and off. + data.addActorConsumer("setMusicOn", new ActorConsumer() { + @Override + public Void consume(final Button actor) { + musicOn.setOn(actor.isChecked()); + return null; + } + }); + // Allows to turn the sounds on and off. + data.addActorConsumer("setSoundOn", new ActorConsumer() { + @Override + public Void consume(final Button actor) { + soundOn.setOn(actor.isChecked()); + return null; + } + }); + // Changes current music volume (aimed at sliders): + data.addActorConsumer("setMusicVolume", new ActorConsumer() { + @Override + public Void consume(final ProgressBar actor) { + musicVolume.setPercent(actor.getValue()); + return null; + } + }); + // Changes current sounds volume (aimed at sliders): + data.addActorConsumer("setSoundVolume", new ActorConsumer() { + @Override + public Void consume(final ProgressBar actor) { + soundVolume.setPercent(actor.getValue()); + return null; + } + }); + } + + /** @return true if sounds are currently on. */ + public boolean isSoundOn() { + return soundOn.isOn(); + } + + /** @param on true to turn on, false to turn off. */ + public void setSoundOn(final boolean on) { + soundOn.setOn(on); + } + + /** @return current sound volume in range of [0, 1]. */ + public float getSoundVolume() { + return soundVolume.getPercent(); + } + + /** @param volume should be in range of [0, 1]. */ + public void setSoundVolume(final float volume) { + soundVolume.setPercent(volume); + } + + /** @param sound will be played with the current volume setting if sounds are turned on. + * @return the id of the sound instance if successful, -1 on failure or if sounds are turned off. */ + public long play(final Sound sound) { + if (soundOn.isOn()) { + return sound.play(soundVolume.getPercent()); + } + return -1L; + } + + /** @param sound will be played if sounds are turned on. + * @param volume the volume in the range of [0,1]. Will multiply current sound volume setting. + * @return the id of the sound instance if successful, -1 on failure or if sounds are turned off. */ + public long play(final Sound sound, final float volume) { + if (soundOn.isOn()) { + return sound.play(soundVolume.getPercent() * volume); + } + return -1L; + } + + /** @param sound will be played if sounds are turned on. + * @param volume the volume in the range of [0,1]. Will multiply current sound volume setting. + * @param pitch the pitch multiplier. 1 stands for default, larger than 1 is faster, smaller than 1 is slower, the + * value should be between 0.5 and 2.0. + * @return the id of the sound instance if successful, -1 on failure or if sounds are turned off. */ + public long play(final Sound sound, final float volume, final float pitch) { + return play(sound, volume, pitch, 0f); + } + + /** @param sound will be played if sounds are turned on. + * @param volume the volume in the range of [0,1]. Will multiply current sound volume setting. + * @param pitch the pitch multiplier. 1 stands for default, larger than 1 is faster, smaller than 1 is slower, the + * value should be between 0.5 and 2.0. + * @param pan panning in the range -1 (full left) to 1 (full right). 0 is the center. + * @return the id of the sound instance if successful, -1 on failure or if sounds are turned off. */ + public long play(final Sound sound, final float volume, final float pitch, final float pan) { + if (soundOn.isOn()) { + return sound.play(soundVolume.getPercent() * volume, pitch, pan); + } + return -1L; + } } diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicVolumePreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicVolumePreference.java new file mode 100644 index 00000000..e9b434be --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicVolumePreference.java @@ -0,0 +1,13 @@ +package com.github.czyzby.lml.uedi.music; + +import com.github.czyzby.lml.uedi.music.impl.AbstractPercentPreference; + +/** Allows to manage current volume of music. + * + * @author MJ */ +public class MusicVolumePreference extends AbstractPercentPreference { + @Override + public String getKey() { + return "musicVolume"; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundOnPreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundOnPreference.java new file mode 100644 index 00000000..6e053dbb --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundOnPreference.java @@ -0,0 +1,13 @@ +package com.github.czyzby.lml.uedi.music; + +import com.github.czyzby.lml.uedi.music.impl.AbstractTogglePreference; + +/** Allows to turn the sounds on and off. + * + * @author MJ */ +public class SoundOnPreference extends AbstractTogglePreference { + @Override + public String getKey() { + return "soundOn"; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundVolumePreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundVolumePreference.java new file mode 100644 index 00000000..eab2e941 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/SoundVolumePreference.java @@ -0,0 +1,13 @@ +package com.github.czyzby.lml.uedi.music; + +import com.github.czyzby.lml.uedi.music.impl.AbstractPercentPreference; + +/** Allows to manage current volume of sounds. + * + * @author MJ */ +public class SoundVolumePreference extends AbstractPercentPreference { + @Override + public String getKey() { + return "soundVolume"; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractPercentPreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractPercentPreference.java new file mode 100644 index 00000000..7e1811e3 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractPercentPreference.java @@ -0,0 +1,46 @@ +package com.github.czyzby.lml.uedi.music.impl; + +import com.badlogic.gdx.Preferences; +import com.badlogic.gdx.math.MathUtils; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.lml.uedi.preferences.impl.AbstractPreference; + +/** Allows to manage a float value in range of [0, 1]. + * + * @author MJ */ +public abstract class AbstractPercentPreference extends AbstractPreference { + private float percent; + + /** Uses default preferences. */ + public AbstractPercentPreference() { + this(ApplicationPreferences.getPreferences()); + } + + /** @param preferences will be used to store the setting. */ + public AbstractPercentPreference(final Preferences preferences) { + super(preferences); + percent = MathUtils.clamp(Float.parseFloat(getValue()), 0f, 1f); + } + + @Override + public String getDefault() { + return String.valueOf(1f); + } + + @Override + public String setValue(final String value) { + percent = MathUtils.clamp(Float.parseFloat(value), 0f, 1f); + return super.setValue(String.valueOf(percent)); + } + + /** @param percent will become current setting value. */ + public void setPercent(final float percent) { + this.percent = MathUtils.clamp(percent, 0f, 1f); + setValue(String.valueOf(this.percent)); + } + + /** @return current preference value. */ + public float getPercent() { + return percent; + } +} diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractTogglePreference.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractTogglePreference.java new file mode 100644 index 00000000..8fb400f4 --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/impl/AbstractTogglePreference.java @@ -0,0 +1,50 @@ +package com.github.czyzby.lml.uedi.music.impl; + +import com.badlogic.gdx.Preferences; +import com.github.czyzby.kiwi.util.gdx.preference.ApplicationPreferences; +import com.github.czyzby.lml.uedi.preferences.impl.AbstractPreference; + +/** Allows to manage a boolean value. + * + * @author MJ */ +public abstract class AbstractTogglePreference extends AbstractPreference { + private boolean on; + + /** Uses default preferences. */ + public AbstractTogglePreference() { + this(ApplicationPreferences.getPreferences()); + } + + /** @param preferences will be used to store the setting. */ + public AbstractTogglePreference(final Preferences preferences) { + super(preferences); + on = Boolean.parseBoolean(getValue()); + } + + @Override + public String getDefault() { + return String.valueOf(true); + } + + @Override + public String setValue(final String value) { + on = Boolean.parseBoolean(value); + return super.setValue(value); + } + + /** @param on turns the setting on or off. */ + public void setOn(final boolean on) { + this.on = on; + setValue(String.valueOf(on)); + } + + /** Sets the current value to its opposite. */ + public void toggle() { + setOn(!on); + } + + /** @return true if the setting is currently on, false if off. */ + public boolean isOn() { + return on; + } +} From 00b39b1e575ab40abf07998c8ab267730128e0e8 Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 4 Jun 2016 11:15:41 +0200 Subject: [PATCH 09/58] Added music support. --- .../github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml | 1 + .../czyzby/lml/uedi/LmlApplication.java | 7 +- .../czyzby/lml/uedi/music/MusicService.java | 192 +++++++++++++++++- .../lml/uedi/music/MusicStopAction.java | 50 +++++ 4 files changed, 245 insertions(+), 5 deletions(-) create mode 100644 lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicStopAction.java diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml index 247a5ce6..8cc2ced1 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml @@ -5,6 +5,7 @@ + diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java index 31aa1512..edb8c84b 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/LmlApplication.java @@ -238,7 +238,12 @@ protected void addDefaultComponents() { context.add(this); } - /** @return true by default. Override and return false to omit {@link MusicService} in the context. */ + /** {@link MusicService}, contrary to most utilities provided by default (like {@link Stage} or + * {@link com.badlogic.gdx.assets.AssetManager AssetManager}), is not a part of standard LibGDX API. It was added to + * ease the management of sound and music setting, as well as make it trivial to implement looping themes. This + * method allows to choose whether to include it in the context (along with its music settings) or not. + * + * @return true by default. Override and return false to omit {@link MusicService} in the context. */ protected boolean includeMusicService() { return true; } diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java index e6e84ae2..10f99fe3 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java @@ -1,10 +1,15 @@ package com.github.czyzby.lml.uedi.music; import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.audio.Music.OnCompletionListener; import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.ui.ProgressBar; +import com.badlogic.gdx.utils.Array; +import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; import com.github.czyzby.lml.parser.LmlData; import com.github.czyzby.lml.parser.action.ActorConsumer; import com.github.czyzby.uedi.stereotype.Singleton; @@ -18,6 +23,19 @@ public class MusicService implements Singleton { private final SoundOnPreference soundOn; private final MusicVolumePreference musicVolume; private final SoundVolumePreference soundVolume; + // Music utilities: + private Music currentTheme; + private final float duration = 0.6f; + private final Array themes = GdxArrays.newArray(); + private final OnCompletionListener listener = new OnCompletionListener() { + @Override + public void onCompletion(final Music music) { + music.setOnCompletionListener(null); + if (music == currentTheme) { + changeTheme(); + } + } + }; /** @param stage will be used to add music transition actions. * @param musicOn decides whether music is on. @@ -40,7 +58,7 @@ public void addDefaultActions(final LmlData data) { data.addActorConsumer("setMusicOn", new ActorConsumer() { @Override public Void consume(final Button actor) { - musicOn.setOn(actor.isChecked()); + setMusicOn(actor.isChecked()); return null; } }); @@ -48,7 +66,7 @@ public Void consume(final Button actor) { data.addActorConsumer("setSoundOn", new ActorConsumer() { @Override public Void consume(final Button actor) { - soundOn.setOn(actor.isChecked()); + setSoundOn(actor.isChecked()); return null; } }); @@ -56,7 +74,7 @@ public Void consume(final Button actor) { data.addActorConsumer("setMusicVolume", new ActorConsumer() { @Override public Void consume(final ProgressBar actor) { - musicVolume.setPercent(actor.getValue()); + setMusicVolume(actor.getValue()); return null; } }); @@ -64,7 +82,7 @@ public Void consume(final ProgressBar actor) { data.addActorConsumer("setSoundVolume", new ActorConsumer() { @Override public Void consume(final ProgressBar actor) { - soundVolume.setPercent(actor.getValue()); + setSoundVolume(actor.getValue()); return null; } }); @@ -130,4 +148,170 @@ public long play(final Sound sound, final float volume, final float pitch, final } return -1L; } + + /** @return true if music are currently on. */ + public boolean isMusicOn() { + return musicOn.isOn(); + } + + /** @param on true to turn on, false to turn off. */ + public void setMusicOn(final boolean on) { + musicOn.setOn(on); + if (on) { + currentTheme = getNextTheme(null); + fadeInCurrentTheme(); + } else { + fadeOutCurrentTheme(); + } + } + + /** @return current music volume in range of [0, 1]. */ + public float getMusicVolume() { + return musicVolume.getPercent(); + } + + /** @param volume should be in range of [0, 1]. */ + public void setMusicVolume(final float volume) { + musicVolume.setPercent(volume); + if (currentTheme != null) { + currentTheme.setVolume(volume); + } + } + + /** @param music is music is turned on, will be smoothly started and played. Replaces current music theme, if any. + * Will be played once with the current volume setting. */ + public void play(final Music music) { + if (musicOn.isOn()) { + fadeOutCurrentTheme(); + currentTheme = music; + fadeInCurrentTheme(); + } + } + + /** Smoothly fades out current theme. */ + protected void fadeOutCurrentTheme() { + if (currentTheme != null && currentTheme.isPlaying()) { + currentTheme.setOnCompletionListener(null); + stage.addAction(Actions.sequence( + VolumeAction.setVolume(currentTheme, currentTheme.getVolume(), 0f, duration, Interpolation.fade), + MusicStopAction.stop(currentTheme))); + } + currentTheme = null; + } + + /** Smoothly fades in current theme. */ + protected void fadeInCurrentTheme() { + if (currentTheme != null) { + currentTheme.setLooping(false); + currentTheme.setVolume(0f); + currentTheme.setOnCompletionListener(listener); + stage.addAction( + VolumeAction.setVolume(currentTheme, 0f, musicVolume.getPercent(), duration, Interpolation.fade)); + currentTheme.play(); + } + } + + /** Forces a change of current theme. Assumes a theme was already played - there are no smooth fade ins of any + * kind. */ + protected void changeTheme() { + currentTheme = getNextTheme(currentTheme); + if (currentTheme != null) { + currentTheme.setLooping(false); + currentTheme.setOnCompletionListener(listener); + currentTheme.setVolume(musicVolume.getPercent()); + currentTheme.play(); + } + } + + /** @param previous was played previously. + * @return the new music theme. */ + protected Music getNextTheme(final Music previous) { + return themes.size == 1 ? themes.first() : themes.random(); + } + + /** @param theme will be added to the current themes collection, which are constantly played on a loop. By default, + * themes order is random. If no theme is currently played, this music instance will start playing + * smoothly. */ + public void addTheme(final Music theme) { + if (!themes.contains(theme, true)) { + themes.add(theme); + } + if (currentTheme == null && musicOn.isOn()) { + currentTheme = theme; + fadeInCurrentTheme(); + } + } + + /** @param themes will be added to the current themes collection, which are constantly played on a loop. By default, + * themes order is random. If no theme is currently played, one of the passed music instances will start + * playing smoothly. */ + public void addThemes(final Music... themes) { + for (final Music theme : themes) { + if (!this.themes.contains(theme, true)) { + this.themes.add(theme); + } + } + if (currentTheme == null && musicOn.isOn()) { + currentTheme = getNextTheme(null); + fadeInCurrentTheme(); + } + } + + /** @param themes will be added to the current themes collection, which are constantly played on a loop. By default, + * themes order is random. If no theme is currently played, one of the passed music instances will start + * playing smoothly. */ + public void addThemes(final Iterable themes) { + for (final Music theme : themes) { + if (!this.themes.contains(theme, true)) { + this.themes.add(theme); + } + } + if (currentTheme == null && musicOn.isOn()) { + currentTheme = getNextTheme(null); + fadeInCurrentTheme(); + } + } + + /** @param theme will be removed from the current themes collection. If is currently played, will be smoothly + * stopped and replaced with another theme (if any are left). */ + public void removeTheme(final Music theme) { + themes.removeValue(theme, true); + if (currentTheme == theme) { + fadeOutCurrentTheme(); + currentTheme = getNextTheme(theme); + fadeInCurrentTheme(); + } + } + + /** @param themes will be removed from the current themes collection. If one of them is currently played, it will be + * smoothly stopped and replaced with another theme (if any are left). */ + public void removeThemes(final Music... themes) { + boolean removeCurrent = false; + for (final Music theme : themes) { + this.themes.removeValue(theme, true); + removeCurrent |= currentTheme == theme; + } + if (removeCurrent) { + final Music nextTheme = getNextTheme(currentTheme); + fadeOutCurrentTheme(); + currentTheme = nextTheme; + fadeInCurrentTheme(); + } + } + + /** @param themes will be removed from the current themes collection. If one of them is currently played, it will be + * smoothly stopped and replaced with another theme (if any are left). */ + public void removeThemes(final Iterable themes) { + boolean removeCurrent = false; + for (final Music theme : themes) { + this.themes.removeValue(theme, true); + removeCurrent |= currentTheme == theme; + } + if (removeCurrent) { + final Music nextTheme = getNextTheme(currentTheme); + fadeOutCurrentTheme(); + currentTheme = nextTheme; + fadeInCurrentTheme(); + } + } } diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicStopAction.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicStopAction.java new file mode 100644 index 00000000..1c0dcb1e --- /dev/null +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicStopAction.java @@ -0,0 +1,50 @@ +package com.github.czyzby.lml.uedi.music; + +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.scenes.scene2d.Action; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.github.czyzby.kiwi.util.common.Exceptions; + +/** Allows to stop the chosen {@link Music} instance in {@link Action}. + * + * @author MJ */ +public class MusicStopAction extends Action { + private Music music; + + @Override + public boolean act(final float delta) { + if (music != null) { + try { + music.stop(); + } catch (final Exception exception) { + Exceptions.ignore(exception); + } + music = null; + } + return true; + } + + @Override + public void reset() { + super.reset(); + music = null; + } + + /** @return will be stopped. Null if already stopped. */ + public Music getMusic() { + return music; + } + + /** @param music will be stopped. */ + public void setMusic(final Music music) { + this.music = music; + } + + /** @param music will be stopped. + * @return a {@link MusicStopAction} instance, which will stop the theme once executed. */ + public static MusicStopAction stop(final Music music) { + final MusicStopAction action = Actions.action(MusicStopAction.class); + action.music = music; + return action; + } +} From 672cbd31e0e88a3a0ffe93b3438103b736c34251 Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 4 Jun 2016 18:05:11 +0200 Subject: [PATCH 10/58] Added style sheet processing. #27 --- .../github/czyzby/lml/parser/LmlParser.java | 6 ++ .../czyzby/lml/parser/LmlStyleSheet.java | 38 +++++++++++ .../lml/parser/impl/AbstractLmlParser.java | 12 ++++ .../lml/parser/impl/DefaultLmlStyleSheet.java | 66 +++++++++++++++++++ .../parser/impl/tag/AbstractActorLmlTag.java | 15 +++++ .../lml/parser/impl/tag/AbstractLmlTag.java | 8 ++- 6 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/LmlStyleSheet.java create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlStyleSheet.java diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java index 7e709875..e2434af3 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java @@ -35,6 +35,12 @@ public interface LmlParser { * alone if template parsing is currently in progress. */ LmlSyntax getSyntax(); + /** @param styleSheet will be used to provide default values for tags' attributes. */ + void setStyleSheet(LmlStyleSheet styleSheet); + + /** @return style sheet currently used to provide default values for tags' attributes. Can safely modified. */ + LmlStyleSheet getStyleSheet(); + /** @return true if parser is strict and throws errors for unknown tags, attributes, etc. */ boolean isStrict(); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/LmlStyleSheet.java b/lml/src/main/java/com/github/czyzby/lml/parser/LmlStyleSheet.java new file mode 100644 index 00000000..b372babd --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/LmlStyleSheet.java @@ -0,0 +1,38 @@ +package com.github.czyzby.lml.parser; + +import com.badlogic.gdx.utils.ObjectMap; + +/** Contains default values of attribute in tags. + * + * @author MJ */ +public interface LmlStyleSheet { + /** @param tag name of the tag. Case might be ignored. + * @param attribute name of the attribute. Case might be ignored. + * @return default value for the chosen attribute or null if not set. */ + String getStyle(String tag, String attribute); + + /** @param tag name of the tag. Case might be ignored. + * @return map of tag's styles or null if none set. */ + ObjectMap getStyles(String tag); + + /** @param tag name of the tag. Case might be ignored. + * @param attribute name of the attribute. Case might be ignored. + * @param defaultValue will be the value of the chosen attribute in selected tags if it was not set already. */ + void addStyle(String tag, String attribute, String defaultValue); + + /** @param tag name of the tag. Case might be ignored. + * @param styles map of default attribute values mapped by their attribute names. Will be added. + * @see #addStyle(String, String, String) */ + void addStyles(String tag, ObjectMap styles); + + /** @param tag name of the tag. Case might be ignored. + * @param attribute name of the attribute. Case might be ignored. If any default value is assigned to the attribute, + * it will be removed. */ + void removeStyle(String tag, String attribute); + + /** @param tag name of the tag. Case might be ignored. All styles assigned to the tag will be removed. */ + void removeStyles(String tag); + + /** All stored styles will be removed. */ + void clearStyles(); +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java index 481c3337..af9a948d 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java @@ -30,6 +30,7 @@ import com.github.czyzby.lml.parser.LmlData; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.LmlParserListener; +import com.github.czyzby.lml.parser.LmlStyleSheet; import com.github.czyzby.lml.parser.LmlSyntax; import com.github.czyzby.lml.parser.LmlTemplateReader; import com.github.czyzby.lml.parser.LmlView; @@ -53,6 +54,7 @@ public abstract class AbstractLmlParser implements LmlParser { protected LmlData data; protected LmlSyntax syntax; protected LmlTemplateReader templateReader; + protected LmlStyleSheet styleSheet; // Settings: protected boolean strict; @@ -130,6 +132,16 @@ public LmlSyntax getSyntax() { return syntax; } + @Override + public void setStyleSheet(final LmlStyleSheet styleSheet) { + this.styleSheet = styleSheet; + } + + @Override + public LmlStyleSheet getStyleSheet() { + return styleSheet; + } + @Override public void doBeforeParsing(final LmlParserListener listener) { preListeners.add(listener); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlStyleSheet.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlStyleSheet.java new file mode 100644 index 00000000..c9a32e3f --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlStyleSheet.java @@ -0,0 +1,66 @@ +package com.github.czyzby.lml.parser.impl; + +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.lml.parser.LmlStyleSheet; +import com.github.czyzby.lml.util.collection.IgnoreCaseStringMap; + +/** Default implementation of {@link LmlStyleSheet}. Ignores case of tags and attributes. + * + * @author MJ */ +public class DefaultLmlStyleSheet implements LmlStyleSheet { + private final ObjectMap> styleSheet = new IgnoreCaseStringMap>(); + + @Override + public String getStyle(final String tag, final String attribute) { + if (styleSheet.containsKey(tag)) { + return styleSheet.get(tag).get(attribute); + } + return null; + } + + @Override + public ObjectMap getStyles(final String tag) { + return styleSheet.get(tag); + } + + @Override + public void addStyle(final String tag, final String attribute, final String defaultValue) { + getTagStylesMap(tag).put(attribute, defaultValue); + } + + /** @param tag name of the tag. Case ignored. + * @return non-null map storing styles of the tag. */ + protected ObjectMap getTagStylesMap(final String tag) { + ObjectMap styles = styleSheet.get(tag); + if (styles == null) { + styles = new IgnoreCaseStringMap(); + styleSheet.put(tag, styles); + } + return styles; + } + + @Override + public void addStyles(final String tag, final ObjectMap styles) { + if (GdxMaps.isNotEmpty(styles)) { + getTagStylesMap(tag).putAll(styles); + } + } + + @Override + public void removeStyle(final String tag, final String attribute) { + if (styleSheet.containsKey(tag)) { + styleSheet.get(tag).remove(attribute); + } + } + + @Override + public void removeStyles(final String tag) { + styleSheet.remove(tag); + } + + @Override + public void clearStyles() { + styleSheet.clear(); + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java index b5d2d428..3b613efe 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java @@ -3,9 +3,11 @@ import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Tree; +import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.ObjectMap.Entry; import com.badlogic.gdx.utils.ObjectSet; import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; import com.github.czyzby.kiwi.util.gdx.collection.GdxSets; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.LmlSyntax; @@ -33,6 +35,7 @@ public AbstractActorLmlTag(final LmlParser parser, final LmlTag parentTag, final protected Actor prepareActor() { final LmlActorBuilder builder = getNewInstanceOfBuilder(); final ObjectSet processedAttributes = GdxSets.newSet(); + addDefaultAttributes(); processBuildingAttributes(builder, processedAttributes); final Actor actor; try { @@ -51,6 +54,18 @@ protected Actor prepareActor() { return actor; } + @Override + protected boolean hasDefaultAttributes(final String tagName) { + return GdxMaps.isNotEmpty(getParser().getStyleSheet().getStyles(tagName)); + } + + private void addDefaultAttributes() { + final ObjectMap defaultAttributes = getParser().getStyleSheet().getStyles(getTagName()); + if (defaultAttributes != null) { + getNamedAttributes().putAll(defaultAttributes); + } + } + private void processBuildingAttributes(final LmlActorBuilder builder, final ObjectSet processedAttributes) { if (getNamedAttributes() == null) { return; diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java index add877c7..5dcc93d3 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java @@ -44,7 +44,7 @@ public AbstractLmlTag(final LmlParser parser, final LmlTag parentTag, final Stri } else { parent = true; } - if (hasAttributes(entities)) { + if (hasAttributes(entities) || hasDefaultAttributes(tagName)) { entities.removeIndex(0); // Removing tag name from attributes. attributes = entities; if (supportsNamedAttributes() || supportsOptionalNamedAttributes()) { @@ -59,6 +59,12 @@ public AbstractLmlTag(final LmlParser parser, final LmlTag parentTag, final Stri } } + /** @param tagName name of the tag. + * @return true if the tag has default attributes assigned. */ + protected boolean hasDefaultAttributes(final String tagName) { + return false; + } + /** @return true if this tag type supports named attributes and they should be mapped. */ protected abstract boolean supportsNamedAttributes(); From 58118fac1ec93c91a31d4e5d6271f25b9bbf6f2e Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 5 Jun 2016 11:51:04 +0200 Subject: [PATCH 11/58] Initial LSS parsing. #27 --- .../github/czyzby/lml/uedi/views/View.java | 6 +- .../github/czyzby/lml/parser/LmlParser.java | 8 + .../lml/parser/impl/AbstractLmlParser.java | 19 +- .../lml/parser/impl/DefaultLmlParser.java | 33 ++- .../parser/impl/DefaultLmlTemplateReader.java | 2 +- .../czyzby/lml/parser/impl/LssParser.java | 190 ++++++++++++++++++ .../parser/impl/tag/AbstractActorLmlTag.java | 7 +- .../lml/parser/impl/tag/AbstractLmlTag.java | 3 +- .../czyzby/lml/util/LmlParserBuilder.java | 25 +++ 9 files changed, 282 insertions(+), 11 deletions(-) create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java index 7194d794..c903e861 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java @@ -34,8 +34,10 @@ public FileHandle getTemplateFile() { return Gdx.files.internal(getPath()); } - /** @return path to the LML template file. */ - protected abstract String getPath(); + /** @return path to the LML template file. By default, will return "view/" + view ID + ".lml". */ + protected String getPath() { + return "view/" + getViewId() + ".lml"; + } @Override public String getName() { diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java index e2434af3..fca7e5c8 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/LmlParser.java @@ -63,6 +63,14 @@ public interface LmlParser { * @return parsed root actors, in the order that they appear in the template. */ Array parseTemplate(FileHandle lmlTemplateFile); + /** @param styleSheet LML style sheet code. Will be processed. + * @see #getStyleSheet() */ + void parseStyleSheet(String styleSheet); + + /** @param styleSheetFile path to a file storing LML style sheet code. Will be processed. + * @see #getStyleSheet() */ + void parseStyleSheet(FileHandle styleSheetFile); + /** @param stage will have the parsed actors appended. * @param lmlTemplate will be parsed. Actors parsed from the template will be added directly into the stage. */ void fillStage(Stage stage, String lmlTemplate); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java index af9a948d..8606aa59 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/AbstractLmlParser.java @@ -71,13 +71,15 @@ public abstract class AbstractLmlParser implements LmlParser { /** @param data contains skin, actions, i18n bundles and other data needed to parse LML templates. * @param syntax determines syntax of LML templates. * @param templateReader reads and buffers templates and their files. + * @param styleSheet contains default values of attributes. * @param strict if false, will ignore some unexpected errors, like unknown attributes, invalid referenced method * names etc. Set to true for more HTML-like feel or quick prototyping. */ public AbstractLmlParser(final LmlData data, final LmlSyntax syntax, final LmlTemplateReader templateReader, - final boolean strict) { + final LmlStyleSheet styleSheet, final boolean strict) { this.data = data; this.syntax = syntax; this.templateReader = templateReader; + this.styleSheet = styleSheet; this.strict = strict; } @@ -195,6 +197,16 @@ public Array parseTemplate(final FileHandle lmlTemplateFile) { return parseTemplate(); } + @Override + public void parseStyleSheet(final FileHandle styleSheetFile) { + parseStyleSheet(styleSheetFile.readString("UTF-8")); + } + + @Override + public void parseStyleSheet(final String styleSheet) { + new LssParser(this).parse(styleSheet); + } + @Override public void fillStage(final Stage stage, final String lmlTemplate) { LmlUtilities.appendActorsToStage(stage, parseTemplate(lmlTemplate)); @@ -266,7 +278,10 @@ protected void doBeforeViewTemplateParsing(final View view) { * @param class of the filled view. */ protected void fillView(final View view, final Array actors) { if (view instanceof LmlView) { - LmlUtilities.appendActorsToStage(((LmlView) view).getStage(), actors); + final Stage stage = ((LmlView) view).getStage(); + if (stage != null) { + LmlUtilities.appendActorsToStage(stage, actors); + } } processViewFieldAnnotations(view); } diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlParser.java index 8749dd11..81aa2709 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlParser.java @@ -7,6 +7,7 @@ import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; import com.github.czyzby.lml.parser.LmlData; import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.LmlStyleSheet; import com.github.czyzby.lml.parser.LmlSyntax; import com.github.czyzby.lml.parser.LmlTemplateReader; import com.github.czyzby.lml.parser.impl.tag.macro.util.Equation; @@ -28,7 +29,7 @@ public class DefaultLmlParser extends AbstractLmlParser { * * @param data contains skin, actions, i18n bundles and other data needed to parse LML templates. */ public DefaultLmlParser(final LmlData data) { - super(data, new DefaultLmlSyntax(), new DefaultLmlTemplateReader(), true); + super(data, new DefaultLmlSyntax(), new DefaultLmlTemplateReader(), new DefaultLmlStyleSheet(), true); } /** Creates a new strict parser with custom syntax and default reader. @@ -36,7 +37,7 @@ public DefaultLmlParser(final LmlData data) { * @param data contains skin, actions, i18n bundles and other data needed to parse LML templates. * @param syntax determines syntax of LML templates. */ public DefaultLmlParser(final LmlData data, final LmlSyntax syntax) { - super(data, syntax, new DefaultLmlTemplateReader(), true); + super(data, syntax, new DefaultLmlTemplateReader(), new DefaultLmlStyleSheet(), true); } /** Creates a new strict parser with custom syntax and reader. @@ -45,7 +46,18 @@ public DefaultLmlParser(final LmlData data, final LmlSyntax syntax) { * @param syntax determines syntax of LML templates. * @param templateReader reads and buffers templates and their files. */ public DefaultLmlParser(final LmlData data, final LmlSyntax syntax, final LmlTemplateReader templateReader) { - super(data, syntax, templateReader, true); + super(data, syntax, templateReader, new DefaultLmlStyleSheet(), true); + } + + /** Creates a new strict parser with custom syntax, reader and style sheet. + * + * @param data contains skin, actions, i18n bundles and other data needed to parse LML templates. + * @param syntax determines syntax of LML templates. + * @param templateReader reads and buffers templates and their files. + * @param styleSheet contains default values of attributes. */ + public DefaultLmlParser(final LmlData data, final LmlSyntax syntax, final LmlTemplateReader templateReader, + final LmlStyleSheet styleSheet) { + super(data, syntax, templateReader, styleSheet, true); } /** Creates a new parser with custom syntax, reader and strict setting. @@ -57,7 +69,20 @@ public DefaultLmlParser(final LmlData data, final LmlSyntax syntax, final LmlTem * names etc. Set to true for more HTML-like feel or quick prototyping. */ public DefaultLmlParser(final LmlData data, final LmlSyntax syntax, final LmlTemplateReader templateReader, final boolean strict) { - super(data, syntax, templateReader, strict); + super(data, syntax, templateReader, new DefaultLmlStyleSheet(), strict); + } + + /** Creates a new strict parser with custom syntax, reader, style sheet and strict setting. + * + * @param data contains skin, actions, i18n bundles and other data needed to parse LML templates. + * @param syntax determines syntax of LML templates. + * @param templateReader reads and buffers templates and their files. + * @param styleSheet contains default values of attributes. + * @param strict if false, will ignore some unexpected errors, like unknown attributes, invalid referenced method + * names etc. Set to true for more HTML-like feel or quick prototyping. */ + public DefaultLmlParser(final LmlData data, final LmlSyntax syntax, final LmlTemplateReader templateReader, + final LmlStyleSheet styleSheet, final boolean strict) { + super(data, syntax, templateReader, styleSheet, strict); } @Override diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlTemplateReader.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlTemplateReader.java index 49ac36e6..a0bacc58 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlTemplateReader.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlTemplateReader.java @@ -39,7 +39,7 @@ public void append(final String template, final String templateName) { @Override public void append(final FileHandle templateFile) { - appendSequence(templateFile.readString(), templateFile.name()); + appendSequence(templateFile.readString("UTF-8"), templateFile.name()); } @Override diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java new file mode 100644 index 00000000..73b78d27 --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java @@ -0,0 +1,190 @@ +package com.github.czyzby.lml.parser.impl; + +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.GdxRuntimeException; +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.LmlStyleSheet; +import com.github.czyzby.lml.parser.LmlSyntax; + +/** Allows to process LML style sheet code (with CSS-like syntax), extracting default attribute values of selected tags. + * + *

+ * Parser instances should be generally one-time use only - since style sheets are parsed rather rarely (usually once + * per application run), reusing LSS parsers usually does not make much sense. + * + * @author MJ */ +public class LssParser { + private final LmlStyleSheet styleSheet; + private final char inheritanceMarker = '.'; + private final char blockOpening = '{'; + private final char blockClosing = '}'; + private final char separator = ':'; + private final char lineEnd = ';'; + + // Control variables: + private String lss; + private final StringBuilder builder = new StringBuilder(); + private int index; + private int length; + private int line; + private final Array tags = GdxArrays.newArray(); + private final Array inherits = GdxArrays.newArray(); + private String attribute; + private final ObjectMap attributes = GdxMaps.newObjectMap(); + + /** @param parser will be used to extract style sheet and syntax data. */ + public LssParser(final LmlParser parser) { + this(parser.getStyleSheet(), parser.getSyntax()); + } + + /** @param styleSheet will be used to set the parsed style data. + * @param syntax provides style sheet special characters. */ + public LssParser(final LmlStyleSheet styleSheet, final LmlSyntax syntax) { + this.styleSheet = styleSheet; + // TODO extract values from syntax + } + + /** @param lss LML style sheet data. Will be parsed and processed. */ + public void parse(final String lss) { + this.lss = lss; + length = lss.length(); + index = 0; + line = 1; + while (index < length) { + parseNames(); + parseAttributes(); + processAttributes(); + tags.clear(); + inherits.clear(); + attributes.clear(); + } + } + + /** @param string will become the exception message proceeded by the current line number. */ + protected void throwException(final String string) { + throw new GdxRuntimeException(line + ": " + string); + } + + /** Parses names proceeding styles block. */ + protected void parseNames() { + burnWhitespaces(); + for (; index < length; index++) { + final char character = get(); + if (Strings.isWhitespace(character)) { + addName(); + continue; + } else if (character == blockOpening) { + addName(); + index++; + break; + } else { + builder.append(character); + } + } + if (GdxArrays.isEmpty(tags)) { + throwException("No tag names chosen."); + } + } + + /** Appends tag or inheritance name from the current builder data. */ + protected void addName() { + if (Strings.isNotEmpty(builder)) { + if (Strings.startsWith(builder, inheritanceMarker)) { + inherits.add(builder.substring(1)); + } else { + tags.add(builder.toString()); + } + Strings.clearBuilder(builder); + } + } + + /** Parses attributes block. */ + protected void parseAttributes() { + burnWhitespaces(); + attribute = null; + for (; index < length; index++) { + final char character = get(); + if (character == blockClosing) { + if (attribute != null || Strings.isNotEmpty(builder)) { + throwException("Unexpected tag close."); + } + index++; + return; + } else if (Strings.isNewLine(character) && (attribute != null || Strings.isNotEmpty(builder))) { + line--; + throwException("Expecting line end marker: '" + lineEnd + "'."); + } else if (Strings.isWhitespace(character) && attribute == null) { + continue; + } else if (character == separator && attribute == null) { + addAttributeName(); + continue; + } else if (character == lineEnd) { + if (attribute == null) { + throwException("Found unexpected line end marker: '" + lineEnd + "'."); + } + addAttribute(); + } else { + builder.append(character); + } + } + } + + /** Caches currently parsed attribute name. */ + protected void addAttributeName() { + if (Strings.isNotEmpty(builder)) { + attribute = builder.toString(); + Strings.clearBuilder(builder); + } + } + + /** Clears attribute cache, adds default attribute value. */ + private void addAttribute() { + attributes.put(attribute, builder.toString().trim()); + attribute = null; + Strings.clearBuilder(builder); + } + + /** Adds the stored attribute values to the style sheet. Resolves inherited styles. */ + protected void processAttributes() { + for (final String tag : tags) { + for (final String inherit : inherits) { + styleSheet.addStyles(tag, styleSheet.getStyles(inherit)); + } + styleSheet.addStyles(tag, attributes); + } + } + + /** @return character at current index value. */ + protected char get() { + final char character = lss.charAt(index); + if (Strings.isNewLine(character)) { + line++; + } + return character; + } + + /** Analyzes characters, raising the index. Stops after encountering first non-whitespace character. */ + protected void burnWhitespaces() { + for (; index < length; index++) { + if (Strings.isNotWhitespace(get())) { + return; + } + } + } + + /** Clears control variables. */ + public void reset() { + lss = null; + attribute = null; + index = 0; + line = 1; + tags.clear(); + inherits.clear(); + attributes.clear(); + Strings.clearBuilder(builder); + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java index 3b613efe..36f313ac 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java @@ -61,8 +61,13 @@ protected boolean hasDefaultAttributes(final String tagName) { private void addDefaultAttributes() { final ObjectMap defaultAttributes = getParser().getStyleSheet().getStyles(getTagName()); + final ObjectMap namedAttributes = getNamedAttributes(); if (defaultAttributes != null) { - getNamedAttributes().putAll(defaultAttributes); + for (Entry attribute : defaultAttributes) { + if (!namedAttributes.containsKey(attribute.key)) { + namedAttributes.put(attribute.key, attribute.value); + } + } } } diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java index 5dcc93d3..7a66c6e3 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractLmlTag.java @@ -16,7 +16,8 @@ /** Common base for all tag handlers. * * @author MJ - * @see AbstractMacroLmlTag */ + * @see AbstractMacroLmlTag + * @see AbstractActorLmlTag */ public abstract class AbstractLmlTag implements LmlTag { private final LmlParser parser; private final Array attributes; diff --git a/lml/src/main/java/com/github/czyzby/lml/util/LmlParserBuilder.java b/lml/src/main/java/com/github/czyzby/lml/util/LmlParserBuilder.java index d7eaf368..87e46a33 100644 --- a/lml/src/main/java/com/github/czyzby/lml/util/LmlParserBuilder.java +++ b/lml/src/main/java/com/github/czyzby/lml/util/LmlParserBuilder.java @@ -1,6 +1,8 @@ package com.github.czyzby.lml.util; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Preferences; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.TooltipManager; @@ -62,6 +64,29 @@ public LmlParserBuilder skin(final String id, final Skin skin) { return this; } + /** @param tag all tags with this name (case ignored) will have the attribute applied. + * @param attribute name of the attribute. + * @param defaultValue default value of the attribute, used if attribute is not already set in the tag. + * @return this for chaining. */ + public LmlParserBuilder style(final String tag, final String attribute, final String defaultValue) { + parser.getStyleSheet().addStyle(tag, attribute, defaultValue); + return this; + } + + /** @param styleSheetPath LML style sheet data file. + * @return this for chaining. */ + public LmlParserBuilder styles(final FileHandle styleSheetPath) { + parser.parseStyleSheet(styleSheetPath); + return this; + } + + /** @param styleSheetPath path to internal file storing LML style sheet data. + * @return this for chaining. */ + public LmlParserBuilder stylesPath(final String styleSheetPath) { + parser.parseStyleSheet(Gdx.files.internal(styleSheetPath)); + return this; + } + /** @param defaultPreferences will be set as the default {@link Preferences} instance used when no ID is specified. * @return this for chaining. */ public LmlParserBuilder preferences(final Preferences defaultPreferences) { From 672831226eb72a47741939bb5437adbf437a932c Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 5 Jun 2016 23:19:43 +0200 Subject: [PATCH 12/58] LSS parser now uses template reader for extra utility. --- .../czyzby/lml/parser/impl/LssParser.java | 99 +++++++++---------- .../impl/attribute/ColorLmlAttribute.java | 6 +- 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java index 73b78d27..8b1b90d9 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java @@ -1,14 +1,13 @@ package com.github.czyzby.lml.parser.impl; import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.ObjectMap; import com.github.czyzby.kiwi.util.common.Strings; import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.LmlStyleSheet; -import com.github.czyzby.lml.parser.LmlSyntax; +import com.github.czyzby.lml.parser.LmlTemplateReader; /** Allows to process LML style sheet code (with CSS-like syntax), extracting default attribute values of selected tags. * @@ -18,19 +17,18 @@ * * @author MJ */ public class LssParser { + private final LmlParser parser; private final LmlStyleSheet styleSheet; + private final LmlTemplateReader reader; private final char inheritanceMarker = '.'; private final char blockOpening = '{'; private final char blockClosing = '}'; private final char separator = ':'; private final char lineEnd = ';'; + private final char tagSeparator = ','; // TODO comments: '/* */' // Control variables: - private String lss; private final StringBuilder builder = new StringBuilder(); - private int index; - private int length; - private int line; private final Array tags = GdxArrays.newArray(); private final Array inherits = GdxArrays.newArray(); private String attribute; @@ -38,48 +36,47 @@ public class LssParser { /** @param parser will be used to extract style sheet and syntax data. */ public LssParser(final LmlParser parser) { - this(parser.getStyleSheet(), parser.getSyntax()); - } - - /** @param styleSheet will be used to set the parsed style data. - * @param syntax provides style sheet special characters. */ - public LssParser(final LmlStyleSheet styleSheet, final LmlSyntax syntax) { - this.styleSheet = styleSheet; + this.parser = parser; + styleSheet = parser.getStyleSheet(); + reader = parser.getTemplateReader(); // TODO extract values from syntax } /** @param lss LML style sheet data. Will be parsed and processed. */ public void parse(final String lss) { - this.lss = lss; - length = lss.length(); - index = 0; - line = 1; - while (index < length) { - parseNames(); - parseAttributes(); - processAttributes(); - tags.clear(); - inherits.clear(); - attributes.clear(); + reader.append(lss, "LML style sheet"); + try { + while (reader.hasNextCharacter()) { + burnWhitespaces(); + if (!reader.hasNextCharacter()) { + break; + } + parseNames(); + parseAttributes(); + processAttributes(); + tags.clear(); + inherits.clear(); + attributes.clear(); + } + } finally { + reader.clear(); } } - /** @param string will become the exception message proceeded by the current line number. */ + /** @param string will become the exception message. */ protected void throwException(final String string) { - throw new GdxRuntimeException(line + ": " + string); + parser.throwError(string); } /** Parses names proceeding styles block. */ protected void parseNames() { - burnWhitespaces(); - for (; index < length; index++) { - final char character = get(); + while (reader.hasNextCharacter()) { + final char character = reader.nextCharacter(); if (Strings.isWhitespace(character)) { addName(); continue; } else if (character == blockOpening) { addName(); - index++; break; } else { builder.append(character); @@ -93,10 +90,14 @@ protected void parseNames() { /** Appends tag or inheritance name from the current builder data. */ protected void addName() { if (Strings.isNotEmpty(builder)) { - if (Strings.startsWith(builder, inheritanceMarker)) { - inherits.add(builder.substring(1)); + int endOffset = 0; + if (Strings.endsWith(builder, tagSeparator)) { // Ends with ','. + endOffset = 1; + } + if (Strings.startsWith(builder, inheritanceMarker)) { // Starts with '.'. + inherits.add(builder.substring(1, builder.length() - endOffset)); } else { - tags.add(builder.toString()); + tags.add(builder.substring(0, builder.length() - endOffset)); } Strings.clearBuilder(builder); } @@ -106,17 +107,17 @@ protected void addName() { protected void parseAttributes() { burnWhitespaces(); attribute = null; - for (; index < length; index++) { - final char character = get(); + while (reader.hasNextCharacter()) { + final char character = reader.peekCharacter(); + if (Strings.isNewLine(character) && (attribute != null || Strings.isNotEmpty(builder))) { + throwException("Expecting line end marker: '" + lineEnd + "'."); + } + reader.nextCharacter(); if (character == blockClosing) { if (attribute != null || Strings.isNotEmpty(builder)) { throwException("Unexpected tag close."); } - index++; return; - } else if (Strings.isNewLine(character) && (attribute != null || Strings.isNotEmpty(builder))) { - line--; - throwException("Expecting line end marker: '" + lineEnd + "'."); } else if (Strings.isWhitespace(character) && attribute == null) { continue; } else if (character == separator && attribute == null) { @@ -124,7 +125,8 @@ protected void parseAttributes() { continue; } else if (character == lineEnd) { if (attribute == null) { - throwException("Found unexpected line end marker: '" + lineEnd + "'."); + throwException("Found unexpected line end marker: '" + lineEnd + "'. Is separator (" + separator + + ") missing?"); } addAttribute(); } else { @@ -158,30 +160,19 @@ protected void processAttributes() { } } - /** @return character at current index value. */ - protected char get() { - final char character = lss.charAt(index); - if (Strings.isNewLine(character)) { - line++; - } - return character; - } - /** Analyzes characters, raising the index. Stops after encountering first non-whitespace character. */ protected void burnWhitespaces() { - for (; index < length; index++) { - if (Strings.isNotWhitespace(get())) { + while (reader.hasNextCharacter()) { + if (Strings.isNotWhitespace(reader.peekCharacter())) { return; } + reader.nextCharacter(); } } /** Clears control variables. */ public void reset() { - lss = null; attribute = null; - index = 0; - line = 1; tags.clear(); inherits.clear(); attributes.clear(); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/attribute/ColorLmlAttribute.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/attribute/ColorLmlAttribute.java index 45e56829..f8d6a064 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/attribute/ColorLmlAttribute.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/attribute/ColorLmlAttribute.java @@ -37,6 +37,10 @@ public void process(final LmlParser parser, final LmlTag tag, final Actor actor, } else { colorName = parser.parseString(rawAttributeData, actor); } - actor.setColor(parser.getData().getDefaultSkin().getColor(colorName)); + try { + actor.setColor(parser.getData().getDefaultSkin().getColor(colorName)); + } catch (final Exception exception) { + parser.throwErrorIfStrict("Unable to obtain color with name: " + colorName, exception); + } } } From b8a43380e2443a4fb84682c9773bca1b7d57cf16 Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 5 Jun 2016 23:55:16 +0200 Subject: [PATCH 13/58] Added style macro tag with examples. #27 --- .../java/com/github/czyzby/tests/Main.java | 2 +- .../java/com/github/czyzby/tests/Main.java | 2 +- lml/README.md | 1 + .../lml/parser/impl/DefaultLmlSyntax.java | 2 + .../impl/tag/macro/StyleLmlMacroTag.java | 140 ++++++++++++++++++ .../provider/StyleLmlMacroTagProvider.java | 16 ++ 6 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleLmlMacroTag.java create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleLmlMacroTagProvider.java diff --git a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java index 42e4b298..831f7897 100644 --- a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -47,7 +47,7 @@ public class Main extends AbstractApplicationListener { "actorMacro", "anyNotNull", "argument", "argumentReplace", "assign", "calculate", "changeListenerMacro", "clickListenerMacro", "comment", "conditional", "evaluate", "exception", "forEach", "import", "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", "newTag", "nullCheck", - "random", "tableCell", "tableColumn", "tableRow", "while", + "random", "style", "tableCell", "tableColumn", "tableRow", "while", // Custom elements: "customAttribute", "customMacro", "customTag"); private static final String MAIN_VIEW_TEMPLATE = "templates/main.lml"; diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java index 50c583f3..8cfcc8eb 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -53,7 +53,7 @@ public class Main extends AbstractApplicationListener { "actorMacro", "anyNotNull", "argument", "argumentReplace", "assign", "calculate", "changeListenerMacro", "clickListenerMacro", "comment", "conditional", "evaluate", "exception", "forEach", "import", "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", "newTag", "nullCheck", - "random", "tableCell", "tableColumn", "tableRow", "while", + "random", "style", "tableCell", "tableColumn", "tableRow", "while", // Custom elements: "customAttribute", "customMacro", "customTag", // Vis unique tags: diff --git a/lml/README.md b/lml/README.md index 68095358..ec22a0ee 100644 --- a/lml/README.md +++ b/lml/README.md @@ -35,6 +35,7 @@ If you want to use LML with GWT, you have to add this module to your `GdxDefinit 1.7 -> 1.8 - Added `<:random>` macro, which allows to choose a random value from the passed array. +- Added `<:style>` macro, which allows to set default values of tag attributes at runtime, similarly to LML style sheets. 1.6 -> 1.7 diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java index fff4642f..f8d72067 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java @@ -283,6 +283,7 @@ import com.github.czyzby.lml.parser.impl.tag.macro.provider.NewTagLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.NullCheckLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.RandomLmlMacroTagProvider; +import com.github.czyzby.lml.parser.impl.tag.macro.provider.StyleLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableCellLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableColumnLmlMacroTagProvider; import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableRowLmlMacroTagProvider; @@ -389,6 +390,7 @@ protected void registerMacroTags() { addMacroTagProvider(new NewTagLmlMacroTagProvider(), "newTag", "tag"); addMacroTagProvider(new NullCheckLmlMacroTagProvider(), "notNull", "ifNotNull", "exists"); addMacroTagProvider(new RandomLmlMacroTagProvider(), "random"); + addMacroTagProvider(new StyleLmlMacroTagProvider(), "style"); addMacroTagProvider(new TableCellLmlMacroTagProvider(), "cell", "tableCell"); addMacroTagProvider(new TableColumnLmlMacroTagProvider(), "column", "tableColumn"); addMacroTagProvider(new TableRowLmlMacroTagProvider(), "row", "tableRow"); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleLmlMacroTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleLmlMacroTag.java new file mode 100644 index 00000000..812a24a8 --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleLmlMacroTag.java @@ -0,0 +1,140 @@ +package com.github.czyzby.lml.parser.impl.tag.macro; + +import com.badlogic.gdx.utils.ObjectMap; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.LmlStyleSheet; +import com.github.czyzby.lml.parser.impl.tag.AbstractMacroLmlTag; +import com.github.czyzby.lml.parser.tag.LmlTag; + +/** Allows to add styles to LML style sheet at runtime. Assigns default attribute values to the chosen tags. Expects at + * least 2 arguments: tag and attribute names. Default attribute value can be passed with either third argument or data + * between macro tags. Both tags and attributes arguments accept arrays, so multiple tags or attributes can be modified + * at once. For example:

+ * + *
+ * <:style button tablePad 3 />
+ * <:style button tablePad>3</:style button tablePad>
+ * 
+ * + *
Both of these macro invocations would assign "3" as default value of "tablePad" attribute in all + * "button" tags. + *

+ * Note that this macro supports optional named attributes:

+ * + *
+ * <:style tag="button" attribute="tablePad" value="3" />
+ * <:style tag="button" attribute="tablePad">3</:style button tablePad>
+ * 
+ * + *
To modify multiple tags or attributes at once, separate their names with ';' (by default) to create a + * LML array:
+ * + *
+ * <:style tag="button;textButton" attribute="tablePadLeft;tablePadRight" value="3" />
+ * 
+ * + *
+ * + * @author MJ + * @see LmlParser#getStyleSheet() */ +public class StyleLmlMacroTag extends AbstractMacroLmlTag { + /** Optional name of the first attribute: name of the tag to modify. */ + public static final String TAG_ATTRIBUTE = "tag"; + /** Optional name of the second attribute: name of the attribute to set. */ + public static final String ATTRIBUTE_ATTRIBUTE = "attribute"; + /** Optional name of the third attribute: default value of the attribute. */ + public static final String VALUE_ATTRIBUTE = "value"; + + private String content; + + public StyleLmlMacroTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { + super(parser, parentTag, rawTagData); + } + + @Override + public void handleDataBetweenTags(final CharSequence rawData) { + if (Strings.isNotWhitespace(rawData)) { + content = rawData.toString(); + } + } + + @Override + public void closeTag() { + if (GdxArrays.sizeOf(getAttributes()) < 2) { + getParser().throwErrorIfStrict("Style macro needs at least 2 attributes: tag and attribute names."); + return; + } + final String[] tagNames = getTagNames(); + final String[] attributeNames = getAttributeNames(); + final String defaultValue = getDefaultValueArgument(); + if (tagNames == null || tagNames.length == 0 || attributeNames == null || attributeNames.length == 0 + || defaultValue == null) { + getParser().throwErrorIfStrict( + "Style macro needs at least 2 arguments: tag and attribute names. Default attribute value can be set with third argument or data between macro tags. All 3 values are required."); + return; + } + final LmlStyleSheet styleSheet = getParser().getStyleSheet(); + for (final String tag : tagNames) { + for (final String attribute : attributeNames) { + styleSheet.addStyle(tag, attribute, defaultValue); + } + } + } + + /** @return names of the modified tags extracted from attributes parsed as array. Assumes there is at least 1 + * attribute. */ + protected String[] getTagNames() { + final String tagNames = getTagNameArgument(); + return tagNames == null ? null : getParser().parseArray(tagNames, getActor()); + } + + /** @return name of the set attribute extracted from attributes parsed as array. Assumes there are at least 2 macro + * attributes. */ + private String[] getAttributeNames() { + final String attributeNames = getAttributeNameArgument(); + return attributeNames == null ? null : getParser().parseArray(attributeNames, getActor()); + } + + /** @return raw data of names of the modified tags extracted from attributes. Assumes there is at least 1 + * attribute. */ + protected String getTagNameArgument() { + final ObjectMap attributes = getNamedAttributes(); + if (GdxMaps.isNotEmpty(attributes)) { + return attributes.get(TAG_ATTRIBUTE); + } + return getAttributes().first(); + } + + /** @return raw data of names of the set attributes extracted from arguments. Assumes there are at least 2 macro + * attributes. */ + protected String getAttributeNameArgument() { + final ObjectMap attributes = getNamedAttributes(); + if (GdxMaps.isNotEmpty(attributes)) { + return attributes.get(ATTRIBUTE_ATTRIBUTE); + } + return getAttributes().get(1); + } + + /** @return default value of the set attribute extracted from attributes or tag content. */ + protected String getDefaultValueArgument() { + if (content != null) { + return content; + } + final ObjectMap attributes = getNamedAttributes(); + if (GdxMaps.isNotEmpty(attributes)) { + return attributes.get(VALUE_ATTRIBUTE); + } + if (GdxArrays.sizeOf(getAttributes()) >= 3) { + return getAttributes().get(2); + } + return null; + } + + @Override + public String[] getExpectedAttributes() { + return new String[] { TAG_ATTRIBUTE, ATTRIBUTE_ATTRIBUTE, VALUE_ATTRIBUTE }; + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleLmlMacroTagProvider.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleLmlMacroTagProvider.java new file mode 100644 index 00000000..134f3942 --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleLmlMacroTagProvider.java @@ -0,0 +1,16 @@ +package com.github.czyzby.lml.parser.impl.tag.macro.provider; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.macro.StyleLmlMacroTag; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.parser.tag.LmlTagProvider; + +/** Provides style macro tags. + * + * @author MJ */ +public class StyleLmlMacroTagProvider implements LmlTagProvider { + @Override + public LmlTag create(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { + return new StyleLmlMacroTag(parser, parentTag, rawTagData); + } +} From 7c06c2c5cb2ef656c36a5a9689d1b8a03164b015 Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 5 Jun 2016 23:55:29 +0200 Subject: [PATCH 14/58] Updated examples assets. --- .../assets/i18n/bundle.properties | 1 + .../assets/templates/examples/style.lml | 29 +++++++++++++++++++ .../assets/i18n/bundle.properties | 1 + .../assets/templates/examples/style.lml | 29 +++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 examples/gdx-lml-tests/assets/templates/examples/style.lml create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/style.lml diff --git a/examples/gdx-lml-tests/assets/i18n/bundle.properties b/examples/gdx-lml-tests/assets/i18n/bundle.properties index 48dd7dae..1f0abd4a 100644 --- a/examples/gdx-lml-tests/assets/i18n/bundle.properties +++ b/examples/gdx-lml-tests/assets/i18n/bundle.properties @@ -84,6 +84,7 @@ newAttribute=Macro: newAttribute newTag=Macro: newTag nullCheck=Macro: notNull random=Macro: random +style=Macro: style tableCell=Macro: tableCell tableColumn=Macro: tableColumn tableRow=Macro: tableRow diff --git a/examples/gdx-lml-tests/assets/templates/examples/style.lml b/examples/gdx-lml-tests/assets/templates/examples/style.lml new file mode 100644 index 00000000..bdaf531d --- /dev/null +++ b/examples/gdx-lml-tests/assets/templates/examples/style.lml @@ -0,0 +1,29 @@ + + +<:style button tablePadTop 20/> + + + +<:style button tablePadLeft>20 + + + +<:style tag="button" attribute="tablePadBottom" value="20"/> +<:style tag="button" attribute="tablePadRight">20 + + + +<:style tag="button" value="3" + attribute="tablePadTop;tablePadLeft;tablePadRight;tablePadBottom"/> + \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties index fa3a72a6..9dbda0ab 100644 --- a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties +++ b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties @@ -84,6 +84,7 @@ newAttribute=Macro: newAttribute newTag=Macro: newTag nullCheck=Macro: notNull random=Macro: random +style=Macro: style tableCell=Macro: tableCell tableColumn=Macro: tableColumn tableRow=Macro: tableRow diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/style.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/style.lml new file mode 100644 index 00000000..bdaf531d --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/style.lml @@ -0,0 +1,29 @@ + + +<:style button tablePadTop 20/> + + + +<:style button tablePadLeft>20 + + + +<:style tag="button" attribute="tablePadBottom" value="20"/> +<:style tag="button" attribute="tablePadRight">20 + + + +<:style tag="button" value="3" + attribute="tablePadTop;tablePadLeft;tablePadRight;tablePadBottom"/> + \ No newline at end of file From 21ad384e695b64309636383d569e2e76832301b4 Mon Sep 17 00:00:00 2001 From: MJ Date: Mon, 6 Jun 2016 16:07:33 +0200 Subject: [PATCH 15/58] Added comments support and LssSyntax. #27 --- .../github/czyzby/lml/parser/LmlSyntax.java | 3 + .../github/czyzby/lml/parser/LssSyntax.java | 34 +++++++++++ .../lml/parser/impl/DefaultLssSyntax.java | 48 +++++++++++++++ .../lml/parser/impl/EmptyLmlSyntax.java | 13 ++++ .../czyzby/lml/parser/impl/LssParser.java | 60 +++++++++++++++---- 5 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/LssSyntax.java create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLssSyntax.java diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/LmlSyntax.java b/lml/src/main/java/com/github/czyzby/lml/parser/LmlSyntax.java index ca29af9b..9b4a74a7 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/LmlSyntax.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/LmlSyntax.java @@ -304,6 +304,9 @@ public interface LmlSyntax { * @see #getConditionMarker() */ char getTernaryMarker(); + /** @return current LML style sheet files syntax. */ + LssSyntax getLssSyntax(); + /** @param tagName name of the tag as it appears in LML template. * @return provider of tags associated with the selected name. Might be null, if tag was not registered. * @see #getMacroTagProvider(String) */ diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/LssSyntax.java b/lml/src/main/java/com/github/czyzby/lml/parser/LssSyntax.java new file mode 100644 index 00000000..ff5f883e --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/LssSyntax.java @@ -0,0 +1,34 @@ +package com.github.czyzby.lml.parser; + +/** Contains markers and special characters of LML style sheet files. + * + * @author MJ */ +public interface LssSyntax { + /** @return if tag name starts with this character, instead of appending styles to its sheet, its styles will be + * copied and applied to other tags. Defaults to '.'. */ + char getInheritanceMarker(); + + /** @return character that starts block containing style definitions. Defaults to '{'. */ + char getBlockOpening(); + + /** @return character that ends block containing style definitions. Defaults to '}'. */ + char getBlockClosing(); + + /** @return character separating attribute name from its default value. Defaults to ':'. */ + char getSeparator(); + + /** @return character ending attribute definition, typically at the end of the line. Defaults to ';'. */ + char getLineEnd(); + + /** @return character used to separate multiple tag name definitions before style block. Defaults to ','. */ + char getTagSeparator(); + + /** @return character that opens and closes comments. Defaults to '/'. + * @see #getSecondaryCommentMarker() */ + char getCommentMarker(); + + /** @return character that has to appear after or before comment marker to properly open or close the comments. + * Defaults to '*'. + * @see #getCommentMarker() */ + char getSecondaryCommentMarker(); +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLssSyntax.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLssSyntax.java new file mode 100644 index 00000000..3eb19742 --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLssSyntax.java @@ -0,0 +1,48 @@ +package com.github.czyzby.lml.parser.impl; + +import com.github.czyzby.lml.parser.LssSyntax; + +/** Uses default LML style sheet syntax markers. + * + * @author MJ */ +public class DefaultLssSyntax implements LssSyntax { + @Override + public char getInheritanceMarker() { + return '.'; + } + + @Override + public char getBlockOpening() { + return '{'; + } + + @Override + public char getBlockClosing() { + return '}'; + } + + @Override + public char getSeparator() { + return ':'; + } + + @Override + public char getLineEnd() { + return ';'; + } + + @Override + public char getTagSeparator() { + return ','; + } + + @Override + public char getCommentMarker() { + return '/'; + } + + @Override + public char getSecondaryCommentMarker() { + return '*'; + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/EmptyLmlSyntax.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/EmptyLmlSyntax.java index b52fa0ac..cc64a16f 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/EmptyLmlSyntax.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/EmptyLmlSyntax.java @@ -6,6 +6,7 @@ import com.github.czyzby.kiwi.util.gdx.collection.immutable.ImmutableObjectMap; import com.github.czyzby.kiwi.util.gdx.collection.lazy.LazyObjectMap; import com.github.czyzby.lml.parser.LmlSyntax; +import com.github.czyzby.lml.parser.LssSyntax; import com.github.czyzby.lml.parser.tag.LmlActorBuilder; import com.github.czyzby.lml.parser.tag.LmlAttribute; import com.github.czyzby.lml.parser.tag.LmlBuildingAttribute; @@ -30,6 +31,8 @@ public class EmptyLmlSyntax implements LmlSyntax { * ignoring case, value: processor). */ private final ObjectMap, ObjectMap>> buildingAttributeProcessors = getLazyMapOfIgnoreCaseMaps(); + private final LssSyntax lssSyntax = createLssSyntax(); + /** @return a new instance of object map storing maps with keys as values, ignoring their case. Utility provider. * @param type of map keys. * @param type of stored maps values. */ @@ -45,6 +48,16 @@ public ObjectMap provide() { }); } + /** @return {@link LssSyntax} implementation. */ + protected LssSyntax createLssSyntax() { + return new DefaultLssSyntax(); + } + + @Override + public LssSyntax getLssSyntax() { + return lssSyntax; + } + // Warning: before any syntax changes, make sure that LmlUtilities are also updated. @Override diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java index 8b1b90d9..f91f9a88 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java @@ -8,6 +8,7 @@ import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.LmlStyleSheet; import com.github.czyzby.lml.parser.LmlTemplateReader; +import com.github.czyzby.lml.parser.LssSyntax; /** Allows to process LML style sheet code (with CSS-like syntax), extracting default attribute values of selected tags. * @@ -20,12 +21,14 @@ public class LssParser { private final LmlParser parser; private final LmlStyleSheet styleSheet; private final LmlTemplateReader reader; - private final char inheritanceMarker = '.'; - private final char blockOpening = '{'; - private final char blockClosing = '}'; - private final char separator = ':'; - private final char lineEnd = ';'; - private final char tagSeparator = ','; // TODO comments: '/* */' + private final char inheritanceMarker; + private final char blockOpening; + private final char blockClosing; + private final char separator; + private final char lineEnd; + private final char tagSeparator; + private final char commentMarker; + private final char commentSecondary; // Control variables: private final StringBuilder builder = new StringBuilder(); @@ -39,7 +42,15 @@ public LssParser(final LmlParser parser) { this.parser = parser; styleSheet = parser.getStyleSheet(); reader = parser.getTemplateReader(); - // TODO extract values from syntax + final LssSyntax syntax = parser.getSyntax().getLssSyntax(); + inheritanceMarker = syntax.getInheritanceMarker(); + blockOpening = syntax.getBlockOpening(); + blockClosing = syntax.getBlockClosing(); + separator = syntax.getSeparator(); + lineEnd = syntax.getLineEnd(); + tagSeparator = syntax.getTagSeparator(); + commentMarker = syntax.getCommentMarker(); + commentSecondary = syntax.getSecondaryCommentMarker(); } /** @param lss LML style sheet data. Will be parsed and processed. */ @@ -71,7 +82,7 @@ protected void throwException(final String string) { /** Parses names proceeding styles block. */ protected void parseNames() { while (reader.hasNextCharacter()) { - final char character = reader.nextCharacter(); + final char character = next(); if (Strings.isWhitespace(character)) { addName(); continue; @@ -108,12 +119,15 @@ protected void parseAttributes() { burnWhitespaces(); attribute = null; while (reader.hasNextCharacter()) { - final char character = reader.peekCharacter(); + char character = reader.peekCharacter(); if (Strings.isNewLine(character) && (attribute != null || Strings.isNotEmpty(builder))) { throwException("Expecting line end marker: '" + lineEnd + "'."); } - reader.nextCharacter(); - if (character == blockClosing) { + character = next(); + if (Strings.isNewLine(character) && (attribute != null || Strings.isNotEmpty(builder))) { + // Needs double check, possible comment along the way. + throwException("Expecting line end marker: '" + lineEnd + "'."); + } else if (character == blockClosing) { if (attribute != null || Strings.isNotEmpty(builder)) { throwException("Unexpected tag close."); } @@ -144,7 +158,7 @@ protected void addAttributeName() { } /** Clears attribute cache, adds default attribute value. */ - private void addAttribute() { + protected void addAttribute() { attributes.put(attribute, builder.toString().trim()); attribute = null; Strings.clearBuilder(builder); @@ -163,11 +177,31 @@ protected void processAttributes() { /** Analyzes characters, raising the index. Stops after encountering first non-whitespace character. */ protected void burnWhitespaces() { while (reader.hasNextCharacter()) { - if (Strings.isNotWhitespace(reader.peekCharacter())) { + final char character = reader.peekCharacter(); + if (Strings.isWhitespace(character) || character == commentMarker && reader.hasNextCharacter(1) + && reader.peekCharacter(1) == commentSecondary) { + next(); + } else { return; } + } + } + + /** @return next comment in the style sheet, with comments removed. */ + protected char next() { + final char next = reader.nextCharacter(); + if (next == commentMarker && reader.hasNextCharacter() && reader.peekCharacter() == commentSecondary) { reader.nextCharacter(); + while (reader.hasNextCharacter()) { + final char character = reader.nextCharacter(); + if (character == commentSecondary && reader.hasNextCharacter() + && reader.peekCharacter() == commentMarker) { + reader.nextCharacter(); + return reader.hasNextCharacter() ? next() : '\n'; + } + } } + return next; } /** Clears control variables. */ From 19fd4055070fa808e58cfdd0654a10d8dafd0763 Mon Sep 17 00:00:00 2001 From: MJ Date: Mon, 6 Jun 2016 16:16:11 +0200 Subject: [PATCH 16/58] Updated README. Close #27 --- lml/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/lml/README.md b/lml/README.md index ec22a0ee..5bc1571c 100644 --- a/lml/README.md +++ b/lml/README.md @@ -35,6 +35,7 @@ If you want to use LML with GWT, you have to add this module to your `GdxDefinit 1.7 -> 1.8 - Added `<:random>` macro, which allows to choose a random value from the passed array. +- Added LML style sheets support. See wiki for more info. - Added `<:style>` macro, which allows to set default values of tag attributes at runtime, similarly to LML style sheets. 1.6 -> 1.7 From 6642e787413afdc369044bbee37e63f5ac26597f Mon Sep 17 00:00:00 2001 From: MJ Date: Mon, 6 Jun 2016 17:21:53 +0200 Subject: [PATCH 17/58] LML UEDI fixes. --- .../lml/uedi/assets/AssetManagerProvider.java | 2 +- .../lml/uedi/assets/TextureAtlasProvider.java | 3 ++- .../assets/impl/AbstractEagerAssetProvider.java | 2 +- .../czyzby/lml/uedi/i18n/I18NBundleProvider.java | 15 +++++++++++++++ .../com/github/czyzby/lml/uedi/views/View.java | 10 ++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java index 6e211890..789444b9 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/AssetManagerProvider.java @@ -18,7 +18,7 @@ public class AssetManagerProvider implements Destructible, Provider getType() { - return InjectingAssetManager.class; + return AssetManager.class; } @Override diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java index cde00333..221e92f6 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/TextureAtlasProvider.java @@ -36,7 +36,8 @@ protected String[] getExtensions() { * @return path of the atlas with the default extension in the default atlas folder. */ public static String getTextureAtlasPath(final String id) { final String extension = EXTENSIONS[0]; - final StringBuilder builder = new StringBuilder(ATLAS_FOLDER.length() + 1 + id + 1 + extension); + final StringBuilder builder = new StringBuilder( + ATLAS_FOLDER.length() + 1 + id.length() + 1 + extension.length()); builder.append(ATLAS_FOLDER).append('/').append(id); Strings.replace(builder, '_', '/'); builder.append('.').append(extension); diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java index 6f50d705..6a25364d 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/assets/impl/AbstractEagerAssetProvider.java @@ -32,7 +32,7 @@ public Asset provide(final Object target, final Member member) { } final Asset asset = getOrLoad(id); if (member instanceof FieldMember && target instanceof Loaded) { - ((Loaded) target).onLoad(determinePath(id), getType(), idsToAssets.get(id)); + ((Loaded) target).onLoad(determinePath(id), getType(), asset); } return asset; } diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java index 8329b533..0531f18e 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/i18n/I18NBundleProvider.java @@ -100,6 +100,21 @@ public I18NBundle getOrLoad(final String id) { return bundle; } + @Override + protected String determinePath(final String id) { + final ObjectMap idsToPaths = getIdsToPaths(); + String path = idsToPaths.get(id); + if (path != null) { + return path; + } + final StringBuilder builder = new StringBuilder(getFolder().length() + 1 + id.length()); + builder.append(getFolder()).append('/').append(id); + Strings.replace(builder, '_', '/'); + path = builder.toString(); + idsToPaths.put(id, path); + return path; + } + /** @return encoding used to read {@link I18NBundle} files. Defaults to UTF-8. */ public String getEncoding() { return encoding; diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java index c903e861..5cf79765 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/views/View.java @@ -44,6 +44,16 @@ public String getName() { return getViewId(); } + @Override + public final void render() { + render(Gdx.graphics.getDeltaTime()); + } + + @Override + public final void resize(final int width, final int height) { + resize(width, height, false); + } + /** Override this method and return {@code true} if this view should be displayed first. Usually the first view * would inject the {@link com.badlogic.gdx.assets.AssetManager AssetManager} and update it until all assets are * loaded. From 0435bd10a430826390ec3d72ef6e411ac249578f Mon Sep 17 00:00:00 2001 From: MJ Date: Mon, 6 Jun 2016 22:03:48 +0200 Subject: [PATCH 18/58] Added UEDI README. --- uedi/README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 uedi/README.md diff --git a/uedi/README.md b/uedi/README.md new file mode 100644 index 00000000..5f1e2ff8 --- /dev/null +++ b/uedi/README.md @@ -0,0 +1,29 @@ +# UEDI for LibGDX + +[Unsettlingly Easy Dependency Injection](https://github.com/czyzby/uedi) is a dependency injection framework (not surprisingly) which aims to be as *non-invasive* as possible. Instead of flooding your code with third-party annotations, you're free to use POJOs constructed or filled with some reflection magic. + +`gdx-uedi` extension is basically a reimplementation of `uedi-core` library using LibGDX reflection wrappers instead of the official Java reflection API to support problematic platforms like GWT. If you don't care about GWT and want to use UEDI at its finest, don't bother with this library. If you want to make sure that it works on every platform, this might be the only way. + +### Limitations + +LibGDX reflection API misses method and constructor parameter names, so no parameter-aware context is provided (even for Java 8+). + +Also, there is no reliable way of listing implemented interfaces of classes at runtime, so - contrary to `uedi-core` - LibGDX UEDI context maps components **only** by their class tree: you generally cannot inject components by their interfaces, unless explicitly mapping providers to interfaces. So, for example, if there is an `ArrayList` provider in the context, `uedi-core` would be able to inject an `ArrayList` into a `List` field; `gdx-uedi` would not. However, both would be able to inject `ArrayList` into an `AbstractList` field, as `AbstractList` is not an interface. + +## Dependencies + +To use UEDI with `Gradle`, add this dependency to your core project: +``` + compile "com.github.czyzby:gdx-uedi:$libVersion.$gdxVersion" +``` + +`$libVersion` is the current version of the library, usually following `MAJOR.MINOR` schema. `$gdxVersion` is the LibGDX version used to build (and required by) the library. You can check the current library version [here](http://search.maven.org/#search|ga|1|g%3A%22com.github.czyzby%22) - or you can use the [snapshots](https://oss.sonatype.org/content/repositories/snapshots/com/github/czyzby/). + +If you want to use UEDI with GWT, you have to add this module to your `GdxDefinition`: +``` + +``` + +[Standard UEDI scanners](https://github.com/czyzby/uedi) are fully compatible with `gdx-uedi`, so choose the ones appropriate for each platform. Note that the fastest way to set up UEDI application is using the unofficial [gdx-setup](https://github.com/czyzby/gdx-setup). + +See [LML UEDI](../lml-uedi) for a LibGDX framework built around UEDI and [LML](../lml) (*LibGDX Markup Language*). From c5c0582458f07c4d5298d26129c23696fd68890d Mon Sep 17 00:00:00 2001 From: MJ Date: Tue, 7 Jun 2016 17:30:02 +0200 Subject: [PATCH 19/58] Added missing music service actions. --- .../czyzby/lml/uedi/music/MusicService.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java index 10f99fe3..c6b5c5d8 100644 --- a/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java +++ b/lml-uedi/src/main/java/com/github/czyzby/lml/uedi/music/MusicService.java @@ -54,6 +54,31 @@ public MusicService(final Stage stage, final MusicOnPreference musicOn, final So /** @param data will include a few useful {@link ActorConsumer} instances that allow to set up current music and * sound preferences. */ public void addDefaultActions(final LmlData data) { + // Allows to query current music settings in LML templates. + data.addActorConsumer("isMusicOn", new ActorConsumer() { + @Override + public Boolean consume(final Object actor) { + return isMusicOn(); + } + }); + data.addActorConsumer("isSoundOn", new ActorConsumer() { + @Override + public Boolean consume(final Object actor) { + return isSoundOn(); + } + }); + data.addActorConsumer("getMusicVolume", new ActorConsumer() { + @Override + public Float consume(final Object actor) { + return getMusicVolume(); + } + }); + data.addActorConsumer("getSoundVolume", new ActorConsumer() { + @Override + public Float consume(final Object actor) { + return getSoundVolume(); + } + }); // Allows to turn the music on and off. data.addActorConsumer("setMusicOn", new ActorConsumer() { @Override From 47a706a753d3e3ea110bd0ba451b5e0a1ab55714 Mon Sep 17 00:00:00 2001 From: MJ Date: Wed, 8 Jun 2016 15:41:14 +0200 Subject: [PATCH 20/58] Created gdx-lml-uedi-tests project. --- .gitignore | 1 + .../gdx-autumn-mvc-simple/gradle.properties | 1 + examples/gdx-autumn-tests/gradle.properties | 1 + examples/gdx-lml-tests/gradle.properties | 1 + .../android/AndroidManifest.xml | 24 +++ .../gdx-lml-uedi-tests/android/build.gradle | 154 ++++++++++++++++++ .../android/ic_launcher-web.png | Bin 0 -> 51394 bytes .../android/proguard-project.txt | 45 +++++ .../android/project.properties | 14 ++ .../android/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 7658 bytes .../android/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 3777 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 12516 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 24777 bytes .../android/res/values/strings.xml | 4 + .../android/res/values/styles.xml | 10 ++ .../czyzby/tests/android/AndroidLauncher.java | 19 +++ .../gdx-lml-uedi-tests/assets/view/first.lml | 5 + examples/gdx-lml-uedi-tests/build.gradle | 41 +++++ examples/gdx-lml-uedi-tests/core/build.gradle | 10 ++ .../java/com/github/czyzby/tests/Root.gwt.xml | 6 + .../java/com/github/czyzby/tests/Root.java | 42 +++++ .../gdx-lml-uedi-tests/desktop/build.gradle | 25 +++ .../czyzby/tests/desktop/DesktopLauncher.java | 31 ++++ .../desktop/src/main/resources/libgdx128.png | Bin 0 -> 1828 bytes .../desktop/src/main/resources/libgdx16.png | Bin 0 -> 205 bytes .../desktop/src/main/resources/libgdx32.png | Bin 0 -> 533 bytes .../desktop/src/main/resources/libgdx64.png | Bin 0 -> 963 bytes examples/gdx-lml-uedi-tests/gradle.properties | 12 ++ examples/gdx-lml-uedi-tests/gwt/build.gradle | 80 +++++++++ .../github/czyzby/tests/GdxDefinition.gwt.xml | 16 ++ .../tests/GdxDefinitionSuperdev.gwt.xml | 9 + .../github/czyzby/tests/gwt/GwtLauncher.java | 22 +++ .../gwt/webapp/WEB-INF/web.xml | 3 + .../gdx-lml-uedi-tests/gwt/webapp/index.html | 32 ++++ .../gdx-lml-uedi-tests/gwt/webapp/refresh.png | Bin 0 -> 2971 bytes .../gwt/webapp/soundmanager2-jsmin.js | 110 +++++++++++++ .../gwt/webapp/soundmanager2-setup.js | 1 + .../gdx-lml-uedi-tests/gwt/webapp/styles.css | 43 +++++ examples/gdx-lml-uedi-tests/settings.gradle | 1 + examples/gdx-lml-vis-tests/gradle.properties | 1 + .../gdx-lml-vis-websocket/gradle.properties | 1 + examples/gdx-lml-vis-wiki/gradle.properties | 1 + examples/gdx-websocket-json/gradle.properties | 1 + .../gradle.properties | 1 + .../gradle.properties | 1 + .../gdx-websocket-tests/gradle.properties | 1 + examples/gradle.properties | 1 + .../czyzby/uedi/impl/DefaultContext.java | 12 +- 48 files changed, 781 insertions(+), 2 deletions(-) create mode 100644 examples/gdx-lml-uedi-tests/android/AndroidManifest.xml create mode 100644 examples/gdx-lml-uedi-tests/android/build.gradle create mode 100644 examples/gdx-lml-uedi-tests/android/ic_launcher-web.png create mode 100644 examples/gdx-lml-uedi-tests/android/proguard-project.txt create mode 100644 examples/gdx-lml-uedi-tests/android/project.properties create mode 100644 examples/gdx-lml-uedi-tests/android/res/drawable-hdpi/ic_launcher.png create mode 100644 examples/gdx-lml-uedi-tests/android/res/drawable-mdpi/ic_launcher.png create mode 100644 examples/gdx-lml-uedi-tests/android/res/drawable-xhdpi/ic_launcher.png create mode 100644 examples/gdx-lml-uedi-tests/android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 examples/gdx-lml-uedi-tests/android/res/values/strings.xml create mode 100644 examples/gdx-lml-uedi-tests/android/res/values/styles.xml create mode 100644 examples/gdx-lml-uedi-tests/android/src/main/java/com/github/czyzby/tests/android/AndroidLauncher.java create mode 100644 examples/gdx-lml-uedi-tests/assets/view/first.lml create mode 100644 examples/gdx-lml-uedi-tests/build.gradle create mode 100644 examples/gdx-lml-uedi-tests/core/build.gradle create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java create mode 100644 examples/gdx-lml-uedi-tests/desktop/build.gradle create mode 100644 examples/gdx-lml-uedi-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java create mode 100644 examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx128.png create mode 100644 examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx16.png create mode 100644 examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx32.png create mode 100644 examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx64.png create mode 100644 examples/gdx-lml-uedi-tests/gradle.properties create mode 100644 examples/gdx-lml-uedi-tests/gwt/build.gradle create mode 100644 examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml create mode 100644 examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml create mode 100644 examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/gwt/GwtLauncher.java create mode 100644 examples/gdx-lml-uedi-tests/gwt/webapp/WEB-INF/web.xml create mode 100644 examples/gdx-lml-uedi-tests/gwt/webapp/index.html create mode 100644 examples/gdx-lml-uedi-tests/gwt/webapp/refresh.png create mode 100644 examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-jsmin.js create mode 100644 examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-setup.js create mode 100644 examples/gdx-lml-uedi-tests/gwt/webapp/styles.css create mode 100644 examples/gdx-lml-uedi-tests/settings.gradle diff --git a/.gitignore b/.gitignore index 922d3bab..8da7775f 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ android/gen/ *.ipr *.iws *.iml +*.so out/ com_crashlytics_export_strings.xml diff --git a/examples/gdx-autumn-mvc-simple/gradle.properties b/examples/gdx-autumn-mvc-simple/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-autumn-mvc-simple/gradle.properties +++ b/examples/gdx-autumn-mvc-simple/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-autumn-tests/gradle.properties b/examples/gdx-autumn-tests/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-autumn-tests/gradle.properties +++ b/examples/gdx-autumn-tests/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-lml-tests/gradle.properties b/examples/gdx-lml-tests/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-lml-tests/gradle.properties +++ b/examples/gdx-lml-tests/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-lml-uedi-tests/android/AndroidManifest.xml b/examples/gdx-lml-uedi-tests/android/AndroidManifest.xml new file mode 100644 index 00000000..2e7058f3 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/android/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/examples/gdx-lml-uedi-tests/android/build.gradle b/examples/gdx-lml-uedi-tests/android/build.gradle new file mode 100644 index 00000000..76d8854e --- /dev/null +++ b/examples/gdx-lml-uedi-tests/android/build.gradle @@ -0,0 +1,154 @@ +apply plugin: 'android' + +android { + buildToolsVersion '23.0.3' + compileSdkVersion 23 + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src/main/java'] + aidl.srcDirs = ['src/main/java'] + renderscript.srcDirs = ['src/main/java'] + res.srcDirs = ['res'] + assets.srcDirs = ['../assets'] + jniLibs.srcDirs = ['libs'] + } + + instrumentTest.setRoot('tests') + } + packagingOptions { + // Preventing from license violations (more or less): + pickFirst 'META-INF/LICENSE.txt' + pickFirst 'META-INF/LICENSE' + pickFirst 'META-INF/license.txt' + pickFirst 'META-INF/LGPL2.1' + pickFirst 'META-INF/NOTICE.txt' + pickFirst 'META-INF/NOTICE' + pickFirst 'META-INF/notice.txt' + // Excluding unnecessary meta-data: + exclude 'META-INF/robovm/ios/robovm.xml' + exclude 'META-INF/DEPENDENCIES.txt' + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/dependencies.txt' + } + defaultConfig { + applicationId 'com.github.czyzby.tests' + minSdkVersion 8 + targetSdkVersion 23 + } +} + +configurations { natives } + +dependencies { + compile project(':core') + compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" + compile "com.github.czyzby:uedi-android:$uediVersion" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" + natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" +} + +// Called every time gradle gets executed, takes the native dependencies of +// the natives configuration, and extracts them to the proper libs/ folders +// so they get packed with the APK. +task copyAndroidNatives() { + file("libs/armeabi/").mkdirs(); + file("libs/armeabi-v7a/").mkdirs(); + file("libs/arm64-v8a/").mkdirs(); + file("libs/x86_64/").mkdirs(); + file("libs/x86/").mkdirs(); + + configurations.natives.files.each { jar -> + def outputDir = null + if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a") + if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a") + if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi") + if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64") + if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") + if(outputDir != null) { + copy { + from zipTree(jar) + into outputDir + include "*.so" + } + } + } +} + +task run(type: Exec) { + def path + def localProperties = project.file("../local.properties") + if (localProperties.exists()) { + Properties properties = new Properties() + localProperties.withInputStream { instr -> + properties.load(instr) + } + def sdkDir = properties.getProperty('sdk.dir') + if (sdkDir) { + path = sdkDir + } else { + path = '$System.env.ANDROID_HOME' + } + } else { + path = '$System.env.ANDROID_HOME' + } + + def adb = path + "/platform-tools/adb" + commandLine '$adb', 'shell', 'am', 'start', '-n', 'com.github.czyzby.tests/com.github.czyzby.tests.android.AndroidLauncher' +} + +// Sets up the Android Eclipse project using the old Ant based build. +eclipse { + // needs to specify Java source sets explicitly, SpringSource Gradle Eclipse plugin + // ignores any nodes added in classpath.file.withXml + sourceSets { + main { + java.srcDirs 'src/main/java', 'gen' + } + } + + jdt { + sourceCompatibility = 1.6 + targetCompatibility = 1.6 + } + + classpath { + plusConfigurations += [ project.configurations.compile ] + containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES' + } + + project { + name = appName + "-android" + natures 'com.android.ide.eclipse.adt.AndroidNature' + buildCommands.clear(); + buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder" + buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder" + buildCommand "org.eclipse.jdt.core.javabuilder" + buildCommand "com.android.ide.eclipse.adt.ApkBuilder" + } +} + +// Sets up the Android Idea project using the old Ant based build. +idea { + module { + sourceDirs += file("src/main/java"); + scopes = [ COMPILE: [plus:[project.configurations.compile]]] + iml { + withXml { + def node = it.asNode() + def builder = NodeBuilder.newInstance(); + builder.current = node; + builder.component(name: "FacetManager") { + facet(type: "android", name: "Android") { + configuration { + option(name: "UPDATE_PROPERTY_FILES", value:"true") + } + } + } + } + } + } +} diff --git a/examples/gdx-lml-uedi-tests/android/ic_launcher-web.png b/examples/gdx-lml-uedi-tests/android/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..a18cbb48c431dfcc163fce2b6e27e981f8c09f6a GIT binary patch literal 51394 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.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration); +} + +-keepclassmembers class com.badlogic.gdx.physics.box2d.World { + boolean contactFilter(long, long); + void beginContact(long); + void endContact(long); + void preSolve(long, long); + void postSolve(long, long); + boolean reportFixture(long); + float reportRayFixture(long, float, float, float, float, float); +} diff --git a/examples/gdx-lml-uedi-tests/android/project.properties b/examples/gdx-lml-uedi-tests/android/project.properties new file mode 100644 index 00000000..4ab12569 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/android/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-19 diff --git a/examples/gdx-lml-uedi-tests/android/res/drawable-hdpi/ic_launcher.png b/examples/gdx-lml-uedi-tests/android/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..288b66551d1efd1f13dd06f20a67534d2df57946 GIT binary patch literal 7658 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 literal 0 HcmV?d00001 diff --git a/examples/gdx-lml-uedi-tests/android/res/drawable-xhdpi/ic_launcher.png b/examples/gdx-lml-uedi-tests/android/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fb7cd9d868f1d7d9964f1686dcbc018ef9495a GIT binary patch literal 12516 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 literal 0 HcmV?d00001 diff --git a/examples/gdx-lml-uedi-tests/android/res/values/strings.xml b/examples/gdx-lml-uedi-tests/android/res/values/strings.xml new file mode 100644 index 00000000..4c659eb8 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/android/res/values/strings.xml @@ -0,0 +1,4 @@ + + + gdx-lml-uedi-tests + diff --git a/examples/gdx-lml-uedi-tests/android/res/values/styles.xml b/examples/gdx-lml-uedi-tests/android/res/values/styles.xml new file mode 100644 index 00000000..efc31fab --- /dev/null +++ b/examples/gdx-lml-uedi-tests/android/res/values/styles.xml @@ -0,0 +1,10 @@ + + + diff --git a/examples/gdx-lml-uedi-tests/android/src/main/java/com/github/czyzby/tests/android/AndroidLauncher.java b/examples/gdx-lml-uedi-tests/android/src/main/java/com/github/czyzby/tests/android/AndroidLauncher.java new file mode 100644 index 00000000..fb66e07f --- /dev/null +++ b/examples/gdx-lml-uedi-tests/android/src/main/java/com/github/czyzby/tests/android/AndroidLauncher.java @@ -0,0 +1,19 @@ +package com.github.czyzby.tests.android; + +import android.os.Bundle; + +import com.badlogic.gdx.backends.android.AndroidApplication; +import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; +import com.github.czyzby.lml.uedi.LmlApplication; +import com.github.czyzby.uedi.scanner.impl.AndroidClassScanner; +import com.github.czyzby.tests.Root; + +/** Launches the Android application. */ +public class AndroidLauncher extends AndroidApplication { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + AndroidApplicationConfiguration configuration = new AndroidApplicationConfiguration(); + initialize(new LmlApplication(Root.class, new AndroidClassScanner(getApplicationInfo()), "gdx-lml-uedi-tests"), configuration); + } +} \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/assets/view/first.lml b/examples/gdx-lml-uedi-tests/assets/view/first.lml new file mode 100644 index 00000000..ad98c44e --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/view/first.lml @@ -0,0 +1,5 @@ + + + This is a simple LU view constructed with LML. + Click me! + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/build.gradle b/examples/gdx-lml-uedi-tests/build.gradle new file mode 100644 index 00000000..788930a8 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/build.gradle @@ -0,0 +1,41 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + } + dependencies { + classpath "com.badlogicgames.gdx:gdx-tools:$gdxVersion" + classpath "com.android.tools.build:gradle:$androidPluginVersion" + classpath "de.richsource.gradle.plugins:gwt-gradle-plugin:$gwtPluginVersion" + } +} + +allprojects { + apply plugin: 'eclipse' + apply plugin: 'idea' +} + +configure(subprojects - project(':android')) { + apply plugin: 'java' + sourceCompatibility = 1.6 +} + +subprojects { + version = '0.0.1-SNAPSHOT' + ext.appName = 'gdx-lml-uedi-tests' + repositories { + mavenLocal() + mavenCentral() + jcenter() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + } +} + +// Clearing Eclipse project data in root folder: +tasks.eclipse.doLast { + delete '.project' + delete '.classpath' + delete '.settings/' +} diff --git a/examples/gdx-lml-uedi-tests/core/build.gradle b/examples/gdx-lml-uedi-tests/core/build.gradle new file mode 100644 index 00000000..63ff4b39 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/build.gradle @@ -0,0 +1,10 @@ +[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' +eclipse.project.name = appName + '-core' + +dependencies { + compile "com.badlogicgames.gdx:gdx:$gdxVersion" + compile "com.github.czyzby:gdx-lml-vis:$libVersion" + compile "com.github.czyzby:gdx-lu:$libVersion" + compile "com.kotcrab.vis:vis-ui:$visVersion" +} + diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml new file mode 100644 index 00000000..1bd36c51 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java new file mode 100644 index 00000000..80dbd038 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java @@ -0,0 +1,42 @@ +package com.github.czyzby.tests; + +import java.lang.reflect.Member; + +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.github.czyzby.lml.annotation.LmlAction; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.lml.vis.util.VisLml; +import com.github.czyzby.uedi.stereotype.Provider; + +/** The first application's view. See first.lml file for widgets layout. */ +public class Root extends View implements Provider { + /** Default application size. */ + public static final int WIDTH = 640, HEIGHT = 480; + + @Override + public String getViewId() { + return "first"; + } + @Override + public boolean isFirst() { + return true; + } + + // This class implements Provider interface to customize LmlParser used to create the view. + @Override + public Class getType() { + return LmlParser.class; + } + @Override + public LmlParser provide(final Object target, final Member member) { + return VisLml.parser().build(); + } + + /** Since this method is annotated with LmlAction, it will be available in the LML template: first.lml. + * @param button its text will be changed. */ + @LmlAction("setClicked") + public void changeButtonText(final TextButton button) { + button.setText("Clicked."); + } +} \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/desktop/build.gradle b/examples/gdx-lml-uedi-tests/desktop/build.gradle new file mode 100644 index 00000000..81839e35 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/desktop/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'application' + +sourceSets.main.resources.srcDirs += [ rootProject.file('assets').absolutePath ] +mainClassName = 'com.github.czyzby.tests.desktop.DesktopLauncher' +eclipse.project.name = appName + '-desktop' +sourceCompatibility = 1.7 + +dependencies { + compile project(':core') + compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" + compile "com.github.czyzby:uedi:$uediVersion" +} + +jar { + archiveName "${appName}-${version}.jar" + from { configurations.compile.collect { zipTree(it) } } + manifest { + attributes 'Main-Class': project.mainClassName + } +} + +run { + ignoreExitValue = true +} diff --git a/examples/gdx-lml-uedi-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java b/examples/gdx-lml-uedi-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java new file mode 100644 index 00000000..d8473ab3 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/desktop/src/main/java/com/github/czyzby/tests/desktop/DesktopLauncher.java @@ -0,0 +1,31 @@ +package com.github.czyzby.tests.desktop; + +import com.badlogic.gdx.Files.FileType; +import com.badlogic.gdx.backends.lwjgl.LwjglApplication; +import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; +import com.github.czyzby.lml.uedi.LmlApplication; +import com.github.czyzby.uedi.scanner.impl.DefaultClassScanner; +import com.github.czyzby.tests.Root; + +/** Launches the desktop (LWJGL) application. */ +public class DesktopLauncher { + public static void main(String[] args) { + createApplication(); + } + + private static LwjglApplication createApplication() { + return new LwjglApplication(new LmlApplication(Root.class, new DefaultClassScanner(), "gdx-lml-uedi-tests"), + getDefaultConfiguration()); + } + + private static LwjglApplicationConfiguration getDefaultConfiguration() { + LwjglApplicationConfiguration configuration = new LwjglApplicationConfiguration(); + configuration.title = "gdx-lml-uedi-tests"; + configuration.width = Root.WIDTH; + configuration.height = Root.HEIGHT; + for (int size : new int[] { 128, 64, 32, 16 }) { + configuration.addIcon("libgdx" + size + ".png", FileType.Internal); + } + return configuration; + } +} \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx128.png b/examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx128.png new file mode 100644 index 0000000000000000000000000000000000000000..41587f2def1337909455e7e4535df4e86a1a669a GIT binary patch literal 1828 zcmbVN`8ON*9{q+$iZPZxrL}ZXba++D&{HI-CWzWfELFQfEmI6BN+onu)z*=xMS`eS zYiG2?8cT^*$4=}CPn#fGbQ)rv^k10!IrnqVx#!$-fBBsANwv4Nkdind0RWJ~TB03< zO8m|vFyZb-`1A_}=6lTo4GzB#we2NI=!l0~-iQ3xjo7^c7sp^x8BbRO#b!`1+SfgyxH4h=bMI&@rcJ@5QH+lPIMTOAN2?j&WIX zt=pz zBG2;?9rD(;jXp$HhaJ@8vt5CrN!6j5Jgxk4V(1p&kCcdbO`O9 zY)yn1O7=0cc&9%`hX4h=J3GzRCD|!`ocK(#EO%e8qPAvP&%fS$nHxfftk)jW`~w^P zkwL$kUS$}mBOPy({GM$ih~LtV?;T48uAv*7 zR)|U5dfeR)Bg0J3A0-e_)@lP!6LM-yJlurTWTh1hagAQax!)_#UD=0$$`2oH8_TBP zIrMGytcM8JExB8ESvTBN_f?1o#O$rPZOa4~ywRBW(C2~M@Y;hBa*TiUPkFpo8i}~a zAbiOzo4UZ}Yz|Je%TGh?QMjm8^}Ap2Qr7!cc+G$r$3@G4V(gIp`sw@MI>Y!Hx+2uM z5*BZ^;gwOMrbF4!vJt%|`O2u1lre6*9p|@?x)uWDyCpZZ^1&++g8~Ilf@-~l-B`Pe zm4@-ym@J6iowF~0Z`2aWPvb!8YCCfO*%E`X{)~=$W8etU0tc&gf9crdMOE|jFj;S_ zy0m?y5x_lU#;<%c-Gwaahu@D2)J|LsSIc3W-IoRdq-*A*ntHRaOfLw#Jb(Wupr246 z^~aIF_qv{Ikq)#U*z^Z_G|tuB`%SP}Mt+bIn1onLDZ_D|`=D1?UPc!;|A=vU&n~l` z%fh_E~zgQ{0VfNxqk5&x>D7>{L*Bn6;FWgz(arXCE{X$HR=3 zOxl6>vj8$IT)9Jrn3J}Vp+CEMVLB?HD{M7?=T>vBt@4G^>=uUbMp_kE14XTwro)Fl z{#E75!iwxip+A&EK_MBrom?DSGle;j4OStpfq9YjsV4=FQ7OkG4r9+0(9TzmGN#TF z+nb5TT$Kzc(z=2;4*m=3juq;wLMk0D#@ghPP--!XsHRl*$xO~BGK3cVAgC22OfE+D zdN>kfCZLz<1cf=~7`~vgeJ|MEPLHG*{JLeTYhw@6fd$t=5j;H2q9_H#2Nr8fx_lda zP)OjsI&&R(f$(|;W&JUK3wgS`J4aXSup3t%S;|wkrwW3s>e_O#l+3K9B5_BNz1N?j ziFW`4xO*{Q9_`2g^X`4(%~gAiDAw*HZ6KAMD>{2(hk-af@t#`Tu!xm z%c{Ydr*RC%x-!ev%gg0?=n}q=9ep#!+|PMoMn>S&VdZV1H@6$=s)btn0-{ANcmLi6 zVA_Tfr98;LprD_cz|i}#sdQ?++2qkC?3}}VMlbxU3Y{0l$zkZ{l|D(jzVD@pBP=<- zw2KvErPGp$^4E`R-E59bG3S(C7?<7MaJYOLsD6Eyl<3>65K*BUQ+Jd)gepo6_IG`Q zM0#3l&i4qU?^~bq)Kk-;>f2NU(}G8=gBOH_tUK&s+qWuVAuI9YADg2yPvGr<(hmop zVg?4rGpxqnhs7ZaWW-c|H5BjS>vAy^fq$Kw=GJRACGIR4f74`u^oosg?2N8^f!Kb7 zt=-9NX}Gcx-=W}5&9&u8M2e(~UgA`br+XSgJLyk16Z*>(kwF4WC%A8eDc*3~T>YfX z-VOQvyYU8LViS#_6B%={OlOqm5w4+Y5!44u+=7Hw4jejF@V^{RR-p|SKak$_I9CGl zgsRD<;rBzLn^7h%F$)y-?&0}RXAFJ9)M5MHRg$~mYVYOh$(2UA9fBN1;4;!<3j%Mq zv&7gMfUva^wZ`Qduj${_h9Y50iaNaI64B0^5>v~#bTZRbVB}^n;Yj2q`(B;>v%Vvb zVEot7c#C3bgA;r8SX~qMRJ^<3A)rh3b-xTI5g+~=JQ>lHNlrWL;AT^W{|sO;w&-dz H@1%bK{_%j4 literal 0 HcmV?d00001 diff --git a/examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx16.png b/examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx16.png new file mode 100644 index 0000000000000000000000000000000000000000..43d3f847bd7ae17c0403e6f49cff78fe8956c339 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPNE2E&9{AL@T4?v+PPZ!4!i_^&o65Afw^GPuq2pV)u zoZ#!@vWw-|KmS#XEU|}O+;&{xu=%+4C;#CSH7S)PUwL+@6l%Jd$*fi?5f|7ZX)BOw tCZDMC#CPUdcZrR=BxcX=81P(PkZ*Twr0isDn zK~z}7?bE$$6hRor@$a*DYSe(nDz^xNTqD6kY!w7|gYF?%h~Qr!7z9Zv!9);DBWRH# ztsugkR$-O9MI;u2#cF4xjSBaIVhRl;aowMV6FCmS(q=v|3=aeIJkPv<=Xsvz{b%N8 z0hfVuE?xnafxxZNOX54g46ti>gX+&9EGlJpWZx3VtEQWUtSKy8+q>`LRI9bsZ$wum zyC+x-pJdlZ3&>r3+!asu}hD8{6IkAAp0d^S5Ez$q`M%9-;EV+Qh^jMAJ&E zhiNAd(@tJh@e)8{td_Q)BjynaViB>ro&0YFjJgEWfRn(c!O=k@iUL!NbOll09OIZf z!Xtx56b%|tRA}dE05dkaXQC4XEFju4&0(DCCew3&uJ9iPJOthW8L$LgD`hi7uO}~d zufM9Uj|0q>vf1B>1=4G?pkjfw5zoGk@4qnBYHjtC_&exs?`*uI_B5OK-_Y|s&+~o( Xb~>M%;?xi=00000NkvXXu0mjf{YT^0 literal 0 HcmV?d00001 diff --git a/examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx64.png b/examples/gdx-lml-uedi-tests/desktop/src/main/resources/libgdx64.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc93d90b97510788f1e27dc59fb38154939142b GIT binary patch literal 963 zcmV;!13dhRP)81{s9eh&2EJ15ims zK~#9!?bc6d990~^@$YYT5(q`mgH5)PfQZt9crd3zDQVfP?reKeBGf}qVliHoC<<+8 z!Bp_%K~xBOXb;s>N_Xuht;I``rWHh_ROA0h1;kHmZ9f2)Mj* zF#Bjj@cHZ{BA?WPN2cT80o)D``zo6G_`Js@B`-!(87MN1u-3W7-QNIIZR3uX5Zksg`a$H{8d!nudj5OP8UkY8YZm6^KJoG z6X(rFqZIfV_&bqD!%=R1moAh}#O2HRY@9k&R6{qAABIY$^~C+IMv1k)<80}As}9}F zWv)2Ff$IJB5rA~D_~)88_DmujMnaV@d@uVk=u9nmL;aPz3y3@&{c{Or3aCU&aK_J%Pqo~%?_mI@fX5Qo8&R+~ z6^0d_T=6o;Rpd^KwtH(YP?e3QD2Lm17S%oVw30sn*1WNyP|Ft)*%eiN@3`Uq!MO{o zzL)t0yBI5KR9<`6(C($IOFHD1E|hcSF9fOy)4N=*or-11$Ygrfdt#uk0SB` z=o~r(&tK_g1%Hshw304vu|Kyj4{R- lV~jDz7-Nhv#u#&-`42S9GjS$vFVFx0002ovPDHLkV1h6+(0u>^ literal 0 HcmV?d00001 diff --git a/examples/gdx-lml-uedi-tests/gradle.properties b/examples/gdx-lml-uedi-tests/gradle.properties new file mode 100644 index 00000000..1167a479 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gradle.properties @@ -0,0 +1,12 @@ +org.gradle.daemon=true +org.gradle.jvmargs=-Xms128m -Xmx512m +org.gradle.configureondemand=true + +gdxVersion=1.9.3 +libVersion=1.8.1.9.3-SNAPSHOT +visVersion=1.1.1 +uediVersion=0.2-SNAPSHOT +vertxVersion=3.2.1 +gwtPluginVersion=0.6 +gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-lml-uedi-tests/gwt/build.gradle b/examples/gdx-lml-uedi-tests/gwt/build.gradle new file mode 100644 index 00000000..b804d516 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/build.gradle @@ -0,0 +1,80 @@ +apply plugin: 'gwt' +apply plugin: 'war' +apply plugin: 'jetty' + +gwt { + gwtVersion = gwtFrameworkVersion // Should match the version used for building the GWT backend. See gradle.properties. + maxHeapSize = '1G' // Default 256m is not enough for the GWT compiler. GWT is HUNGRY. + minHeapSize = '1G' + + src = files(file('src/main/java')) // Needs to be in front of "modules" below. + modules 'com.github.czyzby.tests.GdxDefinition' + devModules 'com.github.czyzby.tests.GdxDefinitionSuperdev' + project.webAppDirName = 'webapp' + + compiler { + strict = true + enableClosureCompiler = true + disableCastChecking = true + } +} + +dependencies { + compile project(':core') + compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources" + compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources" + compile "com.github.czyzby:gdx-lu:$libVersion:sources" + compile "com.github.czyzby:gdx-lml-vis:$libVersion:sources" + compile "com.github.czyzby:gdx-lml:$libVersion:sources" + compile "com.github.czyzby:gdx-kiwi:$libVersion:sources" + compile "com.github.czyzby:gdx-uedi:$uediVersion:sources" + compile "com.github.czyzby:uedi-gwt:$uediVersion" + compile "com.github.czyzby:uedi-gwt:$uediVersion:sources" + compile "com.github.czyzby:uedi-api:$uediVersion:sources" + compile "com.kotcrab.vis:vis-ui:$visVersion:sources" +} + +task draftRun(type: JettyRunWar) { + dependsOn draftWar + dependsOn.remove('war') + webApp = draftWar.archivePath + daemon = true +} + +task superDev(type: de.richsource.gradle.plugins.gwt.GwtSuperDev) { + dependsOn draftRun + doFirst { + gwt.modules = gwt.devModules + } +} + +task dist(dependsOn: [clean, compileGwt]) { + doLast { + file("build/dist").mkdirs() + copy { + from "build/gwt/out" + into "build/dist" + } + copy { + from "webapp" + into "build/dist" + } + copy { + from "war" + into "build/dist" + } + } +} + +draftWar { + from "war" +} + +task addSource << { + sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs) +} + +tasks.compileGwt.dependsOn(addSource) +tasks.draftCompileGwt.dependsOn(addSource) +eclipse.project.name = appName + '-gwt' diff --git a/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml b/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml new file mode 100644 index 00000000..57714783 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml b/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml new file mode 100644 index 00000000..16a7ec75 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinitionSuperdev.gwt.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/gwt/GwtLauncher.java b/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/gwt/GwtLauncher.java new file mode 100644 index 00000000..8101c142 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/src/main/java/com/github/czyzby/tests/gwt/GwtLauncher.java @@ -0,0 +1,22 @@ +package com.github.czyzby.tests.gwt; + +import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.backends.gwt.GwtApplication; +import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration; +import com.github.czyzby.lml.uedi.LmlApplication; +import com.github.czyzby.uedi.scanner.impl.GwtClassScanner; +import com.github.czyzby.tests.Root; + +/** Launches the GWT application. */ +public class GwtLauncher extends GwtApplication { + @Override + public GwtApplicationConfiguration getConfig() { + GwtApplicationConfiguration configuration = new GwtApplicationConfiguration(Root.WIDTH, Root.HEIGHT); + return configuration; + } + + @Override + public ApplicationListener createApplicationListener() { + return new LmlApplication(Root.class, new GwtClassScanner(), "gdx-lml-uedi-tests"); + } +} \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/gwt/webapp/WEB-INF/web.xml b/examples/gdx-lml-uedi-tests/gwt/webapp/WEB-INF/web.xml new file mode 100644 index 00000000..4301df24 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/webapp/WEB-INF/web.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/gwt/webapp/index.html b/examples/gdx-lml-uedi-tests/gwt/webapp/index.html new file mode 100644 index 00000000..43d7e5c5 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/webapp/index.html @@ -0,0 +1,32 @@ + + + + LibGDX application + + + + + + + + +
+ + + + + diff --git a/examples/gdx-lml-uedi-tests/gwt/webapp/refresh.png b/examples/gdx-lml-uedi-tests/gwt/webapp/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..24a48f1cc98e37dcb6fce0939031097d755b32fa GIT binary patch literal 2971 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 R0y+Qy002ovPDHLkV1j|Zhj9P^ literal 0 HcmV?d00001 diff --git a/examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-jsmin.js b/examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-jsmin.js new file mode 100644 index 00000000..b6af93d8 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-jsmin.js @@ -0,0 +1,110 @@ +/** @license + + + SoundManager 2: JavaScript Sound for the Web + ---------------------------------------------- + http://schillmania.com/projects/soundmanager2/ + + Copyright (c) 2007, Scott Schiller. All rights reserved. + Code provided under the BSD License: + http://schillmania.com/projects/soundmanager2/license.txt + + V2.97a.20130512 +*/ +(function(h,g){function fa(fa,wa){function ga(b){return c.preferFlash&&H&&!c.ignoreFlash&&c.flash[b]!==g&&c.flash[b]}function s(b){return function(d){var e=this._s;!e||!e._a?(e&&e.id?c._wD(e.id+": Ignoring "+d.type):c._wD(rb+"Ignoring "+d.type),d=null):d=b.call(this,d);return d}}this.setupOptions={url:fa||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3, +wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0,html5Test:/^(probably|maybe)$/i,preferFlash:!0,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null, +usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs\x3d"mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs\x3d"mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs\x3dvorbis"],required:!1}, +opus:{type:["audio/ogg; codecs\x3dopus","audio/opus"],required:!1},wav:{type:['audio/wav; codecs\x3d"1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.movieID="sm2-container";this.id=wa||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20130512";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns= +{flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only= +!1;var Ua,c=this,Va=null,k=null,rb="HTML5::",A,t=navigator.userAgent,U=h.location.href.toString(),m=document,xa,Wa,ya,n,F=[],za=!0,C,V=!1,W=!1,q=!1,y=!1,ha=!1,p,sb=0,X,B,Aa,O,Ba,M,P,Q,Xa,Ca,ia,I,ja,Da,R,Ea,Y,ka,la,S,Ya,Fa,Za=["log","info","warn","error"],$a,Ga,ab,Z=null,Ha=null,r,Ia,T,bb,ma,na,J,v,$=!1,Ja=!1,cb,db,eb,oa=0,aa=null,pa,N=[],qa,u=null,fb,ra,ba,K,sa,Ka,gb,w,hb=Array.prototype.slice,E=!1,La,H,Ma,ib,G,jb,Na,ta,kb=0,ca=t.match(/(ipad|iphone|ipod)/i),lb=t.match(/android/i),L=t.match(/msie/i), +tb=t.match(/webkit/i),ua=t.match(/safari/i)&&!t.match(/chrome/i),Oa=t.match(/opera/i),ub=t.match(/firefox/i),Pa=t.match(/(mobile|pre\/|xoom)/i)||ca||lb,Qa=!U.match(/usehtml5audio/i)&&!U.match(/sm2\-ignorebadua/i)&&ua&&!t.match(/silk/i)&&t.match(/OS X 10_6_([3-7])/i),da=h.console!==g&&console.log!==g,Ra=m.hasFocus!==g?m.hasFocus():null,va=ua&&(m.hasFocus===g||!m.hasFocus()),mb=!va,nb=/(mp3|mp4|mpa|m4a|m4b)/i,ea=m.location?m.location.protocol.match(/http/i):null,ob=!ea?"http://":"",pb=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, +qb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),vb=RegExp("\\.("+qb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!ea;var Sa;try{Sa=Audio!==g&&(Oa&&opera!==g&&10>opera.version()?new Audio(null):new Audio).canPlayType!==g}catch(wb){Sa=!1}this.hasHTML5=Sa;this.setup=function(b){var d=!c.url;b!==g&&(q&&u&&c.ok()&&(b.flashVersion!==g||b.url!==g||b.html5Test!==g))&&J(r("setupLate"));Aa(b);b&&(d&&(Y&&b.url!==g)&&c.beginDelayedInit(), +!Y&&(b.url!==g&&"complete"===m.readyState)&&setTimeout(R,1));return c};this.supported=this.ok=function(){return u?q&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return A(c)||m[c]||h[c]};this.createSound=function(b,d){function e(){f=ma(f);c.sounds[f.id]=new Ua(f);c.soundIDs.push(f.id);return c.sounds[f.id]}var a,f;a=null;a="soundManager.createSound(): "+r(!q?"notReady":"notOK");if(!q||!c.ok())return J(a),!1;d!==g&&(b={id:b,url:d});f=B(b);f.url=pa(f.url);void 0===f.id&&(f.id=c.setupOptions.idPrefix+ +kb++);f.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+r("badID",f.id),2);c._wD("soundManager.createSound(): "+f.id+(f.url?" ("+f.url+")":""),1);if(v(f.id,!0))return c._wD("soundManager.createSound(): "+f.id+" exists",1),c.sounds[f.id];if(ra(f))a=e(),c._wD(f.id+": Using HTML5"),a._setup_html5(f);else{if(c.html5Only)return c._wD(f.id+": No HTML5 support for this sound, and no Flash. Exiting."),e();if(c.html5.usingFlash&&f.url&&f.url.match(/data\:/i))return c._wD(f.id+ +": data: URIs not supported via Flash. Exiting."),e();8a.instanceCount?(m(),e=a._setup_html5(),a.setPosition(a._iO.position),e.play()):(c._wD(a.id+": Cloning Audio() for instance #"+a.instanceCount+"..."),l=new Audio(a._iO.url),z=function(){w.remove(l,"onended",z);a._onfinish(a);sa(l);l=null},h=function(){w.remove(l,"canplay",h);try{l.currentTime=a._iO.position/1E3}catch(c){J(a.id+": multiShot play() failed to apply position of "+a._iO.position/1E3)}l.play()},w.add(l,"ended",z),a._iO.position? +w.add(l,"canplay",h):l.play()):(x=k._start(a.id,a._iO.loops||1,9===n?a.position:a.position/1E3,a._iO.multiShot||!1),9===n&&!x&&(c._wD(e+"No sound hardware, or 32-sound ceiling hit",2),a._iO.onplayerror&&a._iO.onplayerror.apply(a)))}return a};this.stop=function(b){var d=a._iO;1===a.playState&&(c._wD(a.id+": stop()"),a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),Ta(),d.to&&a.clearOnPosition(d.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(), +a.playState=0,a._onTimer(),l()):(k._stop(a.id,b),d.serverURL&&a.unload()),a.instanceCount=0,a._iO={},d.onstop&&d.onstop.apply(a));return a};this.setAutoPlay=function(b){c._wD(a.id+": Autoplay turned "+(b?"on":"off"));a._iO.autoPlay=b;a.isHTML5||(k._setAutoPlay(a.id,b),b&&(!a.instanceCount&&1===a.readyState)&&(a.instanceCount++,c._wD(a.id+": Incremented instance count to "+a.instanceCount)))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){b===g&&(b=0);var d=a.isHTML5? +Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=d;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=d;if(a.isHTML5){if(a._a){if(a._html5_canplay){if(a._a.currentTime!==b){c._wD(a.id+": setPosition("+b+")");try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){c._wD(a.id+": setPosition("+b+") failed: "+e.message,2)}}}else if(b)return c._wD(a.id+": setPosition("+b+"): Cannot seek yet, sound not ready",2),a;a.paused&&a._onTimer(!0)}}else b= +9===n?a.position:b,a.readyState&&2!==a.readyState&&k._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;c._wD(a.id+": pause()");a.paused=!0;a.isHTML5?(a._setup_html5().pause(),l()):(b||b===g)&&k._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;c._wD(a.id+": resume()");a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(), +m()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),k._pause(a.id,b.multiShot));!s&&b.onplay?(b.onplay.apply(a),s=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){c._wD(a.id+": togglePause()");if(0===a.playState)return a.play({position:9===n&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===g&&(b=0);c===g&&(c=!1);a.isHTML5||k._setPan(a.id,b);a._iO.pan=b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume= +function(b,d){b===g&&(b=100);d===g&&(d=!1);a.isHTML5?a._a&&(a._a.volume=Math.max(0,Math.min(1,b/100))):k._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;d||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):k._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==g;a.isHTML5?a._a&&(a._a.muted=!1):k._setVolume(a.id,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute(): +a.mute()};this.onposition=this.onPosition=function(b,c,d){D.push({position:parseInt(b,10),method:c,scope:d!==g?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c=b)return!1;for(b-=1;0<=b;b--)c=D[b],!c.fired&&a.position>=c.position&&(c.fired=!0,t++,c.method.apply(c.scope,[c.position])); +return!0};this._resetOnPosition=function(a){var b,c;b=D.length;if(!b)return!1;for(b-=1;0<=b;b--)c=D[b],c.fired&&a<=c.position&&(c.fired=!1,t--);return!0};y=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.id+': "To" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.id+': Playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};null!==d&&!isNaN(d)&&(b.position=d,b.multiShot=!1,f());return b};q=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b, +10),c[b])};Ta=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};m=function(){a.isHTML5&&cb(a)};l=function(){a.isHTML5&&db(a)};f=function(b){b||(D=[],t=0);s=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount= +0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,g={};if(a._hasTimer||b){if(a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,E&&(Va=c);a.isHTML5=!0;a._a=c;c._s=a;h();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};h=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in G)G.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,G[b],!1);return!0};z=function(){var b;c._wD(a.id+": Removing event listeners"); +a._a._added_events=!1;for(b in G)G.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,G[b],!1)};this._onload=function(b){var d=!!b||!a.isHTML5&&8===n&&a.duration;b=a.id+": ";c._wD(b+(d?"onload()":"Failed to load / invalid sound?"+(!a.duration?" Zero-length duration reported.":" -")+" ("+a.url+")"),d?1:2);!d&&!a.isHTML5&&(!0===c.sandbox.noRemote&&c._wD(b+r("noNet"),1),!0===c.sandbox.noLocal&&c._wD(b+r("noLocal"),1));a.loaded=d;a.readyState=d?3:2;a._onbufferchange(0);a._iO.onload&&ta(a,function(){a._iO.onload.apply(a, +[d])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&(c._wD(a.id+": Buffer state change: "+b),a._iO.onbufferchange.apply(a));return!0};this._onsuspend=function(){a._iO.onsuspend&&(c._wD(a.id+": Playback suspended"),a._iO.onsuspend.apply(a));return!0};this._onfailure=function(b,d,e){a.failures++;c._wD(a.id+": Failures \x3d "+a.failures);if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,d,e); +else c._wD(a.id+": Ignoring failure")};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);if(a.instanceCount&&(a.instanceCount--,a.instanceCount||(Ta(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},l(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b))c._wD(a.id+": onfinish()"),ta(a,function(){b.apply(a)})};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d); +a.bufferLength=e;a.durationEstimate=!a.isHTML5&&!f.isMovieStar?f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10):a.duration;a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var l=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()?new Audio(null):new Audio:null,e,a,f={},h;h=c.audioFormats;for(e in h)if(h.hasOwnProperty(e)&&(a="audio/"+e,f[e]=b(h[e].type),f[a]=f[e],e.match(nb)?(c.flash[e]=!0,c.flash[a]=!0):(c.flash[e]=!1,c.flash[a]=!1),h[e]&&h[e].related))for(a=h[e].related.length- +1;0<=a;a--)f["audio/"+h[e].related[a]]=f[e],c.html5[h[e].related[a]]=f[e],c.flash[h[e].related[a]]=f[e];f.canPlayType=d?b:null;c.html5=B(c.html5,f);c.html5.usingFlash=fb();u=c.html5.usingFlash;return!0};I={notReady:"Unavailable - wait until onready() has fired.",notOK:"Audio support is not available.",domError:"soundManagerexception caught while appending SWF to DOM.",spcWmode:"Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash \x3d true for more security details (output goes to SWF.)", +checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+m.location.protocol+" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/",waitFocus:"soundManager: Special case: Waiting for SWF to load with window focus...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...", +waitSWF:"soundManager: Waiting for 100% SWF load...",needFunction:"soundManager: Function object expected for %s",badID:'Sound ID "%s" should be a string, starting with a non-numeric character',currentObj:"soundManager: _debug(): Current sound objects",waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded",onload:"soundManager: initComplete(): calling soundManager.onload()",onloadOK:"soundManager.onload() complete",didInit:"soundManager: init(): Already called?", +secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html",badRemove:"soundManager: Failed to remove Flash node.",shutdown:"soundManager.disable(): Shutting down",queue:"soundManager: Queueing %s handler",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying .swf_timedout CSS...", +fbLoaded:"Flash loaded",fbHandler:"soundManager: flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",onURL:"soundManager.load(): current URL already assigned.",badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)",noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout \x3d 0 (infinite) for off-screen, mobile flash case", +needFlash:"soundManager: Fatal error: Flash is needed to play some required formats, but is not available.",gotFocus:"soundManager: Got window focus.",policy:"Enabling usePolicyFile for data access",setup:"soundManager.setup(): allowed parameters: %s",setupError:'soundManager.setup(): "%s" cannot be assigned with this method.',setupUndef:'soundManager.setup(): Could not find option "%s"',setupLate:"soundManager.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().", +noURL:"soundManager: Flash URL required. Call soundManager.setup({url:...}) to get started.",sm2Loaded:"SoundManager 2: Ready.",reset:"soundManager.reset(): Removing event callbacks",mobileUA:"Mobile UA detected, preferring HTML5 by default.",globalHTML5:"Using singleton HTML5 Audio() pattern for this device."};r=function(){var b=hb.call(arguments),c=b.shift(),c=I&&I[c]?I[c]:"",e,a;if(c&&b&&b.length){e=0;for(a=b.length;en)&&(c._wD(r("needfl9")),c.flashVersion=n=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)": +9===n?" (AS3/Flash 9)":" (AS2/Flash 8)");8b&&(d= +!0));setTimeout(function(){b=c.getMoviePercent();if(d)return $=!1,c._wD(r("waitSWF")),h.setTimeout(Q,1),!1;q||(c._wD("soundManager: No Flash response within expected time. Likely causes: "+(0===b?"SWF load failed, ":"")+"Flash blocked or JS-Flash security error."+(c.debugFlash?" "+r("checkSWF"):""),2),!ea&&b&&(p("localFail",2),c.debugFlash||p("tryDebug",2)),0===b&&c._wD(r("swf404",c.url),1),C("flashtojs",!1,": Timed out"+ea?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)")); +!q&&mb&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?(c.useFlashBlock&&Ia(),p("waitForever")):!c.useFlashBlock&&qa?h.setTimeout(function(){J("soundManager: useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...");c.setup({preferFlash:!1}).reboot();c.didFlashBlock=!0;c.beginDelayedInit()},1):(p("waitForever"),M({type:"ontimeout",ignoreInit:!0})):0===c.flashLoadTimeout?p("waitForever"):Ga(!0))},c.flashLoadTimeout)};ia=function(){if(Ra||!va)return w.remove(h,"focus", +ia),!0;Ra=mb=!0;p("gotFocus");$=!1;Q();w.remove(h,"focus",ia);return!0};Na=function(){N.length&&(c._wD("SoundManager 2: "+N.join(" "),1),N=[])};jb=function(){Na();var b,d=[];if(c.useHTML5Audio&&c.hasHTML5){for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&d.push(b+" \x3d "+c.html5[b]+(!c.html5[b]&&u&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&u?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required?"required, ":"")+"and no flash support)":""));c._wD("SoundManager 2 HTML5 support: "+ +d.join(", "),1)}};X=function(b){if(q)return!1;if(c.html5Only)return p("sm2Loaded"),q=!0,P(),C("onload",!0),!0;var d=!0,e;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())q=!0,y&&(e={type:!H&&u?"NO_FLASH":"INIT_TIMEOUT"});c._wD("SoundManager 2 "+(y?"failed to load":"loaded")+" ("+(y?"Flash security/load error":"OK")+")",y?2:1);y||b?(c.useFlashBlock&&c.oMC&&(c.oMC.className=T()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),M({type:"ontimeout",error:e,ignoreInit:!0}),C("onload", +!1),S(e),d=!1):C("onload",!0);y||(c.waitForWindowLoad&&!ha?(p("waitOnload"),w.add(h,"load",P)):(c.waitForWindowLoad&&ha&&p("docLoaded"),P()));return d};Wa=function(){var b,d=c.setupOptions;for(b in d)d.hasOwnProperty(b)&&(c[b]===g?c[b]=d[b]:c[b]!==d[b]&&(c.setupOptions[b]=c[b]))};ya=function(){if(q)return p("didInit"),!1;if(c.html5Only)return q||(w.remove(h,"load",c.beginDelayedInit),c.enabled=!0,X()),!0;ja();try{k._externalInterfaceTest(!1),Ya(!0,c.flashPollingInterval||(c.useHighPerformance?10: +50)),c.debugMode||k._disableDebug(),c.enabled=!0,C("jstoflash",!0),c.html5Only||w.add(h,"unload",xa)}catch(b){return c._wD("js/flash exception: "+b.toString()),C("jstoflash",!1),S({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),Ga(!0),X(),!1}X();w.remove(h,"load",c.beginDelayedInit);return!0};R=function(){if(Y)return!1;Y=!0;Wa();Fa();var b=null,b=null,d=U.toLowerCase();-1!==d.indexOf("sm2-usehtml5audio\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-usehtml5audio\x3d")+18),da&&console.log((b?"Enabling ":"Disabling ")+ +"useHTML5Audio via URL parameter"),c.setup({useHTML5Audio:b}));-1!==d.indexOf("sm2-preferflash\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-preferflash\x3d")+16),da&&console.log((b?"Enabling ":"Disabling ")+"preferFlash via URL parameter"),c.setup({preferFlash:b}));!H&&c.hasHTML5&&(c._wD("SoundManager: No Flash detected"+(!c.useHTML5Audio?", enabling HTML5.":". Trying HTML5-only mode."),1),c.setup({useHTML5Audio:!0,preferFlash:!1}));gb();!H&&u&&(N.push(I.needFlash),c.setup({flashLoadTimeout:1}));m.removeEventListener&& +m.removeEventListener("DOMContentLoaded",R,!1);ja();return!0};Ka=function(){"complete"===m.readyState&&(R(),m.detachEvent("onreadystatechange",Ka));return!0};Ea=function(){ha=!0;w.remove(h,"load",Ea)};Da=function(){if(Pa&&((!c.setupOptions.useHTML5Audio||c.setupOptions.preferFlash)&&N.push(I.mobileUA),c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ca||lb&&!t.match(/android\s2\.3/i)))N.push(I.globalHTML5),ca&&(c.ignoreFlash=!0),E=!0};Da();Ma();w.add(h,"focus",ia);w.add(h,"load",Q);w.add(h, +"load",Ea);m.addEventListener?m.addEventListener("DOMContentLoaded",R,!1):m.attachEvent?m.attachEvent("onreadystatechange",Ka):(C("onload",!1),S({type:"NO_DOM2_EVENTS",fatal:!0}))}var wa=null;if(void 0===h.SM2_DEFER||!SM2_DEFER)wa=new fa;h.SoundManager=fa;h.soundManager=wa})(window); \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-setup.js b/examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-setup.js new file mode 100644 index 00000000..4d0ac663 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/webapp/soundmanager2-setup.js @@ -0,0 +1 @@ +window.SM2_DEFER = true; \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/gwt/webapp/styles.css b/examples/gdx-lml-uedi-tests/gwt/webapp/styles.css new file mode 100644 index 00000000..0abbdaa3 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/gwt/webapp/styles.css @@ -0,0 +1,43 @@ +canvas { + cursor: default; + outline: none; +} + +body { + background-color: #222222; +} + +.superdev { + color: rgb(37,37,37); + text-shadow: 0px 1px 1px rgba(250,250,250,0.1); + font-size: 50pt; + display: block; + position: relative; + text-decoration: none; + background-color: rgb(83,87,93); + box-shadow: 0px 3px 0px 0px rgb(34,34,34), + 0px 7px 10px 0px rgb(17,17,17), + inset 0px 1px 1px 0px rgba(250, 250, 250, .2), + inset 0px -12px 35px 0px rgba(0, 0, 0, .5); + width: 70px; + height: 70px; + border: 0; + border-radius: 35px; + text-align: center; + line-height: 68px; +} + +.superdev:active { + box-shadow: 0px 0px 0px 0px rgb(34,34,34), + 0px 3px 7px 0px rgb(17,17,17), + inset 0px 1px 1px 0px rgba(250, 250, 250, .2), + inset 0px -10px 35px 5px rgba(0, 0, 0, .5); + background-color: rgb(83,87,93); + top: 3px; + color: #fff; + text-shadow: 0px 0px 3px rgb(250,250,250); +} + +.superdev:hover { + background-color: rgb(100,100,100); +} diff --git a/examples/gdx-lml-uedi-tests/settings.gradle b/examples/gdx-lml-uedi-tests/settings.gradle new file mode 100644 index 00000000..d5d8da04 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/settings.gradle @@ -0,0 +1 @@ +include 'android', 'core', 'desktop', 'gwt' \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/gradle.properties b/examples/gdx-lml-vis-tests/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-lml-vis-tests/gradle.properties +++ b/examples/gdx-lml-vis-tests/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-lml-vis-websocket/gradle.properties b/examples/gdx-lml-vis-websocket/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-lml-vis-websocket/gradle.properties +++ b/examples/gdx-lml-vis-websocket/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-lml-vis-wiki/gradle.properties b/examples/gdx-lml-vis-wiki/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-lml-vis-wiki/gradle.properties +++ b/examples/gdx-lml-vis-wiki/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-websocket-json/gradle.properties b/examples/gdx-websocket-json/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-websocket-json/gradle.properties +++ b/examples/gdx-websocket-json/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-websocket-serialization-compare/gradle.properties b/examples/gdx-websocket-serialization-compare/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-websocket-serialization-compare/gradle.properties +++ b/examples/gdx-websocket-serialization-compare/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-websocket-serialization-tests/gradle.properties b/examples/gdx-websocket-serialization-tests/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-websocket-serialization-tests/gradle.properties +++ b/examples/gdx-websocket-serialization-tests/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gdx-websocket-tests/gradle.properties b/examples/gdx-websocket-tests/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gdx-websocket-tests/gradle.properties +++ b/examples/gdx-websocket-tests/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/examples/gradle.properties b/examples/gradle.properties index fe473aa3..1167a479 100644 --- a/examples/gradle.properties +++ b/examples/gradle.properties @@ -9,3 +9,4 @@ uediVersion=0.2-SNAPSHOT vertxVersion=3.2.1 gwtPluginVersion=0.6 gwtFrameworkVersion=2.6.1 +androidPluginVersion=1.5.0 diff --git a/uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java b/uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java index c4c582aa..827243b0 100644 --- a/uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java +++ b/uedi/src/main/java/com/github/czyzby/uedi/impl/DefaultContext.java @@ -3,6 +3,7 @@ import java.lang.reflect.Member; import java.util.Comparator; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.IdentityMap; import com.badlogic.gdx.utils.ObjectSet; @@ -10,6 +11,7 @@ import com.badlogic.gdx.utils.reflect.Constructor; import com.badlogic.gdx.utils.reflect.Field; import com.badlogic.gdx.utils.reflect.Method; +import com.github.czyzby.kiwi.util.common.Exceptions; import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; import com.github.czyzby.kiwi.util.gdx.collection.GdxSets; @@ -377,8 +379,14 @@ protected void injectFields(final Object component) { * primitive and - if strings are ignored - not a string. * @throws Exception due to reflection issues. */ protected boolean isInjectable(final Field field, final Object component) throws Exception { - if (field.isSynthetic() || field.getType().isPrimitive() - || isIgnoreStrings() && field.getType() == String.class) { + try { + if (field.isSynthetic() || field.getType().isPrimitive() + || isIgnoreStrings() && field.getType() == String.class) { + return false; + } + } catch (final Exception exception) { + Exceptions.ignore(exception); // GWT compatibility. + Gdx.app.debug("UEDI", "Unable to access field of component: " + component, exception); return false; } final int modifier = Modifier.getModifiers(field); From 2c490d952dba309e751a332eda7497d8ab62fb01 Mon Sep 17 00:00:00 2001 From: MJ Date: Thu, 9 Jun 2016 22:11:24 +0200 Subject: [PATCH 21/58] Implemented gdx-lml-uedi-tests project. --- examples/gdx-lml-uedi-tests/README.md | 6 ++ .../assets/atlas/logo.atlas | 13 ++++ .../gdx-lml-uedi-tests/assets/atlas/logo.png | Bin 0 -> 3428 bytes .../assets/i18n/nls.properties | 27 ++++++++ .../assets/i18n/nls_en.properties | 27 ++++++++ .../assets/i18n/nls_pl.properties | 27 ++++++++ .../assets/image/badlogic.png | Bin 0 -> 2509 bytes .../gdx-lml-uedi-tests/assets/music/theme.ogg | Bin 0 -> 523788 bytes .../gdx-lml-uedi-tests/assets/sound/sound.ogg | Bin 0 -> 7945 bytes .../assets/style/styles.lss | 21 ++++++ .../gdx-lml-uedi-tests/assets/view/assets.lml | 3 + .../gdx-lml-uedi-tests/assets/view/first.lml | 5 -- .../assets/view/loading.lml | 7 ++ .../gdx-lml-uedi-tests/assets/view/locale.lml | 12 ++++ .../gdx-lml-uedi-tests/assets/view/menu.lml | 10 +++ .../gdx-lml-uedi-tests/assets/view/music.lml | 13 ++++ .../assets/view/refresh.lml | 9 +++ .../java/com/github/czyzby/tests/Root.gwt.xml | 3 +- .../java/com/github/czyzby/tests/Root.java | 41 ++---------- .../czyzby/tests/service/ParserFactory.java | 21 ++++++ .../czyzby/tests/view/LoadingController.java | 32 +++++++++ .../czyzby/tests/view/MenuController.java | 14 ++++ .../tests/view/example/AssetsController.java | 63 ++++++++++++++++++ .../tests/view/example/LocaleController.java | 14 ++++ .../tests/view/example/MusicController.java | 44 ++++++++++++ .../tests/view/example/RefreshController.java | 14 ++++ .../gdx-lml-uedi-tests/gdx-lml-uedi-tests.png | Bin 0 -> 20220 bytes .../czyzby/kiwi/util/gdx/GdxUtilities.java | 2 + .../github/czyzby/lml/uedi/GdxLmlUedi.gwt.xml | 4 ++ .../czyzby/lml/uedi/LmlApplication.java | 5 +- .../lml/uedi/i18n/LocalePreference.java | 1 + .../czyzby/lml/uedi/music/MusicService.java | 14 +++- .../lml/util/LmlApplicationListener.java | 1 + .../czyzby/uedi/impl/AbstractContext.java | 7 +- .../uedi/reflection/impl/MockMember.java | 10 ++- 35 files changed, 421 insertions(+), 49 deletions(-) create mode 100644 examples/gdx-lml-uedi-tests/README.md create mode 100644 examples/gdx-lml-uedi-tests/assets/atlas/logo.atlas create mode 100644 examples/gdx-lml-uedi-tests/assets/atlas/logo.png create mode 100644 examples/gdx-lml-uedi-tests/assets/i18n/nls.properties create mode 100644 examples/gdx-lml-uedi-tests/assets/i18n/nls_en.properties create mode 100644 examples/gdx-lml-uedi-tests/assets/i18n/nls_pl.properties create mode 100644 examples/gdx-lml-uedi-tests/assets/image/badlogic.png create mode 100644 examples/gdx-lml-uedi-tests/assets/music/theme.ogg create mode 100644 examples/gdx-lml-uedi-tests/assets/sound/sound.ogg create mode 100644 examples/gdx-lml-uedi-tests/assets/style/styles.lss create mode 100644 examples/gdx-lml-uedi-tests/assets/view/assets.lml delete mode 100644 examples/gdx-lml-uedi-tests/assets/view/first.lml create mode 100644 examples/gdx-lml-uedi-tests/assets/view/loading.lml create mode 100644 examples/gdx-lml-uedi-tests/assets/view/locale.lml create mode 100644 examples/gdx-lml-uedi-tests/assets/view/menu.lml create mode 100644 examples/gdx-lml-uedi-tests/assets/view/music.lml create mode 100644 examples/gdx-lml-uedi-tests/assets/view/refresh.lml create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/service/ParserFactory.java create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/LoadingController.java create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/MenuController.java create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/AssetsController.java create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/LocaleController.java create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/MusicController.java create mode 100644 examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/RefreshController.java create mode 100644 examples/gdx-lml-uedi-tests/gdx-lml-uedi-tests.png diff --git a/examples/gdx-lml-uedi-tests/README.md b/examples/gdx-lml-uedi-tests/README.md new file mode 100644 index 00000000..12fbcdac --- /dev/null +++ b/examples/gdx-lml-uedi-tests/README.md @@ -0,0 +1,6 @@ +# LibGDX Markup Language with Unsettlingly Easy Dependency Injection +See [gdx-lu](../../lml-uedi). + +This is an example project using LML templates to create GUI and UEDI to manage dependencies. Each example view uses different part of LU API. Note that some knowledge of [LML](../../lml) API is assumed, so make sure to go through regular LML tests first. + +![gdx-lml-uedi-tests](gdx-lml-uedi-tests.png) diff --git a/examples/gdx-lml-uedi-tests/assets/atlas/logo.atlas b/examples/gdx-lml-uedi-tests/assets/atlas/logo.atlas new file mode 100644 index 00000000..e5247560 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/atlas/logo.atlas @@ -0,0 +1,13 @@ + +logo.png +size: 378,63 +format: RGBA8888 +filter: Linear,Linear +repeat: none +logo + rotate: false + xy: 0, 0 + size: 378, 63 + orig: 378, 63 + offset: 0, 0 + index: -1 \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/assets/atlas/logo.png b/examples/gdx-lml-uedi-tests/assets/atlas/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5d61ca9cbdba765b240b8aed4b0a3790aba0c1 GIT binary patch literal 3428 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 atN>H~y=6YO;U3U!3$QY`GvkF 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

p{ef@dDuEM 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

$@ZS}Dm` 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%0A>p zyQaD9{m@gK-2?T--UY8D0`Efkya$@_PvrN|$1Ltl4STk zF7Ay54<9zkI|A|oss*BnR{K9Kvn}a)2WK9cle9`*&Yt^*rn5`~VN!bj4XmYX zPM<}%SrxmFyT4@Nd3RCC!rS3YUjYK1(8dmUrz09F)N4q@_X=7_Wubx%e_5yghTZ&p zUD9;*ynit%TrpMrrjaPiIB)E9zB}*S%Sx&K?e7Bqg#MfeItW}Oq3AaL zJr*n>V3zPiY)TELPO%=sDVd#t<{7|m)$6q=z|`}P)_@!WdwI?^vbZERrOb8<9BQ}b zFY!rLbZa7?lkD6E#U!p+N+i_cc44J}|=SJE+m;_MN;dEnucGcOSBO|~{4NBqC z<%lL?ahzG8F!Dn4*&^+yx4Y0wAtp=cpUg)ow4qAXJj^We)w?6~+TQynZ{yf(X+1BH zB%@|2-hn<$(eX{q#13xL03nXnz8ceK^EukGX1_*sAwLK6br2 z{w#KfG|E>S%%-}dCl&3+2c1Yud$mlo9lJUmu>h%ddx$RZ*Y7e21P;ynrTV^DD&6T_ zs`}!?_ILbGneKVd2}?DX8nNqL|I8X4b*sF_3_q>9~@Qf75t_q;9Z`5F!B-c*}k*J7Ub=Wehj%oi{D zqMOfNR)5fV_u!P((f2XH!I$vQRzCA=e6ABl4?d1n-S`#q>sQMe?_0(5by0_LQMGGs zFRxkhSsC4+BzQ{JJ_l3xKD=65c6fF3(G%7Q_p!d5z8t>ce34@syFpvR2fu#&ejr|U zXY`U;T5J*aPr?^grRh^&UqgA5z^9bmy~e)d+fjmFM48PA&tif6u|IEWYq?Be79Ck* zf84_f8kq_8Vh_in6meQST;V%P>Z5ste61s;g*DT;QyxRytRBh7sXg~%g^f2brC2Ku z#o+}glwhND5>FB?hh3_r`Dx2Pdan2L`tr#~N!t$(-h3Ffz7q0~WkVr6p*w06|K0&6 z1O1ZZOTMfXtft9~E`PJTlH*!j?CFJX4hcc>FcDFsw~imShQ7WRdiH&g{)vbiF?;vC zKP2A!vgi3aH23nGudcm&_+Xfp2C)39>&pq$`*9e=LM+ zXqQacxBxl*!qkMKKJBBwW}1gN*lEAAZhz`Gq|a7AIePO^*ZIjm&G}$+&nuzuS%nV| zyOX;(%Rv`doh&DTGu*UHyInpzo|g-_{^N&k^}(+OZCw$cu+SIq4rQ>9=e?l3@91ky zl82c^Me4`_BuE3`=S9gC9O(xgOG^UF06i*v=#U;o8`85X8w6`yX|Jc~haZNls)@U!q&5bMo z97tr@r2NyB5~Tu-I=Rj1Ek1sNk(HG@;x1s4`;~pT%eQd*(yy7_xF+K~Lx3epQ)4ht z1yao9l7H4Ln1*VIf#r`ogP)@o*Yy(s4hZSpj&a-k_aei+%%}jSfOQ`R0J5%ioDZb= z)YU$H(5veA_o($!nidS45sXt}?a6y&x&t9*JUDpwPG@ugV6y(iI75`@msz7?02O(}_NCx!H>U`saz}Z&2&Z zX-bzVwm`Py+@T z;F1>GCVu~2M1{38HPBNy-Z|h(Ji?c4`UT-qO05C_nEWZQzQ zqO?2C7LW3i!KcG|r$3xdd7{vM_R7HCr4tZXcYLzb=vCii+AzOj;Qteo>0+$U4FLZU zljT{DPU^xuhRbJ9|4~INsGto_efjwM=a-Fd`_F?)>@q>9?|?iV92dZE*S@ z$EUTO?e&-IoBzOSMh5>l4qt!RUHkR*d%n|OVN+|f-hin7x2%%~SsrCQP7 zAfP(W(AXf{mu3n!oSdj;X}VdnKb4p#Dd|g;Ml`~;9EKbqA(vFm&B;@N=e=kq-hBds zN^&qj0qQY$==J>cr3Cz@<0#=>Xo}yr#nonKM*6pfq z5nq)Qb!+fo`IV!x_k$d1$AUw$xcbC&XBYnDbFHXzP%StDeebC?Y;?9QH8H!KFFLX| zy%Q5a3OpeF*5HF)x9+kN>xs2nv)OSZvyblNpl=5UcHuJ&o5U6UD?Yu0rAK^%%+7rb z3bLR6@ro1Slm~8clPln`%QJZ|=Us;D*a_C^uzwLgN-1K*9j1NPU$m57v`Nlql6S!; zP5=S{uN&3#We2!;a*!_GlQ(?OW(m2%GOgOpHvmA2t+KIx6r0YtaFDJ$erlM>1Qmb);#o2V_^E!sa|Q!A{a!zDvpnNLcT42$lzUiyDk4r#Qr0#?&$V9xXs0 zkC*CkMGf9SQB0e}g5l5@eT6MhHYVuyqZ2=2ke_FBK26y$6BgrUK0RK`RZ`vk9*d!V z%B#6BBO!Igd0QF%mFhMUMfGhEKRWyiazTZnoiNxXqTO^^nHrnVLDl`jK?*Rt(L)K^ zx_Ahz^Pe4?>dZ>s-<@;yFq;BJH2kGmarls{~; zQ6Ez=tl`PuH^=KqVm~7Nat!_Dm3_E9rO@yLhwTcG@bOKo1kan`y)PGC4dyEWm;c5D z%g8S+yV244a_P}~lKNV>2(kz26JY<%V*GjYcJaldfQJ#76=j)2HSs<_=LgU3a;#cF z)Es{N@X>WZxL#81dk@6N-|R|FevQ&HeepK1!UTlC1%<^8QSkM=D`E7avfZc2{g*NY zMEI07MV$h-o}PYk@xRLrz(Ix!ByUU|_MkM=O$w0WH z1NOuC&tLzd?s*SUsiAR0@f7^v!ev-dAD0j+ zJzrsQd#n#~GUsPQ{*3frl0_j0_EcAgjW0p>M^9F%FD*-4c)NNS0`tc?#q!Y`aL+=Q)nVHl@&{r_+PU*S zzovf!U|{-IV=afgA}lQhTlCyVP9-G;t*T#Awd_Nx0*~e2MnsBX*rjKp7>M{7B0EX@SHP6-WuxNMkC13 z7tZ#9#*0|!=Cm39MoFr0RLdDPW6&*_#_LvdGeLnHQ=Sz+Y?~w_Ijsux;lOzEHJ8(H z5wf^sY9JPOO20Nq#A3{YxNAA>ql1nf6!=QiLhAw*aPPK zt3v!su}E}a7W!PucbOs*g((XsOh4gWXip@f-7dJE@DjoFhv_$aZ5sTZKVy)I;VD?P(xP2J&L*d>R}ldq;@YQ zYZk)6(~@=K!Ksa(N&EBFEYxv~OadKW@ioB5qQj+i?upZ*j70ducX+LH&3b{R##mR>#G0e<(^lnsg%y4QR&qyg?`anvCPdelCY7c1vfZ4L^<4r*@!(PjHxg zQb|$ck}-xk1Swk7v9KJsiw#T*GTEX=>bqWsCT!`JCznLk_+n)wxvb6w9}Dzok-T$x zVx1WYVK?ttk*BQqF<1Qf4V$P#R0qLqsa7fEaiL-7C??a+x%#qN#}%K}MsZsj!?Ho( zOhHf9;8_c+Q*TTPYEjL98Kef8UZxH4B+ka)cR7OK>`KSu+yp*9bgvJGN(kWPO8_3~ zi*Nd>HO$WybD>NtGHI0D;jR38#C|>oi&0FB_T^o3nCVG3GlQVWh)T2OMIc@ z>p;X5r^wAC!Z}lRHF=%UP3@Z|&*Tiumh#q|6j*(BMNR%UfU8?y*36g-v|ufNA0g4I zM~uUBSknFpb4lg#wgPW*1QJOTOQ*uw`;Fg859iw$dR5wx_=V(<{$ALR!G|A3Dp64m zq`>jzcu?O!OJ1;T#lwd65Ux+{Xzuqe_G#%G%(RnHrSFd55@Km5?Xz_}-cD(^rzQ@% zZ%M4qBDHoSiBY!gHFL(l3}Qf=g6%0+crv6GT9aeBwY++wDv#-^_uahpSEsTGI{5d; zV8GM|9kukWL2bU(q5#Z~MIq>?)6G1zW&`8D#;8f>Zg_pCUJzLpw*>Kh*<@Fw8FCl= zkXb5tTaKOOPH~!l%5^Rm{GU4o-;v6Y;s#gRrgT_d&cE9z9;$4AIu2~d$2!YxgtykF zEKje(dr-oH`+@i+jr!wa=H*gh3{^n=?eM6U+BA^?`_oBMoP41nJukTbWwBaE(?SQ{ zed$TmJ^mv~FF%7{U*;-qLZ{##Wx!KPqI~v(f7hs4BTm(3qCzu?G%eE zf28CEH~n)bBL_3mWF7&(f2^U^2Jd7=M}?0e-LK5-`ailG{c*j_G%<`=V?28YrtpMm9Q346 zNaD+o#FUasV_@ehLpcRcD9lt4v3UI+mKObNp5xlJ>Hhr^-bf=(NYm8Z#kwU3&aHZM z_RYq^U^e)VDq3Em=hLxy#m5W;!Km6txae}lF%l7OsA@(7DM?#6ONg?{*u;)Zod=R2Vh8q${vv3v>=Qf z@RVi)USXYYnn~Qu@>01J^Z8HZ(p{m9@ZT#Ui&*jF6Cw@gB00J|BHuo7GVZ8Ve|xin z?67zu1bQMp@9L?aiZP!Ee* za*}51HeRc|ojH5Au9m4u4!Xw7+gh!ui4cMOQohamIXgMVQ}Qtiz{ZpWl$S148fP>h0V$=+KfUi_{b() zblHcYUbwzD(zg6y-W*ubiky#_MDE+HP17O*$=vL3no!{7K>B5Qz-@#3PI_X(%}faY z+33Ap#EWUzVW{$g$YWYpl8ZlBwcH&T6mV#xLn@Adr2@b*xfc1p=he?U zK5av%bup#o%j1~+NE2QT{zisax?u*~yb?S#E~8mLe(3Um6)i2JS42{1M;p?*xu#yk zh^7Yk^TXUl)om*CuDzv#VGb1uiO?`9L#&K@naAAIXKc8#hW6tqta)eP6Eiu@EnmGK z50yc0*nZBI#%+SLh(-mcQxJ|qaXNnoS(xP-+qKx>{E34L)K~4?l7SXc%Wp2$dlkz` zmbiQM>}Xc~&`F;PyP0z`)2z;)3r1d+^T+Fm(F5u!`avw)Ak$Sw{zQ>$D^;T0b{B2< zV=B-A;>o$m=BQH1;aJI8wXr!d%Gv`pFm+)_ z>?yyBUQ4Jb;`opmrB*Lu$S>aA>UOc^`E*;-wX-*<*>?9R4Oy@10^TTE|1A5XP}WkT zBj|eH{?06-$@crdSuh8yP@2j-!Zg*{DwJc*Sq4&pS918$V3*77cKJPfaswR_ve;rO z7)b5}W0MZZfX8JHoq*hRm*%nmc7OobgpWhfgBKAGC-Zo8l-6EY+Fvlh)gZQNtMsgE zI(}zxZP}ha*9t=*%Y%%-vHZLvK&G0&5hKno+oQ2$V%n^KbyNAiK+$#z$*hBU*-1fr znZj(sS50w$99U#9P?Ur}@L1>!hwS@TBL)ap42^BJex;xr+c2_UU)+B~gs*5^pWCcp)2sTC4)B0jPclH(~#A4Nituz-m z(g%wRB-c_l914T}UlQIJe;;$dm&D?2rc6y`dpQBAnrLXZa(xcOj%}r>c;zWV zqTAdK#>5@HKH9xY{)WAD6u3y`yZ2+HfLxn#KgEq!*{gr4g6-^%BJf)TubIm9YSqe>yo$ZP=-mp(QAc*gp>@2l&qwk0GI} z>NYSIv*MI)hJ$p?OvG5GFWM*8_EQ~!b3j_vu`;ZjSYEh5;}l|Km>MNUACE>_5&IG=V)7utICo_EJJ zx)Ksim$Q-ddYP}Cm_jV>H05UQ;~{{iwVeaM)_<26zzzzMw~ebweQwOePW$!H2A}zI zmuBW&HnzR3-ZuUw6f&%m4KBk(y-Kc=MOoFo4)sI>wFFo}l{*3MCPcm~FhIKXV#jM;X z=^S$}I7d+6axw6P#kUP7hyeptS*4&HLLQXi*&DwSRH6MNi~+dVkG7(^n{&KzVRN>5 zzHyFE0f+PuIA6wq79`P8$=$fe-}T~9<&g{cx|}NDv^{WntqYtb-N15QNeME|K~}6Z z=8lkm%+`)SQAcYd-N-tn6|ZhwO!FE7!o2yVW;1Xp6HRsLIeDRzU@BaihW8I6EmiNz z%>O)R!E6dE+G(hZ$|p)$)=XFN8`#XZ4;vF?0+|=seLOLTXdbri3p+cb@-`4QYh5Kk ziW%2|&^Gj#KgTpZhWdNms&c*e*`2NSrm0Q4o0PDgpztEOOW0#T(U?+PqCCu{=*+0N z0^J$HV-1Nj%gvq0W@!Vmd{fZd`PqRRPK9i-=Y3C&4>7$Wt&r+D;Dl-x-bmBdI z<3WE?x|3$WtOvu3;LA*x+*Ggd)pf~Gc3J~a><3s}iPtp<@a!$vACl^V;2wCiCf z4Z<)IRzh5xs@eF8*#ho%i7DYC1keH!5(+z}$>h;14?_6~%D7IkZF0-W@{~7;UTIw7hrJO3Lv_Sf7Yb4M&>|60M7IKT$>3wcM{LEI7d_+UhN zQNd$uEmCMlAQR&kr`ng26~#n704pT;kJB|L*oG3?ARfQ0oQ~pwN@1YcUmBgs59sEl zq?F#e`Ee_P=2zPP>W`_2;_&OQj||^sEJ`(rR*E{^RMB6hMr{5CCRZZ{>$Z;M=1sl! zQdN2hV_y{=z+P?~81jo7m`f88;0h`I#>M&j(Q;Gpi%o+0@= z)_5)v&66TU_$KE9=|7OIp3zKfK{U9ag{1)x{(dKN2X}cKqLINdM=^zI;V?n@!SMMi zuBb4cZVSVk;A4P32rMbG+AqLwM8PgnfhUs93f+)_2P)0#t;kE#w;kx!A{Run=w2rx zJzCP)VIz66FUbOplExgswJ!>AzmwP0ZnRoGi6cISy%_Gi_)z%jm18f%#@M+N+Si)~ zjl4gF{5-igtcHlc{chLF+@zcIa7O6?ao#k>1Kt;0F`U0lFw?UnCXjuXL!z52wBif7 zQoOx7fWJG-VY91?6P7tjpZ;sI>^?H+Pr!Kj5P{owto*X_dm5Qezznt^lB(kUi{!jI zP^*kuq#b8RB@uB_OB2C9&ynOr(S3@EkSWX)vh}rhz?cZEOm&XuU-2$Wm8$SL4?dn; z0Rog_FCmgV10N%~(j^3j5wK1{Y~V!2yXy}#)f7f~KbqwG+bF(%W4<0)p8lXezK>5V z8U1wZ-NdC`$QmjBi9P0TeCear%?07wKfXd@z(beoKQvCpb)xj7U2cu5+}JRlvcp|S z*fBZ_pyO+-wAFPThiGKhQMq{o(#~-3ype=bft~G~YNHo}Oysm!+6~)kFRjh(tRiT^ z!>1oX;rZ9u`Oj$@@*27b)W-J@w23=l5W1=f>Ygn`t!3(L`yUM(w53UP9)~<8Ux*_U zg8+@txYz;R@HmQ_%F6UX3jzJ9MG zK8A;8$H+*`m(_}k`60XaRBY}aXiUa|@8k1a<=s8rSsvHU`cBg})kl1VzZ_Wf(XR4A z0>`iYl?V{>#)7YW`f(-DI-Lvjs*J(LpT!T2JC#E(B-rNO6%TE_3w7{Qbr%?2P6+R&B>UnyUf8!SJNIPi2WlZuHeMsRU>j}8v#8Y_WdV;qAg zi{lINH>++!!@HeZti=sUJ<)k#_4q>uw!w{O5-p#zgr0n~95W*fX*s}sxuKATTh`$brVeDDAG=wwm}n@W;?IsZ6BW3ztfi);SDMJO~5> z23AzVXfo^sq_|U3dc;pfHLt51EF(@=#c;_$^vypwKIPa*3HfG!<;PZ?{)mP6`3^W* z^J4)PXh4N~nHQRSvn3@5l)JBM%nocEhiDQ#={%aM8#}sI6SqJSl)rhh@YqJ0@@wf! zWkrvCQtgr3m(;5uOf_T(7z_*!44%8FN|vW|NfDSA+E;&F8nnwBmTrh^iXW;s|1iPRJsJRuu`r_hN?`sdZ9;N)u#X%l3~ziEo`i0oh5~s zF*DoD%V&X5SOT`kU=d6&{MBV#wgzz;@?A(2u<-%R12}(ASq7YRu`L5uaxfr2ghvHJ zNmfs^C<#xoLmsZw_KW%Zs$3ft5q_ zzl_&=^W^(tMfEKHYEZ{=XHzGWQFJNTRW|4> zU^r{RQ7%OtF1vS!v&l-rfY}terlC6}RkuiK#$6`=kHy-Sr>VzZO41?|8#qsiIvsoH zCoFyS12KR}lbW5-Ad}HrNy#9yw!i>TFk|J23tf_-Z}0nAFZOZ2^YZp})IM#<4=>fG zV~NZe&4tRg%^g;-p`xloVk`2%El&Q{2)N#oC!tdz=%zM3mssQcPMH7`f`dxAV<=zm zlfQBq%((n{vdKF8%4Yw5GpzBGuVlx*cWi31f9z4=FRqrHoFAG7&3LiN{y*3wDkfI% z91@D}z9M`bXL#i-iM4%j<(+nKdDuPn0JY`7k5^Je4!oz3>db7pTNa|%Zz}+2%>F($ zuM`ROGq@5Hnk{vAZF0bzDdJtAc=+(@*lz}pqY{P-=p$zVbOGoAx{4p?@c)Q93$UiX z`2XLH(eb55$7mQeQb5oVqie9yEg+0gDUpzolF}X0F}f8bL^_m~5L8fxow&&bE_uRY7{hV{&pVxc3l|TS1SS(UdBw|TRGfKDOOWA;Ud-Y*9AbAGhFu<12 z9McU69 z(XBTno9TUPyGAFM^kRCeu9DP(D<+bulCOahJOz#gYm;SevGF3jVjlYtps8b(N0Ml(UwO80f|A*%nK~NTn`s%Ye_UH0ViY5VOaxVELQh_KcYL@OP)NqSY8HqjyF9;$PCa%~98vrbesTF?{aD-ErdV5l^Ns>h?^dciPT^_< z5~(oMt|qu(V*sEWh6A8P7L}+|Lp(pdU=+fcS<@IY;k*@@Myb)l%%U9xw0)woVu+HU zHV4cKXU(r^N)Qkrx@wg!7(oHLN4ZP6Hm@?(;KOVpZ%p8D=U~wt`-F*zk!UVS=MN1| zrs7iqQH|krJ^|FdV(d%nvkH^xE_E!>w%8X7F$W6uBPQQm=VE(*24f9EEW+2{k-XG& zKI*a4GiDlyRg?P^avD5+P?1*fREolAro*A8#+QT>af38S>>4REp3I^5LdQ=pOU@bG zxqkJL`Tp%8NRx+5DHw&O7Lk*KCurtp*AvAucro0{0nUk{+L?j=R-<}@RXx(M$SqzF zfXOi26?EnY_z?gf>~60NvYF6;Rvlj{_63$f^1~SeUpG@WshNkYlb<*sx zJW68}9Wr1J2BM^1QO!QmX6f&_82gZCT7&Wyvf3c3EyMzCMlB+xNz0@v!Te0tcW8@@ zQ)K0^*`M(LD3$S6(HyOK3NSwrk&p~>0aG&@F>BTi!=f!OHp#_E%1G!%)5fJ4sO zsv2)L?09rOq>H&$mHt$P)0%g>Tl(AWKfelH2i`yWs;4sZdAiH_{hhYg<}WcL3ZYCV z2wGA`|8|p`_6h#HP1km{j4Z^GwA2>9OH4=8{XEdHvRXFg4I{4D?oYPdR9mT2Uap4n z^nUy#@n$nC=~>}dp;I2nt(c)%vV;^mG<8*_0RVeQDo?U158~;)7_%~B=b zL(D!U6JQ|^P*ec)R7e?312lLQ8*0vuJ?-l&I@#M>W7k!fUXkJn=I-?PPiM2@w%|+} zeXn0+$=B*QPdA4+Z4-~h&Q0_9-%NVYUa9iviZxI?n@?4fRPs)P5D|HE`%(c)FQfe_4LhoaEz6h_k$*#v?E= zDDmp`kyV6(xbxi~-}!$$C4_}};_qiaQ->Y1JOlwAAp8x) zuq~emr(l7401iFja=Az4@}$k?K-GHgcTaRy`TOtWM8TjbiJLXVccSHE!)^B%na`8h zRw{579unmQxs{?I8W+uv=^??lqqEJR)o@)2U>hT=Zs-wH|B^fSiv#8LM6qN9|6bnH zL2bZJ&wAg!!4hh2Ru!O|3Z+*`Y>Dbf2PXI!g@9uL)RdtVL*`2+fpE4 zB6Lx`q3Z{CHlN7c+I!ARxtH*ZJ)Sn{iq3%H=fz<8XV6V!MJp>AV7gX-2K;~Yt;89p zf90RPRgC!8ILB7f{X|+u<;Jg#uiICUy~8UK8HB9n^(zVqNl7Vb)tkuE)4#jYQqn|? ztDKzD)WH?Gw3_O78F?9bInA4=8-&JZ^0JG2i*h$qm9GG4IT^$ar0Nyb_qF%p(g;ae zDTJcJr}HcFpI0!8x^RXYW`bQ&(Avd*N>(u@^T8LWX=1PnM{5`R=1_gU&4U2=%;p@p>=CV4PSE~JJ9mz)K1au9m1I(TJ_w%XQd&;u3#eM>9_*b? z^t@l}C#ImWgZb~0i2?)-mU6q==NSP<(r5PrKI=kcMTFl~{-M|g8)DyxX(O;3vMVF# zMst{)h6H3VUS^bIo6VGQRFLYf^Zms?;vv)`Mg8}@ePZbzfLtw4^2py{eSf|;&N^X& zO=f{jU*%!4d<%_h7HZWVJo$5eH9$B#?Lz$vYER{apuiA&iLBPX8djX?#Jk;;w`T>V$ zBDf)q$-WWL;^uQpQ%thX_#{DuBFR{ckbq=Hnk?#R7tk$rwFG!#JUY2nAmb%$j-rh( zEhj+VgyG1Daac1FstbK=&G;j5U>F|~t0mqXP0?P85}gb9RF~8oq|La~Wh3@k!Nx!h^&N!wl$0){XI;}M^JzM>OzOq;GQwrXLg z+@`9gK#EWB7hPb3NxI}*R1rOZPopFd_?HqjYM!X+UlSL<{q*tc1p7KORM2zgmtPGP z^q+c+ftnun|E1X$-h7f@N*e)RcYx_9=?QeIJ`CJ9Ep9BW+-c)M!!@L=*qSydc$6DD zMgzPrK3V<#NM4f)N-^g*t(Yrl)xnWX9U)lf-XZcO?Kg8%bQ}t?q=pL^j;L4i~w*@~B}d2Bs~g z+noGyN^*914F26C@GS~1>8(tsaiUBjlz|lemq)sD4 z#6)lwyd6cwieK3Pn}YkhX)r&{!FV<>RLdw%=KR2ji#i==y(FEDtHc1@m(@F6RyTM! zLdvTgXQu7@?;0I23`&etKl|Og*n*i_A_3^|zav@9>Fjy&mf%HR;+$YyHT>S7DjA-G zI?t;vhnokwm0Me_XFzb-)pYugz2A{ zWd_&_aljNk8_!`{(@h~o*> z2iKR24Zq@oOuGL7qZm0V63vt%Lt;2-!zyyW=Re^eB+Sw*k6mah6@XpXV?z_LvaGBh zeJ0_l(AiPH<6brk{wf^p!8)+RLY`ne&KE5@SH|>!$odr->8zUQ`a5o?7AFNzDafMdf>#E$LBY%^x^cPf zVi*&>!}jQod#A5aEfnQWwwNGWFDmBeD$t%~_zZ4I0R{jW7KPE;au>`n0j~W#(aNjp zaP_74AEVmwN#Ut%+-lCwqM~H>_3wrNi|kvy-aSL?pVnuGOgCAkuC4Fhy?qs7wPIf^ z|L9IriArkb%ik6sFKA8*x9$eD-wbSXk{k5LnUomb6!CwPzyCJL=ZD*4W&irad-kN6 zgM&?v*l!hGjpl841$UN&y=Eo%@uH0*DYV)mWj7$(&}a^r8rSZRC7oU4E@q9ef54kN zH3!5j)XSd2HED>PkI!ebO z-^K@ZDl%p56mEaLecGuk^7AKo#F1-oTt5SpRNmThQH#UB zvX{-SybKqAx9&T3$+~@AyW>UVtd(3Vvw^6t_P4F6u0Cv=48vzpxdHm=rDvZ9Rt#t> zTEBGptap{^)nztZR|~OA;@1Ncy^U^nH_8_a(+pf0m~QxHS1xGX;3OJXiLT0Hm0@p- zP6#u@8e&{P!|!J_qH| zxVE@(Z4(NX8@xCL1!;yn6snem^ld#C^FlZw+?ZU56Ky>UB!Hemh@Q{&7IUJ6dkh#o zwK#a!8&A{4G8L(zfkaTc%kXbii+*Sz;1;U0swH1Uk=zpep!8Ja!M%x;$2I0G zI(?xzc@Y1yK*=HQxwGXG55j8-I0LUXL z31o68YNb*NQhpAm1j~;}Bh9(w)~rweV-@CBU3EA8p!RR`xYjlWQj$eF$lOm`oR)047HX}U28zR@?;nCN88n&kna@MXYa4yc;3B29ym^21C1j>G*M z0vbu3`3Aopc)V)Fb22kqCs*pGLlMeHObEeBc6=N_X5`dxPnC}_r&n=k;n|jz*Q4-z zpq)Ti?>Zr_{U?XXG{0-^^D4k zr{IQ+c&@nRv>(KjONRDtN^PTPVyZ^Da5~H|mVrN;Pa{p9Wq57r%bq2>P$T61c%%fv z3dTQ$8dRbkZ5MWapG6n1QAC-a1)Z|O;5u_M-Q$c4IfynLaKYeA3PFBoRGNsD8@sDD z@;L%BK@v^V%4KctM$j%(Aqti2vJ&}nK-N1|pIARsZOTQ}r!VLKX8xiaKjvLi`Z?{3 z=>#;Gy#)$r+;8Bwji`cvN{-sMvB`|wom z(o1uCY~BcK2~qug;TSeqoDAq8n!4AoMrz(ZONT}7OZu_aXyvO3Rr^l+9E9{_q4R}A|ld=QHF80@7 zbn*1LvY}0WAYaFON_*WdtQMVf5T1aRnNlw0_#ZlMH6JE8M(d{oE zZjgn%U-N>}et2?2BGnv^wCaeo*VT59nHAY$dQaCeA6mcz;yPfyAh89{2vY(EU1OO- zKu*tvWf6&n7%=m~4HZ#5|kdfKNdxN5CQbjgwBFN z0)q_K0j|ITTd3mX6iCk-*E)ybNYS>x<|e$W8>Ed;$Xod_*+MRB-qE)7B+lMZ0b4Tk z_pBx2V%Ik)ll-9f=a21oH%>i|*6(~i_UMU}?R%&4$X_^5BJ9|^><^Nr_Aq?z zP?hJ^#bJ^P<-x_(6Gsn7@Sl>Gt zC0^mz!cF04{!b(k6b$+Tx!qdMcu(>Z~x~a zE_%|H(_BfxcjE7<2?^8u13nnLqRe)8CUXa($f_WIN?Vooi(u!du%`QxU>gtmWGgdcN^X5Ne zv2H$KDPq(Kyzi~Bg8m#`tug)@_~+WC*0eVVA8EqTw`($QB0zxZM(%7`%^yaUq1%0d zX8e@Y0Fd0Nja?*QP-T$pX>$ecq;s<}=fuam4E zk>$#V&tELq#qtHN=@)i%9{3Ek>DOm=`4s41`;0Pp-f2-$Sr4dy*5Eg`@8e|l;X7)@ znUvthExCs^!tG5_YQ+`fk;Ium0MEIuy0u?R9;+|OEZi<#?Y;=*=?Ryrhea94v)tv$ZS;0B<`vyyNcYrt>wIwG5PWm-_BNFbEh*A}6j!9OfKxk(=AH{Ka(_jx>JCf4par z;~FMT{I`o-w1og&lKr&0Dtq!!;&66^m|G4I4f4>7Hp3MEdS!TkeYMB{05Dkk(_gTH zG^>yCrZFAJ`b@YDAF&;QTB&7}4CZ4u7|p|8Rf8G0#P23fD7~643f8ep`&F`Al)uz1 zAbU}VlRj~1XNGiH*M@#7Kz!1dw*5 zKv2&`jf6V4k;ugN5BG@+6Rxy-y5;IPONJV|zuDsmT3LvUVBI$u61sQ}K2IUfs&W+dN>mAIe`JF;(lO%+k;!KT)Y0%st{gw5U z3}WZj{iS9Q8{Vu!_b)%c`*Qdxbu(COaEE|l6}w&B|ySgCT>5`N08 zFR13n3CM5UKzDlegqOR2BS~|e0Zg+&A$_sTA!57sb|F3&Rb8HK$?)KCFF#bk^%PO! z)v(;fxmbI&mp3#38H9^Q>uL}0G)Udr&5WuAHW+(9Lw0S-n(P!T&AQt-hMr-FlrbOe zep~i7md&q~n4YgN8jp_V7$FciypSm)97$DdR>SUSW|SE9q4xs8*p`JFmIIbpZC`%nkJ9Hc3Ig&e%u&fOX8Kh)J4u5^ z3ZIZqE!nN>XttGGe$ChnKcQesi@OrEk?9ttR|2$SC699?*@9&ay=?)1Dy^2e%H=W<($5pwOGxsIE%g8HV zG(l(v8%IpscgWE7jC3LWuX{@GmQeBnyder4 zh4Nu}DbJwUvT_(_>^18NO(87or*ITkB@4H_gb|QbMltfcwLBQ}GWc5MVWP#$9tSJZ zXgJ~lToUOL8D)xh%O6ysN*Kfo&E5j?l<7Zu!HKx9M08z;F3Tto!z2J}uH+Ebty+NJ z0O9v2=fs)_2*~M8=0`N)H%&{v-f`YiSbn^6cYWalhm%28WVDnA-2{i^BlYckm1bfXxY|4|058eq0RfvumpB>8f+Hl^ zqn%^RB+t1la#^M42{_lZK|wi#GDI-uRU4P)BvuCOvS?G`l48XGAy25F_%SRznwY90 zRgQp*#h5zNa88aPo`~AkvRDDjE)vaj5SyV=@*Av4d9X~xj|=jTu;^F;uelvDrdTuQ zmWHi4z8+7`PAT|E&-$(+puh~z1}_D0ZUFSy^MzZh&IuuPp^v{0Z(EL01h8G+A_Fch z19N~wHxw2G`}4_I;ra*InS3^@s{^G#aXGh{Xp1Vhm7%Yb`@r;MdlQnKh6I|70IN~~ z{b84N>&H4C|BaC4yuKM&cu8?swmPUrd0>275B?96^1lmtr*iEGj^OE%2-9Ul(3Cr1LDHd*VeUmuAIqoD9yf7)oSyQR*!;nJgwUP5o9#Q?SZ``jLi) zdXW-0u85(>Q~BPWsqL$<{b{xJd`FS(@m*tTl}`xGpbc(5}=52sW^{S0^QWp%!n1jSdG z`iPcB>K`0t?F=%7iX8-za1H`2UYiF>&;u7MZ}NDBE6z~98a9>@3-SQ~XqQWu6wsbY z_JBkF@6qD*C+S@&R=8+em0VUN>8dMkwF%5S`HICnlb0*VE37AG24V}3G1!bQf+lAj zqY$&kAdx2a8D;{`ZSzuci&ops%z5;^mFsk)-csB+0aP1(p_*=5+{l zXCM!CGVp8~VB^Wi(J5-w@g_8=SLAsAO|MV)x{tw@2IqqxQ4g%`lC%^%4T}{9@;u* zm%RnKUa?Mu`Vo~B<2KPH#Z<&#{N3T4kA}6y34kQArzdxIwU!#D!b2ng)807TnsK*( zr|+L^{VFqSJBUr;diCM4Vm1}nskX)pWMvly2Y@!bFx~qcaiHY-<=9>6&IGk~_djmg zWY4xEV#ekT4klVJ+9vV5o#loaL_I2UmOhXGYI!plmtOoB!%#_N$P*#*&|8wVofZvX zQ$c3!g8+-$R9(n+_UM}=%B!oQPP0z>eh$iI2ItK1p}Is zPptp0`J0YjIKP_d5Btk;& z=a<@-yMFn6w%I$2|6uJ$1vouXPx3v?;!9UZ@3=CrH>JO20Zo25dPE|HtiK*X66VD4 zYlRBQ%jJCv0zrUfmCG@!|BR9|pgIS19gnZ>ExTwWvl!_#_eb*vCe>!5#ZU_E1(X22 z31^nEh*1>*00Xdp7cAb%RDlr1pn$KW!!)`~bTMnvL(D4(d!2;XxnVq6vHMwk^;#DJ z1s~&d-7JNPpWZ?yw%;ivX22=KhliAw^MeyZ%;!Lcq zeX9B-fv~o(7Ao@m_xAHQx1K!fRIqasfo}{<8e@7Q_Gj8+%1}~(6QqK_$EQBUcOgin zZW3ovL3N7yI~&ANSN@ol=-0d_$W2|INPW^k^p~woSB;1*(}o}EbQP+B%ur+sroz~VxPt5P>(cVW5PpZ&1YZEXlw668`MLBS=3Uej;$F?BRq;qn^_MWW0^u-+F#qYs;k$LmAqTd}{~ zMKc(kH&y#M*E;jELe}47S$1z4gpY>ZpFbw z>%90-#UWKMXg&e2%B*wEp6}iqPjvd8CIJk)3=_UoKJn0wgd<`5SH^-(#~{KX0>ceyvJk}4P{^;O8aO4H@tR5u1Yj+ zkt5atu00q1OBXXY7@0D+=Z5je?%KQ&KE#QMc@`34F8_<8TF{|@U2iGlCvg)##&A0W zNH!hkG*T8=qEL@$Rlr&XqofL!$abB#c!Yt^ie*y~{V0goR#H8p@v6?VQ)jaG!IQaE zCJUBK)zXh}H>x6DTva+qcFQ4OJ5Tw&n)N=Y7CN&~t&S~M0kRbbf0m}#%}0Lp_4VOx zEt-e|T^D8Jq-r%6Qc+IhR0$YJ1KDF2EIHR9nIaPaM^dx#I}>#K__1|-jM6%H zMThVf4E0MGe-=1j{_geS3?Fy)SMmVxxEh0B9-op=Gp2vSV`{^C&8lIDnq_?4Z~Fng z;55HtWElEOjoChj*#x#GMItsbcElqs*4ZiKW7YHy&R)59ITye`&vVNz+_NMHQa9xS zaOrNES4UsobU$x#+;M%d*ILv3AvV~dAM(pl59I$BJlJr3q(L-^{Po?bi#8Ttt3}j^ zsv{otN36XsEaa`Ue>;dcM@t^zE-fTKbKKK9ba=}9HoqojxJ8X)Pz#^jgViv&R-UoQ zTu&cG|L++=6JKlfwwFDNjWI!wjYh91hKh@!pk%4bQ>dU);}M$a8olXT&CF%4^tR0& ziAWCb^`O?whYR<2Po)H#N|p9s>?TLm{s@0P%Pq^TeERoRWk~_Jc1C*4Dd*>Qj+>nE z$Ucp$yQUx2WWRFb7l!sHEWf@spZ`>N{h9$E-ZPQkdL>eEaG46aHH*hiAi19Dt*@Y()AMmgc*V)gYNQ-M7eu&_$qh)B7aFU7shR2b?_HMsB=g#j$%jT` zme!3-lN{CwrZMrvx%7qviXVnZ?=|Y^HQIXOTIs(TD|~!>Cz-&qRRtSqvJC?Y3Wb*E z7Lv#WrW>vWtl2NM_tZ$$O$Xj18O>^V{MyRG5@eI^#?Ga+9c7hIyK-XFxs}L43g{M0 zn{g@Ae65sMQ)WJRwwi4)zn(>~u*`eR9@;&XBx6o;$_q&UnysDuaKItgjapcLB>w6J z1$|!Vmh`To>xhGdL6?w#@0P#0DbU>i$=|1a?__G;_z@p5MZoS;y)@Yg+|i$I)7E4| zG+l{8_}^jMG>}!WR2)LSH~X9aS)b_oBo;v{zix2w%%^J^{qyT`BUbRP^S_~kc%qY$ zq<*00_VG*a>b>>CcmtE`}be9iC{BBcQ;XGYxEPrP&&Z>Al@;p-c z_{nBGY_@162;;baJ=y)8SK$Uv4Xday@GgpyxWn7#ce?R;0Vs2>tL6JUE1%yru7wyo zPenfYS_iiK;58I@2<>OF^GVg;(4cq<7!vou=Ql(js-wAIb%-QNy~>>UkBh3A2hISf z+Oj?+LSl-4h#V8|5p`nAQaF=@grvMj)t)J%LtF>%=j4-#T$!Iu2TjsC+j3g(pkqGT z#Ert6rN#unPZt3K25pEm(jQx~&u`>56rSK1Gu%&XZg(c&Z0G*;`1JZfSpkU;hoj+A z9}aiI`+?F4C*s7breGdL-4dlULd+oj*B3+j82a1gD&mRNITqDDQ*GWGbPk~Nz2dE0 zl9IcQ(i_37YK-4?NSZg5A3lzV{S&hLxwkg-dxWRf-+waV;pj+4762_Ni?3v-f#)P) z{;l5wm1bm=0A5xDMJ%)n!@i=iwN|a#4N$0DG`qX7FbC6!D2*_IfD5#dYaFfhknE_< z+1aS}StGuPK{Xp`Ws$@b5v7_}DJP*(k6Ekc?7R&J-m|#Is@D=PvDF8dN1<=c46!;_ zTG{Qt)KP~qCfos>LiWH&+mg#>hZJDYfC|wR^4rW2^3>5aH08lPh628pC(?Dg@HR(& z(MBr>x$D2BF4@~(MZA}CRGp;1t{!&Z@EdThFW8CRk6?B`=?cA0OEgC$k{?^9 zKt-C#Lj@p%fKt+NuLocHR)@Dz)ATdM0)M#Hy_u83OW>yqYJF5h@}HNmhUd=n>I|?< zS>9$YEMHQPE2QIgDrqZ6wincul?e;fbxZ40Zl?T>KyAoP*AIpaq!MC*px0=2`m0pB9Jg!+w*?VJ(ee1KJFNPj5Gv!Jn0`IY@5U=~7W;C@z0TQ1XezR$UirhbEs;O8EwMM4~?%hj%^Jw*9c!*W!)5YS1 zg0tTv4RZ5mR-w~M4{EOaEvTo9cBDgwcYJ(4y_sj2QfoJo;9Cby-TJMXYKmZe>~|g{ z+bWq%~^zlNV?vHR$iX-UB2J`V-SMUM4x=X$O@p33g62Y#zQ&{;&o zqizy!Sh>jQhUGc;Q;)1yGE>l7SSWqIK7>(>Y(x=@Hjh_tMab+`IT-Y0$?M(oNfp*B zsP_Dym$2Av09DUG6e*+Vc7-+#x9fskEYY7qUm)4^9_5HOWPr>gWt~4E?h&mv7hoNs zQm;q|7yH}H*n1o!$Nl4KW0?IU142ZnZ^iQAx$Ml;v!V@J3tH`0Ly4g>Uee2lJbP6^ zH5!MLOM6ReRnLZ#IwzeFY?ln~uIDyu&Z}bQyx!k~{NLX({BQ8`2y+zL$k%njTUwBO%m;(WibN^!1mG}3Kf9-tRKR7ZkOoO0I{pwZDuiWF1P3#l{<=Po7)XY7vcN#MLh=U1zY2=W;L zA*ac>O7ttlT7nyxjAB+(^8Z!NsR5_+VO+HJs|T4QdFz~l#$+%Q?FrAbop&v}QgQ{+Qm&u^bw zSbBc9|BM!H34g`#t>$SmUL%l%()ote{vP66z`d&Le3)O+3_j+flK|j1F;TR3e! zhcoQlI)p;|TBIYV=3(LWvtNu?k|$TjPf|IsWH$#{tM(fquVtLN#`MMejf2XaIy$v%5||fq5+{ zoxYp`F}TVcW7=9XeQz~3&0x=RS2G?x$!c``r1fp6Nsi~*)+Cpu;`Id9qu8!#(*o)t zQm@zN2$EvzfxH=X0r}kl*2u1m63;3LT3=kvmW|Z#&qkjTz4E%Q9%g4#^)Rg%nT)~P zP@uoShhvxlNp9_{ur41jfTwGF%PEViFO7RK-8Lg^D|1_Bs+CK8-IWSCT&qA}Q>RsO zE|fO&hnL+?Dri%dZ-QhGH$>YJ>XKRvHJ+T}pZ*JG!gl=APz1Eb(B0&R5!c!s^6 z>~!Yg2zO-eJ5I<-y>HV4z7F&T@%ILYoY&rRe@MJ9nT?7lh=Z%$NAkqTwU?q~_?>8@Jn@MtaQuiVse%?1B93Pi z7S=|}OT~|BiDRm{0)`L&W{{x=J_e7q>Dj`4*7h(uay=d>0>6>MhDKWC^BZn5SxuE3 zf^)k0109|f3xZ2xos8ANLQ64PyI|df2ZX5xzHJ$wlgJMKSI z%Lb^_zMcOu6VfRcrXl*Q(*_Vte)2IsnE{7x%Ezfi3f6$J z$fz&x%Fc(Gsb~$}H>~Y%BJaLE%IzuX|2kJ$C|_4yIv-G{Xw>7g-Y(g{-lvt@A_PC!z;$o;4_bQ(YF9lPgZN>V4Z9&#p?geMF|{KNXoQ;ChcUmFsB44 zaEVmqiF~5;tiw?hj7p42p2Y=|wdiOKsBG4k3~8q-`pI-$z4?YVCd-hn!C!-*w=Sly zu1ZVM_zoTX>8_snu0C_8aqezgMYAx<2nAZH;nwQWMTe%|vz4%Gh%ZHwKAwLoVENJ3y2T$9yc0LS_5LyC`#Za&=kzvW_j*K@Ml2k>k1~vWJH^C|NAjBx|_vYWw(&@{Qv5?x~T{(Q7bB!1Ta*TnX+)R z#x~gn8B#zxwNnz~OD&L+adr5m$9bosOn}uMlpiS#e3-kh8+aX~XAaZnasp}euNhPYqEQh-s*XW7Xt)7fmfo3Xu zpFB4mB8(g@<$I$B==v&wKY_dv1Gj%LmJ^a%3JnATsMJCJ(VnGUYg8rqVbtIHw99w< zS8m4XO{F>rL3F9pTZ>HZx80GsA}Odgs#vH@Ab^np(Mqd|0I{pZLgT|A){pO(4kXlt z>7K&KBan+0>ZFX%r6zk|_@d#I7lndT&k{euZ;L=m6BAJkUdebH8Ri!D#5%YIb4z(? zIkwzWf39(yUiuaTemd@V&W593*5|2yWeofjV}!kpZc5@~Vh%7fGs-~ed#a>lU^H`{ z&!$Sd30I13#CUY{FuE2te;&DEIqz9#rcQH@>{_J>YFkH)^7YHxxTQhoYR*m? zgXNmuluY!oZ9v8&Yb|FADKUgb0O5ySR)NVIcQ{SjpwP8f8A&{c_TN?)hMOf5NXp-> zYYCY_>mG*{_q>+iS$MltXIez>$oZGzxIUbBvBIEvmtk|z>CY4|)TV#jg0!pOvY&k+ zbV|{<%aA#{xm-T6aZf7la_lpUA!@JL7cgBJm12>u-EfjY#fkYN?BJuk2 z1JoaDYgY8|65xN-MG)GY8pk(iTg)g(kNyzYVw3~*ZzUX1PysKL)+=gNwABq6i25`f z0hPjrL?P8_=mqx>F``4dX0FK@FlL@N20cX6ilLRrY<*j3owm;PUhfe#Nfm-8A*STT z)XS|h!6ge!U@We1KGMQ0&>Jtx%_#tNES2QQ)~`uP)x6vjcq~FgTh3C!81V%sEm>+V zxiSW2-B#qjRmH3a6Lj@RRKOU&+h}f3S1<~c7tzY#IRB>pWd;49yJ@Ob{0B@^%~LzR z$H0=tmY`wjpwDDKkAthjLlirf#PrrNDn3LQaN;4es|c~z4P`6ZXkYNGrtvuw@V;09 z1Qy(p$j_I^fyUWcj7Vkzrlf)l49|%sg$zKSyiB@=zMQ{Y0&{L&t?LlcVTu7FNQ2aB zXsO8l-qxT^0f3w&@tU@L5;6S4(J5}XAW0C|eD!*~Qb#u437LTwcmM@*2HRXa01(CX z!53{3e33@)>06i+=U`5qX+qc2h7;GdEj%QgpcyF|lzXXAe&IcI^W&y0xsZhDv&R>w zho)bUqQ^qr!@^`Z4<4zH+`-^_vLGLlaKo7&M)V{r>7hu%qPL z$_imrwK!zPzL;ovFp60L|FS)R1bCR(r=KRk+5+ciFZPvY{5(!+1%+LKfjrj-x6vTR ztT~F&X{Ef(qG+U>%odwmF+G67BhkGxO?c7jM4Jk-VJZMzI#xCLZNjGJZPq|NEcwaL!)-9c{Xy zLBKR#H{woW>E{qb|8pgPOl3+t2 z+R}h9jgP}zmmtO@|4>T0#m0P*HcA^eDvfK>kdk5Qn0*ZkDpTrmd??BIw65Y)Ka0oK zLA%Y98W|2 zo=-j}1(8EDp5&^RC(q|va}Po9#NLul>1si=VvE=sdEJwneeE8_2JL8!6$gU;?nzL+ zZsZ>BDZytL@;gWv$EVyFPl=*(UEzHonaA%)H(+AYd4{mKctA)W zV}tL_|3%b$05$Rb;oh4B0)%2Hp`)QnmlBYw0TOzUKtk_Lx^$JIp-PvofFPX|Kso}V zfPhj|dKG@yP?{YJ7Vi4L?>l#Aa%OktBy&#o?4I^~KTqAbSq8%VBfK;kJvr>Ggv90# zu$*ivh@6UOt8TxWLE$!7kcXorMX4XzfBPKvrgzcJ)_#89~`DW9B{ufP>4zYlGUz5PyO;t4| zEXByA^FjwXIT#)@2zEihr%)_k$7Ufv5<4GKwmic~dYyOiCYR@H_DjJw5*=(m@0>Bd z%lYJRHjpSd<1J2Dlb%Ym&l>!br7U4+~>Y^tdI-j24QkG5dfM5lTl|Wl3kSrA!ZlEl&WRgBeFF&;T1ycQA%N4utP7&9w5E^^ z&^sO@KAfWfrFAp=8X8ruk2FlGH2l2wweFJs(E5q^K{rRat1xE_JLgg z9Zs)Qhk>6^V52v|a3%%;ynBA8Dp-IS0Ih$}bT-FfJ=VulGwLHvf*qn`iVFXLZwPcj zCVdo|M0^LUG24)2r9-C!IQdyqGHCFZHBgsmKuef8bsDSZ!4u5Jie&0G=zcU?U_%*d zzef>*4I4jB98zQtoO%gwT*T9D>!mOYG4kdvuGS5tW`!)k+{-8o7B1x6GFF!DkoReL?@?dYDnr`9o_}(l*uqxwZtC~?2*S|Zh zz7kbd3J9*>FAbHMWPL|DmfqJ@#nnxyi%asTof>+ctokT|+~&muG$9-~;E-TD22_R% z-LOtnOX8(pBD=F0Y*Ha!DdnnyOs#{{U;9DIoc&U)lprhJ-m=A6-$kFY#LvhSMd7w>wzTul;8to#*dl#n>EIbW%@)8_T?JEGCV)MN8?aY75G zS_v&gNuPwzYa2ynSOO(Z!*5RWu@Xn@@d6!ZXx-@qjlbKh=1oTJ4A<`rSH zGdontd=1(Quv;iVS<~7>yjr=(boG#^(vuRn!ss4a_N*PrJh*Px*0>($qG5_QOZn!& z@1?@j$pNh0U^RsfEt?{I9j$bS1vGG&RfU??Hl;f_BEwerQr6%qQE}N(w|9>C>e z$1&X&?4EaU*Pez)jppOkXXvX$t;L~x7**Nk*7ZZK+9PwWV+AI!?fPv^ENjIf{PaIQ z67uZ4dAB_Y?+(K0Caj8Pf^&rsRE%kMf)Zf@Fj&LnyV#ij5)N@?Q&`|Yy3Hk zEpzy{wse}&9K5wyi9~=;gqe3tPBLjat>CnTUy?OYGXTuv!fnM3ty0PXBafhVEV>yb zb!m_t>a9IE12SZQp&DCJ-YN^X*w(zZK`^W#CBlP~JzH@VKsN&!s%mP03ZxpBX)bOf zI>>jqDLcy5_lg9^Z%^)H3EK9Edx*#jkMwu3nRXdxesw%QW;Ct3KOSkfa&js9qJB*| zLTW)Lq#pmfb{uA$=FwV*&?fP9D;Fdj1^n-so0r#Pi-a$Ww3gyFazAGtE(I+Hc6#! zYG`Lz;rFw$av`ofHTU0K1W5K&{lk_P>+?3Tu8Vy5$H6yK0koIW*sZ*QtSDm%e_f&1 z9eYRLr5!$7zs<@xi?VcuMLCdrpgK**kb$LUfFH`k^NDFxW{v3_hS12%WCPvSFPEWp z?;Cs9e){x@_$B6g?yFy;YezwiRJwU1Br50@TjRR$`QhzK;FC)SU|mSbkT`(jW$kxx zyga;*U;G6%p$&zHmscz6F}N&aP!d`v-<&9$ahIkn1~}Cm?;+4tdXqMw+S|4^+U@SkEH|q-8{mDW+NA0bNn~rB-0|9JxGL?c->G*&`Rx^l ztnXGYtmIs7MDhSJwVf3VF#RFIAdH2Hb8>DLG$!i7`PLWe!HP6<|c9XpjB~ zNEUJNJ(GU;-^B)-C?`4wK@Kr8*KlRNNtFXpjempBbf6AS2a@#JN+xeB`PmV#8riY; zFuR=(Vb0?rCTrInQ_AR-vKx(%fvAd(sDuQPvlhH0YK)1bCJ;LD8Y>WQ(R*`%woiZehlmU=+&!~?0Z=ifKs~e{?K~?sT&?tQ=jl&$3)pV0@^;Q zS@TqN5y{o9hU}6qs*>>t9yc&_8S`#xk8TKLfG-Y;3Kze~sDuL_ z8QkUO!DZZdg%i}F3vxIK*q{tg&an5^r3Y@CW`QwKLTd%SO^9qrzk7p|vcv*OK0_+? zL1sP=bDkvF@dJe+0VG}(rPcLU9!bd66_b4VOobGe^@;NmncruWOSijJNxY10S-22T zwdT3_=Ok8H7+@c~HQkKxBZN9TZHO+zS&PuG;jLzXDvq*85qb;)8n0=U)Qn6iXd>hP zn%uuplTmsqc+*u$O^WrBSTuuzo5)tHwZ|K4agWO?1fFf1qqDt!M2oM(vZu1rR;iR>_@b|=>xyg#4OA(5BBo+5c-vyhE zv&Wk|2a;>gO6-}Ev>H(-YqcF7c~2U=ZI{`SvNj^nat9t<3m`!a52(~LRqtT(<(Im-0Vz!1|Yx=T>I7bHCzSd~@U@nO-M2FUG(pLZK zif6p_yd6t5>`yy)dW4Pe!E2wcV@wNN6!q|@SdxQe%+)yC@`h9sUd)6tyL#4FGF>yP z)xY*u19NdQ4+_5Y3^yp{a1K8aanN?b*#9f!zQW)CT5zTY*J}A=MvvAO(99}{y3R20 zdCAM!E0wc#s`aa8vXQHOOD30+zT<-UB zw)?YJ&wo6Y7$9GbN&kFx>J+Wk>gE0Rny00PGs?61E`bGm3G?{A1^w{kKODNpI#EwF znxY4xlD~W|UFJDD{x++V`*=st0}{D69957M{j>JFaPTtc-JEV6!FSKtE($$7`|Jc{ zLs&K#wrKv>-KW`b6mZt)EI6_+1wG%F2OBrcyEG+hra0)OlG1l3b(qnBn6HcmSxSlm zRvbVJl0hbMvhYZt4qY-SIXOTB$!(BrkS(!js-8MKzpZJeFmPS*`#fN~oI8mRak^df zgI0vud3NW|^IsPA?e~#k1&6A|4oVF6g4 zpFEtm0+V|Qz##m8xsS7THo!>(^zOa+{eeGkm(K)Vd)B5X8_n+GIeCw3AJLyah;Lw}m>cX^z8>ZNV@fgR3nBKtA=WNnT;_emSL8FImR-lWxG)CJ|8O%dcB zr9W~wN#lNdQ>F=I_c|1;=8)!2|CN_xq|X$!T2ig6ZK{WalqXpS4PH=tOkeQMK511> zbLGG&&G)TUOE8N|`IfSSGZpxA&lRRRf$<3`=}rjLuvu^rV=ZUUY-n!KN61%F)c)$l zQfY;vbPk_$le?~4FnuJ>l}4Uv|L^gO%3R!t7qjM7^bnvH}XD9d+MOv2f)yu3+EOGPcj{Via1gnh-+76CaX* zCa0hpjrPe`4%ZK2(i6L2Ofw5@`|HZA2!x&^HTrXT(`dmFuxTg{_(Gor)2`MY@9eJE zCdR~O*yWVC-NqSn852HkWlhIi83*({1%xi1TgH#=!}6dgN*|N#u#3O-z%pU4*h}Th znP)rq(7uM^cf5X-F+UMw(R0sQJN)T{Sv-d2^I^8RYSWV{zGCrgKp`6;_33PcReFat=w@Ve-QM zO2_D$;ziBxSy@L*#j9bWDZ8<1gTvAKLLMh5Q|pQVpPWH$pyjlODXF0Hd9QRxp_TPQ z)X1|*mE%po3>~wLi<<40V>jf{iY+mQ_;~K+KN((@?7zREILQR}HFpM@+Kd;3VeInZ zuE)!FX433Pq{ia4iQt~YA)@(jd-B?Tw^{NlPPN#$$^@lSMrlobpJHTOWxT>@;1m9X zg-7TwEPyqcA4gdY9DyaGIm_>ktDYy57lA@7Yq4cslGnU&P!4fE9pR-xY^BQH+@klU zx_NtfwX|W>ZIv|i$@1G@N!vTDY{G)zJcMI#b~8gBT!vnoZb<7dxc;o9q$E2VrP+|; zQcbU|k#fDRz5ZU^HYD3>M{xaxS~hQomz*NSCZ1))yz-W{5^RPc>Esl zRn{SqKHOT9z`Q93?Rk`|)e@*2vqboOH#KA}EK%HPP<6L$1VMxe*d|@wBypirDS56Wndjb8->*oU(`WA0|Y)2T~VTU_%amayD!W>8z)jV9d7clFje~mz?;^s006m>yB z0;LL4XUw^<-O>#yG8Cd{P6gV~tf`$(7R29F%9f9gt|bfb3w#)sm_FjJGy((@Fa4Yy zF{dSHJniH`7ZEVcILS_$k zJkRgS(-uyVxj%No0?+>-QaRZq@K9iCXs}AXuptwCE&t!cTan+J(<{dbz=CQ@)SV5J zT4^T(S>YVFTByGUVjE+4k~OvMIm_?O*u_#rV?NCBUF!g(N2`iQ-}Mp-K7P_}JonxwbK^Od{}#Nt;>@8tO}JLsg)FuSfeBSXNN*Uns1Wjf znfwQF0D71LmKBSa5{xR5p-Wl!U0ynBtd8sc@O9;dUnq|fgtW^LLAiF_FW8wq4zvpX zlktKPKpFEQPwM#+iy6*Tw?F&l|yGlTd<6nF?SPUvJl^~s4CBnQk4~t6E z!#lT(SRTzU38`oWYj70Hxa>wEzPB7`r^cNCd>ybrAe+a0K$oFHQA0-e+TyYq7%UZJ z6LJCM@RTuKu}HnxJkV-DQjBbjYAW7J}LH?4D_N{2A6iu1b0 zF6v~*N8P$>jfOzR+98U3IqKH$M={Db-4;UVQY;q0f>7%FH=m`u zt0*;)JWAs4Ucgs-cum}W;e1L>N{B5VJ8zp)r{q&zD4aoVLV$%9Om6eyNaAMZ!x4rv z+u#9+@dGOm;btu;t}M?IjcsBLW&-N!m~Jc>UQX^5Cs+Ts2FMR)gsPLqPeDF^4$$~l`hO%fe$9K&zv4V*rjd9IEq8)f=azaUT_N$l(^@)QRN)m z3!f0BH)P(Q9do}|VbA#^;L#=MiHGvd%uWnp3axrLnAQNeD#MZCqF=zt&d{~r0Ily(`QXi7GK?vP3X<(ZT~AY*EZDSZ`7 zZsX@h3}p$GY{}9$EHBVctIxbs%-%AtbyIkv^rX`;Lo{Vbtli7Iiz$hTNk6e&%%f>y(&L}sj#{iAmp*=Kw8!^9Gb8>M)D1Qh(=i;_kuUhv}QB4{nH@0)L6XJ~Hf zOCT7JG$519h-{8iZz5W}Q0aL5yzqzzF(}(W)fkUF7?G`E4L3kD=UbE3Ldt6b`ngY- zp1{#!qxI?8=&C$DFVh2RsC=_ThSX;EN7-}~)L6P!UPcAHvq+qHCwGeLN4Ya*K0pR@ zdz)Y&fxExI1))cwiaUt?D1FMI|3mF7^UB4Ep^K00jwPf>&uia=o+~w7gFriJ$<5?FwiGb#Wc`Z>{9$%`MUVBx*#Ar zDP%huE%g>A*UFzzV*^3X`RUw*SId+|-H1@TNSe-Ddh>C zfm+75wWEX8ZvZdX)WK2hYdm;BN}>B^y{4?tI(p z9=pHv_I@a+o6jB#pmy)C?AwvM$g}?juP;-B$@XPjJ^`KMe&FXmAXTRh%tKihrd${^ zh}2AZ$mjdDwPmJ#EYYA>{d8Tu#af-Ya4q?$k8q5W+K23bihT ze&rb?(e19Amr}THZ%fVRC1Yi4euH* zH)y|vsSlqcI+GECe)NY*vzsha>oDY(0l@nhwj?ad z@aG5@UJFVyNjw!BZD~NPuyM_FH}s1(4=ASu&Nh@cC;%Tn|Nl7T3eo@dLH}^b{{nZn zUt)%=K7RQA{rivKA3yAU`1Jk=P*ztxqk9DX{^1CEN?A=wSyk_m}#qg=`*2-BCrO~TWN++ITDN5 z7g$8s*%a?8?;wHXJQyxrJ)H!9H2>AgZ{gy`tsYYz{c_{tIs!DHj~O;AjbBapO?>P2 znw=Q1)@@7bGW){LORSClV#f5o53o;{n#Q?8_j9$337=HJP(ty3(F^Ymr&IXDS;Y`- zClWOq7L~atSzaVsaxb4XNs*6#n_e^0crW8BI%+s^tKHaJkdlygFV!)6 zySJeS@53597z=k69RW{vNcLOf4wxr|v^rf}NOuaD-ItN$v}s&uxwVu1REhl)@AH6n zJhv`BU&#M1AWLl)b!{fiq*ysiAFc32>7O|)kNqBZuu#$7{B_zc$~hpZ^U2A?oc7yJ zwp8gGT(7_C?6%rm4{~O6_42+Sn;rSf`_i+(qzCVYoW(l%C~RF5;woWm_l_8A`l2>5 zevdqM&wci3-(271Ii{bQgH5=T>0Gu`O5f=;m}`*0kO|MsHKaGwUxk4~#QXjFJWs8J zIb%U}-Tym{)u2d?*L0_d-ttxOd)g2I!emD$Osof6S1spSX`ZS|X-UFO+!{4r%@TYS zI|g%^{&6KU)WFp!`QyLTqGM4BQP)cMu4Zr9tq0CW(=UsCSc%CqXRJxqo32LObTT`0 zV=U|Q#77#xbJjkVRb}+7Ij~aEjYAfU>b$Oa}x(?=7=%L4Rh6%h@(*Zs<0c|Lyq~$95Mmi_bOp(SKK! z-2VRP3|MU-^+?Xz(JB6M-Q@cHnG#Tu!qC_Gze=p0)!K)aqM+sC;cyGMv=0~YV2KP1 z1G_H=)G;PYBa)ct$jperJb;DB3fFOa%5X>&(^-ku3;C5Zw4Lsj86S-h1-9w(D-0Ni-~ zb8^*&I|(YJfHCtpz2A^xy*4X2o9{Qi6{B6ICM!H;9$JM{SJG6HZ{AHF#xAR(cqH^q|^HdnBv)V#{IXbFV02@s2%e}+3n0}r8mNM z#3l@(-kDR%!;XcE(;@q_xplJnENB{96dLjSs6IRPdB~?ZZFbf$3cEAzk;28hue02` zPt9pR{`IZO-J}XS^J-UZeC{mkeCyTY-_Nx-O1^&z-xLv2dD7;}mFkoj`qDwmXnp?4 zKGOf#H|wYA6Q$p111{^shEr{`gU>8@M)I-o6{c(3=Bqm^+YQcy!tO?JZpauQkv8ho zss&1JMcK!N$eyMV-lfW%Oke`?gEf&;qWk{_9=ZEUh7(V%IezTS2#ACe764vKq|4pGn^t|LHa=JvzZ8zH*lP zKZ&T%p<_d@wGHE+9P&;v`#2KsiO!Zf<#m_p6o2G?}QR)3+ICXXBg}3O~(upEq=Uy=eX~NO<)sl z8a`=ql`3t{%r?!XsXjR+y3jfvp$ICXlc4;P@Ofbk<3YY5I)8>p%QAsGIjJ>Cp1IpF zsat1ef98&reNTv=-~-7uk5|U+;j&)|y#WKYMFH@azRAN2Rai|ZmwG1>@zB}{g=7_3 zTNGC8wj3camolx>8=4pKwyWGzL_=}PC^R?P%88j&IGdmL7eBvQ&Riz=CNyAo7;EO= z7dx#8v-fEH$bqu_Yj0L!7!G-(3H6>a?(O}<&T-W0-2UWY?D`Ef7t2fKjArRCs*`%U znhUf*hN*uafm~0o4v3r9BopZ86@dGU0ZXk%{HgvZiHVGut{ZG`muryChB)mRG6$uI z*1{KD@`g~N9;to)O+>MnB{VHS2V_O2ud5J9qY@zLT`&kQWf5^}Cp^Co)%==XW=ggV z(RrjX@%=5EgmUV4w7ycTYt+>XdXmi^4X+xh=Ch=(KJt(OJ5Q)3Lv*%;6{;%oA+}@h zOjS69j${)NX~`5u=GHU^(r!0Onc?5SZhamdwm6=m>x0r;!%N5cq&I{SwUc5F*smpky&7>zyw^D z1Kb$vc6ml~9^7TOsCNC$Xk9`g-an$o`Kpw$%47sT%QEmtFjCnrMuiQ{KOf31vIEHE z%BFWoW|&F2soKfX0@oU@g$5Emedz^O9j4CgTq&#uc#5da`q|-M#LQxNeaPRyEJ3&D ziiw{MS@5HLPX+!4Rz`iO8q-tH3wmX|uOZQ?^IsHIUe=XNoT>dDVwf8AuHnrUdbxZ$ z^!2Gh^W7Ge1nFsatiBF!^SPAw%bDDx$j*$v_^y+WzUV?JgXhEVi_hmo_|6}PltNhW znyTuoMb4bTYAEwq_bPgMZnrHS21b%&T;*uHT_76{e1SiGq_)XpXr;o?H@a{U6KSXbSrLcbTX@W1ImAX& znM{95^qp(J_3+T&F8WSS@Ab$N5}1dShpKVe^k_(^$(=v@W^>n%tlxY$1(6bn)o!-F z5SU@{Uxh1-KXgTRgiO<5^S6%7c)6Qw3Sny~!QgE@!N{q0QSX+_pB_BO@WIaI*0MB7 z8N(FQrdP%2nPrvZ_5z*tk3yYjWA)k~wy&G_TTLD$8 z(9IGz2p5=uf3K5k`02(e%}V1ES+$Z*WL=2TU2mw<38_`P4so0O6WVtKH;K<$?-b42ykWXPodAx>rYaSQ};tlq$bZ^fPXc7C}}zf?>}FtJngJhptWMs;wIJ$S*R-)uYWb_@lTvjiul$NN4$EKqTWtXu->S zE#@~)$w|EEqg%Sv%8{+3-h8Qec}Y&UtFMuQ)4G1=;WLhuyJ`7BXPS=hZ#?uDGVwC9 zyu6=(;pNq(&xN5dMc%5J6s;;7jSMGu5q#xvEpc($IE?g<~e!c5`T<}3p>*%JvD zy-y0GP^NG08+)4wTPL~$lv{tlM&wkk6#DwD03{Fe7!IXOvUndj8<$;MCb(@W$`Kva znq?PGvdES(PNvJst}^JE-93`_Inlf~`keNg9Usw1#r6IST69h_HLuFoN!}3RAN~%` zri=av6=trs5cgQ=gzzSLGOwuE*lf!|ZUVivC`qA?2|*D_$zaj4(d3%-rJS0_+5`j@ z4;>zn$m6j2YJ6Y)7jpQ0Hb(rs#F7oc>~xt+J)ceI(C?2Bo@$#*#q+PgZRxWgk(em| zL6v$0HgZ@faky8G>GCcuSANaO#tMlejqZd*-uKc|m+9d66W0m_^xO|@ZUx=nsnYrm zG4}=hBn-N!rp3ZIax{m$K7;nHt}8&P=~YJa<;BU*?oc0BoA2`Nbc;;Kw%cL?O_8!t z?nw@8L}6Wa3K8Hf%JXQmOI%3c^1NuO%S4NbnRosK_`G6XWw>g(dEA>2(}-?lGMn{c zrL@e*^LVR!{kG(l*E#r+*mGoMILCG15`6y^y_E1BvRV=VuR>yP3Puap zt#(Th8cp6h%}F_lr6sN|?#QFK1a@WHOQhRqB_C#7*Fy^Yw%GZY+ z8qGqg_@P@3nO@2%^hje&^&Zj(t=xG$#H@H0LcSd!Ibrj}n$P4~W^wGAJkYo5x<CgjY9_OHvh0csP9>E1(oD>4Lmu z6=hQl54^-TRUe=+M*mI3IIOc|d$jgOzk%U>|Mkp#}`v zM3iN@-x{eDA`d^@ck5hN$YI(`hIa&p~reKeqi{k5H; z@oPhX66a_~R+x3;Uuc1cw#yj6oRzWM2GS@Obgt zESZKZ1N5CfK7a);sX%$+XJnr4WG+}U0aqs1rwES%qR_jDp65@VN8K`JX>SP&I(111 zphUx@G17!ype|n3fn2l=h|`e!Z_gow#h~SFu;%Ux8a7dF-$zCiHZk?5};_H z0Qd+WN^yhO5rP9Ni}y#(1)cy6BYxZ7hgY|L=Z3FPZcE$cj-v`T zn7JiQNqL`W)M@=^U!Zr|OYmzQ+nLYT0$pY!P@R(2low1t;S0}-{MLT9f9y{9*}yAX zZUbGM_@ka_n){hf9d`r-nxCJoO@ASKJ-h6du)ytf9p9pbcBi7^bnMn9xjqyHOqp-P zt`VN17<6bAf0M?Tgcm9ru+(VN?Srm#+L4sHesdKCdGith& zIM;NFI0Dw{Wab<~li_MqdYB@JJ%|(G>Mvld7|kuV(C1nISSLcloF5Yj(E;2Gm@H!@ z<5-%1`KO1emvv&_+xb@IWx$xNkDsU8&~-B9>q!^mZAU1EZwwQ}#6{w7)kSBEIn&wBPO zxH)~P&VyLG3LGT=nU6luDGi-x6UW_z zLR6^2#J-`a4W_sZmPS3UyR*CphxU&ikL59we0$!X#FJxouR!&I9Pj}vX0qfS#sxYQ zX}f-VUD>vLu3^>ncJ}e^YAx*-Fsb!aOO{u4{bBF)@3=MEahvf{0f%|IV8+|o^?_HO zISfZT;x2Uf=9LFO+D)F;keC(iXE*7~Z~Bn+q;CKPc3vDHQ)sjeLk;u%&dITXPo@=$ z-EH6RiLep3jM`KrPo4x6|4Sv1S3bL@RO`e6Wu81xYZ1yA$-8Bz;%?4OkDv4XpBHMR zl$L5_qZDS$q{g%Q87CL*dyWS%R!bW_{}o)*S=t`MV-u@|9TkPzEh(sq;p6F=Y}0|T_%eA0atDL_`z)d>=D;WIVhtj}ku zvW+wK*5jn^4ed(XPd7f0qBG4kip{@&zGGShIxYM6i7nKY8Oe_fRZ^&&cwW(-XIErF0F!02AQBcN46+Po@_Rg?$V{yZq7zJ&kH`b)n4 zShA|4+4suKgB|WjCZ9Fo4g9=9s?=r))~~2EA7KEZ-oRr%-GGd1B9ool3#ndII}KuL zy67DyiE2JJBTf&r5Bj5u98Z!%PBt1B3QGwD6bDnxc~b1ZV@ZBM{cK9ODIXK}sFcsa z?zB|d(`XL2x`yYuzKVI%@^Eu*u8HD6-fyfm5W0mphZIiE@P-oLRKPr~3^(Ro??AOF zygVf-F}~dv`t4`-v0%07<-|R1fHMsam%;{ZVj-GA8o|_blmC%lDeczS6jttB{_s}%DuHG0rEDh3wpz_n!;+() zYSV?$Xd9fhX~Sr!YwWzY>k6>-1mV+(^FDX1oqqPEkF6yx#U zD}=1C#*^RpU1me4jtqI%$L;-awtaZvwjabOJ#dUInB-wJHk{c$ga%zCf_H*)EGR_q0h-5Vt5Ak%*x--y{$%cEPRrz}gwi<6^$EZQln(R`EVjI|--7_o;N8=J z`YYz>TxhoT_jR$UIRCyOYSwtZLr-AMy+aKH=4OB2azK{63bLn>;JUPi&>(d#$da6* z*k)cTdFtk+=PS?9p5;9;XHJTcwi)K3jIU&AkZ&cR0!ktR)hJJ=s5i}1yvIxST&zMe zTb;c5l7wn3kGaAv19s(lY*%9^zQJ%e{}o!AQrhcwaHlv*fmW*ZzA|azzC(iJZDt*< zowXw(5WF8G_&ao;!E)s+SP-zuQMn;wq~a%N^ZNxP=~3g)wmzZ{f$BDP+3ooKvs%z! zT}PW?ar3s#;{cZ}=mgQ!=D~Vnuq5q7HgoPHbAN}G9#J@HS3Tk@{Xj_j+Zn(BoY(+e zOxD?SuI8fpxou3&(px7)61u>&>`mrV_RAM0DhEKT!B0_Zb@=yG%0SpgQ{(7f{1x%-k)H#R;6es2Es z|E}2c&gJ~i8sL(OwHhRSRRU&eTrD@)PG<#w7{Cdo|C1m{B5`>9D5gz>PRVRutaB#L zlsmDqi$AGbq-1R16u#<2;>qF(|0Or(MMpEh^s=oc^X*mRZhoWxW&P2l&;wAYT!L$nON!z_q_0&lB_~3mUt&I3d>ooT4-f!0&(ov09;R-~ zI~MZxZm>XTEu22FCiqBe$gQt>Y864rw;z9*@2_P1nbGBrCfvbGa~2Qi>k_Q?)7hAT zFHQQyw@AB8;GU|!NcL0`_m=wQr^h~h82M>ZhTwF+xQB}Gzl=bBW=l&^@^CRaE$X!? z4#;+!|7Fp<(=~rz`HAw`Fz1`(&u3dNH%or&3XIuKocjo>@N60^OG~47M?@{XRQ&sV z>JVrO5(-w+Tu4m{UA~b+^$5$RBcPN^U8@6hKBwfO1{sf548H791{P6=#o^F#Y;gf= zM#a51o-APAG7l0T{SAGlSYlu98TGvS$oA9}2}b_!@U{qHvMtW#ZRW`i@h>YC6_JHj zeG!$Cm_x~)Q$5;ew;znfeikW?m+sBFT3FBUycdh+r97OSXfY<5u7J(qYmPQwcc zRS>>o;zn#}03?-Jy7!b-65N;8BTR_bIV6Tj0G~I$)eXBHuyX}tZ235-B3>`tP5Y~; zbM~##AC`{G2Tk+a2;K6i$OV3~KesL1sg@o{+&{40-@9}FjyFO=HGCl%{RM;z9Js6; zDDAR*>w4vPL*UegH9&H9&@Qy`^&A>G=5(Pe9%HOw=Y4XR#vh|++2M8 zabKIdy1FE|@0sS(;;3?h2x5QB0w9GHngBZ894mue6if+;u@Ts*|Q+)hD%A9qQW zRmju11kyp_Q|1!PPi(uzFQdX)0x`GROC=X1Qs5e6*iE7#jN+-Pq5@!`shq}0b|gbF zSqKWSV>}@If~Qjwm0;;@Fx@b(Q`~OD$G3w59+zORUc0N;$x{+0QZ`jl_%<6z-+12n zao+qH_O7qis?GIOF!n38iDhf_+sy{phpx>%yi(b2m}~SoO~R?z=dCwikRc*<1`;om z`3H7a=4 zG~naAYYSRkx=WIik4Fbe^4vu#qJc~zw?@gj*rIS}qn6%;&X_F6Pc?}e=q0P_VBDI* z%Xc;VsECo=Rkc&VU2p}3;%9GwX}yt4eD+cH+t>RCZkh!RZ~7R#g9!+n=Z*ViZhSFa z_FwdYOO}ZM2}1V@@bqFoDSNFlBl_9KFRe#QYw-x7{=%zqzPGRK1Aa*Qz73)R;MxZK`fz!rQ?>j>d2@B z%mC8F%^jo!2btFLf~x$x%}(A_R;VDMSWZ3*T;ko1>7!M()?`RolK9aUvDZHtEY`B8 zXQo&kJM%h;b>s}>62V$!uWI;W zl5)Gtqrh7CL3Q_5yjOewe{Yi?{QA6;3p|bU*HBRHYgs*60-7TaHWBD$9J7tu`Z;Unh8*x>Hg>l3VERs|qoj)(im&xiZy# z`G(GBrPl88cB@E(9{JBJK|FmqnjtpY@nsoyHFxV6LfW=EJ6q6)kxDX5#mCdnR>ES3 z1ih>#R@2*rO}NE}3kmne4#_N-l=0edi7oVAo|&_`A<2GoUL-EtSRy8BZs_OS?A&} zJkvXM$LiH*-*IcP7fEH2)~{Ye$6h`qN6TIAM3Gb<^FmI(33DS8O&@HmnW^8@DqW3N zJT!*fJx3^Zy>+KlPUe8 zO}msof|Y=)lPKQ9n86`e-i&`|0(m`RPbJt|S;b9UpFHI{pAQD<=ha@J6&9H@VR`UG zi!BeoQuZ|;g&U)Ehmd5b@jR=1CYh0xDPc_dKSZ5pR1;sc_9qE}BoqTAND&Ox5L$qM z6v5CtQj$;vq<0VyP_g_&mEHuTh|)_a(wib3>C#0IL{RC9fLPHR-*w-0Kg?R^>&ay1 z?AiNyeh;)em&;_v%YwYzLXW8yFnQUsL{adw98P7OLdq7^A$vc+l2Q0AHk)SIpSF64 z1*&1Luk|e;EotDzqA3b3kC0v%&1ACuyO&41Py*%hd_J#B(>emBqHx|KBUqKSRH!Q% zBV`pAX!T@c{j0Qtw*7b7CA(rFwjtZIh838k=467dTjuhg!G@-lYw5ZwS6X6XEY~>X zh^WU$I-mMP?kc#ophfAPM~=)Uu{p)5U`yUDTis;aD7JO2DRa7RWYoS$I;`eejC&xn zOYfod^|+4Bxe1=!6{*CyhmJz2-U(pwyId8_qlz}|LDhBx**B>|ppSnCI~RJ*3v zx3LV`FIh^YuT$8!rZZ^iu8Kxj1`=({n3U^92QA*}jW%T!2{a-X}lt-Sf=2SQOcd5^R)_@F}EP^){un z|DF@y@#+330dKwtz^ZlH&Ik4HDNe_7xv4XA6{d48d#8xR>*TzQ(5ZN@Ez_h+FE4x9 zLxe$-)!73<^i*QX1i6J35$i=Z&RdwP6J!L;q16gPv|KU>3N1`SOcyAidr`;!7Kw&9 zv`R#8&zv}YJU5-udq(eIZH(bZF6_MGX%mIpekm;vm=q{v9oG{6P3CYsMiX2OeZS(Hwv)K~ zH~W{6p-L$spOmK^89^%Uu=wjAtXUe&Zc)=>uy`W&r``MfCkLw-uN7GXyC-DxpOBvp z?OoP2ILq-QiCU&E0hN}wm3l&rSxVo_5&-ct-A%(A1{@z$KC_zDf<8I-UX zjZtSHHmm*l_NJk&#T<5EWazaZew8R>cZOq)gDdL8{tw|<4sC4(n&CZ~Hz}AD9B*n^ zT2#nOCOJi#D&#Vl=-jk9W&FJCLnqr`ui8*0?dFRW3}~9A)7R{%7L?2yV(6@O>^HF_ zA>!`4XoP|@TxB8r3JK37-QfeO?X(+bhy+)^?FXLrxnr$st}q#nX3(>itC{0#)wKU; zF zXF?yU2UQ0R2xBo|EQKjy053}y*Qat2Je#Id9f~#T;`cu_(q@jUAF0tgl>H10O1Cm7 zB%Jirbnt$z?DX$XTJM*%m(xdmRmUGdsI7Wi@DlkIA9=Tszr!jA77kt7O`#pH)hl%V;vBy9H92k4juRS@>Qh<>dqAC3xzT|+diglg z-Nb41oU45;xQXk5*qg5~M$b3|_-WfUz0KH-w?$#}S1Z(jMB6K|H4$H?1=Hx7pr^~s z#(n?Z-Q^$szkz39V9AK#*H(K_qP7j^>MZavf1OCAA5H(1P=cZLHmoyKcw?68c_6wP|V=PsjDA4Z&$9U~}3n z?~@-8b$u+!iYj|^03naH?o6p4qAd_ zLXc*+K2bn^ojM)NyC+u?cHf(Gu10|V%s#JD<1;PyJS{zx7TWC5w}sm4g(^>zQ;8+U zA#mTkapL`G^k`5uZG=q>#O$q5oxJUs9TOWaTTuXJ6xP);%Jw|N&eT7hIhjr{2^oq0 zaA0A1P7v)Ef;0RvBJlDFAK7!WWvUJ#Z1tbXpoM69e8r=rU>Zk;&|f2d=`D>di*mhT z_|>B=hfF*1XGf2?YDcUmo_?IUAb8GOP4hy)@E5pB5SH|%!)LP<>5ld7S&v*Sx3Uq) zJbjJtPrvB#{!~XjXSL2{BL4(mEVN*P^$#NFIXzU}qy641HCnuWbkm&HjJJweWx^-D<8c~37A8$9Bi+|h=UUZe_yrGEQfcXm%hUR6i8Ys( z3^Pd`a5_V;(lle_;<~43X@w##bF4E=|x8Cx5 zm>4bpk&%?aDG|ONY#yAbs%v~(JKR~@+4~Fn3)zCaxpXKS$UOZ7*?Jwur z@yX`O{$H4)tcvPi23cu&1-XmrbTIGH@6EeQor-D05WCf_mRo*83CwNXGsOx3N4ZTd z{TI!mO9yF;j9^A<^JXP$DeriiPCy;+nrAjWYeAvj)sCHWomO4KOq64wVZHkLFK3cxe%_RI^5J0fso#`q|xTgFW6kA~d&={<@jiq$#Xh`AL zNWNk@>+lcpAN8JbEjPUHzTDJ;(6*P?Z?9MaS@@Si%yyLTt>?aYp+e2eC-!zopVD92ghn1y0GA>3+z7bjGz1nts z*|!baZwoBR>0Sl6s+Y|i+EQDl$bpb!2Id|6M^b#OM$meP--niJ;19#AxQ2Gv&b*}3 zQ&bj>m*jDoVm)6>mej*aUSP_~TEJH&w2H zfBw8Py285GUo+ycJRSP(>#wXDzLB`g167w71-?^g3TPcs32j#mT{z86jfY3-HfvL* zaG#^^hlUZdPB*Q&h&ITrF>C9RR8OgA6n2ip#K-d{4d8N@n&`8m4zFU1hF*p*UmB{- z$|@u|`{^PD9sp#`ikjOhlOyBS#xz^SL5MMK@?7e6lgUDs8=wiWCnjq0xF&KzFp$%2 z>Wn75i606CvYOP`>_J~^i>^qjSeBPr#7EeQ?*D)yz0b9Oy56Aq*q?=X8*YObIYDNs zbH+QKzomM%jXRtOIwLFfoR7tows2}PdC~KZSwsHi#DdEp_0bb1F%BD9-tQhzlzaPM z3$B+5Q`*0;6~bkz={4^SF{d22l%jrTijA_B4w1!p#{0Z)r~(uM;NTJQO4iyS^mx2B zvkHstwQKU^im1)k+mi!4!YstXMSKYpVwAB^$OA?f3ElTEib4wZbF`q+-Re>!vte&a za6D6?&14?~$Fx!d25Tj}qj7|Y@Iaq#YD<`;tB_zsk@2~1xmC|pyg!3}IMTJc(HRf6 zvvv0ozB>eMveAYj1#Ds7it@E&>PPP50dU6jTd-^1$UKQrSBbmO%>EFVbm*`}fVOdc z3XGoI@S3-7lm}IVXTj>D%hk5$-pet?)|_!~&m-?d*?k1+Gy9nLG64X_JAwd2w&7Aqt#zETK5L>F+&4mz@8#M7Dib(ZdylyHiN5XPu&aucAxp~ zxBp=CUFVv>2xZF)-y{uJA~2|Y70rpuQER?F?ejvQ7rsG;~OVJfV(d*W}|`&+^FU;5iCm}_>! z*Ns85x75|0Vd7wu#UK`1&QZ`d2Q~{3Qv)E#GoNtJBDnKuflcYAXY6-5lt1WuqQOt| zsu5{-9@oo`A5h=i@T;voKO>`_EN+}TK6%MmKKnGhr+PCd13 z&Fl}>_1vRDk_CyWnnDWfRfZM`WLaGq6REGfWN%5Ttl7EOt5_?8m*xvuMIfP>317%{dAa;oJn?2P3+`&e)lBwO={VU zh{3_$uTXDx)jHo?F*@@rR`2{A*V@!L6Sv$97u665>zuGS7rj_Ab;Ld8*{q_5@|ynk zqdB9NG-Y7kVSf3R-f)%wG)`?TmX(#>gP+O}BU=$lw`xcUaeD$&vDZ`9 zt+IHX>0o`@%>2$J-Iq9%t=;W1ujUMjf?Dum3tg3)(sB+6i_aJ4m9SKm*^D-1QyrLK zPs*&!KYi4j-uDLpEVSc?8vLP*_aWJS4U!2q$?ZY4-12ZUcYSsaGoO0zB*P}%BwVz{ z6M0#0W0MfN>&uTmtB*Ckz7oky^2@4BwREmNS~BL$_D& z>8FXmQ|$_~xZv_`GJw`f6Jk#vFr`P8+!6v;R}{2peG7iJs5tkhEqv|cNSeNjs-(%Y zs<+AhU$?27&LLioVc(4w7rdws0kp`9V=Oy_DyXG%oeL}gci&kaF#>yjwq58GoN|{t zt#w~e-Pe%%qw8=FZ$GjzY!!I=Kkk2WZq*4Bb4PY{Wy_k-&r0WY!gapCH@2z)rMkMR zt=9S8KNLHCZA{r}jva-xtS;b6pu;7wy0Sv?&L|CSB!A+nVZ9ijCnZvRV`-@C8{9x4 zf))KftAce9ZKoZ=o>qonh|ipOj=B5o&y_1}Mfb0te7g9=!i2mePFsxW1N=+xxl1$a zlsoWHcJ-2@l`ou+P6;WJnfkS%KC`^&DlSy&89qHJXXcEV zIf7rQxN?nuGr7dTaAk{tqVVEWbrU{q?kc(b2%JD{W7`%D$y=yOZ#Rmzv?NpLDmxeD ziT4v*+3RF$WdpsNDB-24)KT5ddyFp_p4=1P@ib-be&sC0|5kJ8H#wo3>hSx7{N>9k z_}W+I*o+Qc-?o*>C#TeBLw*4P=YETCDOh>P?>5$hzJtTAr=$}^YiK1>9m_2dq;j%B z(Oyfm;Uy@Mc!55h6R5K1n<(*wcbW~SIXCBsqQX6#xY|mPQM$kfenzcTh~QR*FZL*4?Oimbagj8GwqVkQ=?| z+s$_yzejp@b}g|0x0f$|u7aU^=Lne=bCvW$MvP{HtqfL}4CMr#Cv=i>UBEVVG{JM9 zon9qWp&}%_LIw zxArA?V!rBiT?|JSF%$%wRnleN2$luZ=@b60{S-;vZV#B*AC;=zaOvu|dK>a%_~v4p zE-8&?UPi&pS`zs=Ps0ubjh>aC<=BsTLGt9nXifL>nSo`Dew9x7S^Awvdj_IZ>mcl> zb&J)3yT6vhvgD$1JLI1Az3V$RhFmn76*T45BdA3U65QqpmXaS8bFY^ibZ(EQPi=bq zttAl@Su=Cl2;Sy-TY8;Zk)741q{55Cm6%nM!nR{!qzY1sb`pq~W#)4+v(GvkqYcx{ zpl0&C`wmI_b8Oa^XzbiB8Jot6G#ZLph_(k`_bc*tE`lELgmE+TZ!g4u#vW$%;I2G7 z&RIlCyRR>sJV*r(vLy8G?1rQ6tRI##CMzi^p%C5eA*S5EIk14(s4GWTb7NimokA~c zF*hl499(~6A(dERWgUG-kN!dCRYeXfn`x5z=OdCBmADA?^@x{sQut~Y{P$2@7WBj za&f#rGE#!B3q7F2{hT$q6Tkine2CP{6l>}N0h-IuI`BU4-2zU{%W^u@mwy6T-tK}^ z3fs{#u=Y!99~+t73pN!|20E3rWQT6}R)wJ`yhDugu2c>o9L^CVN00QZ>I|hw=h_60 zdwn7OTMNX$cFMQB&uQ1pSkPk1Fk<`+j3N`W$LI|sH)Z$s5ptH78PQllb|3)HY7R0- zO2nTZq(T{b#Oig~`I(J4oVpDQf~ZiewwR^lf@V5Ax>pPp4#p7JB*v6%)uC_@0vf5m zBo^0VVg=R17uh_(K9|qi&JfbB&<&x*(-i&A2U{d)Ci|%0yn>V3T?*1M(YBaQh7^3` zM}B>9mz!hy*6W7bfcfK+(ZFHXkuk+vYrlH@o|Yv;sB=bz6xQua3~=^ zd%ZLF<3Oyf?5(q99_)%5#Nh=n1i=9z>Q#wMhy5;l!*-TUa8wXn9w>nm;m?e}7ymaM zROQ{jj+3aysa@zSA(MrgYE29I?T8*{uiMxc>~HGqamA)m+`=w?RkzoriM*)Oi*z^3 zZMm!P{)}K zeT8K^8G87-@k&%Lhp{b3br5iA{JjZQvZq9}2gkG@d=I`b#&8*u-I#riO-roupqtn| z6%VaWcD9BN@Ft1rM=fMy*_q;5g$lvUFLV;kE1FC?A_$curyn`jDxtUlU4}S6!F8mD z3|Ql+BC3h0wdlH;g@tC(`MjU4aekf_eyGgtiOL(#eZLG!f)3ayPav+jZMrR%YDM>3 zE?=>?`0cc3|Km03lDyD%IBveX0s@0-qH1dkZN5n%`5Qy|D&D^BOgRLsD<&^FZh&Hr zlswi%Uhks;1^R00+B2`jQrOkg-){Q`_$}>k>P6 z_9O39bup?zKo1dK)&~sRxaFYCCI+~L9hGRs1JW2a@9TBEMcix@9b-$RdEIL%>p5+y zvO>ag868MaR)eyZWdv-N*~G;Rsrs7l=}f;n1QX4S(ZGky0EGT9okO^B#2Ai>DVQF!{IYzbG{slEZca;(Tuc>TiZ=M%*+g z_5maCUDdA~T9oU5XifbQ=W^+RQRxwQ_4$GS_hb;})}hdaSMp;jr}0nvA)$Bbjn!0+ zLhf?^vC{5rk_YZSTrsX0TqR&v)lL7>L>bF9K;Q1E*kAy$9#f$ldBcg3Otgg#5F1;; zU4@}H>ipQao(gg)m_fio@s_FjzO!P6gk_X=uw}P3mzai=qc04dCNAF_+@z(dA<|p0 z-3@5z^NN$wI20S=;cBi)q8cLMQBcfiJ%+(d9}H^J#AB+vk6l?F8E-Ezy5hM7Ib6Hh zl4hY+(L}UU;Mr?e-1Uq{A0HV0wxU?`~z4Sha{#AKH}I8_@nk0CpE}@3lYKluxoCS z7Z^e+%rQ7J=?y3L0ag>v)i@DAx4LMahNERiHOJc$2b|IUI$%BFIHq)C>t&KKxnv&w zehwTNzz}omFq;;-$SpkD}E<~TE z?m4@WCE)6l1V6PmnI8SG`Vqq<_JZlElWS+fZ#}s;do40ecZ~?pNvigic8s^;(|I38 zzRYXS!uGt@r>)-hGa#axbAa|GSAUUc&#VC&4FPft3?TT?xU|fS6$UEmbqAPXu@Ph{nJ@bc%NLTe+&;VsCTK3ceU-|sM`~?`7IgW z)}B@1Pu`yyi#JNY;ut=?J$jtAHu(CI$o}(KI#wyv{pFae&6x7(s(2uvjxV&?#@JF8 z*{lf%2rA6PG#og*MIcU4P&QcK-tcexH)EuryAS~7j|XQ z(Ka*`ktYStlR{)PJCBv>5}IV8y4sq8z@S`PGp`6l7SV|#okw;Q5;0Dq)V%_TByR!l za^EsI4KkrMOG_Yf|BO$G8_Yp>qmt$?Z zQ~?9N1t=VHxWbj)-J^lA9nB=ZXh zAC1|xUFv?BjK47C! z+8ryW)URDAi7W(Z*)n*h*J*=Gtn2oLoT4zXfY(hPUJ-2QLLqfD9DtFD35zt_y;U>3iMD;=%FTD^Ru_VVs8sP zSaa|*<1ze-qKRR8ckhI@2e5Ma&ysUT;720xYUSYLcnOb(B11r@J6Lnx5GZz?z26=% z;Ve=`g8@}u*UX-d(`$%YOVXgT`K+waP_@?UEg$OD<&YL7Amzr!R8-D>gX<(5{Ysn#@8X{PO-W>oKGb-!_ zD<&MQqje^IJ{%^=W6+xw7Y;i!f+z_tiuh0Gs$!3(@5ir(%}4kL#HfhFW8-Aa0Pfs# z&LPk;yxlSJKYm^G(6*HJw{RAjIBJ}|;iRmmjuiN2a;XvbTqhcqC&~nUuKLH`PFW}L zwBUU$wK~<6vAIl3)OAidqycrHwfGF166fPM&#;-O_x*OzFIR9g9?sUG~8RHl7(S z&U^B#(rC#O40LSOK#OMk9i@lpMid#oFlGrKIS#oELEF#<%m za(V>y_O^Xd$kj_!m- zRmVN0P5e3qSSNx(V6z9^LPU?wCW<-UXLN^6t=H%D-+s{5Gl^KIu?~>&TOA?G8$YEv z@_Y3lV|VEwwB@QhVyx#aao+jg|@D?Xo(iHK3Dk3rmPP+Va#yb~n!j~NFdYz`nXV^rCm{xr#=qP1nBUfV8 zaI`&2`lfdkr~|R`RG-V#pvW|=w-5JyQz%D8DpqArtGDkWeKgt)<;XF1KY$S=K3Zp0 zIVVbBwGDY9gy(F4&e3=2S--CwE4hZc8?A65Xw@H0frm`%#`qQFjsJK1B;`wfZ7~ZBz4WobBhW{>hBmfSIrrc*CWcL(+o@J zt*m4@N*|fRqj&O2Gm6m4;`SA<=qqxNR2nJXPT}OhIy7X!>_A)%EMK`JAKvWu?R-F$SF68{fNm-RjqM&rc2l{XrS75Ok3@qU_W=6}Z(iyPW2?HMS0G zIh(4eqWcsQtO^pRLqZF z2YVMVh7W2XdcC|=NLgkB|LI3@6ufs>33^tJUYk0*{^trD=zw(>L&zx`$OV(uN-6^V zfmVA7IMdLiw$NMleoL?*wRei^iFtRPI6U6O5>Q_{kr}^MIC0yjZ1W?2>EwmWW22Cd zmjk0>d_;~c5OHSAr&?GUCv$k*Mm{(X!07*j08*8g{A|3S_o8Hkc~6A~8iY32u?uN1 zfC97nVf^htk+NQCKyPJ?7CMLZ{Y3DGi3lgNFRur37^x%MZJ#&y{(8Lf#Pj9eyI_{5 z5gn9n@A3PK!GwR=_m8V7N^0?V*W-htum4-d6Pv5cHx_Yd$-dOVj#7?O(FIG2q2)oIM=4W_zIw%>AFLEbwaU zDKR-=T|Wxr_ZSpSC^Jldf6)8jKRNd8nPG z9()cwdY)0_kn_&skoBe!V_js@&v==j0q1a#fj(y_$Fp^)W0c>uxyv(+9Bd{^88K3? z4ox4|+*rS$xU>9&u0%ZXeA)D2b)^-w8+36|-cR|)+w&Z67=JR}=Zjq2(jO2a(>D$1 zCCm|g%VI0J>a(4y`=Xp~`w|p6_+k{N>Br&LKbT#LX*oUBV}@`d0_yywe!b_ZKb$Vs zY58~fw)mk7kX7NzbS-#iXQ!3l)vK+3I~HUziJX<+7zceb{U%?=CA-m-e9NY((~mF4 zEmd002q~$2-gz&;&Lc8)wkCFde3%zgc<9;bnsrkpkn_`*pZcS5e?MRC)OzSPkVN*0 z)H^TyWDIuRb>^>WxZvMx<>QR5Z;NBK-(te7aYT^_R@O&V%cD<@{2gzf6U$n$+jF=( z{WSbbqip{4t(nF!vAiDRPthZ=I5RRk2LRL|ytVixi$WzBrn0*Q>6=BaX|uqcwIXgX z#WS+McqJA8Ow+2#BzC$bU>{N#1uSG$`72AmCUrG@93N|7raXf3C`&j>SAV)7y=#BDT=%{1 z?igHF!1cb7xAmovm&QUN1uaaU1@A}mU+1abU5@^FJOAkFo}RI|Ge*5xYVk~xMjb4A z>W$8E*lhjfxz(1QI(0TLBGuo3R^WwQ1zNBt9ByF>8XP?fI$Ng`W{RVQVB1c+G61n^ z;D}o)-$o9RRfW?-Y67ui3?wp%m0ZeYzGcYYqec-<8q@#LJJ*kjH9Ohb!{C){LP4~@r?<_`=%bZFa?U)7xgOwoW1c?myEhxrY1ZA@9OSp7S+%2#Cen!K2Tr)>x2@6%0hfcR7 zEiLUGw+xuhk2f@S_=o_ z@UekQ*uDkL15qY3Y3g*=@%iIL}Kpn%m**Bi} z0nb_H$}|qmmG&?*fBUQt+@dU+Hd*zWR8Vz~q{AC916wt0BoHHyx0OPmiEN9e6NSA_6zWLoZ00FOY(-#`TsJ_3wcS z($G{aB-;fS_~5{K>F3Rr!Q=Hq6}4QHYK_p5hb=UGRvIK}ZnT!)t}RsnkNk&S!(#e#CIJcX>>a1%t=F3O}2V+bvdsq!2sHA9jV_a zp%AQh@z?s`L;acjSCNwIB41WS)a{nE{>a!jf+h8=p>NvGIHC8q##PV^MNZIeUY&mT z&I}qBUioE0uPk0<)Uczo(~X>4$T#Tp9}7tP(!=S<%{WV&wTem-Qp`LzoI=7cOKKqX zztcRbwg{CpT2+;Q8}Cxt;wQ4v%9AUPCwG2DcfazJFtO<8=d$z27%*iSw4^j5F$SB;uYFIfXdc6;+viu0T zsN!$Z->_Lnm2FD4oas4TN8LF4)pd5fp-8`y1pv;&!)9+Xa++k3$!Mksa0RSo-PT2? zV+0IX?{Y~f_LIykS&RCNL&~-$OEBi_8ptw>%&7b{Y=Uv=_4cAM6cv>1IKTq7&Wfh@ zb5t~(OWP2;`e2~I4A_%d$`|JQCEVZ#@e+pUr&R*?5c%|ujIiC6PVk`Z6=gEjISN0d zk(aJ0s$)}o^dLW2@P|?`F)eHV64Pzj=?u5GrRSF;v>GyMd?qSS^B|9n%I@D_ar=gw znEg5|j(!=B(lk)bbX0U(61iSt^l|52qnUr{liiAmM&3D*e8p0)LcgjlG3Y;PTrjUw z0#`kou*c$@gD!o|@o(K>Nc0mG2HLV2B#Vd3BnPXr-E8U`!V9Q6^sq`|x>sy$Zkml{ z1iDHnp2i(h$<;^FW;LJjRq?dQZLxZYe>{0wYM<@dzUMnj>u-rP?*f`-dIr7RPp>sk zGrfjoko|QNU=bw5m}NzS9wINy@$oN5?JI5)zTvyfx58_cRhuQfk zh5%V0Z(QJ^@y9bRvJ?e;1lW3D&9T|GpTwSEn?z>s=O$~QAbJVB?#9MiChR^T*d&}+ zX6CK2?{Pv}NC1>IUSu}NW=uWpYH^u=r#O9r-TUcIwb*oe$F9Xr)qo>hgzinJBD)a^ zVK1sYxksah20@C<+)j|8iRUVZ!~F=0h)=}I+D_|2*5pfKi^f?~?^II)lS>!Dr}}?? zKYGt}3?t~gN1~48{Xn$`^{2#c;+IOIhMg1n1iLw#Ajzpl$BU&OetruS<&_G?&5;&G zflYh!MMWm|ka$Y9wa+Xpp1r>Z)QqWcM2k8R#1s>I*nLq;p|ojTb8|sYiF_`2FW5YyTc52P zY0DK7UG7?R#iFcItf^@(Mqr@HS)oK~eaP{k0xy&v zAED)^N9f48nI?^{#n&d8vvJ{B4<=%{dXFr1)ouXPm%HSd4zAVm?1$<}KTZQNaE-yA zlU!!8T#uHD7mqUQF4)UMJ`3p-J^UP#bd}6OYW12ao8kHZ{I5Lt*Z;|brRcSkoJYrq z$J%mdg_OM7`9r)Uod>LZ;m@1>rF9jVfz_XK8Y+Jw(lXL`=?m(6+m9=Ul$8|cJDw@4 z97)T{;N>o;{AD{B*glY#ClF*6WeIX}GV&^aS^Mx_ z;LVA#c+wgpG2om003n_aIE3yxTC?{&tfd8wHCWpuQ!AE>B8t3i_sZ;@B4B|nE`4|w z{)8fWl52e|Hg;1)T*_;jkdJ}Y_2HX9Qk5Z}I|lhY-l=KsTmRitA?kbbMcRT{3bif( ztUn`a89@Ucof4STS2_vNlEr2mTXwu97M0pBouBgt-mL$I&TZIX_ukE;45Nz4LpT<)GZ>UDMrLZ^X`aR&B89 z#DV|Q>KYLm!gYFNd}v=p0e_5F-rp^=4boTMSH5`veEZ|d`7;*%FHJ5w62u)p_5=sX zQvMa^vvrFsRpLU<_14v2l2dS5_|!GX3#Mf;a<2E+L;=Hdb6yH_P2y7YAZJ0p63wpO zeql?|@Lk2d>y{zP0Z18LCpx0O;%>;~mxlCT+YcFC>vS3334XwHme*on2dQk%IZcwx zt~SuDNW7pC*S}B!mN%TG7sL4c=&X3nnUgiCj$fGo&oRr_&8*W`*~9UTY6a-e4{io_ zjU^DXPv88)m2k=F7Jzox&dm4DJP`tv96y?lD?U$LIr@;L4sB`=cRO+)d(b4-z0fU1 zbssKqcdv`b2r|%J{y&9{nf@Gaamo`bX;-!+XvC?O`Mwhg> zVFTf^b=8_kFUUKkx@d+L23sgs90(+5d)l>b3|R+8SF6J!Jj-qi4MezBR}Vx(KY@f< z1sP0b_V7t>27%H8V0D0-r_5cpNjJ3wRENnBhESuUSwAMYtJ;6;0YCLj4(Owh0aVed zqeLob$Q209qbK0l*?^Tm-F{(>lGohes|)~L`lmB5g(K>V$Fv=Hrb$BPv`Xu`N%OC!JxEF0P|N_(CF<7{a+xn)khYGG$sj$lfL__64AVpS9c7 zv6f#IL0kfeSU7;CQ!q?hUj5t-Uxpx^5DWztU`BBTU9&Tcct#-!NstdE6lQfH_u$6B zDJf0{*LMSD)wyo(297F2TdP}nIqWbfK!H*%*z!&P6``U?t3#EXhAec+Pay1BQ@BHx zJm|R}SFw8yUt3XKOw@pQ1W}FC`n%hzMHEeiMN5oj?gj{1LbesKIo6@iQ~nWwrnjmU z_gjC36<*?(0qpjoQw=_O%S0I;+yb+d;vticB6WCgB(M0D8>Jp$F*HIx+epy!{i=c> z(pxRU<;gz3h>pYb*!;NQDR=jd8B_PPq3QQ@=Iw+5^2FTA->j+&a9L?;jjGads=4RChl z972Fu25s28vgeZIypN;X`l*oM&pMt*uR2c` zPQ8Vs7Jxw&t^jAaX%#}Fg2kM}6Di`Qx>oed_507g)zH5OftwItzl~;&)@FN2%M}PQ zm44sTK_zjd5*D1GxS-StG*On;`seD~=`<|P2}Rn0rY=62KM9Hd4-lfybDQO;vSckY zbhMdVRh>0Hof1V;eYPA!u2DJ|dImT4y7!}0d=KB%G!5d&gcf80yq19ZXM|E(7u-LuLig7>(Hkfj#3 zDMP8qS?NCtG5lC*B9OTA9M!PiArrmJ1T&!%Isknm=12!bn&AX@n9n0a!*QLfJEF|j{w>FJJa$T9hc&ZOhI2)Uv56c) z+w5^HYb~LZ4U(#0dM@gi>;s9x5<2yPEK5PwQ)cP9t9tJa1@5wUj^w`KreSYFc0mCI zz&cFo7Fkr3sluq$4w#P0 zl9@8V=$H6Ql!NNZPlZDRJjnaSY(E^VN6)QA=q#?pii1ZP24gkH0=Dh|`jXGi$UZVRVb5LZ zXBCl4UPs-6il7h>m`$Li%IWy1GS*%U%6iDN*VG^nT%v|g>H&Bd86OgDo)68?6;}># z&7>7*DRpK89S55%FzN#Ep=CJV6kQ1T)KVZ#yZQ5l$YL;!$ zSikiI?xPU>sM$`Vzr3M9M5s?9hQdDE`-VlwP_Tp{oPg54w+&h4W@2? zdox37fV`*JhKpHYu0<=YApM}zvt|?0W%n7g2TLz*Z0^bY%!KpGwUd!ih~MEgzHdrm z5eP^Y*#R%d>IhhKGTxuZd5&6_x}T}`a&@&~*&1j-#@5tK7qP{(hdeUZ*wn;{*EhD8 zx7n>Olyh1?zpWwwJge^a33>+&xKy@w^=GV*U5ehD=?J$jWNo-m5+6P8=h4rT`Bx41 z@CJd>%q4fbK8P+y8#He4Ja5)OrBOwEwub@nXN(yNfZ`UGnJz$&t@?K|QIbMt6RDszKdDsz*6_fdT~u1X4@1qM|0VT?OW++}Ebn^8PVg=WTM zC>TU7#)jgn>L?MKUV*}QAB=|G&*_i2ou_x@1{rjwsB(ZB^i` z>z#>-SQ|?NKpQ+={~*N6ZJ=M%gFuVdF2ba83Eu<>y`B&a>J5~mS5S(@;V8({E+w69a!Rp~X>D-^3Jmn&WCsINN=6~)=P#Q0m3+;Hv2G^Xd zt>OOGw|OlEXf_tSEeEa9*8c-w#&4M`{**llnT=Tv!x?I3$Ys+pl(n*4K23g0x8}0= zV|GM1Yrj0=GsPHKT&eo)yYiTlCnmdpw+isxkhg|(~4TbW!lC{J9-cpB`7%!j5kl$v!OcPx$q=QWO>=KG1zTzMw^M zq#_D?-+|Bld}Q&X*%%y$=09K+fES`@n^hOY&v`d5?Dezi%`lf$fA5D#$Tk$!gSN0x zw1ppzf4YXmo4fG*2R*>C7X+s`tA6jcHI5mIkGG3{>X}B%NN)FELV-#bf<};9@N#x+ zQ*}31yLbSf8v7{K%DQf+bos-Bz+K^u=N<^)>U|^5(hq(0GW|~?Az1AkV}Y9@=gb2p z?-l~1BOFxLy9u3x4;rwkCL+BHmvfBIt?EmLMd2;fUaw__DDlV16Hny!V&XipVWrapOgO?g8abZXxI?5%U; z{~w;dI;^Sp{r_xiG&n}5qmk~C7~Q?mAl;yZs31BTMu>C>(lHw8P(VPs8&N>%G7uF6 zzw`b1UB7efIz0dE+Wj1!bI$$T_bVtK-SqJ?!O@Z9Me#o#r06yJR6DUtN^AE-Th@8>sg)VZG?mzR5@4Ve z(1hZBR{0m-ib|80cPy5?J5V#}oZUDZRV%g_Ezmx{{IN2@?J2*c`jmoejb~eOr8VB= z0vx5P@d=pMMIMw^*;7ZZ)2d61wCKZfx?QPVh*Ta=2Q$rJe}i@ZFCz;*9w( z^zy<#5SEYZx!8u>IHMH3s+>0;t^507~Bhhjrk-g_4)qDz5Y~QNCbfFOw+MuD|NXzLcmd^nx5JA z7L?7VZwY*3k_S$*n@(u0O8ee|`Q%9|28fe?FMfNEt7mh6m0cm$HHgfyWWH!9Bu}#J zlSWUO7-8{2NmeZtj+8#!V!r!u_JcR%jv%5Z6Q_^PLVB2Vd-!OBB7 znv4NKhIGG{00Y-Ol~3jFtcM?T%~U>!8&KR02r40`rO_j!*}#^`J?pWN!Qvo-Ydaz%cKkm*8;J=?N_lyrpnq}TLgk;dIr2>^RuoymCP--JXBRdqNLJMd>V^V zH-2|{yrw(^%AoyR7c&F7;`LF(vk1Kt5;VL zQT|NirzN+P+LWj;I~?|!8iiJvR!0v;LOP|SXw@aT+(|K1-l!ViMUsCWt2U{8Sap`% zqop3-wY697dLPP@)N)-pyH1x3A9dXgI&?}oTpUFF1bv%7f&ugC7_hm1OZr}7;h{+q zR|bmLAVb+e4LuiMS|*RrP)YQ3v?^xyp10;oZ#^UcLYO}&Ce7~MQ%T;F?ha*go!N|d zFXyB(aWMKC?lj+NP?}@fccbn2Mj#sV@2%Ryf7*{u5}!7riWvUio@q^7a9_9S6au z{0k)pMW&v2J0!Fz>zg3IL}-HuGDtab>HdE=|}}fg;Gq+1d_Xe{6wY_nn|Z=4lx&sfOoqSO@f=m z+LZTvxs9u+Kq>E;dogG?8k2u7FyLQ<5>w)cr|Zb*tDpxcy=s|^@%FIRp4`QVLa_Pc z0UE|m^26C<<8(OOw0heI7s6I&nv()Dp^xV|7Ino8gMc8uqg)3hH%x|pAYVex=b>y* z0=A`K6l)HLDUYL4Uyhzccwy7ANf8k8U#}{)xi)%1y@X1k*C%T=M!olps}%p9`R?!* z$_@V^zz5U45Cf!yXy%~!RsY5J??74s_=Xu^PJ zs3-`A8G^~k|G;re9n_Dv03pRTGN}UOP7QEX?*V>27siy4b?4KB_M6!@qxSB?LTQHz zKeBU5o45{M8`mFM4S8yaSfaW*CG)OHrU`k0U?L5)u1y0RhG7ECy{=QV3Q8PSQw!(+ zEV_RviAxqD`OnNTc#6-HA58^@;oH~vWGY-7z^FoiaTL0K&XdM*nhy&LQIt2+i=1?r z-j`(3C?SC-5vuHo@*GS*uXL~QB?0;B+O!v#LJ0-oL}yrpZ7=awv}O)}nPs}=!HHm^ zS{yIz<>b$UKXs%b`j`^!`>0@Hel7qHxGEo$ z&IWe?zhbbZk0g2QA{=ap1?`^)vQ^?al4&GIRt{h|TLP3qGjNM(bmv`iHk1 z!1xVSi#VP%$x+r9qa&e(lB>3@`**#IBhuj-^g^`NLwG&|R-<%p&c+f_J`+QdAc^kD zI4G?Z41L#hVUYJBh%>`l_?MSwP?VOCtt%0tA#uFN!3fIXOs+W$7Ns=bG`19R5vG$I z3Ye}QcnB@}tF|H7--`i}vCm>?v8dMmdM5Rj0YcRQEEn-k-D=mHXyjwWE*Sxp>P^MV zH*m(UXAilFs+>erGXrlxjF!32OvgiWlkKG)#UTn*byi&2j7m*!Aw?sOXdoA&AU^^wjFpLBX%+LM+* z;ed%HJK*EMIW6tNlma^Ux|R^$B;Ek(ca-lND1(=KmGP1GPVz~lVgJQUjKrUiR6mB( zfyUHZ)JRStcsNDSzV>rTJ$Uo4RgZyeLcJkLJzZVZh3aG(+G5aPfY+eaL*y>{h6A^OsonKQ6P<&~u6zy>#|FXzY<#K%JJo10f4d zyimfhD0iyJAaBvDaz*9O)jM3b2TN}`4nhIfIAOuXGm-dojJ^Z_wsp_)zUrD3Uh4b_ zf)|eiC~nbQ8yvsamMMB6*ya`Fd2Z=`&7S0@cS7rN@Km~#i0S!z$G*=AQYde-&wrYw z>zQvlh?hVyw`(CXftvTpZgp9sXARaob8$gUOz3Izx%iupsuGXCi)NXp2~tD}w%LQk zZLa;4B$%qXMrqh9R=z#>o-<>~ZBo8*Mg+iqRPxcN5;sbUm*7R#tR@Gw(NH9}8ZmpX zHJPSeVkN|6!Nbinxuavzwk4eoYx*pK!i0h3?R2DA=H4^{CcEy@2|dKpJ?*6kcxXlG zN@EJ}3s_3^gMsK`HAnVH0&x`vP9ib9mh46(zCh*CS&VxwZTnGVnF6I9kB&Cgoqbi6 z$$hbX340i?3c!H0gPxAC3~K9rs=Yf@u|(-jrI$tH+J8+s!}B9NPe(>!xz*PDzg->@ zTSS{4hJ??5SFLNHP~O1!1bqbiSi9QEJ`g~P&#_R-f?a%DPi9%DjH9I} zA0;34<8|cmT{imDvfN68!9Q0swUuC7@2sx)u0`SCYCk-TZU~QHB{UY2#F~?Cr-`_K zXBJQKPceDvGF!GSG?Yln2gbWKSHzef3hb1hkieidz&yP7J&N-T$6-jvT+Wj_a+G1K zC++0>rVdV(^#)fApuDp#`>Gd(e^Oim6b1O`^?>~1Ighe_^f8Oh$U&5V9JOx+*Q%2fC3>7cmI84sVw z{ZS_MVWxWRQY+sdA4jqIcyqR`FKYUA@gfx-e8wwqPUqzExv6TiN)?klZ@B8wu4>I? zi~nfEa91Bw_C8Bp%cjcIT2Z}C9fa4FuhvPBs?Qp<4l`;)yS?+4a2;HImNj@#;8*<^ zyQ4c9=598bjTANu|kWvtuWE_S|?VT_s|f(TOR5E--k()do~a^P2g7&YJk zSu_pD6NODke06{9N#mJC2FyZ!>h(N-AC{p~_;sr1_?5z`zMnnYGlR)%mR6k|p=iQS z9;50C{BAi!80j_=Va~B~q`m9>!2!}o+KWA1`pQe9Y8O(-h7RkE8~xo1J)#hbW+$Gr zZvvl<9+4xvGu|P}%rbDM{0X@RDtHsIGVl}KC(k@3&?nFAjqAliJV-0dzEx)#v|6~wSJybXc`nbabO z##J5`Yft*%ghhe`#L@YFFDM9%NeReU7_0{MrPgWJ%T23>@MhV-m!^ZDH}j2;Sbms3 zGXrVj;&$(a0#jp8?jvkq%-P3-yhk(-d0Ga{2z+Posy2a8`_FXbqOY3QIKDux)e2uM zM7opS0F>mfZORLT{O=@uPG?($i^*Tl?GzkuJ*i0z9AMj`-MIlE+`z#0CxyNvZWf4Ze^@4861 z%TN4e{reF|^axvZ)9G$Gt|+~ZRq0J_E0gd1RNq4`*?WX3J$-y&48UA)aCN?fiklaT zuv!aYU$`85NrJAjp?xLI_~E}Q;$t}g2+Y)U8^|yg{+E~naS>7+SnG_+OaLLBt6jqh zLnJyS@z9ydn?|H-S8;jXw{6mkvT%%05q4za&NUvuAi-NsrS#Sk`YODPo5Y89uEkAj zHKE7Wr@=kKS7udd!F2^po?=mLoMZ7LRW9OgVoXg%{O=UaXEY|c>Rrl8f=w%V?8dCK zHdA~R9d*vb;3_rkk?|U>^t8bp_AinP>JCoNa=$nlkvVQg8#e`o+0tHeiB#lK{_$P7;ZO)M5bySZqd5M!nfts zstNaesesbG6JXvknyrSakf2GNdE{OPU6fOPJSjL0lQ(-aAys>?6WdvyTtGn@ z1%qoowaOG5xxDDlhz;9>7kPY-E%=#1XOfzZ!_{AVvo>?f3LgkT0X|9qwH}!5Z+?Hu zacITFjOKaY^uK>#LxlA`h8V}A2H&*=!O*ikNt1;FZ;uY<48JwsFaWigQ8$GCcUsR~ zE#?X+YWz2Ub5XC_eY}0dDuQOFJ<5N*l;R1=-*?Iz+WnA5FlwE1(xvWz&7UW*&5&Ds zCiQ<`snJ+4m#4tl7`)41^Cwlq6U@Q6nr##uTuer^Acgg`BgT_`w%z$xL=L^q|JuHz zkVJercQ0z538Ok&7o6w!OxkMY8Iug1=Z+UlWkGCTeZA)cS3+m#>zpI=apOXb|9*zU zD9fQbEwi**%QK|aUtNQ*Ol5Ww*o{=NlX-Ms(^`yz@X z+lRx6>Q4L`PT)}O$C6CJr*_#-WOTH^VHXU5{yMEtkIa3G=CkY0+)nI(6W%6?rjbMQ zX1)Lu46EJG#_v0~L;EwR%)m~HdmxPiuwBXM9;!RiWplQv9u$oNfDMnvTsqM%#jbVp z-17KVd~sl^z*i?z1RfJAcAVDE5mpAa{W#ZsU3cnf|MU>+^*oh?j{v~5U>PdrT|+>YN`F<7E zx2&|C7#Gn)r%BWJ#WHtIVtwD}l6Q|T%sLSq4#>(bvy!WMRHvDC&7J!+E6RVJA-=z< z4feLQ!#ihx^TS_YvVbj(bu#~mOMq;MQ6JFFalpBx+~O|IWmA+lpbqKzwgFqpHGJ!2 zc+B0^DsT!CNUuBcjs*j=a{iCeyvq9<9)gZEkC+;F^CbwWi)BK zcvN`qy1FCprArzZxJ3x;;3bd%OYa5_%~~f>S$<0CIX4Lktu9NUn38oTqkEDXC_pUF zZ?2pVwaSx@2UYreRLdd>JvNzY z`bd|QidTa-Cqp}Lm(g~?O;q@k_Jf#U`UZBv(4Jlmejjy6Sg823r9yc^S{&DAzVmB z9%*&=DS=tmqO(61y$gQ6$orKD(NBXXPXL-d@r&yCN@mVTJ>$-Yb*ZZY>WWmQFWrV+ zaS#yz{|&iQdms8fr9U79m>!Qzm{aY=EzH)5n^HS9mVfj9II%NxlU138gLwYk(T*LK zfM(^c8Lf;9JypekGN4{WiN7hc>3S`yCB!_WoO-&5!Yag-?|M>J=DdSRYz~^E2=%f<)O0+X> z2GNDIO(y?}08^DX(9-u_{( z@qzZ-zQ;6|73VYURH<(?k3cbWR=_+E)sf>QTvpki;x=E>r9H2cW@v^UKBWK3X_24o zai1mLx^qF@tZ1PsL;l;I0>56M)SWk0l_z&HXU|IlYsGuUA73>YcZ@9#AL6~`Q2#H% zYvK!4+_+EGV#-lAU-`--J*%r`RX)nz0i6)s5pM3`!NZ_o zL}~)AByDbFQ<=Kr;JNpbEbUpY`}^94Z`a)v>GTVd?T6(v=+~VKBfoGyJXfvwb?>-k z79ctd_%$mLTc&pg_AoIMo&pTBGf9}mbF1`Ldi0WVI+O=&OvQkOxl zWdCi#pPMW?_T-fBtEThH(;w=8E0Tpn&!!n)``pOi98m;JXc2huJ+lLceoLk*ZB&C{ z#>J`BiaH`aI%&=^S=zJ8eNfAJH5LHPkRd|a}ej)~PvRKP`G`(9GQ z$q^s!(m|AZtL{(4FZQW3Q9>GnBhEh_TXf%uFxr~n20~f3Z29~08ZZYI=CzHCVFj|g zGE5(}h+{vARI`r;b(={V39|bZSgMAg4j>$Ed=tn>6EVyFX`y~RT`i+r2ZjC_GUaFD z+gAJUf!`){{^QbTzqNZhx6WMNU^eU{p1wv|@{H6wRl0V~32oQ+k^GBtO)&S8J}{8p_nS&0xRT*M=sSRM-T<(tu3< z|APxM0Fko8!xgffLE$D=jg_``Aj9Mf~)=0UUH(OARC$&tBvBX z=l!f;gt__cr~eZ^7p{^NOo~XlUrv(}H`)-DGs#b6DgD*%>FSL@<<~!eGV5DsM0+pn zYQKyV2!vf}KS+m;XZ{#$-t}ugu~h=1GI^UH!T9xoG9m$zuLF9O$SRw2cGuI?2?{Gs zu^dpLjIR`4Z#9>W>baj(C5p5FT!2?^O)%rKgd*HWC)lC~Z^3K8DH4iNjmQMn@g^Tp zJ@(d-fbngdLNAwtiI@-_K|A;0HzYI&k+)&V?*3T>O;U@ ztWkQ19pHP$o8&CCq-FVja@BHJx-0${zkx~y<3Vidoae+G6U_e zpiDulI9UZm@nII;@?6r6Ul&l6FAv{{R}SLSQB)^q2P<+PKKQ}mtW<3BX76X_=N4xK zF5w088#3xs|M68qEvGO4OoX% zgf7<*k0VX7N?}|U!y7K7*88Nkg9xZP9}q1r3v2=%X5lfZlx3!4j7-Ua=gRt;iNe2F zluVSb_Y4K8t;>ZP=&fGlo9Pz^73-kp-jzI%q2P0UBa|>6)4sF!7=9lqj21XESSvFKpD(q7G{Z#{{Hro@m{`-7^V~fVdl#h8e9Y>i;?~`Q|Mn3)9bq zEIRDO&kw%hGBoTxb9MF5(QF#ja6-)@GOXHDx)o= zR0WV>%4eF6p~x?hR+3QNcVANYka;uKVO<{ykrnP0$9Tm$K&k5rD{oj7!Ii!KM1!@$ zSOxw#g>;n5o4`S&6goCLlF2iKryZJ4VgUyjh;40I*~m$~eF%k9w!{G6+?-@ht~q zV}#oC)~eDqO zrMZFY&MP5dPcteOoxF{(^=o)rGY>JPz3St;m7Fwuqq8SE?xy?v)hVjBQ~;1zX+6Lf z!LJ)f%f#}G_NIUqb<#4v?7@=~1lCS0oz{>k1B2y0sy1h;Nsd zS!NniM8oh6gzZsj8FJi)fVkp!<=5y!m*qI~asGJOQ zKD~|~=sg*7N(?M{+p#qqXlVW#MDjnlG_slvpGf^rO<5TKmy^KjNO$X8OiW4co1mbO zkdTu6-y7#Y*LOevCH;ANEiR!X|6{+r_(jL+l#qyog6yTRsHmuzoRZAXz0>2b$NN{? zKLllO|0Vf;a=Q6x`U_jvx=&9EI z9`@KG1`vS3?*JS$Xa$BWsl2ItVl<2evMC8={a2EaDGUNgUOrTjT2K{FX|yOA#Vi?y zcD(mbT|rlP;NAov>lxIw=#|`~`{`3p=)OLU7;g^F=b*a9eOaR8?}A)p@qp-H$@h;Z z^*^gtKOKMTWRuDon)>m93%z0`ach$2lIW-Y!v3wM7WG%TJ|xVJg%|fko1QP(q)r@? z)cuv_yZiHnIw@x~^#?IJf-e--K;n;+tE!yDD^Qd&RJwEBR&d5GNGGr~X6AUuDJgS? zdt|0{lNacPONF=vn+@V;hCh%}ar$M2xR9P9J{s!$zV{AJ#RCI8Y$b^2#-!AQq;M|D z#(1h0by_~*#8nj+3o-6+UJUsHX@6;iQ*mm2nq6sjb%Nu`mFLE8#d_4bzwC{>)i2lI z9Ve2^UpKBm%|f3lW-Po=<8AQVxLo<|{B}fQV)D^6+vAA}w!`&`!rz%c{69oQq}@#g z%9LXti|igREBk%_*p{@mE;kW}XXMr2v9~Amda2d`ZM{jx$VC=J5ce``et-VqUh^FN zX{~Y8?F;}pw@*^62mrDWKz+@7^dhO%0*zX>G55m$&(Chr(gc0CUP&(W^UvQQx!3Zq z+zE=#9!u@)>RkaS=P{*#rDdV8YkZpZ0-uQ&Lke0^3k=c6$>b~BcfRjo3M5=^7Kp(~ zwI7GVgB^$!rtIaR1@7)S2{tkZnoe*t!rr*X51F2e{+{)9b;6p9I;l0m=2Q0{=KP>85083iDk5Ajd-uC|nqSGBAM>1kyJB4#4LcUp+6eR?BHtfBB zFy5OA;<(ek2|IaZazA`3{xQr;XDgeim@59DR&&$jC)bT>@2 zsB$@e!m*X088#uSMPJkeCGeFheenfDrJ zn5>4C+@_ZwP%mk0`F+ZGes8dI+y*e zv~WW+17!|`;BXYEm!G2*-iesDjC*0I(PBfI{DQ{L?<7Pv0#LB-uRPJ%tr%mrkpRlt^y25s3_MW%&`dl^(Fwv0W>6h*bdDK zda6bK8dKJz11F?yHG$9J(F6STjlZTSh+VPF16Pb(32?fQjaU2v*N)WpX<+hR34Z& zzFFfJ=%XLjnq-Q$)Sb1V1@~wQlGRP)mdnf#7+U6OSj6%%h?&<&jpEB%_yzB^hv3t! z@@np{eBRH;1(s)H9|AKW`4{$s^YBIO6nQkv3n3JGCI;DX_AesjMr5v9gg; z(|mJNJd`)@V8(Y9<+fT*)&#&{<(gEt_Gb)8O=cx)4at5}hG44ymR7do`X9>ZwwdWX z$I%E)jedH6qmNnErHp|p;&xR8Z$63^ zSYe>0f#IyB@%4pa{%n3yzF|yuuNTJ`l?JL!CZUXbF(NFhU|FyF??&->imgdN7|@+t!g|KK}@$3g)Bn7 z5X{$N!a_?((yuP=!hjGtWZFoKwA`QU)=>o^tWY%k8K^fhib_mhcDD3z;m$A_Wxcn0 zVdz)xVJjbScK6oRI$flmO^}ZZS*Lo@5+V20_8N%@3(+iq1GGU$MaKzPE}%%)K!C_U z;I8g`Nv|S|DIu?2{hRboU#iyxxKqiA0-Me+LbX4inD7|zW*S5P(NO>g_4#72L1M3@ zJ}25l6WU^RY6Bp7h@FU$!ZV~_)6sTlYn3?AuQcz(F->mCT8^rBgmL+?^v7CO)*HMD zD}P^A*?Oz;4)Za1s@h8TJRVmVyF&bxEpFo0RPTmg3(p%BDwt)ULl8X;FE9xsvy{2p5 z?x+DI^De&w{9xeUX52kyUF0zQf6RL&+QH4KfGP+FCHf=(^E=2Wosx%fF2 zmwSgs7O~_4ydM>&MSI%{6x>h0etie}n^gaCC*ix}sak%$gt6R9`7r6n6K2ZUyA^HO z7|-0lyRY874gY@JAa^g-iE{j>oZ+3@_q)l?Kl(nMXXR1u8gY9W!$LW~DFcL_UVZ;K z^{Zau%cdMWxVaf|9pX-S)E?xB`c--e%DPc?8F!&)Hx z9N)S6^2XRKz;4%g{iV+-7iLkbKzt5r5%Lw77vKgvxzC>MF$Q-8pxKE5m>#-UM~lF_ zgkVv@S(MbgS(F`{w9lb30mGEf*tfJek19n%f?!;VvjN;^C1E!tSY``K&lL|Rlztwh zGt|W|rH%)r>8FbK2=>GX2pjp?)Ow?vkUt$e^CZ+K(Wl!VPT!n=$}E5S)SLcO*j1Rq zqQ}LW+?DIolb&6}cd*O!u?nNzDfm>`=xw0ZO(Tu0xhFwMA=&;v}E#IYc+wKM@}*c?T*^4qILD7Bi1& z)lrv@ERqEz=ihZ)&22_~k|d^PxbyifA0OYiT)>BP*U7@nYD}3+EckL2;7OVrji%ui{%y>?Y(sm6rUXM_Ap& zEjV>dE8YO4RI4IH1Jn;u7l?(&6(kJ52Wd0J)gtYw2=%FlNJYssmmR<>vo(@_RPu+1 zu!;AdiGbD?hsau_vOR|rmk;@%57Rfe=b(fqv(cg0*2WB0r{0X3qxPl`lB$Mg3p32Iiq zzEQNctD^G$oQoUO@u9IKC<2+|u7bou?;4Bh8RM=3#44C1$+>=w3Le(RSI%p2yXKFl z$7_F+?p2+rq#?Bw9^1~w3lnOJ789ZqtjRSSyzo+HBTPglE#;|9=1s(ybX~3i09oQ% z$`8MhC_xAy$ZNcM;lme+fsF{CKm6_^*zG~i+r%JT6qH*a9T`cwSACP3#Sa*S6FPq4 zhQM1^nRgtMNmXae4G6F$c5>zV6Qet`Z?MsZ{u|uN7HpOU2UN0gY`Fz@I4+`o=<&0| z(Fi`}P7qKSB;j2#E7#qdU;&p;95*36nfL7Z4v%ljqvK<(hZA;}@r>%HD)Ivj^A{X? z4mpDSl-QIMyyt6Mrd)8?deYVrC{7fw(g2k7>CfC676m3PaH$ekm#9}Vp{Y?dtcdyb z-y*)`R7CoA%Q?`m^Y_E1zYt)^7*v7cbmXmaJsHTc<^KJn4K6*&NvyAc@ox_iZo@Bc z=USEztr)-4DO21~RNp*9}YS!H8oW*MdXOk5+^X z)n042w>;`OUHYoZX+{l1?O!0M%MZiHiH1A!pcoF2L8@jc@zz4H_G+oT0q&1?Jgz+U z@F(>UGpD*9Q+`}>tAP~{SMr{2bFR02D!CF!fa6)m4)@3gbpyw@Uu3}a&6KVt9|pt< zPbO_OKO3$3s2~u*6pSW#I|FNErc=AiV@!j->*R-{SG~(f$OSj5WN6@|;$7IQYo!8J zl^-{+r+e`~5gxa1%=q$LNi*Ez7j>4ZLkSGT1n8GRb~0|1n|X!?<&kEz&aFf5b{415 zD0UimWYcD(YtyT@}&H!u6qt)AJ3}k5Y>3rAJ!V7%O zs!&));QH~0&#siA;Z<78SN{zk{5Q080MV;OjDSdI`dlIHwrGt2$Us9?q}}`hUwP3M z22I|zfbc{2NkY_w3b!1fQi9XXouny9Yu0E>___UPf{jMBA-Wk+{G;FZ0?G3T%daO) z$2L8lTyrM6B0psa>n1Cd1by z8q(6^v+^4okF1vFWFBnFozj3Rvla-x3n^3xNIE>3?0vF1c-sJ-eZRxQ=tF3?mK zea9f^wkrXJIA#eIjOv;HYXNT02Y-0{L_|a*#UZzx#zW~%Rt1N;sH6?4LK=ZI_0de) zWE?)JNcA5R+ilI(x9nccWQH_7OlZWL}ERh;KW4!8={mU!KnKL%i%q%n&t@y zC=WzRyesqmvZOey-BAUWqltma7ODVLgfb?ou^~+|Z-oc**IiHnk=1?2u8Q$)Fi!2c zSGWSZoJ9VFKpl;h@D8UlDABn{G{nhym<=Gde|+s_fsb<4ukhEOg*t4pgRCD!!Iw-r zJU@SuuUPe8eE%Jyvm3LJZp#ZRAPMk#y4N}tvqhLTfh^cvQ0>NH zucPv{%GjT&X9OF&BC;S1=+iI|2Nc+R5OjO?CSqqllPO>+dGn(jtLv`Y%a4;iH-4U) zT?#lF9m_4f==n?Z`rCXR0dPdY^*c#T{>87~7%~5gyBkrTrk+tfL^?)-Cje5QK;Xms z+8IuVWn|sMz&6ci7&n5K{KZI`xNOK|VVZD051Ji9@~;9$mmuZ^@rE`Yc(hp6Iygi) zO0dJz8mQR)Sq69p2AGMVK=vS??)^fuM8P3Re>%tKok`l`l4vNpyz7DMDP!T|x;?WW z-U~%7$GYf0O){^31mr6ze&1J!T|cV&aWy)3C(Y>Tf?%lok;K%m+4k<=jJuP^N-Hm~ zRc1zZ^;ho3ZhhkWjnheO~#yWO}konJ`UW=`-)fbWR=h+^^E6Ce>m^%Pw1afccqOD0~P0Yio~T0Xi3of$%m&8(9e4TGwb261VuQ|D?i zE&4|}W!}T3aYk%fnCooN+tj|n(fL`kk;RR<%cGqD#fqQwdANe=&Wi+nU0L3wgBMZi#oQl;LldL}Qw&Y|gem$@ z2rz){t~Y^C{VUg}D?|W2*}ur~RWa=>YtAxr?$M)9>)DT=zIjU7HI?(d3j*k`RZCZ| zdWM#H(}$%0C{K(cqansHn3Ti-<|D82ecrTq{mp$#kD2HsI}ZJ+0YYsL4xoe3D_24C zVZgnIl>jOODJCWHTy+$IT|ZvGs{8n9yzSt|Q;^D&p_G@d&gu0eDA(NQ~xI9y1W4R-MvUxO~ z#xL*;`sqf>tu%b69>Wo&I)kTIORern`_7ftUS>vzQ7Lz$c8+A>EkRN`W*+x-+aiD_ zyyh1@4#3QxD0WPfLSSF;pue^nnhXTA&n0rgBXN{~f5%CXE-=NEk)5lba!8(zfWO$u zZjrHv*Q2Vc{6z!*^uxr7ffdmnvNBT(9dNby(aXwhxc`PJwX1Qr{nE)0I!SCyT0D_4j zf%!0TVl@uZn0Tw0p4~4akH~@UmovF(9AdVc0+{0gV8Tx>}zW!UU zWft-|V-z{9xCaQ?tm-vU8gE{Kh~}caRfT$nUzdJl>=9Wjr>g~&+nIggMpqUeOb;UW zOc{$L)oFQ#j`&Fg%}w&2d{xxGZD<00inG)GTP**#0!{jiDVe73V)Gs$$u}L)49?Gs z`g67QTbOA#Q^O|>h_#_52tm_MA?vUlKSZCE?+Azk-X|x|Ck;P(w@Infrp4~Ezcemb zsQ}hr;)248Oa7j&+j!P$bmGCXN_cx(Ke~Sgn@7PS?N)*tU?YnVx=OP=U~`De@sp4M~C&#bIgdZe0?1gw#3RPJ=L z9$CE;7Zc`rQndO6mJ!$LUaI;ycT%pFs}&F;WrvZ{H-6gln^zYS{eJ&z3BsT(K*%ob zV{1j_%&X=|b~}UV_h58!{}pI=`QrXf6G#+om0z_EnXv)$f&>mh`OgvwKTnEwgcf$8 z4l0uXwN2rCOkkx#H%#p1#Z6)>8qYKK-o+|Y3e(tROCiY%DF$njFEXht6c>B-634Y5 zVz5yA30M}&v50d zsidBrRb1e+YT(`r0Zsgyz5vHcT|h@+iQv^;NG35#AQViY4&y%1wNgp1tb(SPN9Z{0 zZ1m|j*^WD9jy0~jz(onwMHx6XYthw1cu{mRV*Ue6WeKg>JkOsB4-WcY=j7k4T;LhQ zr&*xVa1sKwl~mW2Y@lfWJAV;QzDOHws$Ev%^m20fCI-g9+41(IZ;HE&$(Ja-PJJ_xA$TK6SG#fy;|g$zo0Mukb8Z)4VeLvo6e;vny$dFZwP~gj>ed`KL!(8 z`J#S_&y~nNoSg2eRFC3+R~gtQ*x+h(hi3DQGj6{*zj&<*)wvM!%RY+^{jY{VG3E_+ zA=_eUH}7K3T;duwSKDIQcO=%2P~?k>l#>`6#M=eYJ}blwx*_Py28!db1TmEqP%6B& zw4}7O(!q3;7%Vr%Pz}8nycU#O?m4S7$5qUcR9vdViwxl0P`L8hliIKeYN<;F+)^v2CKSh|AdeSuEEj1u4S> zQPt|re3T7(;TCExqjmKF#a-39+T;TQuE*9B3=_aX!~w;3P6~oTXbRO*IPK`cO?>cS zg{(jXYq@OpHeOcqbJQogeO6WqL$7|5eSIe6 zS@uGu`dl}NVl#uePeGr7_Cg2Ev)BhVbJz(Xb4r%m^Yy<^9c z22>Nrz*$(C!O-yBnYz(8g_VQ?Zm6I_GhMFLw!GIYgft@YaD`U6Ux*h*7$f$V)ieBh zYsZC+j*4TG$6|F$`-yAoQrBqn&5KMuZuHp97tF-%Jui93A8}lO;J!R<@6=!z?|3lY z_j-@6=(ziuY6B;HQQho{Bv4|;G?%-JZhO2elGCaG`F3NCO$C)qRCv3~hC-Wgz>n2* z6&5mAZatGZ8%$$aoXQ&Guom+~L{$Q~CSIWFoxEXL6dL7){RT8Tpvx~o3m7;E*q}t- zL&)~>q*-NF+lmc!lMvCh(9Js}4uXLuP;C(*15YsoNNR%-lQ=Xh9eRV~2vx}X6_1J* z$7?XIkq};f`tI0{lK1I;X;`=%;0t^P#+C*wSz<3=sh4&xl=6GdZWhp=vZoi-!lKxs zDH~~VA7Lsb7%(J9kp1T^%E|Vpu0U{l~PO*(dEx<4rD} zu-}SDJ7syoco^q2M}8dJo~ND~ub*G_>cmPG18J5~$@Pq(u=#MAU@jAdcil7>Gi=$0#)!0tx z?`pF54HMWZuh%n%sgy1wM82vXX|wssGnFZ$SwI_LzC1u)1_F@2NbC`NwvA1M z+Or6aEovmhti36!w3NmsMy;q(EwN+omQoZ|tF_fCIw{(3wRGW0f4}E?p7Y1axsqJD zGVYvn-=EL>{d!x;U_hX~cwrHqa^s3L7t zV5SI@oZRoj0xY3x46Wl#VMhDj*z(mO9(DRzMHTns!x0@nhB|FY{HM|@?;b=9o0-|O zpG?id?hQmt#3c2g*hx=2Xwt@v!xc-22r7aWA14FD5o}wJs<|rX<$#ur-FkG79e6tfLYo5F_5YBZd=<1* z)5i$q2D&k#zD!l2L4>sq0EjL67dwc`IpFe7@6fkjC}X;;aPC7Jg4bz;;+8dZbr=j?FeVmWf8w{J%_NwP+Pc^yqz z3(%vAlm=_R3R9AW%$E)lxhuA#*^}3sPkgV~D}O-p)qyXrhQcDw@hAoQCqc?mq(^7$ z$+tA77$40o%|`?-9|w6;)yRu3Qg!+UwIua7k*7*Z*cyk9Ow;-f>F_93V57M7k{mRX zXvU#o6%g_55tlMT&g30hO}pd+Zqbo5o1t9s7{xHwCRC4Ckq2Ph%yZZldoK3jR0P=& z3qp(OC})i)w$bZnb2~_j`t=B7FMGOW;nP@EY~#e$ILd|hBCu6t)9yNWTnLJ9)|dZshG|COj&E(Zx|4bcR?Izoe(b5}4v7ybr zOLX@l7F6|cojdkHlAwj^S0%YRDIb%&EN0etk7d? zz?JWbR~;Ngc5*7PFZ|v3v5ADlyn?I?%0>OALHsnXdVzXUgU1L+pphzJKCBa-E`r8) zZQoF_d)`09Ei2RSJQ!(iNN;Np;h@OY+iv$KKV&A0#_8ntYedHzr$5&{fp#|GNuaKy z(9X-BU-3iBY=fht{{u%cMoZ{`&fU#1x2jIEr|umM+f7$ZIqjXC;Fap!D*p}!ry6P~ z=)`(y`e(g4WbRk43GMso=?T^LVp}^bR_Sf@B3F%q7({Z)2Z%-d9un0MWDU9);tbb7E?r|91L8$BvIU@#?3q zk*m`ID&iBzJB%}S5BxM&lNZ3`tf~F<6IXY&dfspQDPX{x{AzLmQs$PF2e81WoV(12o z_mv|R<-}d7ledZ^Vms?Kjq-Q=V8?1IPnGurS1xXepO+d)^ox+Y>4n(s*qH|FyWcGg zsonnswbO08Dxq3J7X>L^KTmUCMAdPx9u#Y=LEmq}5dB-KH|^elM<|L8=nsrt(8k7b zwL_P@4(kufxs4SZg?cx>TQ5&3=4E=f5$$nJ2(T-k?d3pXg#*lyOiUY>sB*Xa z8JX(SR_2?La>-&lh%NkDn?00|9;wmdxkZ~91u*oTg_vR6Y_2cqnr{8>zZb>om!6_O zp_jRNEj8;w?Sq>k+{Y74dGN#TDp9K|s~2aYMqZ0OtwsH3h8tq%ayVyIT(I%izdEy+ z=c=x8QJE`XiUM2$H!?zt;%Eqmt+$k_y})$9$0am|HkG+`cAh>yak%Xgc?f|Oa%~;Q zfnb+aM~M`?hXHp$qk{sYyMaSgM|p8@w_jBF9~GR9J2qK{E2YA=X_?0F-IXRkq2zkz z$V$+_G6*FiXDlYj8>+21BK~#OE<+6=WeiZ^>CD0$(|7cuCvjqwwbHY9Hymc!uKEej z-nl5y!Msp~FqXzpcprn)J8C_D5+2+i5J03+&3o)D4KD@&a~o z=>9m%!0-Tywjla+-9JOV;-b{%wDwuBiecdlFIUK&`MR27oPn)Kovp|UZLdwmB=d*+ z*Ks&u0207Vrd2V_aBp1+jChvpZj~-NGdw)(%6Z{3OsasAm6|Pr$!U+Ss?4e$VtP0C*XuT#>m5h~dfM-fBsywxh3*5ra$btc2hKM|HtAJN3#3Q6L z7nbiz+e?vWWw)j;2k9hz>V4;&@%BGgy3*!O>nz+$D9f=~`n3ip z8m~J@^=eU)o{GskMe? zz4bVAu6Cp%fK}AL$RUvzWz;X7(H?GXzSC6v^!=wCO6v?Puc)XfucmoMzfLY|Y+iaL ztDvNwwxx@pEw!pa!pv0P>MYoNr@xx4R`sWtxIqUuDFXT8!JJ$M&FsZq z6v}>qjYmz|CxXxdW%u>sZJ|3Kzc~L~i4>p`KT_UT1?;yx`3^8wQEePkkUAAgJWqT_ z0!(FH4x48|*GM{q-ud~W_1a*XgF|MxgFzJ5;T(|bcnS3x8SEntGWY;oiza?y#y^rPU6|*YfYeOt zWuppqw6Xw}5C;tK?Nr-f7|P8(eaniysvIgEqxQ=+g@f37jnVhIfoB`SWDNf*7)9=TYK!w3C9DV zXa*!I(n!V+Fjjv{ET6qOKD#cm*XX{8Hw4Om?2xpgbfjw(yozasW=)Q4cQ&C>N|?h} z@a^~)H>p4ZpQ;0&pc>Dtt2=U4det!UD-Y@7INcHoGsbfM4t1<_EBTDOIC()ZLLT z%Geh0S0uQ93o#duz)BnoT?szn3k zO96@G))HO)47%2OCKB}EPI+|s`AoNOaV|i3(8qA@rU0#)`Vg6O1OyjBgoZxzF{M^O zK@l5$Z%1pp*~6yl$+=083yt~5h$jP&cGj|Z`MM=h)%l7*C*)O8yVyv7mD;ZRk&A@MJvt-7#5)d1~FDiJ?Uk}~<>$MkirdcO^)5uCz z(Z3?2!P6590^~TUB)xA|g*2e7$4(=K?cBAUwwZkFRu%dnAS7@gxR6XsCX+c5lUype zqlEROsI6&)0SYOZ3I=!-3D8IJuo+GYAIfkvjx#kl)+=Kcq|hwqJ1h>X^KvXMPHPA> zU9G@WiOi;_((LI=U`E7DFr~rPEeiJ-d2Roux&5 zP!s*`7O)~Ci1s7I-mVMplBSXh5mfJ4zs$y@boIoL$fwCi2Sl~sZGJ)hAZ#SRj+ zj$q&+GJv{Jj3e>E_pEkG-?tGT8w+OSUFtPw-&pkia#7p2JP75s4c!iJ|T{AuAWE6@jnqx4r@Y8Qiy6$ez8Er%<> zpk-;GUu)xuIS4ueiFkfyIZBB41TW32)z+0K62h+mTKp{j5vutzJm~-!a4qC>m#TI% z*yB<0hsbgb;5%1Jp)E{s3D^Z6c>)j;B`yyKE$F39YU0Z=Z5cxLI7QFPqZmE-95?d~ z|9SrzRmq?%znG&9xxug;LRjAmOHB7eneCIu4>?_mD8p5jfU@sOCFe+vS9`(rT5N<@ ziix{@0bo_g{Qbc_&hL`2WIi#vt@)Ahqg*g)^aGh96s=+xLe7H&<>Q@W~vu&1OA-2;rz-SqJedq)Xs`HPI{|LlsR=K z5hiJwHr>sFoR+w7N5=64^l4V>sB`>n(RKF?DtspshUe&d z3~BRv(S{V^x7J7B&PfDK|M`Yf+g7;4R^8@y?MQkLDXqVTB_uk%KHmtwbH)OMZ>h~b z-ygbGc{f^yWD23Rg44KW)-v`;#fd)VmOzugyx7SC}2B$Z2WmmlO1zA>FDksoAi7S-|n6Zvm<)x5^;&MO7|Nl?$q z`diu1-iVWLtG{h_bg5hz*u@U&eJY_T|8t++&Yc_0i+W=L5%asO+aPbd^o zKyk9V-H?k*2~8Bn{cE@zWb)OM0fc}1YZSC0*{^ja17E)wZq+)97fftJPK1d}=#k5* zB_E&+_PlinF2HM|EFnOBL~x+3q41}%GQAg6&$0_ZEOeCmm#C89^zUe?ss{u;jm&Zx zh`E>QJ(`PH0niH*A+5*>FyV1zGLNO7){>ST)xKYcg#aSzg&J8N0(d7|uH(3H;kmD? zWMP^yewRx_Pzf2}bmipz@n}ujNtJ0;3d@Vr=JhwRLAQ&Soi*$Jwunugm8Lp)#*LAv zI2Lb?ClD`j5K`k)R?%fS+kX{17--&ofnJ1~$^utySLCt;;DQ%Mq%7&VF;7Hai9pe} z2lhETseuV7#vxh&wR+E%jRwH{_bf$`1lQM5j(<0!0RGy33sagJEOh1KYNpEbifyds=5L*>u)zvE=3%v5IV1o7;y z2|+SohCrsW_l4}oO0g+yptku^(}Z&M$6CNaiUqqb5A(>%A6HZxSHJDqIU1hv6DI$) zb27;dnOCKb)%McDkiKm$x1Rz41g`-M6oaC?4Y`KyTQ*Q&0F|W&MYm14*N(WSjsWJp zQB-#917B_e^1=Pgs79-FWvh;;(liTSbL2U|9Js*ts!j1g5%XP%Z_@_GsAMFo$;IB0}mz3{N*hzE+9v42mztLsJxhBk_dP}O4C%#dY zRz9LK$$@^@_IT{Tav_=}{gyC~i0HL)e^BUGX#zOVW5WMsTdU)PM_Lm864 zbwwB9%Ox-039jz~JYt2J z>+o)(ZoaVBbnvL=F)JQ8qLkksc84?%=KoX4nK;k%0Fs~xbW!Si4 z8zES(6l|vtmzr^1iIa^Q&{sbh1tS$k#~~-Pg5uPOKA$Pa)@q3jD0_si*A6sKSL$fQ>SI*oxmf#3S24GWOoObqey8r?RbR z%T$&EWGy|VLcIDj-(U1_u*w|PN;h~jy*9gdK@TwB3UKz*OlrP?-lI_#cBc*u0ue$@ zi**-<*7MWdds*~yy3yfjLqqo*tEbXa9Gd}^%2EGj#c;h|$NGD%qc=JiOiuu6Yw-$X z6@{Fr#a_QmrC_@|PYw?Gn6KV9G)=g36=Z%j5)oA0{P|%15@3}|jSheqCsbK98zstw z6wfcT6N?u~hdR4C! zN6X>$HeEBWg~mSgzK`b}KED7@``fMKZ9m<8aWWiwqEo2B;7}BD<&R2lbo`2oQ7)y+ zalys;=|-d49rdh>LCcZdvVH=k9X!x_qcTXp@S$R11nVPvWpfRDmJLLF>T6NT!859T8s_u~wR8>ng*8D?FuQ zW<+S(vW%r&1Z(pqxgg7fxlYLELb)SibUBJlVi3JdVy%0F!eXjG7D9?p=I)P@G4G%Z z4moiP*mwv=RR=|tX_ivZ#uUHa%ty$nQ3a}d6cF03AX$S>2fXzRUG??$TH&5`@atvx z{_3EW^Xt{dRTxL5y?4Lp;mvJ9)>77fJs3STIEjNoHzO_gxx85GJFW+#vVs*cc*ADx zqC!~XY;HXw&2scUYd{=5NCe*nO%SbYn)WjW}ks_I>!p1D^{)^QGZDKhczy1nE-@a-t>t!Oc zvjEPP`b?`nHEr%igO&S8p%4jtsyABFi?hh&ZNLz1km)cYpl1qmA4zdFu)OUKQB@=) z<_9AdHc8T8^!HDQ#%ur%LGo|wK%5rgGzCdC5A!8Q^k6Jt_FDj~D zC1A0Pdhjc)Y_EpFKq}%yqiiBJ{P9h`RJoIvfb+L+VBq?^J=n33SLVuAu+#iLSGSL@ zMrr?pU=nYWOVgrsaW#N{z>1VmlW)K3{oa0wR$P3ejo-wV5$M0Yq5RgFfr~j1{_C&8 z1_?e03mkTmq(hObrPw1H)D(%e|4$Q%B6C{sd&f)r^IA1T(A3hCpkf7BVExUim19z@siZ5Dt;k>!JuCd59+KGomGO~Kd)AvnyC+F@ z1G|MPI-T6?;)<}cOo==}>U5%t+6DXH4bIa^iyNf($F;iGE{{m0)&}AP|bHvMf zVM0NCe?b5WzN;SN@w8H+_3Z54qKkK$;jCRfF@_7vWmk610m;vE0nxlt%OF{67l zBP0MEx!uWpc;Wd|-A^@dKVCdr|8M`#!!I(&7H%hhp{LJYFdR_nZy}zbSjW?frPP0- zO?$qzg0oL5zZr;BEoYOq8J-@^l9-L2>;(N6Tn03)7(=Ts|~nB5%>TW0W^1= z5R+RxV_Bl`BLs*<<=W~qL7~Fn*PFF*CLBpWBAhfXUtK|+1#X_`a6HHiK(Kv`ZjVd3 zWO1~Gjoi5y(k5`UbH>{{eQ@dxSe!%^zxXw|6sKzw*k1%WqIIZPe46rJH+JB~?d(XF zJw=)pkc-SI-Q#3ws%*3I=Y=$laL`Br_@M(DY6S=XUKUlN>XHqz8UJ19ZDqX{T<00_ zHZ4WA;x}f=l`pD8%p2&9Q@Jy%zRSH@rQ4&7VEL&}u*x%^haf(f96>HeaM^i1o4>CO z&(u;{dbB)Z;%y-r{pq&0q?_ii4US&5vyk<58)?3*qZl2z>GK{Izc{$+> zE?#+m?DIgf#<-YL+^T!Rwp{Fy$D=QHC#*KPm8Aak^Yi$Yj)#1!7JLcd5qI$GL@=M_i#5NT_wjhJ zK5h24FZ>G=k%X8sk11<0&wk3S>QZ?~wiNHfiOVOdGk2@S z_z0628ecxsG7#3M`*6zE=d(>~43G+jQ{T2F3y6oO5aGLy%uK!dp7*1?#o3A4mKN<= z0u;MiuT~$_*%w8HoR0V8NE^g~At)*sE*Wmm{d&EmUhnVD+SR9{94?M;H*zj@Ow*ft zO$0_;y_Sv4(gxV80Z^d@E&e7{HBUfVl%(YIVC`D8 z`9J1Qs2T37U7N})UC^2fgbyNg1Ty2NBm}o;2c~}Cgw%B`%Y@q*W(%sxLG0cX_V>F% zw(*^-nB|tuUFo}ZZ#TWM>=CSPJ!S5{uH`bu+x1r7eIyaaPIP&OqVa+VeS`-?R`HZhJk}JuGUG?0D;E|| zH^wpM!6~y;yyZ^%58;4*QdNujL75WvtG^@6U8B^if4^^>>nK zEqn+^@#GLiwbIBWVpIQ->zcW5whWkwO=fI=^2=AWKbb*ZQesUk)fn$!T3OrP@@kWQ z>Gt|aonlE=SG9_8eLQ(3PLl8Eri+|E&ocE7|LIY)HFiY`9PZ~g7tRU5=j|QpsrGC) zpQ=B&WroMwx`13O*piFTkmEq@w+=nB;AcOVC;YAwC5)6oc=Ttn8W~5}0LVA7Cy5ci zj=o6tu>nnZfToOb4Cp;yNc|Q>&S9*rS2aK!)`5BhUNWgz2 zN_2(TdTHeIi?X@5RgGhF^J%R8oS&GGSv`VC402~=c9_xsX;UzJkuPkH8f1%~FQmG% zgS!pqc9i4tsq)RUW(s9>zcIFNeY9l$_leGGm-2*!*?OScUf#ygvg8TKH|r%B1+ttp zH&4W>?5I}SEOCDMZE)EU!?yHAGDA%Q^-L<$f}<2$HIO)*vs+O4&#%py&Xs01FT-$Y zIR53Zh`~0;4^uFkuD_!7y3}P14?hkdOhDvcgz1Fjjf7=Artn>dFG|^F;H~PHsnsd9 zh2TPWfiiNfMUDVxpGaqv0i$$&c(gK!krVGGBFqD4Dq?#br=yR7Uy6D4{VO6RC3f)) zjCN`hx28_n7=l(hv{$P2t7bQLOv+(JvEtm8CQ&yW^w?tP!+xZGN}S`~MRtF?(i3$g z)c7tI&&2t|Dkc(s`~&~W8p5fw2k)d>jLVlFL-*g)>auY^5`R~<0!kX{ zyUBMmd6s?VIyd`|gIg}Pda3OTqL;qqf?ZbEkq(sx6^uDuT9Q>=e;g+|{ISw=5n;-9 z)RLoYobe_*0lLVN%@0)*c^@_zhNGT5J6Glh{-@lCqm~<07~SWacrHWPIUzF3!^-(o z>2Ihq3knMx6P00R7VxwWHuD-$RP-f5#lox=D}`IULa+tz;ZEBF^AI-}qAnafAVI$} z?99&(7zHam2eQf3vck%OY7Ym*1OOVCpqr1FfS0#sj#g}*g!#R>Az1bi_U#brjhTY@ zG9E5ZrlV33-Y(}3p9;91#+?U|U3$VxSGVV)r_;wza>3p)x7_NK27-ze&x#-6-E41e zjX2Ko@Unq*R!?g1Z!tM4j)H@M#}|CeM7UaV9w+zfVOSVII~zd6{Em|d4nnOuQnwJS zWqov9dS~IiX6U`ccud*B5CXOSHG7 z9P=tK?tVV{7&Cd}%d?oClbtTNhnfSgZ@b1^5@M}cZ2h9ETH>6t=5ygFn)O-oGaZ_b z_jjw+A6{pj47x*GxcW=*u;@dy^##=;Xi9U;w^x6F+qboOBpK4z=E_S3UGC-=`ABt{ z`bKTFtqd$e;506)C%R!7qN#<}mxGSa#uVfr>^6!{enlPjb`pwl(I9Q59Vu(>e^+#> z=epJv-x$B+ifeI2Ww>X6I^(6?Me7qlc=M38>_rBu+GIB9!jCpi@= zu3+-teVRXiK>h7SeNSKBZ=i|pKki;AfZXRll5d&R)G&fNVo3R(Z{UvAJh&@x+i-`QteO2P&RCmm$FJFIs)qbh* zG4OY!dQoZP-t^Twxf_4K-P08?5{#Z?6SA19{_y#8z4xapHHunVaUUippE9a`Z+^bv z@vd3ySBIL?4aUQD)h_Yct2i8al6RTlmHzCJrR3$)Ll4l(+1Z&cuP+y2+U z<>a?-!7ZSF`}^E*ns5)Z>C)a-@sHEpwOs7%IegY2n8&eo;0D8IIo7Mrg&f5{Ij0B#3JnkSz%o(tzcZLG^obQ!<`u+I2$6C(`wD7sh z)PB5nPf&$vdDz!#)4O*x^6x0Fuma&9l^70t4vP|Rbz7W+#wX^3z-8`@WvZCD3X`^v zpCdc>ah()f_N?rH14+uJV>CnH4%3)ujusfXZ^#I*abi z;fWh?@dHc#LfF=IEuh#;XZ%aPRf7cW{je8Cze*K}3&W{%7XVa{rvXQ0!!S!)m&R^t zA@_Ce_uQi~J+y)T!k zpg?pRfgA63MC+Msk98cFil<60#dzKr+|@A(80@3TkjN`B&(egtH)a1b^|@-Q7e}Zx zs@9hSp`opztqf%AR4&?9?H(3V@ZDf6f)rdsJzsLcgKAi6&tQBEH(iSH>@qt_wfR6N zd9{NP%fIWTa8}O_6C}_AWO;h8f-DdCkBf0u^+9u^gMLy%_CapfUG(nlyEWh4Ahq(c zmMPg{2_v=al>0ZkCmH^c%4l`h1m4FC#5V?})KPMFy(^`TPyUs;3`wt&z1~(=e zF?6F5A6~jLU#{t^WQCWbCn&_dblUH^r8~fJje-E9E$JMFmZLS+4|2FipnW0re zaL9Y)2MVKb83+sz1+1{R1-y)PJ#Ml}&*xRqCuPk{tjNqOi!G@ej*H<@AHjSYQReo)OU^~#e7N3aC&PPS#S;&r-z@xaKYk**Tuv;{?jAA zErzLH)qe3zfQuHMZxWh1>%>#fM!vm?zlM{ur;CW$igLbNa1yH~dSaI8bnhlA zbz}HqIMDK=ZT2uJb>kUx3zMf+b4xJtBjezhoK#0gVE!;ogfKQ@%g-mySAyz(qvo{I z?nE{^FO6)_4L}(IDs;clzF69td)w5S6cgd&n75oVqQC7ATU9| z04fs@IJA(%agS@My=-&|xIbKVEE_lCSerB23c?219kMho+OhmSU;ua$sA;3(glVj3 z2SsFh?NZ9SS=q;>y+h8U?+13KZyD2K1D58(mR5drw$cG9dLZV3?@+!x)yw51BE4*5 zK~$C2O9E_5M8EQ};>VBQG1Bw`=6-*fK2|HACSAWkK<080k|8L6?nG)=$F$~f+aTiF zwN+c$mEi71{R~G=%b?Z$2hk427B!q6Z+2y{0Sz}D8e6w_1OX1~Fu>OmD3!PSpvu8`*bX`dao`|H=P_M(C)xL z3H#h3JIot)j+yd%J`~6RYCH9 zw&sbxsLfX*sl!GLVy|uAt}sCAvr2O|Rg6y><-gVtCs=f4t!t&~ENA^lalS{xf9^a9 z@YDEcQ^KIclqR6-{Vg9iKQ4{AwjcL5B7S*aEv(=>-J4jkthmB%4WqAZ?ss4S zF31sckJ{FT0uPv6jD(B@zQ>QHg$;gArO`{UfN6Z|r65F-ASLY;Y9*M0>!fy~MsN`X zDT1#c5>hdVh4TNwJ_COhw}#V|A9rQ&MLu8KJnjc59ZpWdin zz*z^8h_%(&yVXHv93oab5?01wv?oJSRY|U)wJb#E(A3%w+ii2N!%w+6zVNZJsCD?P ze&o*dSJxvqv#5{+x_+ySEvLH&)1*t-syu?C)zLt@A0+;GWA(gV${6(J=G9cJ06QCqQ$!RbM=jpr3wHwpP!O^?bUVxZPE8BcGi3;HZnQr*6|WIV!URb&(#4P@H!#hg}KABYiUx zJI4{3mxBLGe<4-K6tD5kKT6UxBSl$lKJLUJ_vBa-bF+&PSPPv}l_gI|{Q*rMWDQJw zVF6~vd1Ax&L^`B`m+YNF{#QX(;lU>N1U z`cK&DSv~?0mJ$=m`C`Cq9FsEXs3R1VZoN=vI94+|Jnr1gz%$>UY<(y!hEEiOFq)O9 zYGNv-NemYmEdMj6mqeXccxkBcEy`wLXqQU*%%lr2Ph%D=$D7;A05MZWmd42rrpLP! z0$U>JRbsgiqA}*&O@7p9$mQL57TBAXKR>JOpT+%lrZYdh@z(P|AE@=8RVG!}`xr54 zNGzfPm1k0c)B3&)`BKkkV2#hsM~Xw?xin1g8a{?Edgpm5$k=(gjdel^g^8^*aC&_s zE@O*Abqj)3#<|Q+AV)>B>)=+S@weOU!&Ws{G9|N*ATWml?eud7K)rM+~}&MHeH1h3iT3;n`2W z17BceZ-3KxKi8A*&hB~8e_*UuTV2M59{f*)LohS*u0a1EZO$oWgI`GoN%vikqa}*{ zh~Jpf88rsyXgYvMT>|Yy+kG#Ed)F20#FFWt%+ET~7Q#^m@*`a4C3VSV$rP%tl~kCV zMxQD@md1%M0F@ITm{eJda7$jyk=(FjK}|flZ>KKvcc}0F(i|J}r=pRN$4ZR9km|kW z_s~}{?(9%l@nQn|j)-OSUD3Nep1~IA%{2DWmpZ+(k)#(5XboWZL@+X= zpsVS%mKgH;n2%IT?)lW!4?lNK4HHEIYi6Qrl@@+>&%9*&@hWY@0Gds914FISjOW*9 zA;3m&pK_re5!0e?G5`M$!`Jz;JH^Dt?$H3|S`(AWh3$B1-!D**OJ2ylM3XW?rY&>F zEu?n3Tf(UEis3`ZWDz~av~0zoyB3|e6-I6$6DK~VxOwUP=a#tgIfR=AJ*?VmLP@JL zROX@Rvpk6h!N>tA`7Xw%wOkAeHBktW95GnIWwB=T&uv0n4k1rH`@~@!uwFp~M1J8z`g(U>q58T5_dDs4CTYUdU&-aC67ij7J2j~{)9|8}Ifak#;sy{IhDJ3w>ia%SL|DOrIw9f%EepZN7i>n_m>pNhQNKq#X&v=(2UALg`)Xv&MW1AP< zvLfmvfl7nYpy#1nJ+3K!YttF6~$`#HJ2?jqBpE1Nay|BS4{ zb>h#vYn7zJjQnbnZDmU=_o#_c|!6$(jrd8DI|+ zWO+!^XH)a9hA6*ZIhQM=tTTKB1#+#+ONjOOk7bIK#9fI!r_Jy8^(Mz&_I!o^W&IG` zetpbo$&Lim%-CYafN}@c+tzApqh3 z%Yo&o3#|EI^#>ehOlQm=&Ojf(p8?gWtXfJjTMnS?WQ!oRg0-`UIj~Fq-h5+*8%`43< zX>!sl#N6!Nt=Q3Z13ZSRqiAXj!?MX}?l}gHQN=N0rf84*-6v(LS{`^n274;5-dt*;Se$tcC>*$+cPYC^v-nm-iOqsjV~&}B9GsaMfEO}w z6P^z~5p&+vB|BxE-mM{+N%5$=}*9>L`_$I#d9iiIao26Dd`|`|%s+j*BA@ zDy~5|3GInt&*d7BD9mdg41C|<-c&f!Mvv!K7%ih0v4zz0dCU{zr`$T9d6-yWn(S&;a~C&0L6sdVF!mN=Ri za-$0m|2x1<$fqqvE!6Mf`qC$~{rRpsJ^izN4dcUhgNru6eiIdLVBag@BjPYsqg8Cc-ju-|& zf`*^u>D`J<=cYp7@D1GP1qyr(GZNqhHUSTd30%0qizW+m3}x98KM1UYWJSXqNO7$O zey)~AJ$u>ekbASGy=Cr-96W7yTAm6ZXt^;=5g_cb?(-_><&J_}#Vw$28Q3`!VGhR} zs(bWBj;yHo5L~6vFfCh^fB__2-;WQ>y5x^NVJj%LT%&vWBmY`YBhxv!GLIZiq&#kq ziN56zCzPN_0d3n^FO~cH@c!5KFh)*8Qnb?LEZp((mNjC~xFv!Rm=%?WTs$N+t zK~`gHjCQNHBmG5%DRUzP{j(;)e(f9am6(8U(zR|i8!AG@QYfJ3s`chK!+eC5pzzvrayfxKLdeNA24i8ClRhyT$W7@{KXCDiW#K-c(*OSo2% za_s=(IC^H^)4B|Nb)k5SNVZIqB9blEQ;}%;mhVHCip}Njb59tIb1O066BG=&TMZ#9 zwPgHd;H>X$0kGGhB+gXRdEKOLFa9ypZs$zuqAFo?I z_q=IH4KNBE3>Ulh)GyE5S9V*k7O1KO0oacQ>XeW5ha%?|qS;XN`UJ40G{_D6y&6pN z#iqNuPi)Fm=>ER(LRez&#%E0maOw55<)F^e5jN?(m7^d-JeUVeP+7$1v=*Sno-PxO z^9&PxO|BMmiv+aI=|lejFfI-epgQ06?n2!VuQWn_i=h9*U68pI zWms!={IbOm4JzHs&jl;5@~8Bd>~~Zq9z#-Vk-!b{SBR7fZfk#Cg=hXIzJqfcW|uCo z|Fuvzk=(i+^NHq?Bh9^AU9@tCAjPD7uq6rQKiLu0h{&tnQKp8u1f@IXeL0EfM|DMD zC%(jR6t!Qw@hvMR2K?95izn@B-DLdjRd{7SWWc?f;@7^~gE3k4qse0(D*LUwo1Sv- W@i%jWodV0&D?|hm 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 literal 0 HcmV?d00001 diff --git a/examples/gdx-lml-uedi-tests/assets/style/styles.lss b/examples/gdx-lml-uedi-tests/assets/style/styles.lss new file mode 100644 index 00000000..9d68217e --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/style/styles.lss @@ -0,0 +1,21 @@ +window { + onecolumn: true; + titlealign: center; + defaultpad: 1; +} + +dialog, .window { + style: dialog; +} + +label { + textalign: center; +} + +slider { + growx: true; +} + +progressbar, .slider { + animateduration: 0.3; +} diff --git a/examples/gdx-lml-uedi-tests/assets/view/assets.lml b/examples/gdx-lml-uedi-tests/assets/view/assets.lml new file mode 100644 index 00000000..322a61a0 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/view/assets.lml @@ -0,0 +1,3 @@ + + @back +
\ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/assets/view/first.lml b/examples/gdx-lml-uedi-tests/assets/view/first.lml deleted file mode 100644 index ad98c44e..00000000 --- a/examples/gdx-lml-uedi-tests/assets/view/first.lml +++ /dev/null @@ -1,5 +0,0 @@ - - - This is a simple LU view constructed with LML. - Click me! - \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/assets/view/loading.lml b/examples/gdx-lml-uedi-tests/assets/view/loading.lml new file mode 100644 index 00000000..8f1dba22 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/view/loading.lml @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/gdx-lml-uedi-tests/assets/view/locale.lml b/examples/gdx-lml-uedi-tests/assets/view/locale.lml new file mode 100644 index 00000000..86ae56ae --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/view/locale.lml @@ -0,0 +1,12 @@ + + <:for locale="en;pl"> + + <:if test="{locale} != $getLocale"> + + @{locale} + + + @back + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/assets/view/menu.lml b/examples/gdx-lml-uedi-tests/assets/view/menu.lml new file mode 100644 index 00000000..66dc81ab --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/view/menu.lml @@ -0,0 +1,10 @@ + + + + <:for view="assets;locale;music;refresh"> + @{view} + +
+ + @exit +
diff --git a/examples/gdx-lml-uedi-tests/assets/view/music.lml b/examples/gdx-lml-uedi-tests/assets/view/music.lml new file mode 100644 index 00000000..07e7dad1 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/view/music.lml @@ -0,0 +1,13 @@ + + + + + @musicOn + + + + @soundOn + + + @back + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/assets/view/refresh.lml b/examples/gdx-lml-uedi-tests/assets/view/refresh.lml new file mode 100644 index 00000000..f9dabcef --- /dev/null +++ b/examples/gdx-lml-uedi-tests/assets/view/refresh.lml @@ -0,0 +1,9 @@ + + <:random key="size" value="[300,400]" /> + + + + + + @back + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml index 1bd36c51..75f847dd 100644 --- a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.gwt.xml @@ -2,5 +2,6 @@ - + + \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java index 80dbd038..0d13cb11 100644 --- a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/Root.java @@ -1,42 +1,9 @@ package com.github.czyzby.tests; -import java.lang.reflect.Member; - -import com.badlogic.gdx.scenes.scene2d.ui.TextButton; -import com.github.czyzby.lml.annotation.LmlAction; -import com.github.czyzby.lml.parser.LmlParser; -import com.github.czyzby.lml.uedi.views.View; -import com.github.czyzby.lml.vis.util.VisLml; -import com.github.czyzby.uedi.stereotype.Provider; - -/** The first application's view. See first.lml file for widgets layout. */ -public class Root extends View implements Provider { +/** Application's scanning root. + * + * @author MJ */ +public class Root { /** Default application size. */ public static final int WIDTH = 640, HEIGHT = 480; - - @Override - public String getViewId() { - return "first"; - } - @Override - public boolean isFirst() { - return true; - } - - // This class implements Provider interface to customize LmlParser used to create the view. - @Override - public Class getType() { - return LmlParser.class; - } - @Override - public LmlParser provide(final Object target, final Member member) { - return VisLml.parser().build(); - } - - /** Since this method is annotated with LmlAction, it will be available in the LML template: first.lml. - * @param button its text will be changed. */ - @LmlAction("setClicked") - public void changeButtonText(final TextButton button) { - button.setText("Clicked."); - } } \ No newline at end of file diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/service/ParserFactory.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/service/ParserFactory.java new file mode 100644 index 00000000..8146d2da --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/service/ParserFactory.java @@ -0,0 +1,21 @@ +package com.github.czyzby.tests.service; + +import com.badlogic.gdx.utils.I18NBundle; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.vis.util.VisLml; +import com.github.czyzby.uedi.stereotype.Factory; +import com.kotcrab.vis.ui.VisUI; +import com.kotcrab.vis.ui.VisUI.SkinScale; + +/** Invoked each time a {@link LmlParser} instance is requested. + * + * @author MJ */ +public class ParserFactory implements Factory { + private I18NBundle nls; // i18n/nls.properties + + /** @return a new instance of {@link LmlParser}. */ + public LmlParser getParser() { + VisUI.load(SkinScale.X2); + return VisLml.parser().i18nBundle(nls).stylesPath("style/styles.lss").build(); + } +} diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/LoadingController.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/LoadingController.java new file mode 100644 index 00000000..6fcc7ad3 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/LoadingController.java @@ -0,0 +1,32 @@ +package com.github.czyzby.tests.view; + +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.scenes.scene2d.ui.ProgressBar; +import com.github.czyzby.lml.annotation.LmlActor; +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.uedi.stereotype.Singleton; + +/** Updates {@link AssetManager} until all assets are loaded. + * + * @author MJ */ +public class LoadingController extends View implements Singleton { + @LmlActor("menu") ProgressBar progressBar; + private AssetManager assetManager; + + @Override + public String getViewId() { + return "loading"; + } + + @Override + public boolean isFirst() { + return true; + } + + @Override + public void render(final float delta) { + assetManager.update(); + progressBar.setValue(assetManager.getProgress()); + super.render(delta); + } +} diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/MenuController.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/MenuController.java new file mode 100644 index 00000000..09c8c7c7 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/MenuController.java @@ -0,0 +1,14 @@ +package com.github.czyzby.tests.view; + +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.uedi.stereotype.Singleton; + +/** Allows to go through application's example screens. + * + * @author MJ */ +public class MenuController extends View implements Singleton { + @Override + public String getViewId() { + return "menu"; + } +} diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/AssetsController.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/AssetsController.java new file mode 100644 index 00000000..87858f88 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/AssetsController.java @@ -0,0 +1,63 @@ +package com.github.czyzby.tests.view.example; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.viewport.FitViewport; +import com.badlogic.gdx.utils.viewport.Viewport; +import com.github.czyzby.lml.uedi.assets.Loaded; +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.tests.Root; +import com.github.czyzby.uedi.stereotype.Singleton; + +/** Shows asset usage. + * + * @author MJ */ +public class AssetsController extends View implements Loaded, Singleton { + // Will be injected: + private Batch batch; + // Will be automatically loaded: + private Texture badlogic; // image/badlogic.png + private TextureAtlas logo; // atlas/logo.atlas + // "transient" variables are not injected: + transient Sprite logoSprite; + // Non-null variables are not injected: + private final Viewport gameViewport = new FitViewport(Root.WIDTH, Root.HEIGHT); + + @Override + public String getViewId() { + return "assets"; + } + + @Override + public void onLoad(final String path, final Class type, final Object asset) { + // This class implements "Loaded" interface with "onLoad" method: this method is called every time a requested + // assets is loaded and injected into the class. In the example below, a Sprite instance is created with a + // texture atlas region as soon as the atlas is loaded. + if (asset == logo) { + logoSprite = new Sprite(logo.findRegion("logo")); + logoSprite.setX((int) (-logoSprite.getWidth() / 2)); + logoSprite.setY((int) -logoSprite.getHeight() * 2); + } + } + + @Override + public void resize(final int width, final int height, final boolean centerCamera) { + gameViewport.update(width, height); + super.resize(width, height, centerCamera); + } + + @Override + public void render(final float delta) { + // A prove of concept: regular assets can be used along with a Scene2D Stage. + final float alpha = getStage().getRoot().getColor().a; + batch.begin(); + batch.setColor(1f, 1f, 1f, alpha); + batch.setProjectionMatrix(gameViewport.getCamera().combined); + logoSprite.draw(batch, alpha); + batch.draw(badlogic, -badlogic.getWidth() / 2, 0); + batch.end(); + super.render(delta); + } +} diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/LocaleController.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/LocaleController.java new file mode 100644 index 00000000..ac020870 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/LocaleController.java @@ -0,0 +1,14 @@ +package com.github.czyzby.tests.view.example; + +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.uedi.stereotype.Singleton; + +/** Allows to change application's locale. + * + * @author MJ */ +public class LocaleController extends View implements Singleton { + @Override + public String getViewId() { + return "locale"; + } +} diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/MusicController.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/MusicController.java new file mode 100644 index 00000000..f2597120 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/MusicController.java @@ -0,0 +1,44 @@ +package com.github.czyzby.tests.view.example; + +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.audio.Sound; +import com.github.czyzby.lml.annotation.LmlAction; +import com.github.czyzby.lml.uedi.music.MusicService; +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.uedi.stereotype.Singleton; + +/** Plays music theme in the background. Allows to play sounds. + * + * @author MJ */ +public class MusicController extends View implements Singleton { + // Will be injected: + private MusicService musicService; + // Will be automatically loaded: + private Music theme; // music/theme.ogg + private Sound sound; // sound/sound.ogg + + @Override + public String getViewId() { + return "music"; + } + + @Override + public void show() { + // "theme" will be constantly played as long as the user is on this view: + musicService.addTheme(theme); + super.show(); + } + + @Override + public void hide() { + musicService.removeTheme(theme); + musicService.savePreferences(); + super.hide(); + } + + /** Is sounds are currently on, will play the loaded sound with current volume setting. */ + @LmlAction("play") + public void playSound() { + musicService.play(sound); + } +} diff --git a/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/RefreshController.java b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/RefreshController.java new file mode 100644 index 00000000..bbec1368 --- /dev/null +++ b/examples/gdx-lml-uedi-tests/core/src/main/java/com/github/czyzby/tests/view/example/RefreshController.java @@ -0,0 +1,14 @@ +package com.github.czyzby.tests.view.example; + +import com.github.czyzby.lml.uedi.views.View; +import com.github.czyzby.uedi.stereotype.Singleton; + +/** Allows to dynamically rebuild the view. + * + * @author MJ */ +public class RefreshController extends View implements Singleton { + @Override + public String getViewId() { + return "refresh"; + } +} diff --git a/examples/gdx-lml-uedi-tests/gdx-lml-uedi-tests.png b/examples/gdx-lml-uedi-tests/gdx-lml-uedi-tests.png new file mode 100644 index 0000000000000000000000000000000000000000..683da97f173294e4d2bacb61485d53d2a530a186 GIT binary patch literal 20220 zcmeFZbyQV-)GoS}S4tEFrNa#fN`r*7fYPCWbax}L=~NIzq@_zlK%~1Q1d)>N2I=mu zGkMQFZ&pZUx=SKteIiCfsD*a!sTmXzc(MFiry z4+3#*8uL25Q&lWe4F8}T$VfaxTweY6xh69b-obh;sqTP4+$6aA{~97bkr>{@KuO6x z$CyUP!oNw$@+P(xfw+&5dM2XmGP*Y5t)^^zA$;M!FfBrd-YkyZlyrZQV!`9{k+goq zT^1HPsV@&n81T7ySNW(bO0ViI%&!Uuu#A1?^ZdRU2n zU;Z!N{P*Mk^7U>S5y|VsIVK(P&oA{0&$fPINWAlSASC4VCzgG0ippc_O_RZL>$P#` zss6 z;l6qEW&(#XHgYa4^gCLGbFPZ}!XJ{k>xc?5DmEPZj*bo@7A;~SkE1_vk5^Y#sz$AL z<~|h^6f7((6q{a-t=swsgkF8THPgt?mt)#>QNGChhn>CrBNscx=X9W*TmUj-4Hp*FEqff3kJZ5>8Wnk_3O(nRGh+k>s&>DCN3hhv#y7 z%tYF0j(YLZ(}LL8!i|)nA)dK~1^GA*;d!YR@?efXQq_BA;XIk_xZoZ#TV-`QDa z!glw~nr1d_p{P8~!^Nq~i^DXD&@we9UGH;8PfszK_87mgqobqV-l2_Z+wTezTqb{F zNgh)kt?HJGKYtDjDV5ff$mjSWq&k@mX}38kh#&YXQ#awUY3ISZH<_T@Ufg5Tl~ppc zzC&0a=QS7DX4HvH};5hv-b zTo#Gv&!eJie=BUS3`AakdW%?3@AP2IHX$Lw(9n>|&1~Zh8pb$Jtf2dCG6;A)gL4@g&i)QgASEL+r{H|@ zq@tkU_3w`uuxIDpVz}$$l}bnXxv(Ii!WT!Z-XkqT9P|pwXMckHMV%728M>mj@&Ldjoodl?wb@l7c`EJj*O~#9+&5b zNsAbkrK4ZIEMg+TU}k1$Jop%bnsx$&&qT5Zc9`oaC@A2Y{brngVULs)Jv}?s3Jua7 z$Tpj)ytOnmq|q`vOf)NAgA-yQVPE%u2a}omd<+hDyvTZ_ltD{Nizlj*r{%acEpoAS zzL~vQ z6(`M=QLcckhX){{#X9M++W|I=iA%+<-|&wYo-H7o;NiF!=JA$T>Z+|IZ3MgF?`O}i z4tAVIHiMX%+6FB0MW$}&DNmv>&tPJ9>L*WP@giblpBOx=I7OfRJt2L`4wy43^a$~f zp3gOfv>uQ1{UO8OA6vUFDX4tF6+75uwY8JN3hod%v~POFTw#d0$4X_reDMB-CAlfV z5&zk-S$bo}m}@R{>e(zC@TuM_j6Lssx;!Sg+Ie|_*h3iP!z)fh)!biRwV+M~Zghg05{ zF@nU4Two0(I1O)CTSkgamnG9be#9X5PtDf#gorb7yRK@pHVd^h7^#qFNA;JCl2RyE zaT&mgQ^cn3{6P0iPr&Ih+I<8XjsV8(A97cyKcDQrk=mHQL_awJ+u|2?lZeH|qxd?- zV*#_*?9fkaGOgWTp1+o%IfO!!&Hc6A^Nc=C+J9uxROCK za`LrFYCdpwUI!E0B4xMP;F>-5`P2Z)l>rLR?It3>uz~`%6Sld(@K(cr{Lm5}!;ax1 zbuj0|mrc%3lC)&p0`uhfbPCB@Iy#hugbRn{e=nAOaYK6F{9PS9cb%vbZvOpyhfBH2 zYVhpXHHdKj&_e=z6}269h1yypw;+P?*iQa!3OyEVCjETbc%P|aUC0~cDg;WMGn;=FO>33~Q!FY0mx4uih~L#QI&S9cqon}bUWXGOqN7<^wJPuk>4F0T^@%eo zD~~&Prp62O(Xg4XmK~j$S+}gjg9NPbr!Pje8-MD}klBTfcF(iz=HlW-Nm~3Wc@E^W zw4SqhRx*VoKF5{*ED=HF#Id^Wyh9vph3j-hf@3 zo1YIR<6)s&AUv4?_&(V1G+gXVVrOT6SjeUph~D-lWb&L!YUZvH@mUd|XucPh8`w1k z#UR8A%#TxO+5r1D4wst3=(jes}Zi0gIQvr%&F9sQnKL^?!#){TB-L|L*G^+6AGM&Ce&i z1lR5&UL(tCp9iBfFusk7{O*YNEsgy`SlIh*J4bd{`Y zkw=S8j?g!1d0{^v(c+e#V2z2S5PqMhvvDzmX?HAwbl={xOy$8hdEatIQRpzqeKd2u zP+c3hzH!j0Cw*7jW}zU6#d~TX#Lb?N?Zw{YyES6M8LyX!>swD7ChS!g{YDZwqTiD& zcE#Ds7f}%gb(K>Gp6SVTlutwxdMq7(_EvSB^2fvfDu{n}L1L)8mI1Lv^=^ z$eAL}vhv&5gRzA`mNM57y`{-}f8x5dZx19b86+5u3D_o#Ovo+9` zzk-DNKNl3T>w_K|$u@oHAP4Y zH-p?>Rm|K2l&SUw$S*RBuqg$l?&D*I6jqXp6TD?(y-PQks?I#SiAu#R4l6iS`G&(f z199yyO^ZBT=1NWTiaXY}%VYaeoVF!@qm1(AshiQ0Eix+OVg zZ7xEOdrC_C&q9AGZh(Z7{7J4{l0CE0D6d^Y$nnBlm_oamQk|jMLuX44o`u`he@#vc zFh$=V8EAHAtsqkGF$Gr&35ys zRNlq4w5YWn7ZeGmDopvbqkttUzp~QE`r*%_@6^b!YxBp>>V@u9Sy!j4O*@VJ=hwXG*en^*X#dm6|mv^~52@6+?eIVXJOK?N)svV%LwJJO%(Z-e#8n?7*D2`X?u3%@@I z28<+eS{DwG_~2D>zv`@pW>0*<>hbaqX#q#?6ZLL|AC~7G2Abn{4^r~0h3F@u>58cJp}ua#Lt(Qx|EKv_~Zc7E9u_ z13+|fKhC`z%H-H&zwLVYrN!-C?t}x^X{ES% zd>bX9Jhk!=%c2AGpAov|TRiq{!>}rt$b&62w>S(g&oyHFh6#b%$9BMBSPb@ixVxabTN{5$lxtV(zK_dx z;IZck-IVP#4z;N+8?mJ<#tk*9RwD9#;0d_B*yXU z?LV3oC)SBbChFdnNLbBgYDPMkuh|tKDU@RHMBg&%qCz%A8eNWgQj z0ZX)U)L|gn(miz95*k%3@hz`&%t|S`zg5zwf(~ z$2#)r)9N={pY=q^_~G5LsINhlQe(LV(x9FopPfy3dz=i0os@e!u@C21ty7A=_uR`B zJ})wgT`%K=n7Y=?@BQI{Q^;hlRXJT>C#8g1#rmN8GgVf8i787*X@!_b#}#~yJ6J+T z9}kx-sVL3UJjdjFV(=OgFHkL+#(>sz9qYCu$SWL;N#Sj1Fef-vz{-(F`r&Ms77bhG zWF1F8aM!+&IOXt5UOqI%680=UOlGA~reqN3&TjW5f(`3b;Qo>w;~Q^*i43{Jqa7s0 z6H0GDx1?OUYjWi;EZ(-&`;@xvKLXlcY!Uf}+7Og4^F=Q7DizCX|0O2;>804VbTPk^ zFp>OecYaOa$d~s#Yxotv+DXoi zXF~iJPM;$E*L&rU%~`Ao$TZ5T#u%yvSDdI#Vp%OF$THr_zarotB16l%{sQab3{6yW zas80@0f}Ld+`SZQr`qOQC{HEz)W{)z4wVz~Wqz;weox-oPK(_L*3V0@OX|EPt{3OL z*hsXlwG|$Ng`{|VX{4k8(9Ln8B)lqn$3szAyVJ(7XZgXb5N+gb1ZtdZe4l8%q3+14 z_{byM_ts4HpK~EgWSmPbJ#p~^_vH*f+NIpn`<~((RpkS_<^Kq{k4j96<`;&1jLP#i z6f>KM(PHav*8J_cSK3aQud`rN+3vRK(KFC4)~<3haB#2f@JW#@YWc^~&S6Nw>*nt6 z3+~1b#|vMN-o8UxF{fb^ZTQgQz>3mH9=j}+u68gUA*$;wV9p}GKol*!L2(kgKs&u z+a8>t-fHq)-}1q(CmO>`g)RGAONnOw@cyif6eG0;@CWF+UeU)bSZcE>wBA<7FYnK zrop?!PY&U$=@Dy%4eP5{p1yZMjlh*GIUHh9<)dx9&h_b#G$9JF!Ao()GnP^K-q$hg z$Rn-xZm}-ijz>k4{3*PeayPr2%Ixih_PxDLhAXJas?pn5(pyZC~s zNC!)3PoPh+d8j4#P+&YRaaAkYe?!|2*hGB1tz5@q8vm)j-HX2F+J84S*>O}6gN(XJ zXPI0$$^5%r)*WoYtf!L_#JDdLxjV=B&|VMfJPsE!HN-@*`eV_G*ru-?tMGj;%-*MR z+iCa1b9eT%MLli~?enf7u5x~Nd&A_7N4(3bg!4F9-f!>T3=wavSAteGdX zm|cIhfA-8)S@dK5kpTSu(YbVfz#JXbV?~doZm@|7dJv~l`@LsPyw#%a4nY%h_tklK zc}l}M`8Aj6)IJP;dZ8uEo4C_my*ApKR^Jb~e1DxN`8hc_sbXa~8ej2DA^vI1nnJ^q z4>s7r7k3LC%3^5`(WZZoOa1zI^k-36u*~`F>E?@#fSLIl79l#C+3ybuoPH}5Hz^Qk zTREt6)9MXH&D;b)N_s4K`&G>#uIIAH{h?~QUr3U{@X}6p&QIXi!tElbQA(Z8uQRgz z@k9f5_-x2Kh#FGP`@aznO_<~W!NT!6&H9`X>U*Kx1kgMAhPmL+sb^t##{E@WN&@x# zf~(w%8<%%GkA^8R|C8>R_?FZSZ0B8bIs4XU8fb*hJR$!;{$h-< zdGfGU?={Y?ns}u-FXSE3GfmbP9(nJ2&fD)0PTF1C52erk!qHU+UIF2FBMj#X{YlZQ zFl`~KZC4V?JDM(PJNy`;@s;;p!Ms_1@nfXp4xx?QImP9i-TL)fH+7Gn(|TeRv9vMw zpJgH{g>I>_;EPshZmi@Y&YtH2wn0t;IYmICz_?5eO5}<^4*z~WVFOf5hGlHNEo4s^ zU(`!u_48t?v)MO53&xutAbtE2Wc_pV-tjh#(EO(frPF}(jIox`S^p)ghhS{N*&;x< z+v)xAs7dIG)G4$>m+$E;xbHND{3(TVjo=0?Zx;_d_*>k8Qm;yhkOU)nzaBy&Y#EOK zn1X~cFc!<=`?exPDaZ0S$zQU~AL;W2%CZmTxA+2trYDUS{c8(XR(#(bY%OK;J~v3y z@mO%^!6kYxxdsa$@$Fem9o5N#hOpO@qpgK(+&Z%$x%uDYKRsS4Fe)BkMro6@m-OGD za=XxYD!9Wj@rOkf0?gN041E0Gj|_clzfst)-BO6D<~mBM)6zcrz{REOQ9Iy?{YxRW zYQJ` z7=CBSV_6*cXC$v_P+v|70~s%r*O?|JW#IO-j0r~RRTUydd9Ly z+^^gh_oO}ZdE41=dv`f@o{-vb9On>WLfhHm6m?&@->pL2&^cx2-Y9>85GTS4n#GR1 z4hAd(EF=(z8{P#2oAUfKyv8-&m0}zp0R=1MB-RoE9^{e?s02fLQoe8%0~}XsZWPID z8^ka!`G%1+x*Lf8tGaekz!-Md}C!nj+0vG$2I3HRiS6Hp!xU4QWNsixkzCqaOL zpBKC@`cbxvZ$p207+1hlk-aW1ewpgyrRMa zysRZV)RArxc=zlWJ#5ulK$DpKk5!EpASv9x;uG6hA0n&V;&LY*&lRJM$MS1ycFBA5 z%?* zeXMfO_&0A-h4!^XXF?zoQIj>FT>{IJvLmkUvxfqivC({EN6UN6iXN5Ne6F#%EUB>i z-m1K`jeMJ(GpfdS%9lkC^6&tsLSBJIck-M5tEC)YYrW0=i;{8z)?4Yf|0kAo;fDY> zc7?-@Y5b86S9c_lUs2M0oA*M+)IN{PaK5{SamnQYlKx(S|1ECXIory?DW;7dhUilk zO^L?>N8P&J_krUff3QZCpxXXW}fCIN{uKY>7f0Wdkhy z4YHo-y0cO%7!SMGC(jSJoaZmZJB%mcQbO|{WG-0t>jk=tXvFtsF%6!_)Dh{jxmfnx zdkj7SKK^`=kveVi)Q=H^%z)}1O_BQZMNNz|>TrXFQ9YN0SE!$O)5z@_RDFYe+Z{sr z1a|m7I1FXmD?H247mlw4$i>9+&+`1<$E6x)H?b&b_zpAfa*s)bI_MPjK=OCkL_N*h zG$wW9gK?`)bHRJEiygAXRaLA0)A1iY6YB0=&*Vu~i783?l?hrB#BGc2dZ4&B>H2+q z3O{uJk6wVEV!ja%r#qfF$+!3sfZ2VE(Fj{h>}Dt3+Yf5c!5N5Lc;nUF8Cb2xmU>B9 zP>_hP&DZ6UPd1XH^8v%zvIsE#{A<71$#Bk}A^NqnW?p{@{1^mN&Q(Z2b*)P6x87oImOUSc@!){oEyENgzkyZX9LHU?y? zDYg`E{f;VGGGiO{7|tZG8WrHf|9DxVK&!@m!X*2F$!~QqUB*P~hEFzv>+0jHtN!mV z|K;od{^9@fiO;oLwqm4-5fKqPJ3E-jAVOwQ3&aOJMRbr4lRtjM2~8<4EiEl8D=RN| zzjU*(Sb5wf&^I_(_IgG%t!LOYfH|g}03Schb6P%EC6tUuK3(y-gv4VULykCEx=8V~ z9y89)=XalD5)s`;Ts92m>u%2H=jP^O;8F^pmcmBXTm^fjBIyd5vXvRq($Y>j5NH)L zva%k31L>6+qE1taii$9iQBhH=gSld&*X|<@Y0!OV#w#52F)LB z&%%X}H$S@jVQFdU=*UGBQ~D9&`s+FeP{bo5@MCaaF${p%&%wcA#4&QPJ_bc`Mg|70 zvPaC!17@6bky80XG$a_``uqF+{Qk*8A?i?Otq~7)7rQc%PJJ12P>oQ@9&km=Qs%QB zEs2jOHR5@i^7EnDZ>%rb)5u<;D3#h&ck$?{j)5SEbsZ=>rA76B|yk{d`*hm6zI) zGl@S5zf+DDOH8YgN%4pgM`;PvG6*-P6tiGG8J;{*%OB$5=C&taoC@zdZ!_Wmy`GKu zB;OG`@|n+*$}8xO)I;k1fbw0@jiT+90> zHu;!u)Td0}{b22?v6avCHo?BW^*Q+Gy?gi6)zvLZ`H)DFw4N>Rww9L9jTIXev$tbT z9j`h9oXSK~Utf$H6moKMu1(fd7Z&y$6RoVQM6+nG2))m!sqvhu^)xm%ZeSI7CmJ3V z#RV(g(jplX?`CIL=%8?5nO{RlM3mXLY;SL0b#mU3z?1p)YpiU>-X7}EEz0|JpDWPM zwsndknn|6*dX#ff#kfYN&b*IqvGILqsBV!F);jqEzqR2)-^<9KdM?v%FwVx@sbnN2 zKi@Ec@`{(l6s%cO5K(h;b03S5==&bCoV+}iM~_lFgaup8G#a=_JH9**QdCroX4Vw9 z9Tx}|FV=5F_x(9tn|5|~R#L(l_^fvzyf0;+YxR6kxXbhWWS@kDr1Rb2b5*hk&)2D`s;Y{&aow8!SyAyMN;+L7TTuK?mU4V-tR&|4@b~3IFHbq@6nrIysEc)5 zZ>8)3KfK7+{?So}aLF%eX;ISi;4VB?!>^aRkyYs$xhfCuil>DS`UHy`N=RT_j?X%) z92CNBi()q0&Ckz!c}!Sw@1~XiF)5bMOf$rtw|8}NauOA7pa~WDtJrhMm6in_y0^Et zzdBUCCP^I*)$$)ZZHx|!osN^?vUFpGh5?FMB^tS4N8sry*^YmI1wMN82&eHi`A~nq z5l0+!w`@oZp5{&^yH6#`U;erK&-Bmynwpy2TxJfAUPGROAh=JrcJMkDX6AV``t~9z zDXH1!P=G4Ox@R%WnkuTQs#;n(ealO#cd?t46a=GUV`Ia^?H2yT_4Xan8rY8aOA0|Z)bY-|VixN6M-oc3*Y@@to}Clb&bEldRVDo6 z_*mB3qc0k{+zB0;WmZ`^Ide)ypFiJ!^eF4|=cm~Ny$1sTgKz-MXdD90<({TRQK^p{ za_NoYEa|+uCrTa8r1PVquyA`mM%Tu|;tPFCk(G#uh?`rLbb4D`+i0r-7Z(7ox34b+D$$}X8FC3)@$BzRYo<=t zD-S!C_qt@4yVx)p^~~Nlmpv27CUSf_bsQyy+wFvf2OeFh|3vcHn+5vlzbl+ z?22)l{54g-VWHZ^#bI4vbmH9HTr#=vrIEDlNPn&8=~Cm-SE)#?ve1tozs@X9I8WU= z@_I)ft`I1dLJX_r-qdeU*xh`LML@SDm{jvA%G1A2_~7epJLvidO>4c_4)ul}6axdd zh@Q^2_IAMo#p+E-mY6l)+LGrpl_S)wn%t$5%_Y z#VqlW_-7Flk`{^lX()4Fw+l}vX`hwx6i3*CiIcM=K#so_U#H%sVXSr8=YFM@kj?m$ z!|vzJ`iVlGRjS2apA+3vlH`TEz~e!kK%hS*1thSprN7R;W-41 zC`tR&*4mnSF9TQjtf0Ku>uI99Zt{QNQfRH+8&J7q^xAc-t*t#gJT$J3cv-sk&d$!Z zHVyFq=5OL-?(Qy$adC0&F|09?w1h$FfDh^E^FWO_OCIACd!9OlcE|Frm`u%Jrt&@)<7w}5U*>>CX)_Vq9{MH6 zC~i|zQ)_E0N8H+gsxBCkwT%s(pKRij@WB!W1_rZCLt9hNOX0&>fh4ckN0{|P@4$aG zl7)`v2vTal!S86S-(>v}2K+50g*CGE!-o%pdD^R!tkjXMRTem3yCNp?s=q2T4CSad zvVBy^)~<0YZO?bjqNRY|!JimZ$`9{iVPOGiKtEPF=iuNVwkzG1dtEJE_#yN0d09yb zYGA#epdqxF6?!D3b5($ilxk3fo!W02mnZ-$fp(pvy*`EPft9&ABd>qH=;RB#Z0V`1 z$H~Y%%{TG%7IH?8yIY_0CtXBeUHlC|!ju$+vGB9(?bqbx-j^4ENGJnK3+NnpWAA9`a(&EP|M2PyvL#xt{0dLT(U<>aM*I4;7ESH z)SRbG6(waO8+c@m^Us^Yowasr!|Z&AvsbLO(BOIg2IGAa=0uI$kdP1?GqZ;*EO3h1 ziorpZ(7vS8`>Utxl{aT5TUQR3_p)V|FWIoGGNIY0uNRt-oHsXGm&km7J|*hgdh%Nz z!k%{N-JZ!Q*1EIa(@p5xyCYiV#-*fM*QNS)nOiaI)4>R4;>B3w`N^keljUJm&Q`V?aU50}T_nkSw_o`eWB_#sqn0RMaiFHKe92{!|J=Bf`7^t-sJM87O8Egk z)@6L94UzU2g(9Z*s`4j5z5o1?Wu1Z!#cw@k(Df4-7>GK1oJ7s^OyK|`qhs}hj{8+! zkqQ`_5)bcrCDweHec~k;_T>w8m5nMZmX)}B=8K1F(Ohw|*QZ=&BnENg9Wp}~;5Ow? z?SKW&3wia`^)1`R^6_j~)dIRdaE3=cyHn>J`c; zC{PJ|oy{}`Bw=6!%}PuZu$>g>ZTcfqsa5N^I%t~Wd9b(K*D3R|x9xDU#=Sb%gNKvz zPl~WEbvU$^0;>uW9)*DL_U+rSFuYOfx$SC|?9!ql4jup-Rt37qW6txT&?}mqf?o^- zD>W6#&TcpG{Z&s-PXI2}!WH+vJWja`3=K6^A9Q`G0Q-vZW^sOgpufLDpz|~)$}=Y; z!(^iNP`&Kiw{PFCj<(~ddizSPT$ScuzW_Q9jp}6-uw(Q0+-jN(!rSL<>&~6z zhjOy4P#;eqINU;piOs zcj?|D1SH{};6M%hD27c17K%;vi9%K@C_b;UP>1c@Z{J$F zx}d{xC`tGC)BHC(JN8H#R!&kmC8bD>TzMIp1Wt4On%jVd_ponhV{L9XQymr+^gt(+ zgT4Jy(el8+Km&i`*>L_A?G6{aDv(iFdmyH3SBF(llc<7UO4L%(QT2euM7gc5mshP~ zmd9qz;gaHK`$~_4wUG#tE*^nisi~qb0~YT1KJIGu9=(&3 zwbo;0SKX*t%Dv?j)n?Y#6D8)6yE_xLCa^TlX+1}6jQLEuwE`R*ML9XLnSGGYW+_YC z-Uo&WoYitLXZd(}uN*=!Wg-yQ9y2Qoi<7h6u26E`zpIwIT%>Y9XbcR#$kNSDIY|U< zN>F*0SPrp-=DRRHdc+GYT|4vb%hhH_`FDwkZZf5jHwzvN8$t<~c%6H}Id{NfnPCee zzRt#-y=&1d!pnVXkA)8y1p+Cs9!DdEi@drM-2pjUjpF&8Hz0x?^O~3J6gY3{ z9I9J*CCUr``E;Sc`JZA{g$FSq9YuFmzB0qIT(?CjY4GpO+S5)?B=aE;Hh&$_gdW=w zJFgmb_(xK%54Ad)`9n8x@fC#6Q9xOL>cv9e;MAI`B>r*L0|m%hquRiqG-S3eMqgh{ z%h3@CBa7(WH!Gnf?Lzy8eWd_3_1k0@Tk?Xb8?v9F`z<3q9ekQayQ<%?OUA(9ukPiE zs=t1f8`@_Db>Y~~q_V_9CQI%FO-;?}4%AHMu8c8u4YtdFcD11t@`p|f)gpS#*7W6? z3<`mV3RBiB-w#+Ss?e7}sm7f0q+8Dm+|-|0afW8s46R zMQMC(#iYA4m-a;!?kMv0#*k~qeS}zkq$Dkn5Wg^Rb&($&jHcf ziy>fw{%<5wU;KauQ4mE`vR_TFs3K~hf3W-Z5!gs|e&EA!NqYx}6ptOLlY%8B2gXi{ zxZdV&3>JA154v5^(fsB2c)S$ENIBJ_DcBAC zL{mSru5uFNK!*C{aCN1g?G~2XOWQ8u?S>(en+VT8U|2ZlCuLZP{I{*@f8J*T-K*cn zbFTLY@tUIH6~c#<4c^hB;+kG{J;Fku>tDlJBD~-4a}9AdN$?*ph-+5^N&mk5Z{Nh6 z^#2F%DX2OrPwc+*m}ylzF)OB(KX~u}K;VujA+v_x4s1kp9eGG8-^^OBW}-4P!Wx5`q~De<#XcbS@6o2;2r4qBas0eavLK2eYog57#U6v?=d^zRU6W@w|QI z?r-p7u;3ELo{^LNRX8~gdLtUH!1Ojkz-HRHjX)GcoERqch)6)~Or%~pWawwUbR zdA@Zf`9?$+H{%lX)~)>`pW$8VMO~4d&7z$&feQEa(xJb9|DyP`<>lp7*%NH~Mo0PF z53FhteT&4G5$wWON6KskY&J+!8*^n;|Z02Z`S^ymfq=T%dwDeV44{}k_ zw9_&)G_g{EILZ-@d`W8d$Hd& zfGo+yWzHE7j6Hh*Brp)+5^Y2FZXcbj=Ci65JY|W|WQzX%8(1;e+5>zk;7t%pHF9t3 z)t-j$fJ^7so>)jrW49N9N=A1RNz2S^4PzXjJOn&qTiQncJkOx|M!o1PvNL(y?fq$bG$IqL~Z(tBjy>E~gytAM3j%GWx?w`+&WAj15c)$M~L z1Kz`^4!a>b@@rMqsC)a|#rY|WA6=H(;s^mLE3E{a|gmH3SUnlXQBkkw(R9eLywcO$7x7?~~P2qg(U1QEsQ)be^H;AM{$H^5II0e#io1`u5R^_O&)my}}y$WHoQ z&W`MU-R}26o2`F?=7(3R(UD&~Gw%1qxb3be1U!i!my+OtRgS9=yAx02V9-g|ZTW%d zd&R7^?^O_HRdUpNhKF0GKIf{e!naB^n2~dn?wji~AsO;X(ljhoo>^^e(n<2oY_gz% zw-eZScnBbkCaN5P)cp6v9)gNQZ>0LdLs2TfJ{--3j8vvWdxeX%> z8ZTdp*v9YGLN%e-ZQmkf)`&yh%gYO~JCXURtF7%zN6VEqmz6bBXTY6sxH+}C6E-J- zt%W-<_4e&`(f9J1+4=dK!PG;MZ|7Ex=OtXXTCBK1UG1h>94nl#Ox)k!pC~iGsUWU# z9SaGo#v&|AMbh5h4n{94`%z|7R#7oxcj(%+Cx{SAL20Uh<;Dz|J;jH2-D)N`>4<9W zmnkQ*AXNxO6TFhao~V+ZjX`M4EXN8>Qrin0n^Ncx1e0#7 z%z*QD<5v=AFT;!Hc|6#Pszdoy^FQ4gOJwOBHv8sdsPK9()|5Ds1zaNr`4Xv^)S}ao z$51rdTbS-;=dt_yEdJwJrnyWkRur<3kve_nG{-8Ab9h-Sj zd5pf2sMD{MkeIRH-K?I$m!ljD^IpG-tW>)Qet=>(I#TJnYZ61eslyY`rhlF4_{aEH zwdh;ZID|8gSfixPZPitEQz=NiGVAY0rlffPm4Ky&d}lJA%W}zgt>N8GZBau+ke2OT z+R&IN@A*_lkM(F4?rE>f8Ov6kqxg>=!EaUKkFoQfQKwQYqI~%`fArP7#Gt6Z_C{zr zg+4jMqt_P<#1a`;2_YZ}ekrHh(~oV|Ui)#>Tgrnh7(` zw)q{XJycFHEy?{lmS;Ekg*kdVIxK9uup_a~+EFvx(%Kp#Y)4mDXi$**>3TWjLO@`l zIOncfB}*UCa`fE-5{%Dz-ZPIB2u4m-#~J$?l&0NYfYb#M@!~#NJ@wG;TiUIn zoqPco*XwyXIf=sFUSLDY4D&%4Q|W=h;h)xVC^j|7`#m-Wn|KFja9Pu zVLmXE%Op-#oD6fog6o{+I@|TvKIWyPpdvvn;dpm(_nHfc@i>i8QNoP709*$Y%aD!x zTS(J^h@D6BEf#n9gPbsCKA!ij9}jhs7X-!YFJI5o<_bpp@*@0kt;B zba;^KJ%^@eQUihk%$j)-nPPG7P9#mvFi?KR4GjlMDs;DoOAPsW8%Zqk)d$t*v z#1VTJQ@eaTXW-eB$@ILuki77)hzL=M%w9a3QjPrVN(an(&#&LVGeGb~BHsvYg98NZ zT&Wl5HYO$ukc67A%0cB!My9>eVR6aqw!c1vX3B5AdxjGKXX2lVH!-v-rf|s|6~?J|S}@ud6}7*rdl`?eH+oG=Ny+!N-apgz5G}Xf-ndEZ z-}>hd6EkxXo4%-#(bu1PuSp7*3k5BJdEhjfm5vT%t5$OgR{mMt#JY6q2YKN2Ohaah z7Zk5xiV=?8p)-&ufH4aU;)0P@t;p`=zk$imS|~5W)f^umL%ja>%?zf%P(&WuKTrAS zYs=Q|`(vFVA6Y zERn;w4Kn@1wUJqSr?Zn!8@mKl6NFy* zUgtWCRUnMHk?Ya1l&7fI4Z;*zvmK==!Ht5JW7V*;ik$1OC=)@v>h{gF<9YDlIYSh7 z;>D^i$4+qT9%ISRO^^}J(COt9+2UkTE~>J!ID9aC;XZUVtBd(EOBqUVsH1!5zpB4| zdw8<9UZ@&cHujI7H@_l76mSrzRb;E?XZVr<$5W+HCU5TXGI&!gbmrcjT6~%mP~M%C z@%1aJRH@3pV8Fsr=doY%J7tFbBjz|+!f(hvlj69^?`GM0xQFxXH_&-%bQH!kfVOE3 zs$yG(@21^9wo|`RCa^UVHmGHO|LY~I(TS}>M7Ve#B*Z{QUTFtZAxOIY(gDSwM2<+5AYREL|^8EL(Sa$4j-LvBK@oZ zi$!xXug!MB8|XEE{~D0WKo7xegvvE0d#}5+mn_-!(HI}fxIqnkCLz&>uKxzmf}ZA9 zJrvsV4po6v?U>0cJZ53JO%R6XG0?A*g#Q+1aAKUt(9F5#gs5t;w zmrEohC+oa;F>UW|Kuq`Gfia9u?pZ7fFA}ABT}?Uyc7=aKxmWG|Xf?8TZMX9D6!iSA zR%xH^@J@^&3X&M$&i8%NoRVL_r4j~I1nJQn;grmN zO)xj$K9+!xA3R>5_w-$TvtY1zUw{8smF&LWUOKt>X9;E0G&IZjXIDkTS~e@&HHd$n zVCD(}+kT2!Uo#iJl$JU|t4Ak&wcGwmu4eh~rY2+4t3#8C@I>oR7Z)_SyeOBD2`Dx; zF^TUm0S}sT5z(x|MDitVfMVh_=>>dsuha(QMD;Q&lJgJJ>0idm%ggiC3LECP$IUov zq0S989w;a>F*5coqoD1CA?mv_gTFq25UdQ;P6)mQ6vL4DS-$sqwie6O4_6Q)`&ak( zZiQ;Ew-4PV-m|cbF)u23Y#h2 z*9x1#EI{MeorO{XD)llWBg5w(Jz*zcI>0lXoVc6qPzF?&^#4bJQJnXGqiLEv)g`C> zYN?gh1Cr7MIyz`pS=7*jWadAV)R;NwT>$L*1J?G~^!6n>aaA)^n4muHnpmc(qGG}k zx6qjcsh(Pt^mAd(IN4Jmwbjn7mr_qlN=iV`W`bfnOxD_0CWaKT$H_vK%KP$kYGTNI zhwDZj25hrCXxQq}+5q3Z=`zP%Xo_=ZjFMiukmh3`85kLfSaoDA^Mp!;Pm?~vg9*Oc zN`24IKUBLf4CSv;>(F}-(PaJ?MReV^`BAu}crfX6s(YXSZBFRC+cbkGAeft*2L}hk zobf(!J!}(@**XrKE0P}CrqEjajd64XvN*9da-XI-sgFB?b-RYD^9vzU!RtQD92?_mf($ts^Q8BSVpBQ+W2s};%vq2$pzv#ZQn;YNygPo%j?tfd+Qp`C? z`D9F?QoX^r0z$_4_&9xvM+BbYt5@%C3|>Q=;E0Rh+Cx%bP_Pwenk)r5`(lzaM9HHv zGgt+c?BzdxkVj=EyIE}Af;PdY2!CB!-~tW~4mvtIZfUPe3ftQf(Kx z>LnDT>RH_ft*Hy1F7W;i&0Xvpjcnx2Bsl1AEdN};y4oXv69c3p!pG~nZvkBY3$%mq z_PbU-t9W_WK~Dss@LzfGGZoB`BYajn^)y61rVkoEqvQNPerU{Ad%fZ(1Y(+jhNkfp z9c~qp@XaX&IXTaTI8*R5LKZDEPSQJ9=fp%BK^xE{571jdtor{+*+WAhD#S;i`^EK4 z2{&y4tREA3^*j=J5W9it=(x(%-&~QR)VTPAnXRY%D>90);&T(4JJY; zrrFIx>qg=wZMY<;UR`V-dYSaP8fjkN#raN1qAJ=anIRzg!NRs4y^mICI)7 z0yrG@v$hFXxpa1SKeosN)|7wtC@;RaBlGgIMT-{o^z;A|2xny9;RFLR|2X_9y^8$zbZr{Fb zyHES%V&KwO;HWitA{2NS53pUsmR-CBdUDi65kJRBc7_)_HyC8v+dFl-7y%30nLfa} z1z5E_-}g!N{iUVz!)`$qFfVJI#GTQ^1}sR9gQksk9jxsGaUsia!OL!u*5aZs!~Mt3 zT?m}4D4!GF&xDwwSYXb(L@mSnp!*5XRK~Cb4gdGsS}1_LCh+NhsWY%h9#CM;n4uz~ T_f#!|6XXm}S3j3^P6 + + + @@ -23,6 +26,7 @@ + fz!^#@xAc@%6NVi@JG$8DV|&u!#l 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 apE~69jhlb+CJ1F){@I1xYxw|}m;3+d;W6R> diff --git a/examples/gdx-autumn-mvc-simple/android/libs/x86/libgdx.so b/examples/gdx-autumn-mvc-simple/android/libs/x86/libgdx.so deleted file mode 100644 index 285c9b19d9e10dd96ab7b3a55cfbb3ae649e9f07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255772 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 Date: Sat, 8 Oct 2016 10:21:24 +0200 Subject: [PATCH 38/58] Added support for BusyBar and MultiSplitPane. #28 --- .../assets/i18n/bundle.properties | 2 + .../assets/templates/examples/vis/busyBar.lml | 10 ++++ .../templates/examples/vis/multiSplitPane.lml | 33 ++++++++++ .../java/com/github/czyzby/tests/Main.java | 9 +-- lml-vis/CHANGES.md | 7 +++ lml-vis/README.md | 11 ++-- .../lml/vis/parser/impl/VisLmlSyntax.java | 46 +------------- .../vis/parser/impl/tag/BusyBarLmlTag.java | 23 +++++++ .../parser/impl/tag/MultiSplitPaneLmlTag.java | 60 +++++++++++++++++++ .../tag/provider/BusyBarLmlTagProvider.java | 17 ++++++ .../MultiSplitPaneLmlTagProvider.java | 17 ++++++ 11 files changed, 181 insertions(+), 54 deletions(-) create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/vis/busyBar.lml create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/vis/multiSplitPane.lml create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/BusyBarLmlTag.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/MultiSplitPaneLmlTag.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/BusyBarLmlTagProvider.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/MultiSplitPaneLmlTagProvider.java diff --git a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties index 9dbda0ab..8ad792ff 100644 --- a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties +++ b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties @@ -96,6 +96,7 @@ customTag=Custom: tag # vis/ vis/basicColorPicker=Vis: basicPicker +vis/busyBar=Vis: busyBar vis/collapsibleWidget=Vis: collapsible vis/colorPicker=Vis: colorPicker vis/draggable=Vis: draggable @@ -108,6 +109,7 @@ vis/horizontalFlow=Vis: horizontalFlow vis/linkLabel=Vis: linkLabel vis/listView=Vis: listView vis/menu=Vis: menu +vis/multiSplitPane=Vis: multiSplitPane vis/radioButton=Vis: radioButton vis/separator=Vis: separator vis/spinner=Vis: spinner diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/vis/busyBar.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/busyBar.lml new file mode 100644 index 00000000..9f3f9c63 --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/busyBar.lml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/vis/multiSplitPane.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/multiSplitPane.lml new file mode 100644 index 00000000..a54841e9 --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/multiSplitPane.lml @@ -0,0 +1,33 @@ + + + + + + One + Two + Three + + + + + Has + three + children. + + + + + + + + + + 50% + 50% + + +
\ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java index 8cfcc8eb..fcdde8ba 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -57,10 +57,11 @@ public class Main extends AbstractApplicationListener { // Custom elements: "customAttribute", "customMacro", "customTag", // Vis unique tags: - "vis/basicColorPicker", "vis/collapsibleWidget", "vis/colorPicker", "vis/draggable", "vis/dragPane", - "vis/fixedSizeGridGroup", "vis/floatingGroup", "vis/formValidator", "vis/gridGroup", "vis/horizontalFlow", - "vis/linkLabel", "vis/listView", "vis/menu", "vis/radioButton", "vis/separator", "vis/spinner", - "vis/tabbedPane", "vis/toast", "vis/tooltip", "vis/validatableTextField", "vis/verticalFlow"); + "vis/basicColorPicker", "vis/busyBar", "vis/collapsibleWidget", "vis/colorPicker", "vis/draggable", + "vis/dragPane", "vis/fixedSizeGridGroup", "vis/floatingGroup", "vis/formValidator", "vis/gridGroup", + "vis/horizontalFlow", "vis/linkLabel", "vis/listView", "vis/menu", "vis/multiSplitPane", "vis/radioButton", + "vis/separator", "vis/spinner", "vis/tabbedPane", "vis/toast", "vis/tooltip", "vis/validatableTextField", + "vis/verticalFlow"); private static final String MAIN_VIEW_TEMPLATE = "templates/main.lml"; private MainView view; diff --git a/lml-vis/CHANGES.md b/lml-vis/CHANGES.md index f8100221..9ef585d4 100644 --- a/lml-vis/CHANGES.md +++ b/lml-vis/CHANGES.md @@ -2,6 +2,13 @@ Newest change logs are in the `README.md` file. # LML-Vis 1.X +1.4 -> 1.5 + +- As `vertical` style was removed from default skin, `Separator` tag no longer supports `vertical`/`horizontal` attributes. +- `VerticalFlowGroup` and `HorizontalFlowGroup` support. To use these groups in a `dragPane` tag, set `type` attribute to `vFlow` or `hFlow` (as always, case ignored). +- `ListView` support. Now you can display a collection of values in a customized way. Note that currently `ListView` does **NOT** work on GWT due to reflection use in VisUI 1.0.1. It will be fixed in future versions. +- Added `deadzoneRadius` attribute to `draggable` tag. + 1.3 -> 1.4 - Added `SwapListener` to `FixedSizeGridGroup`. Now you can manage (and cancel) swap events without having to modify internal `Draggable` listener. diff --git a/lml-vis/README.md b/lml-vis/README.md index 5308fb08..eecac005 100644 --- a/lml-vis/README.md +++ b/lml-vis/README.md @@ -69,6 +69,10 @@ Note that by making the method static, instance of the class containing the meth Make sure to check `gdx-lml` changes as well! +1.7 -> 1.8 + +- Added support for new VisUI actors: `BusyBar` and `MultiSplitPane`. Usage examples are present in `gdx-lml-vis-tests`. + 1.6 -> 1.7 - Removed `NumberSelector` support, as it is deprecated. Use `Spinner` instead. @@ -93,12 +97,5 @@ Make sure to check `gdx-lml` changes as well! - Now validatable text fields do not have to be direct children of forms - form validators will recursively search through its children and automatically add all validatables to form. - Since tables now are **not** automatically packed, `visTooltip` needs `pack="true"` attribute to properly expand its background over the whole area. This is considered a minor bug and will be fixed in the next version. -1.4 -> 1.5 - -- As `vertical` style was removed from default skin, `Separator` tag no longer supports `vertical`/`horizontal` attributes. -- `VerticalFlowGroup` and `HorizontalFlowGroup` support. To use these groups in a `dragPane` tag, set `type` attribute to `vFlow` or `hFlow` (as always, case ignored). -- `ListView` support. Now you can display a collection of values in a customized way. Note that currently `ListView` does **NOT** work on GWT due to reflection use in VisUI 1.0.1. It will be fixed in future versions. -- Added `deadzoneRadius` attribute to `draggable` tag. - ### Archive Older change logs are available in `CHANGES.md` file. diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java index 0e5fdbc7..822233a3 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java @@ -140,49 +140,7 @@ import com.github.czyzby.lml.vis.parser.impl.attribute.window.CloseOnEscapeLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.window.KeepWithinParentLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.window.OnResultLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.BasicColorPickerLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.CollapsibleWidgetLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.ColorPickerLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.DragPaneLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.DraggableLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.ExtendedColorPickerLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.FloatingGroupLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.FormValidatorLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.GridGroupLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.HorizontalFlowGroupLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.LinkLabelLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.ListViewLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.MenuBarLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.MenuItemLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.MenuLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.MenuPopupLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.MenuSeparatorLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.SeparatorLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.TabLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.TabbedPaneLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.ToastLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VerticalFlowGroupLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisCheckBoxLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisDialogLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisImageButtonLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisImageLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisImageTextButtonLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisLabelLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisListLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisProgressBarLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisRadioButtonLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisScrollPaneLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisSelectBoxLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisSliderLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisSplitPaneLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisTableLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisTextAreaLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisTextButtonLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisTextFieldLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisTooltipLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisTreeLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisValidatableTextFieldLmlTagProvider; -import com.github.czyzby.lml.vis.parser.impl.tag.provider.VisWindowLmlTagProvider; +import com.github.czyzby.lml.vis.parser.impl.tag.provider.*; import com.github.czyzby.lml.vis.parser.impl.tag.provider.spinner.ArraySpinnerLmlTagProvider; import com.github.czyzby.lml.vis.parser.impl.tag.provider.spinner.FloatSpinnerLmlTagProvider; import com.github.czyzby.lml.vis.parser.impl.tag.provider.spinner.IntSpinnerLmlTagProvider; @@ -275,6 +233,7 @@ protected void registerActorTags() { // Vis unique actors: addTagProvider(new BasicColorPickerLmlTagProvider(), "basicColorPicker", "basicPicker"); + addTagProvider(new BusyBarLmlTagProvider(), "busyBar"); addTagProvider(new CollapsibleWidgetLmlTagProvider(), "collapsible", "collapsibleWidget"); addTagProvider(new ColorPickerLmlTagProvider(), "colorPicker"); addTagProvider(new DraggableLmlTagProvider(), "drag", "draggable"); @@ -291,6 +250,7 @@ protected void registerActorTags() { addTagProvider(new MenuLmlTagProvider(), "menu"); addTagProvider(new MenuPopupLmlTagProvider(), "popupMenu", "subMenu"); addTagProvider(new MenuSeparatorLmlTagProvider(), "menuSeparator"); + addTagProvider(new MultiSplitPaneLmlTagProvider(), "multiSplitPane"); addTagProvider(new SeparatorLmlTagProvider(), "separator"); addTagProvider(new TabbedPaneLmlTagProvider(), "tabbedPane"); addTagProvider(new TabLmlTagProvider(), "tab"); diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/BusyBarLmlTag.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/BusyBarLmlTag.java new file mode 100644 index 00000000..b609b458 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/BusyBarLmlTag.java @@ -0,0 +1,23 @@ +package com.github.czyzby.lml.vis.parser.impl.tag; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.AbstractNonParentalActorLmlTag; +import com.github.czyzby.lml.parser.tag.LmlActorBuilder; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.BusyBar; + +/** + * Handles {@link BusyBar} widget. Cannot have children. Mapped to "busyBar". + * @author MJ + */ +public class BusyBarLmlTag extends AbstractNonParentalActorLmlTag { + public BusyBarLmlTag(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + super(parser, parentTag, rawTagData); + } + + @Override + protected Actor getNewInstanceOfActor(LmlActorBuilder builder) { + return new BusyBar(builder.getStyleName()); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/MultiSplitPaneLmlTag.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/MultiSplitPaneLmlTag.java new file mode 100644 index 00000000..267f68e0 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/MultiSplitPaneLmlTag.java @@ -0,0 +1,60 @@ +package com.github.czyzby.lml.vis.parser.impl.tag; + +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.utils.Array; +import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.AbstractActorLmlTag; +import com.github.czyzby.lml.parser.impl.tag.builder.AlignedLmlActorBuilder; +import com.github.czyzby.lml.parser.tag.LmlActorBuilder; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.MultiSplitPane; + +/** + * Handles {@link MultiSplitPane} widget. Can handle any children, converts text between tags to labels. Mapped to + * "multiSplitPane". + * @author MJ + */ +public class MultiSplitPaneLmlTag extends AbstractActorLmlTag { + /** + * {@link MultiSplitPane#addActor(Actor)} is unsupported: actors have to be gathered and set manually. + */ + private final Array children = GdxArrays.newArray(Actor.class); + + public MultiSplitPaneLmlTag(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + super(parser, parentTag, rawTagData); + } + + @Override + protected LmlActorBuilder getNewInstanceOfBuilder() { + return new AlignedLmlActorBuilder(); + } + + /** + * @return stored actor casted for convenience. + */ + public MultiSplitPane getMultiSplitPane() { + return (MultiSplitPane) getActor(); + } + + @Override + protected Actor getNewInstanceOfActor(LmlActorBuilder builder) { + AlignedLmlActorBuilder alignedBuilder = (AlignedLmlActorBuilder) builder; + return new MultiSplitPane(alignedBuilder.isVertical(), builder.getStyleName()); + } + + @Override + protected void handleValidChild(LmlTag childTag) { + children.add(childTag.getActor()); + } + + @Override + protected void handlePlainTextLine(String plainTextLine) { + children.add(toLabel(plainTextLine)); + } + + @Override + protected void doOnTagClose() { + getMultiSplitPane().setWidgets(children.toArray()); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/BusyBarLmlTagProvider.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/BusyBarLmlTagProvider.java new file mode 100644 index 00000000..49ba8079 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/BusyBarLmlTagProvider.java @@ -0,0 +1,17 @@ +package com.github.czyzby.lml.vis.parser.impl.tag.provider; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.parser.tag.LmlTagProvider; +import com.github.czyzby.lml.vis.parser.impl.tag.BusyBarLmlTag; + +/** + * Provides busy bar tags. + * @author MJ + */ +public class BusyBarLmlTagProvider implements LmlTagProvider { + @Override + public LmlTag create(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + return new BusyBarLmlTag(parser, parentTag, rawTagData); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/MultiSplitPaneLmlTagProvider.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/MultiSplitPaneLmlTagProvider.java new file mode 100644 index 00000000..06f49bd2 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/MultiSplitPaneLmlTagProvider.java @@ -0,0 +1,17 @@ +package com.github.czyzby.lml.vis.parser.impl.tag.provider; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.parser.tag.LmlTagProvider; +import com.github.czyzby.lml.vis.parser.impl.tag.MultiSplitPaneLmlTag; + +/** + * Provides multi split pane widget tags. + * @author MJ + */ +public class MultiSplitPaneLmlTagProvider implements LmlTagProvider { + @Override + public LmlTag create(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + return new MultiSplitPaneLmlTag(parser, parentTag, rawTagData); + } +} From a727f0019a75f5305514f9d340dac646ddc77fbe Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 10:47:58 +0200 Subject: [PATCH 39/58] Updated documentation. --- README.md | 2 +- lml-uedi/README.md | 2 +- lml/dtd/README.md | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e9af0031..a0b65054 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ See [examples section](examples) to check out some simple applications using pre ### Other projects Other LibGDX-related projects include: - [gdx-setup](https://github.com/czyzby/gdx-setup): an alternative to the current project generator created using LibGDX and Kotlin. Collaboration with [@kotcrab](https://github.com/kotcrab). -- [ktx](https://github.com/czyzby/ktx): utilities for LibGDX application written in [Kotlin](https://kotlinlang.org/). +- [ktx](https://github.com/czyzby/ktx): utilities for LibGDX application written in [Kotlin](https://kotlinlang.org/). Features a [VisUI](https://github.com/kotcrab/VisEditor/wiki/VisUI) module by [@kotcrab](https://github.com/kotcrab). - [gdx-skins](https://github.com/czyzby/gdx-skins): aims to help beginners with setting up their GUI in LibGDX using *Scene2D*. Contains some free GUI themes. - [Noise4J](https://github.com/czyzby/noise4j): a couple of simple map generators. Written with LibGDX in mind, but the code itself has no dependencies - this is a pure Java 6 library, compatible with GWT. Lightweight. Can be used in pretty much any Java project. - [vis-ui-contrib](https://github.com/kotcrab/vis-ui-contrib): contains some **VisUI** utilities and skins that I've created and made public. Note that the project itself in maintained by [@kotcrab](https://github.com/kotcrab), the creator of **VisUI**. diff --git a/lml-uedi/README.md b/lml-uedi/README.md index 62026a78..b54ac8f2 100644 --- a/lml-uedi/README.md +++ b/lml-uedi/README.md @@ -1,3 +1,3 @@ # Discontinued -This project's aim was to replace [Autumn MVC](../mvc) complexity with a straightforward framework that limits boilerplate to minimum. It's mostly implemented and commented, but I never had the time to finish documentation and prepare example projects. While usable, I doubt I'll ever find the time and patience to finish and improve it, so include it in your project at your own risk. \ No newline at end of file +This project's aim was to replace [Autumn MVC](../mvc) complexity with a straightforward framework that limits boilerplate to minimum. It's mostly implemented and commented, but I never had the time to finish documentation and prepare example projects. While usable, I doubt I'll ever find the time and patience to finish and improve this library, so include it in your project at your own risk. \ No newline at end of file diff --git a/lml/dtd/README.md b/lml/dtd/README.md index 8438dec2..08278379 100644 --- a/lml/dtd/README.md +++ b/lml/dtd/README.md @@ -10,7 +10,7 @@ To make up for the lack of official schema, `Dtd` class is provided: it can gene To generate a *DTD* file, fully create your parser (including the loaded skin!) and pass it to *Dtd* class: -``` +```Java LmlParser parser = Lml.parser(getMySkin()).build(); parser.setStrict(false); // This will prevent some possible exceptions - // DTD schema will contain more tags and attributes. @@ -32,7 +32,7 @@ If you don't want to generate the *DTD* file yourself, try using schemas from th Most modern IDEs will recognize referenced *DTD* files and provide content assist: -``` +```XML @@ -48,7 +48,7 @@ Eclipse is a bit rusty when it comes to *DTD* content assist, but I'm sure you a ## Known issues *XML* files need a single root tag. You can either use a single container actor (like `table` or `window`) or a no-op macro: -``` +```XML @@ -73,7 +73,7 @@ So, why would you even want to use *DTD*? Two words: content assist. And comment There is a number of restricted characters in XML, including `@` - which is used was the macro special character. If you use `1.5` LML version, you have to replace it manually: -``` +```Java LmlParser parser = Lml.parser(getDefaultSkin()).syntax(new DefaultLmlSyntax() { @Override public char getMacroMarker() { @@ -84,7 +84,7 @@ There is a number of restricted characters in XML, including `@` - which is used Note that pre-generated *DTD* files in this folder use `:`, but you might prefer any other valid XML special character, like '.', '-' or '_'. If you use `gdx-lml-vis`, you have to create a custom `VisLmlSyntax` instead: -``` +```Java new VisLmlSyntax() { @Override public char getMacroMarker() { @@ -100,19 +100,19 @@ However, it's pretty easy to migrate to `1.6+`. Provided that you haven't used w DTD schema is pretty straightforward. You can easily append your custom tags and attributes - and I'm not talking only about editing files by hand; I assume you're familiar with string concatenation and `Appendable` interface - you can easily add your custom, hard written lines to the DTD generation script. The generator *might* fail to find some tag, macro or attribute due to various reasons, like internal validation in their classes that prevents from creating mock-up instances needed to generate DTD data. If that's the case, you can always hook up to the generator and append the missing schema data yourself. Adding a new tag that can have any children: -``` +```DTD ``` Adding a list of attributes: -``` +```DTD ``` Adding a single attribute: -``` +```DTD ``` From cca55bf7dffc47a9da12ff745608f8f69cb861cc Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 11:32:53 +0200 Subject: [PATCH 40/58] Implemented style sheets import macro. Close #38 --- .../assets/i18n/bundle.properties | 1 + .../templates/examples/importStyleSheet.lml | 25 ++++++ .../assets/templates/examples/styleSheet.lss | 3 + .../java/com/github/czyzby/tests/Main.java | 4 +- .../czyzby/tests/reflected/MainView.java | 7 ++ .../assets/i18n/bundle.properties | 1 + .../templates/examples/importStyleSheet.lml | 25 ++++++ .../assets/templates/examples/styleSheet.lss | 3 + .../java/com/github/czyzby/tests/Main.java | 4 +- .../czyzby/tests/reflected/MainView.java | 5 ++ lml/README.md | 4 +- .../lml/parser/impl/DefaultLmlSyntax.java | 36 +------- .../czyzby/lml/parser/impl/LssParser.java | 2 +- .../macro/StyleSheetImportLmlMacroTag.java | 82 +++++++++++++++++++ .../StyleSheetImportLmlMacroTagProvider.java | 17 ++++ 15 files changed, 178 insertions(+), 41 deletions(-) create mode 100644 examples/gdx-lml-tests/assets/templates/examples/importStyleSheet.lml create mode 100644 examples/gdx-lml-tests/assets/templates/examples/styleSheet.lss create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/importStyleSheet.lml create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/styleSheet.lss create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleSheetImportLmlMacroTag.java create mode 100644 lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleSheetImportLmlMacroTagProvider.java diff --git a/examples/gdx-lml-tests/assets/i18n/bundle.properties b/examples/gdx-lml-tests/assets/i18n/bundle.properties index 1f0abd4a..623d8d20 100644 --- a/examples/gdx-lml-tests/assets/i18n/bundle.properties +++ b/examples/gdx-lml-tests/assets/i18n/bundle.properties @@ -75,6 +75,7 @@ evaluate=Macro: evaluate exception=Macro: exception forEach=Macro: forEach import=Macro: import +importStyleSheet=Macro: importStyleSheet inputListenerMacro=Macro: inputListener loop=Macro: loop logger=Macro: log diff --git a/examples/gdx-lml-tests/assets/templates/examples/importStyleSheet.lml b/examples/gdx-lml-tests/assets/templates/examples/importStyleSheet.lml new file mode 100644 index 00000000..575ab8e4 --- /dev/null +++ b/examples/gdx-lml-tests/assets/templates/examples/importStyleSheet.lml @@ -0,0 +1,25 @@ + + +<:importStyleSheet>templates/examples/styleSheet.lss + + + + + + + +<:importStyleSheet path="templates/examples/styleSheet.lss" + fileType="Internal"/> + + + +<:evaluate method="clearLss"/> + + \ No newline at end of file diff --git a/examples/gdx-lml-tests/assets/templates/examples/styleSheet.lss b/examples/gdx-lml-tests/assets/templates/examples/styleSheet.lss new file mode 100644 index 00000000..67051f68 --- /dev/null +++ b/examples/gdx-lml-tests/assets/templates/examples/styleSheet.lss @@ -0,0 +1,3 @@ +label { + color: green; +} \ No newline at end of file diff --git a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java index 831f7897..3f00d706 100644 --- a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -46,8 +46,8 @@ public class Main extends AbstractApplicationListener { // Macros: "actorMacro", "anyNotNull", "argument", "argumentReplace", "assign", "calculate", "changeListenerMacro", "clickListenerMacro", "comment", "conditional", "evaluate", "exception", "forEach", "import", - "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", "newTag", "nullCheck", - "random", "style", "tableCell", "tableColumn", "tableRow", "while", + "importStyleSheet", "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", + "newTag", "nullCheck", "random", "style", "tableCell", "tableColumn", "tableRow", "while", // Custom elements: "customAttribute", "customMacro", "customTag"); private static final String MAIN_VIEW_TEMPLATE = "templates/main.lml"; diff --git a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java index b930e240..f2e2d29a 100644 --- a/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java +++ b/examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java @@ -258,4 +258,11 @@ public String toString() { // Printing all example buttons and current playground content: return resultTable + buttonManager.printButtons(); } + + /* templates/examples/importStyleSheet.lml */ + + @LmlAction("clearLss") + public void clearStyleSheets() { + parser.getStyleSheet().clearStyles(); + } } diff --git a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties index 8ad792ff..b616988b 100644 --- a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties +++ b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties @@ -75,6 +75,7 @@ evaluate=Macro: evaluate exception=Macro: exception forEach=Macro: forEach import=Macro: import +importStyleSheet=Macro: importStyleSheet inputListenerMacro=Macro: inputListener loop=Macro: loop logger=Macro: log diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/importStyleSheet.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/importStyleSheet.lml new file mode 100644 index 00000000..8ba6a726 --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/importStyleSheet.lml @@ -0,0 +1,25 @@ + + +<:importStyleSheet>templates/examples/styleSheet.lss + + + + + + + +<:importStyleSheet path="templates/examples/styleSheet.lss" + fileType="Internal"/> + + + +<:evaluate method="clearLss"/> + + \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/styleSheet.lss b/examples/gdx-lml-vis-tests/assets/templates/examples/styleSheet.lss new file mode 100644 index 00000000..f4b9f0ee --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/styleSheet.lss @@ -0,0 +1,3 @@ +label { + color: vis-blue; +} \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java index fcdde8ba..e32702cf 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -52,8 +52,8 @@ public class Main extends AbstractApplicationListener { // Macros: "actorMacro", "anyNotNull", "argument", "argumentReplace", "assign", "calculate", "changeListenerMacro", "clickListenerMacro", "comment", "conditional", "evaluate", "exception", "forEach", "import", - "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", "newTag", "nullCheck", - "random", "style", "tableCell", "tableColumn", "tableRow", "while", + "importStyleSheet", "inputListenerMacro", "loop", "logger", "meta", "nestedForEach", "newAttribute", + "newTag", "nullCheck", "random", "style", "tableCell", "tableColumn", "tableRow", "while", // Custom elements: "customAttribute", "customMacro", "customTag", // Vis unique tags: diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java index f4de1a0b..ec68ee93 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java @@ -427,4 +427,9 @@ public String toString() { // Printing all example buttons and current playground content: return resultTable + buttonManager.printButtons(); } + + @LmlAction("clearLss") + public void clearStyleSheets() { + parser.getStyleSheet().clearStyles(); + } } diff --git a/lml/README.md b/lml/README.md index 67be35aa..fae0b9d7 100644 --- a/lml/README.md +++ b/lml/README.md @@ -37,6 +37,7 @@ If you want to use LML with GWT, you have to add this module to your `GdxDefinit - Added `<:random>` macro, which allows to choose a random value from the passed array. - Added LML style sheets support. See wiki for more info. - Added `<:style>` macro, which allows to set default values of tag attributes at runtime, similarly to LML style sheets. +- Added `<:importStyleSheet>` macro, which allows to import LML style sheet file from within LML templates. - Added missing `programmaticChangeEvents` attribute to all button tags. - Added support for `` pad-related attributes, even when outside of `` tag. - `SelectBox` instances now can store any type of objects. @@ -44,12 +45,11 @@ If you want to use LML with GWT, you have to add this module to your `GdxDefinit 1.6 -> 1.7 - A new mechanism - isolation - was introduced through `` tag. Isolated actors are parsed along with the rest of the templates, but are not immediately added to stage or they tag parents. This basically allows to create actors with LML without adding them to the stage - something that previously wasn't achievable with `fillStage` or `createView` methods. `ActorStorage` is an `Actor` extension that keeps track of a list of actors, but does not draw them in any way: this actor is used internally by isolation tags and can be injected if you want to access the list of its parsed children actors. -- `Lml#EXTRACT_UNANNOTATED_METHODS` setting added. When this is set to `false`, `ActionContainer` methods and fields that are **not** annotated with `@LmlAction` will not be available in LML templates. Defaults to `true`, but if you consequently annotate methods and fields that are accessed by LML actors, you should consider setting this value to `false`, as it will considerable speed up method look-up time. +- `Lml#EXTRACT_UNANNOTATED_METHODS` setting added. When this is set to `false`, `ActionContainer` methods and fields that are **not** annotated with `@LmlAction` will not be available in LML templates. Defaults to `true`, but if you consequently annotate methods and fields that are accessed by LML actors, you should consider setting this value to `false`, as it will considerably speed up method look-up time. - `DefaultLmlSyntax.INSTANCE` was removed. It was entirely unnecessary when using a different syntax, like `VisLmlSyntax`. - `DefaultLmlSyntax` now extends `EmptyLmlSyntax`. `EmptyLmlSyntax` implements all `LmlSyntax` interface methods and manages all tag, attribute and macro mechanisms internally, but registers no tags or attributes on its own. This can be a very useful utility class if you want to manually choose which tags, macros and attributes should be supported. - Added conditions evaluating in arguments, similarly to how you can evaluate equations `{=likeThis}`. Using this syntax: `{? condition ? onTrue : onFalse}`, you can process simple conditions anywhere in the code. See new condition syntax examples in `gdx-lml-tests` and `gdx-lml-vis-tests` projects. - Added `:cell` macro. Adds an empty cell to the chosen table and allows to parse any cell attributes. Useful if you need to preserve a certain table layout, but do not want to create unnecessary mock-up actors with the sole purpose to fill a cell. - ### Archive Older change logs are available in `CHANGES.md` file. diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java index 52e391c5..764d2883 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/DefaultLmlSyntax.java @@ -255,40 +255,7 @@ import com.github.czyzby.lml.parser.impl.tag.listener.provider.ChangeListenerLmlTagProvider; import com.github.czyzby.lml.parser.impl.tag.listener.provider.ClickListenerLmlTagProvider; import com.github.czyzby.lml.parser.impl.tag.listener.provider.InputListenerLmlTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ActorLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.AnyNotNullLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ArgumentLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ArgumentReplacementLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.AssignLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.CalculationLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ChangeListenerLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ClickListenerLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.CommentLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ConditionalLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.EvaluateLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ExceptionLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ForEachLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ImportAbsoluteLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ImportClasspathLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ImportExternallLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ImportInternalLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.ImportLocalLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.InputListenerLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.LoggerDebugLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.LoggerErrorLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.LoggerInfoLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.LoopLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.MetaLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.NestedForEachLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.NewAttributeLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.NewTagLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.NullCheckLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.RandomLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.StyleLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableCellLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableColumnLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.TableRowLmlMacroTagProvider; -import com.github.czyzby.lml.parser.impl.tag.macro.provider.WhileLmlMacroTagProvider; +import com.github.czyzby.lml.parser.impl.tag.macro.provider.*; import com.github.czyzby.lml.parser.tag.LmlAttribute; /** Represents default LML syntax. This class can be overridden to change some parts of LML syntax; note that core LML @@ -392,6 +359,7 @@ protected void registerMacroTags() { addMacroTagProvider(new NullCheckLmlMacroTagProvider(), "notNull", "ifNotNull", "exists"); addMacroTagProvider(new RandomLmlMacroTagProvider(), "random"); addMacroTagProvider(new StyleLmlMacroTagProvider(), "style"); + addMacroTagProvider(new StyleSheetImportLmlMacroTagProvider(), "importStyleSheet"); addMacroTagProvider(new TableCellLmlMacroTagProvider(), "cell", "tableCell"); addMacroTagProvider(new TableColumnLmlMacroTagProvider(), "column", "tableColumn"); addMacroTagProvider(new TableRowLmlMacroTagProvider(), "row", "tableRow"); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java index f91f9a88..ff83fc60 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/LssParser.java @@ -41,7 +41,7 @@ public class LssParser { public LssParser(final LmlParser parser) { this.parser = parser; styleSheet = parser.getStyleSheet(); - reader = parser.getTemplateReader(); + reader = new DefaultLmlTemplateReader(); final LssSyntax syntax = parser.getSyntax().getLssSyntax(); inheritanceMarker = syntax.getInheritanceMarker(); blockOpening = syntax.getBlockOpening(); diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleSheetImportLmlMacroTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleSheetImportLmlMacroTag.java new file mode 100644 index 00000000..ab71c5f1 --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/StyleSheetImportLmlMacroTag.java @@ -0,0 +1,82 @@ +package com.github.czyzby.lml.parser.impl.tag.macro; + +import com.badlogic.gdx.Files; +import com.badlogic.gdx.Gdx; +import com.github.czyzby.kiwi.util.common.Strings; +import com.github.czyzby.kiwi.util.gdx.collection.GdxArrays; +import com.github.czyzby.kiwi.util.gdx.collection.GdxMaps; +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.AbstractMacroLmlTag; +import com.github.czyzby.lml.parser.tag.LmlTag; + +/** + * Style sheet import macros allow to import LML style sheet files inside LML templates. + *
+ *
+ * <:importStyleSheet file.lss />
+ * <:importStyleSheet> file.lss </:importStyleSheet>
+ * 
+ *
+ * Import macro can be also used with named parameters: + *
+ *
+ * <:importStyleSheet path="file.lss" fileType="Internal" />
+ * 
+ *
+ * @author MJ + */ +public class StyleSheetImportLmlMacroTag extends AbstractMacroLmlTag { + /** Optional name of the first attribute. Path to the imported style sheet. */ + public static final String PATH_ATTRIBUTE = "path"; + /** Optional name of the second attribute. Determines file handle type. */ + public static final String FILE_TYPE_ATTRIBUTE = "filetype"; + + private String path; + + public StyleSheetImportLmlMacroTag(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + super(parser, parentTag, rawTagData); + } + + @Override + public void handleDataBetweenTags(CharSequence rawData) { + if (Strings.isNotWhitespace(rawData)) { + path = rawData.toString().trim(); + } + } + + @Override + public void closeTag() { + getParser().parseStyleSheet(Gdx.files.getFileHandle(getStyleSheetFileName(), getFileType())); + } + + /** @return attribute with the name of the style sheet file. */ + protected String getStyleSheetFileName() { + if (hasAttribute(PATH_ATTRIBUTE)) { + return getAttribute(PATH_ATTRIBUTE); + } else if (path != null) { + return path; + } else if (GdxMaps.isNotEmpty(getNamedAttributes())) { + getParser().throwError( + "Import macro has to have a 'path' attribute. Attributes found: " + getNamedAttributes()); + } else if (GdxArrays.isEmpty(getAttributes())) { + getParser().throwError("Import macro has to have at least one argument: path to the imported style sheet."); + } + return getAttributes().get(0); + } + + protected Files.FileType getFileType() { + if (hasAttribute(FILE_TYPE_ATTRIBUTE)) { + try { + return Files.FileType.valueOf(getAttribute(FILE_TYPE_ATTRIBUTE)); + } catch (Exception exception) { + getParser().throwErrorIfStrict("Invalid file type.", exception); + } + } + return Files.FileType.Internal; + } + + @Override + public String[] getExpectedAttributes() { + return new String[] { PATH_ATTRIBUTE, FILE_TYPE_ATTRIBUTE }; + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleSheetImportLmlMacroTagProvider.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleSheetImportLmlMacroTagProvider.java new file mode 100644 index 00000000..ed1f7796 --- /dev/null +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/macro/provider/StyleSheetImportLmlMacroTagProvider.java @@ -0,0 +1,17 @@ +package com.github.czyzby.lml.parser.impl.tag.macro.provider; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.macro.StyleSheetImportLmlMacroTag; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.parser.tag.LmlTagProvider; + +/** + * Provides LML style sheet importing macro tags. + * @author MJ + */ +public class StyleSheetImportLmlMacroTagProvider implements LmlTagProvider { + @Override + public LmlTag create(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + return new StyleSheetImportLmlMacroTag(parser, parentTag, rawTagData); + } +} From 655dce9e55e200aa9a222e6e6ccd66f6346aadde Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 11:57:48 +0200 Subject: [PATCH 41/58] Added new FileChooser attributes. #28 --- lml-vis/README.md | 1 + .../parser/impl/nongwt/ExtendedVisLml.java | 21 +++------- .../file/FileSortingLmlAttribute.java | 42 +++++++++++++++++++ .../file/FileSortingOrderLmlAttribute.java | 22 ++++++++++ ...FocusFileScrollPaneOnShowLmlAttribute.java | 23 ++++++++++ .../file/SaveLastDirectoryLmlAttribute.java | 23 ++++++++++ .../file/SelectionModeLmlAttribute.java | 2 +- 7 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingLmlAttribute.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingOrderLmlAttribute.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FocusFileScrollPaneOnShowLmlAttribute.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SaveLastDirectoryLmlAttribute.java diff --git a/lml-vis/README.md b/lml-vis/README.md index eecac005..674d1fed 100644 --- a/lml-vis/README.md +++ b/lml-vis/README.md @@ -72,6 +72,7 @@ Make sure to check `gdx-lml` changes as well! 1.7 -> 1.8 - Added support for new VisUI actors: `BusyBar` and `MultiSplitPane`. Usage examples are present in `gdx-lml-vis-tests`. +- Added `sorting`, `sortingOrderAscending`, `saveLastDirectory` and `focusFileScrollPaneOnShow` attributes to `FileChooser` tag accessible through `ExtendedVisLml`. 1.6 -> 1.7 diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/ExtendedVisLml.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/ExtendedVisLml.java index 1d916d0b..08c8dbc8 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/ExtendedVisLml.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/ExtendedVisLml.java @@ -2,22 +2,7 @@ import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.LmlSyntax; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.AnyFileChooserLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.DirectoryChooserLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.DirectoryLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.FavoriteFolderButtonVisibleLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.FileChooserListenerLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.FileChooserLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.FileDeleterLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.FileFilterLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.FileTypeFilterLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.GroupMultiSelectKeyLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.IconProviderLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.ModeLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.MultiSelectKeyLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.PreferencesNameLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.SelectionModeLmlAttribute; -import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.WatchFilesLmlAttribute; +import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file.*; import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.validator.ErrorIfRelativeEmptyLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.validator.FileExistsLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.validator.RelativeToFileLmlAttribute; @@ -59,12 +44,16 @@ public static void registerFileChooser(final LmlSyntax syntax) { syntax.addAttributeProcessor(new FileChooserListenerLmlAttribute(), "listener", "fileChooserListener"); syntax.addAttributeProcessor(new FileDeleterLmlAttribute(), "fileDeleter"); syntax.addAttributeProcessor(new FileFilterLmlAttribute(), "fileFilter"); + syntax.addAttributeProcessor(new FileSortingLmlAttribute(), "sorting"); + syntax.addAttributeProcessor(new FileSortingOrderLmlAttribute(), "sortingOrderAscending"); syntax.addAttributeProcessor(new FileTypeFilterLmlAttribute(), "fileTypeFilter"); + syntax.addAttributeProcessor(new FocusFileScrollPaneOnShowLmlAttribute(), "focusFileScrollPaneOnShow"); syntax.addAttributeProcessor(new GroupMultiSelectKeyLmlAttribute(), "groupMultiSelectKey"); syntax.addAttributeProcessor(new IconProviderLmlAttribute(), "iconProvider"); syntax.addAttributeProcessor(new ModeLmlAttribute(), "mode"); syntax.addAttributeProcessor(new MultiSelectKeyLmlAttribute(), "multiSelectKey"); syntax.addAttributeProcessor(new PreferencesNameLmlAttribute(), "prefsName"); + syntax.addAttributeProcessor(new SaveLastDirectoryLmlAttribute(), "saveLastDirectory"); syntax.addAttributeProcessor(new SelectionModeLmlAttribute(), "selectionMode", "select"); syntax.addAttributeProcessor(new WatchFilesLmlAttribute(), "watchingFilesEnabled", "watchFiles", "watch"); // Note: FileChooser#addFavorite(FileHandle) is not supported through LML attributes; this is a design choice, diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingLmlAttribute.java new file mode 100644 index 00000000..b51e57d6 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingLmlAttribute.java @@ -0,0 +1,42 @@ +package com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlAttribute; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.file.FileChooser; + +/** + * See {@link FileChooser#setSorting(FileChooser.FileSorting)}. Expects a name of {@link FileChooser.FileSorting} enum + * instance. Mapped to "sorting". + * @author MJ + */ +public class FileSortingLmlAttribute implements LmlAttribute { + @Override + public Class getHandledType() { + return FileChooser.class; + } + + @Override + public void process(LmlParser parser, LmlTag tag, FileChooser fileChooser, String rawAttributeData) { + fileChooser.setSorting(determineSorting(parser, fileChooser, rawAttributeData)); + } + + /** + * @param parser parses the tag. + * @param actor needs a sorting mode. + * @param rawAttributeData unparsed attribute's value. + * @return chosen {@link FileChooser.FileSorting}. Throws exception if ID not valid and parser is strict; returns + * default value if parser not strict. + */ + protected FileChooser.FileSorting determineSorting(final LmlParser parser, final FileChooser actor, + final String rawAttributeData) { + final String modeName = parser.parseString(rawAttributeData, actor).trim().toUpperCase(); + try { + return FileChooser.FileSorting.valueOf(modeName); + } catch (final Exception exception) { + // Unknown ID. + parser.throwErrorIfStrict("Unable to determine sorting mode with data: " + rawAttributeData, exception); + } + return FileChooser.FileSorting.NAME; + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingOrderLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingOrderLmlAttribute.java new file mode 100644 index 00000000..b6763059 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FileSortingOrderLmlAttribute.java @@ -0,0 +1,22 @@ +package com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlAttribute; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.file.FileChooser; + +/** + * See {@link FileChooser#setSortingOrderAscending(boolean)}. Expects a boolean. Mapped to "sortingOrderAscending". + * @author MJ + */ +public class FileSortingOrderLmlAttribute implements LmlAttribute { + @Override + public Class getHandledType() { + return FileChooser.class; + } + + @Override + public void process(LmlParser parser, LmlTag tag, FileChooser fileChooser, String rawAttributeData) { + fileChooser.setSortingOrderAscending(parser.parseBoolean(rawAttributeData, fileChooser)); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FocusFileScrollPaneOnShowLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FocusFileScrollPaneOnShowLmlAttribute.java new file mode 100644 index 00000000..23fca836 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/FocusFileScrollPaneOnShowLmlAttribute.java @@ -0,0 +1,23 @@ +package com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlAttribute; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.file.FileChooser; + +/** + * See {@link FileChooser#focusFileScrollPaneOnShow}. Expects a boolean. Mapped to "focusFileScrollPaneOnShow". Note + * that this setting is static (global). + * @author MJ + */ +public class FocusFileScrollPaneOnShowLmlAttribute implements LmlAttribute { + @Override + public Class getHandledType() { + return FileChooser.class; + } + + @Override + public void process(LmlParser parser, LmlTag tag, FileChooser fileChooser, String rawAttributeData) { + FileChooser.focusFileScrollPaneOnShow = parser.parseBoolean(rawAttributeData, fileChooser); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SaveLastDirectoryLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SaveLastDirectoryLmlAttribute.java new file mode 100644 index 00000000..91ea5e20 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SaveLastDirectoryLmlAttribute.java @@ -0,0 +1,23 @@ +package com.github.czyzby.lml.vis.parser.impl.nongwt.attribute.file; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlAttribute; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.file.FileChooser; + +/** + * See {@link FileChooser#setSaveLastDirectory(boolean)}. Expects a boolean. Mapped to "saveLastDirectory". Note that + * this setting is static (global). + * @author MJ + */ +public class SaveLastDirectoryLmlAttribute implements LmlAttribute { + @Override + public Class getHandledType() { + return FileChooser.class; + } + + @Override + public void process(LmlParser parser, LmlTag tag, FileChooser fileChooser, String rawAttributeData) { + FileChooser.setSaveLastDirectory(parser.parseBoolean(rawAttributeData, fileChooser)); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SelectionModeLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SelectionModeLmlAttribute.java index ca3d0bf7..a6c646dd 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SelectionModeLmlAttribute.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/nongwt/attribute/file/SelectionModeLmlAttribute.java @@ -29,7 +29,7 @@ public void process(final LmlParser parser, final LmlTag tag, final FileChooser * value if parser not strict. */ protected SelectionMode determineMode(final LmlParser parser, final FileChooser actor, final String rawAttributeData) { - final String modeName = parser.parseString(rawAttributeData, actor).toUpperCase(); + final String modeName = parser.parseString(rawAttributeData, actor).trim().toUpperCase(); try { return SelectionMode.valueOf(modeName); } catch (final Exception exception) { From aad5fe894e2d150bd9e5ff3fc03dcd4539c02167 Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 13:48:53 +0200 Subject: [PATCH 42/58] Added menu listener attributes. #28 --- lml-vis/README.md | 1 + .../lml/vis/parser/impl/VisLmlSyntax.java | 6 ++++ .../menu/MenuBarListenerLmlAttribute.java | 35 +++++++++++++++++++ .../menu/PopupMenuListenerLmlAttribute.java | 33 +++++++++++++++++ .../parser/impl/tag/AbstractActorLmlTag.java | 9 +++-- 5 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/MenuBarListenerLmlAttribute.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/PopupMenuListenerLmlAttribute.java diff --git a/lml-vis/README.md b/lml-vis/README.md index 674d1fed..85eb657c 100644 --- a/lml-vis/README.md +++ b/lml-vis/README.md @@ -73,6 +73,7 @@ Make sure to check `gdx-lml` changes as well! - Added support for new VisUI actors: `BusyBar` and `MultiSplitPane`. Usage examples are present in `gdx-lml-vis-tests`. - Added `sorting`, `sortingOrderAscending`, `saveLastDirectory` and `focusFileScrollPaneOnShow` attributes to `FileChooser` tag accessible through `ExtendedVisLml`. +- Added `menuListener` attribute to `menuBar`, `popupMenu` and `menu` tags. 1.6 -> 1.7 diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java index 822233a3..eeef9a13 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java @@ -80,8 +80,10 @@ import com.github.czyzby.lml.vis.parser.impl.attribute.listview.FooterLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.listview.HeaderLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.listview.ItemClickListenerLmlAttribute; +import com.github.czyzby.lml.vis.parser.impl.attribute.menu.MenuBarListenerLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.menu.MenuItemGenerateDisabledImageLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.menu.MenuItemShortcutLmlAttribute; +import com.github.czyzby.lml.vis.parser.impl.attribute.menu.PopupMenuListenerLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.picker.CloseAfterPickingLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.picker.ColorPickerListenerLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.picker.ColorPickerResponsiveListenerLmlAttribute; @@ -486,6 +488,10 @@ protected void registerGridGroupAttributes() { /** Menu-related attributes. */ protected void registerMenuAttributes() { + // PopupMenu: + addAttributeProcessor(new PopupMenuListenerLmlAttribute(), "menuListener"); + // MenuBar: + addAttributeProcessor(new MenuBarListenerLmlAttribute(), "menuListener"); // MenuItem: addAttributeProcessor(new MenuItemGenerateDisabledImageLmlAttribute(), "generateDisabled"); addAttributeProcessor(new MenuItemShortcutLmlAttribute(), "shortcut"); diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/MenuBarListenerLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/MenuBarListenerLmlAttribute.java new file mode 100644 index 00000000..2874122e --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/MenuBarListenerLmlAttribute.java @@ -0,0 +1,35 @@ +package com.github.czyzby.lml.vis.parser.impl.attribute.menu; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.action.ActorConsumer; +import com.github.czyzby.lml.parser.tag.LmlAttribute; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.Menu; +import com.kotcrab.vis.ui.widget.MenuBar; +import com.kotcrab.vis.ui.widget.PopupMenu; + +/** + * See {@link MenuBar#setMenuListener(MenuBar.MenuBarListener)}. Expects ID of an action that returns + * {@link MenuBar.MenuBarListener} instance. Mapped to "menuListener". + * @author MJ + */ +public class MenuBarListenerLmlAttribute implements LmlAttribute { + @Override + public Class getHandledType() { + return MenuBar.class; + } + + @Override + public void process(LmlParser parser, LmlTag tag, MenuBar menuBar, String rawAttributeData) { + @SuppressWarnings("unchecked") + final ActorConsumer action = (ActorConsumer) parser + .parseAction(rawAttributeData, menuBar); + if (action == null) { + parser.throwErrorIfStrict( + "Menu bar listener attribute expects an action that returns MenuBarListener. Method not found for ID: " + + rawAttributeData); + return; + } + menuBar.setMenuListener(action.consume(menuBar)); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/PopupMenuListenerLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/PopupMenuListenerLmlAttribute.java new file mode 100644 index 00000000..69a1a42a --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/menu/PopupMenuListenerLmlAttribute.java @@ -0,0 +1,33 @@ +package com.github.czyzby.lml.vis.parser.impl.attribute.menu; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.action.ActorConsumer; +import com.github.czyzby.lml.parser.tag.LmlAttribute; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.widget.PopupMenu; + +/** + * See {@link PopupMenu#setListener(PopupMenu.PopupMenuListener)}. Expects ID of an action that returns + * {@link com.kotcrab.vis.ui.widget.PopupMenu.PopupMenuListener} instance. Mapped to "menuListener". + * @author MJ + */ +public class PopupMenuListenerLmlAttribute implements LmlAttribute { + @Override + public Class getHandledType() { + return PopupMenu.class; + } + + @Override + public void process(LmlParser parser, LmlTag tag, PopupMenu popupMenu, String rawAttributeData) { + @SuppressWarnings("unchecked") + final ActorConsumer action = (ActorConsumer) parser + .parseAction(rawAttributeData, popupMenu); + if (action == null) { + parser.throwErrorIfStrict( + "Popup menu listener attribute expects an action that returns PopupMenuListener. Method not found for ID: " + + rawAttributeData); + return; + } + popupMenu.setListener(action.consume(popupMenu)); + } +} diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java index 36f313ac..014ec1bc 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/AbstractActorLmlTag.java @@ -47,8 +47,10 @@ protected Actor prepareActor() { builder.finishBuilding(actor); if (actor != null) { processTagAttributes(processedAttributes, actor); - } else { - processNonActorTagAttributes(processedAttributes, getManagedObject()); + } + Object managedObject = getManagedObject(); + if (managedObject != null && actor != managedObject) { + processNonActorTagAttributes(processedAttributes, managedObject); } invokeOnCreateActions(actor); return actor; @@ -119,7 +121,8 @@ private void processTagAttributes(final ObjectSet processedAttributes, f // the same parsing behavior. } // Processing own attributes. Throwing errors for unknown: - LmlUtilities.processAttributes(actor, this, getParser(), processedAttributes, true); + boolean throwErrors = getManagedObject() == null || actor == getManagedObject(); + LmlUtilities.processAttributes(actor, this, getParser(), processedAttributes, throwErrors); } private void processComponentAttributes(final ObjectSet processedAttributes, final Actor actor) { From 0ce63f411e3fa2ec6633961f8d5049f794a3bf66 Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 16:18:36 +0200 Subject: [PATCH 43/58] Added support for ScrollableTextArea. #28 --- .../assets/i18n/bundle.properties | 1 + .../examples/vis/scrollableTextArea.lml | 19 ++++++++++++++ .../java/com/github/czyzby/tests/Main.java | 4 +-- lml-vis/README.md | 2 +- .../lml/vis/parser/impl/VisLmlSyntax.java | 1 + .../impl/tag/ScrollableTextAreaLmlTag.java | 26 +++++++++++++++++++ .../ScrollableTextAreaLmlTagProvider.java | 17 ++++++++++++ 7 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/vis/scrollableTextArea.lml create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ScrollableTextAreaLmlTag.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/ScrollableTextAreaLmlTagProvider.java diff --git a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties index b616988b..2fbd6729 100644 --- a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties +++ b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties @@ -112,6 +112,7 @@ vis/listView=Vis: listView vis/menu=Vis: menu vis/multiSplitPane=Vis: multiSplitPane vis/radioButton=Vis: radioButton +vis/scrollableTextArea=Vis: scrollableTextArea vis/separator=Vis: separator vis/spinner=Vis: spinner vis/tabbedPane=Vis: tabbedPane diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/vis/scrollableTextArea.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/scrollableTextArea.lml new file mode 100644 index 00000000..06a149b1 --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/scrollableTextArea.lml @@ -0,0 +1,19 @@ + + +
+ + + Converts text + between tags + into content. + A + B + C + D + E + + +
diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java index e32702cf..b6d8a195 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -60,8 +60,8 @@ public class Main extends AbstractApplicationListener { "vis/basicColorPicker", "vis/busyBar", "vis/collapsibleWidget", "vis/colorPicker", "vis/draggable", "vis/dragPane", "vis/fixedSizeGridGroup", "vis/floatingGroup", "vis/formValidator", "vis/gridGroup", "vis/horizontalFlow", "vis/linkLabel", "vis/listView", "vis/menu", "vis/multiSplitPane", "vis/radioButton", - "vis/separator", "vis/spinner", "vis/tabbedPane", "vis/toast", "vis/tooltip", "vis/validatableTextField", - "vis/verticalFlow"); + "vis/scrollableTextArea", "vis/separator", "vis/spinner", "vis/tabbedPane", "vis/toast", "vis/tooltip", + "vis/validatableTextField", "vis/verticalFlow"); private static final String MAIN_VIEW_TEMPLATE = "templates/main.lml"; private MainView view; diff --git a/lml-vis/README.md b/lml-vis/README.md index 85eb657c..bdbfe6cc 100644 --- a/lml-vis/README.md +++ b/lml-vis/README.md @@ -71,7 +71,7 @@ Make sure to check `gdx-lml` changes as well! 1.7 -> 1.8 -- Added support for new VisUI actors: `BusyBar` and `MultiSplitPane`. Usage examples are present in `gdx-lml-vis-tests`. +- Added support for new VisUI actors: `BusyBar`, `MultiSplitPane` and `ScrollableTextArea`. Usage examples are present in `gdx-lml-vis-tests`. - Added `sorting`, `sortingOrderAscending`, `saveLastDirectory` and `focusFileScrollPaneOnShow` attributes to `FileChooser` tag accessible through `ExtendedVisLml`. - Added `menuListener` attribute to `menuBar`, `popupMenu` and `menu` tags. diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java index eeef9a13..a528fe73 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java @@ -253,6 +253,7 @@ protected void registerActorTags() { addTagProvider(new MenuPopupLmlTagProvider(), "popupMenu", "subMenu"); addTagProvider(new MenuSeparatorLmlTagProvider(), "menuSeparator"); addTagProvider(new MultiSplitPaneLmlTagProvider(), "multiSplitPane"); + addTagProvider(new ScrollableTextAreaLmlTagProvider(), "scrollableTextArea"); addTagProvider(new SeparatorLmlTagProvider(), "separator"); addTagProvider(new TabbedPaneLmlTagProvider(), "tabbedPane"); addTagProvider(new TabLmlTagProvider(), "tab"); diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ScrollableTextAreaLmlTag.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ScrollableTextAreaLmlTag.java new file mode 100644 index 00000000..7631464f --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ScrollableTextAreaLmlTag.java @@ -0,0 +1,26 @@ +package com.github.czyzby.lml.vis.parser.impl.tag; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.builder.TextLmlActorBuilder; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.util.LmlUtilities; +import com.kotcrab.vis.ui.widget.ScrollableTextArea; +import com.kotcrab.vis.ui.widget.VisTextField; + +/** + * Manages {@link ScrollableTextArea} widgets. Converts text between tags into text area content. Compatible with + * scroll pane widgets. Mapped to "scrollableTextArea" + * @author MJ + */ +public class ScrollableTextAreaLmlTag extends VisTextAreaLmlTag { + public ScrollableTextAreaLmlTag(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + super(parser, parentTag, rawTagData); + } + + @Override + protected VisTextField getNewInstanceOfTextField(TextLmlActorBuilder textBuilder) { + final ScrollableTextArea textArea = new ScrollableTextArea(textBuilder.getText(), textBuilder.getStyleName()); + LmlUtilities.getLmlUserObject(textArea).setData(Boolean.TRUE); // Setting as multiline by default. + return textArea; + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/ScrollableTextAreaLmlTagProvider.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/ScrollableTextAreaLmlTagProvider.java new file mode 100644 index 00000000..3abab4ef --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/ScrollableTextAreaLmlTagProvider.java @@ -0,0 +1,17 @@ +package com.github.czyzby.lml.vis.parser.impl.tag.provider; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.parser.tag.LmlTagProvider; +import com.github.czyzby.lml.vis.parser.impl.tag.ScrollableTextAreaLmlTag; + +/** + * Provides scrollable text area widget tags. + * @author MJ + */ +public class ScrollableTextAreaLmlTagProvider implements LmlTagProvider { + @Override + public LmlTag create(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + return new ScrollableTextAreaLmlTag(parser, parentTag, rawTagData); + } +} From fc734422749a418c67798efb851119205fee3ee4 Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 16:28:11 +0200 Subject: [PATCH 44/58] Updated fast-classpath-scanner to 2.0.4. Close #43 --- autumn/natives/fcs/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autumn/natives/fcs/build.gradle b/autumn/natives/fcs/build.gradle index 001a8e86..bc49c6d8 100644 --- a/autumn/natives/fcs/build.gradle +++ b/autumn/natives/fcs/build.gradle @@ -1,5 +1,5 @@ ext { - fcsVersion = '2.0.1' + fcsVersion = '2.0.4' } dependencies { From 6b1773741eefb89ae8ae7afdacc90a76a6e3a19d Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 17:52:45 +0200 Subject: [PATCH 45/58] Fixed managed objects in tags. Close #44 --- .../lml/vis/parser/impl/tag/ListViewLmlTag.java | 8 ++++---- .../lml/vis/parser/impl/tag/TabLmlTag.java | 16 +++++++++++----- .../vis/parser/impl/tag/TabbedPaneLmlTag.java | 5 +++-- .../parser/impl/tag/actor/ButtonGroupLmlTag.java | 8 ++++++-- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ListViewLmlTag.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ListViewLmlTag.java index 6977e9a0..3f7c0a0e 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ListViewLmlTag.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/ListViewLmlTag.java @@ -41,6 +41,8 @@ * * @author MJ */ public class ListViewLmlTag extends TableLmlTag { + private ListView listView; + public ListViewLmlTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { super(parser, parentTag, rawTagData); } @@ -53,7 +55,7 @@ protected ListViewLmlActorBuilder getNewInstanceOfBuilder() { @Override protected Table getNewInstanceOfActor(final LmlActorBuilder builder) { final ListAdapter listAdapter = extractListAdapter((ListViewLmlActorBuilder) builder); - final ListView listView = createListView(listAdapter); + listView = createListView(listAdapter); LmlUtilities.getLmlUserObject(listView.getMainTable()).setData(listView); listView.setUpdatePolicy(UpdatePolicy.MANUAL); // Prevents the table from being rebuilt during creation. return listView.getMainTable(); @@ -62,7 +64,7 @@ protected Table getNewInstanceOfActor(final LmlActorBuilder builder) { /** @return managed {@link ListView}. */ @Override public Object getManagedObject() { - return ((ListViewTable) getActor()).getListView(); + return listView; } /** @param listAdapter converts data to views. @@ -87,7 +89,6 @@ protected Actor createView(final Actor item) { @Override @SuppressWarnings("unchecked") protected void addChild(final Actor actor) { - final ListView listView = ((ListViewTable) getActor()).getListView(); if (listView.getFooter() == actor || listView.getHeader() == actor) { return; } @@ -106,7 +107,6 @@ protected boolean hasComponentActors() { @Override protected Actor[] getComponentActors(final Actor actor) { - final ListView listView = ((ListViewTable) actor).getListView(); return new Actor[] { listView.getScrollPane() }; } diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabLmlTag.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabLmlTag.java index 3b5730e2..78ad29de 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabLmlTag.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabLmlTag.java @@ -6,12 +6,16 @@ import com.github.czyzby.lml.parser.tag.LmlActorBuilder; import com.github.czyzby.lml.parser.tag.LmlTag; import com.github.czyzby.lml.vis.ui.VisTabTable; +import com.kotcrab.vis.ui.widget.tabbedpane.Tab; -/** Manages an instance of {@link com.kotcrab.vis.ui.widget.tabbedpane.Tab} through specialized table extension: +/** + * Manages an instance of {@link com.kotcrab.vis.ui.widget.tabbedpane.Tab} through specialized table extension: * {@link VisTabTable}. Handles children like a regular table tag. Mapped to "tab". - * - * @author MJ */ + * @author MJ + */ public class TabLmlTag extends VisTableLmlTag { + private Tab tab; + public TabLmlTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { super(parser, parentTag, rawTagData); if (!(parentTag instanceof TabbedPaneLmlTag)) { @@ -26,12 +30,14 @@ protected LmlActorBuilder getNewInstanceOfBuilder() { @Override protected Actor getNewInstanceOfActor(final LmlActorBuilder builder) { - return new VisTabTable(((TextLmlActorBuilder) builder).getText()); + VisTabTable tabTable = new VisTabTable(((TextLmlActorBuilder) builder).getText()); + tab = tabTable.getTab(); + return tabTable; } /** @return {@link com.kotcrab.vis.ui.widget.tabbedpane.Tab} instance managed by the {@link VisTabTable}. */ @Override public Object getManagedObject() { - return ((VisTabTable) getActor()).getTab(); + return tab; } } diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabbedPaneLmlTag.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabbedPaneLmlTag.java index 10e2c76e..7b1eded0 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabbedPaneLmlTag.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/TabbedPaneLmlTag.java @@ -34,6 +34,7 @@ * @author MJ * @see #getContentTable(TabbedPane) */ public class TabbedPaneLmlTag extends AbstractActorLmlTag { + private TabbedPane tabbedPane; private boolean attachDefaultListener = true; private ActorConsumer showActionProvider; private ActorConsumer hideActionProvider; @@ -44,7 +45,7 @@ public TabbedPaneLmlTag(final LmlParser parser, final LmlTag parentTag, final St @Override protected Actor getNewInstanceOfActor(final LmlActorBuilder builder) { - final TabbedPane tabbedPane = new TabbedPane(builder.getStyleName()); + tabbedPane = new TabbedPane(builder.getStyleName()); final TabbedPaneTable mainTable = tabbedPane.getTable(); // TabbedPane will be accessible through LmlUserObject#getData(). This disables oneColumn attribute, though. LmlUtilities.getLmlUserObject(mainTable).setData(tabbedPane); @@ -71,7 +72,7 @@ protected TabbedPane getTabbedPane() { /** @return managed {@link TabbedPane} instance. */ @Override public Object getManagedObject() { - return getTable().getTabbedPane(); + return tabbedPane; } /** @param mainTable main table of {@link TabbedPane}. */ diff --git a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/actor/ButtonGroupLmlTag.java b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/actor/ButtonGroupLmlTag.java index a3d12d02..7949fa26 100644 --- a/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/actor/ButtonGroupLmlTag.java +++ b/lml/src/main/java/com/github/czyzby/lml/parser/impl/tag/actor/ButtonGroupLmlTag.java @@ -1,6 +1,7 @@ package com.github.czyzby.lml.parser.impl.tag.actor; import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup; import com.github.czyzby.lml.parser.LmlParser; import com.github.czyzby.lml.parser.tag.LmlActorBuilder; import com.github.czyzby.lml.parser.tag.LmlTag; @@ -14,18 +15,21 @@ * * @author MJ */ public class ButtonGroupLmlTag extends TableLmlTag { + private ButtonGroup buttonGroup; public ButtonGroupLmlTag(final LmlParser parser, final LmlTag parentTag, final StringBuilder rawTagData) { super(parser, parentTag, rawTagData); } @Override protected Actor getNewInstanceOfActor(final LmlActorBuilder builder) { - return new ButtonTable(getSkin(builder)); + ButtonTable buttonTable = new ButtonTable(getSkin(builder)); + buttonGroup = buttonTable.getButtonGroup(); + return buttonTable; } /** @return {@link com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup} wrapped by the {@link ButtonTable}. */ @Override public Object getManagedObject() { - return ((ButtonTable) getActor()).getButtonGroup(); + return buttonGroup; } } From 4fc452558c7e555f6925fcd43d01c0b92bf05909 Mon Sep 17 00:00:00 2001 From: MJ Date: Sat, 8 Oct 2016 18:59:12 +0200 Subject: [PATCH 46/58] Added HighlightTextArea support. Close #28 --- .../assets/i18n/bundle.properties | 1 + .../examples/vis/highlightTextArea.lml | 12 ++++ .../assets/templates/main.lml | 5 +- examples/gdx-lml-vis-tests/core/build.gradle | 1 + .../java/com/github/czyzby/tests/Main.java | 6 +- .../czyzby/tests/reflected/MainView.java | 38 ++++++++---- .../tests/reflected/widgets/CodeTextArea.java | 5 +- .../widgets/LmlSourceHighlighter.java | 58 +++++++++++++++++++ examples/gdx-lml-vis-tests/gwt/build.gradle | 1 + .../github/czyzby/tests/GdxDefinition.gwt.xml | 1 + lml-vis/README.md | 8 +-- .../lml/vis/parser/impl/VisLmlSyntax.java | 4 ++ .../input/HighlighterLmlAttribute.java | 35 +++++++++++ .../impl/tag/HighlightTextAreaLmlTag.java | 28 +++++++++ .../HighlightTextAreaLmlTagProvider.java | 17 ++++++ 15 files changed, 198 insertions(+), 22 deletions(-) create mode 100644 examples/gdx-lml-vis-tests/assets/templates/examples/vis/highlightTextArea.lml create mode 100644 examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/input/HighlighterLmlAttribute.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/HighlightTextAreaLmlTag.java create mode 100644 lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/HighlightTextAreaLmlTagProvider.java diff --git a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties index 2fbd6729..0bf47836 100644 --- a/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties +++ b/examples/gdx-lml-vis-tests/assets/i18n/bundle.properties @@ -106,6 +106,7 @@ vis/fixedSizeGridGroup=Vis: fixedGrid vis/formValidator=Vis: formValidator vis/floatingGroup=Vis: floatingGroup vis/gridGroup=Vis: gridGroup +vis/highlightTextArea=Vis: highlightTextArea vis/horizontalFlow=Vis: horizontalFlow vis/linkLabel=Vis: linkLabel vis/listView=Vis: listView diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/vis/highlightTextArea.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/highlightTextArea.lml new file mode 100644 index 00000000..aa3b96c7 --- /dev/null +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/vis/highlightTextArea.lml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/examples/gdx-lml-vis-tests/assets/templates/main.lml b/examples/gdx-lml-vis-tests/assets/templates/main.lml index 5bd96013..7d3afa55 100644 --- a/examples/gdx-lml-vis-tests/assets/templates/main.lml +++ b/examples/gdx-lml-vis-tests/assets/templates/main.lml @@ -5,8 +5,9 @@ - - + + @parsingButton|LML
diff --git a/examples/gdx-lml-vis-tests/core/build.gradle b/examples/gdx-lml-vis-tests/core/build.gradle index 95f4c5ca..a918ad9e 100644 --- a/examples/gdx-lml-vis-tests/core/build.gradle +++ b/examples/gdx-lml-vis-tests/core/build.gradle @@ -4,5 +4,6 @@ eclipse.project.name = appName + '-core' dependencies { compile "com.badlogicgames.gdx:gdx:$gdxVersion" compile "com.github.czyzby:gdx-lml-vis:$libVersion" + compile "com.github.tommyettinger:regexodus:0.1.7" } diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java index b6d8a195..a43527be 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/Main.java @@ -59,9 +59,9 @@ public class Main extends AbstractApplicationListener { // Vis unique tags: "vis/basicColorPicker", "vis/busyBar", "vis/collapsibleWidget", "vis/colorPicker", "vis/draggable", "vis/dragPane", "vis/fixedSizeGridGroup", "vis/floatingGroup", "vis/formValidator", "vis/gridGroup", - "vis/horizontalFlow", "vis/linkLabel", "vis/listView", "vis/menu", "vis/multiSplitPane", "vis/radioButton", - "vis/scrollableTextArea", "vis/separator", "vis/spinner", "vis/tabbedPane", "vis/toast", "vis/tooltip", - "vis/validatableTextField", "vis/verticalFlow"); + "vis/highlightTextArea", "vis/horizontalFlow", "vis/linkLabel", "vis/listView", "vis/menu", + "vis/multiSplitPane", "vis/radioButton", "vis/scrollableTextArea", "vis/separator", "vis/spinner", + "vis/tabbedPane", "vis/toast", "vis/tooltip", "vis/validatableTextField", "vis/verticalFlow"); private static final String MAIN_VIEW_TEMPLATE = "templates/main.lml"; private MainView view; diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java index ec68ee93..b606baa4 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java @@ -14,6 +14,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.ProgressBar; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.utils.Layout; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Disposable; import com.badlogic.gdx.utils.viewport.ScreenViewport; @@ -36,9 +37,11 @@ import com.github.czyzby.lml.util.LmlUtilities; import com.github.czyzby.lml.vis.ui.VisTabTable; import com.github.czyzby.tests.reflected.widgets.BlinkingLabel; +import com.github.czyzby.tests.reflected.widgets.LmlSourceHighlighter; import com.kotcrab.vis.ui.util.ToastManager; import com.kotcrab.vis.ui.util.adapter.ListAdapter; import com.kotcrab.vis.ui.util.adapter.SimpleListAdapter; +import com.kotcrab.vis.ui.util.highlight.BaseHighlighter; import com.kotcrab.vis.ui.widget.CollapsibleWidget; import com.kotcrab.vis.ui.widget.MenuItem; import com.kotcrab.vis.ui.widget.VisDialog; @@ -47,13 +50,14 @@ import com.kotcrab.vis.ui.widget.VisWindow; import com.kotcrab.vis.ui.widget.toast.ToastTable; -/** Main view of the application. Since it extends {@link AbstractLmlView}, it is both {@link LmlView} (allowing its +/** + * Main view of the application. Since it extends {@link AbstractLmlView}, it is both {@link LmlView} (allowing its * {@link Stage} to be filled) and {@link ActionContainer} (allowing it methods to be reflected and available in LML * templates. Thanks to {@link LmlParser#createView(Class, com.badlogic.gdx.files.FileHandle)} method, parsed root * actors go directly into this view's {@link #getStage()}, and an instance of this class is registered as an action * container with "main" ID (returned by {@link #getViewId()}). - * - * @author MJ */ + * @author MJ + */ public class MainView extends AbstractLmlView { // Contains template to parse: @LmlActor("templateInput") private VisTextArea templateInput; @@ -127,20 +131,22 @@ public void parseTemplate() { private void onParsingError(final Exception exception) { // Printing the message without stack trace - we don't want to completely flood the console and its usually not // relevant anyway. Change to '(...), "Unable to parse LML template:", exception);' for stacks. - Gdx.app.error(Lml.LOGGER_TAG, "Unable to parse LML template: " + exception); + Gdx.app.error(Lml.LOGGER_TAG, "Unable to parse LML template: ", exception); resultTable.clear(); resultTable.add("Error occurred. Sorry."); parser.fillStage(getStage(), Gdx.files.internal("templates/dialogs/error.lml")); } - /** Switches the current content of template input to the content of a chosen file. - * - * @param actor invokes the action. Expected to have an ID that points to a template. */ + /** + * Switches the current content of template input to the content of a chosen file. + * @param actor invokes the action. Expected to have an ID that points to a template. + */ @LmlAction("switch") public void switchTemplate(final Button actor) { buttonManager.switchCheckedButton(actor); // In LML template, we set each button's ID to a template name. Now we extract these: final String templateName = LmlUtilities.getActorId(actor); + templateInput.setProgrammaticChangeEvents(true); templateInput.setText(Gdx.files.internal(toExamplePath(templateName)).readString()); // Forcing view to recalculate preferred size (required to update scroll pane): templateInput.invalidateHierarchy(); @@ -152,6 +158,12 @@ private static String toExamplePath(final String templateName) { return "templates/examples/" + templateName + ".lml"; } + /** @return {@link BaseHighlighter} implementation that highlights LML source code. */ + @LmlAction("lmlHighlighter") + public BaseHighlighter getLmlSourceHighlighter() { + return new LmlSourceHighlighter(); + } + /* templates/dialogs/error.lml */ @LmlAction("onErrorApprove") @@ -202,8 +214,10 @@ public String getSomeText() { return "@LmlAction-annotated method result."; } - /** @param container has to be sized. - * @return semi-random size depending on length of container's toString() result. */ + /** + * @param container has to be sized. + * @return semi-random size depending on length of container's toString() result. + */ @LmlAction({ "size", "getRandomSize" }) public float getSize(final Container container) { return container.toString().length() * 30f * MathUtils.random(); @@ -354,8 +368,10 @@ public Action getTabHidingAction() { return Actions.fadeOut(0.1f); } - /** @param tabTable will contain an extra label each time this method is invoked. Expects that the table contains a - * label in first cell. */ + /** + * @param tabTable will contain an extra label each time this method is invoked. Expects that the table contains a + * label in first cell. + */ @LmlAction("showSomeTab") public void doOnCustomTabShow(final VisTabTable tabTable) { // Note that this method might be called a few times before the tag is even shown due to TabbedPane diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java index 19169837..97d0eafb 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java @@ -7,6 +7,7 @@ import com.github.czyzby.lml.parser.tag.LmlTag; import com.github.czyzby.lml.parser.tag.LmlTagProvider; import com.github.czyzby.lml.vis.parser.impl.tag.VisTextAreaLmlTag; +import com.kotcrab.vis.ui.widget.HighlightTextArea; import com.kotcrab.vis.ui.widget.VisTextArea; import com.kotcrab.vis.ui.widget.VisTextField; @@ -14,7 +15,7 @@ * required space needed for current text. * * @author Kotcrab */ -public class CodeTextArea extends VisTextArea { +public class CodeTextArea extends HighlightTextArea { private GlyphLayout prefSizeLayout; private String lastText; @@ -37,7 +38,7 @@ public float getPrefHeight() { @Override public float getPrefWidth() { updatePrefSizeLayoutIfNeeded(); - return prefSizeLayout.width + super.getPrefHeight(); + return prefSizeLayout.width + super.getPrefWidth(); } @Override diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java new file mode 100644 index 00000000..dea78300 --- /dev/null +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java @@ -0,0 +1,58 @@ +package com.github.czyzby.tests.reflected.widgets; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.utils.Array; +import com.kotcrab.vis.ui.util.highlight.BaseHighlighter; +import com.kotcrab.vis.ui.util.highlight.Highlight; +import com.kotcrab.vis.ui.util.highlight.HighlightRule; +import com.kotcrab.vis.ui.widget.HighlightTextArea; +import regexodus.Matcher; +import regexodus.Pattern; + +/** + * Highlights LML's XML-like syntax when used by a {@link HighlightTextArea}. + * @author MJ + */ +public class LmlSourceHighlighter extends BaseHighlighter { + public LmlSourceHighlighter() { + addPattern(new Color(0.75f, 0.75f, 0.75f, 1f), "<[!][\\s\\S]*?[-!]>"); + addPattern(new Color(0.6f, 1f, 1f, 1f), "]?"); + addPattern(new Color(0.6f, 0.7f, 1f, 1f), "]?"); + addPattern(new Color(0.8f, 0.6f, 1f, 1f), "\\{.*\\}"); + addPattern(new Color(0.8f, 0.6f, 1f, 1f), "[#@$]"); + word(new Color(0.8f, 0.4f, 1f, 1f), "'"); + word(new Color(0.8f, 0.4f, 1f, 1f), "\""); + word(new Color(0.6f, 0.7f, 1f, 1f), ">"); + word(new Color(0.6f, 0.7f, 1f, 1f), "/>"); + } + + /** + * @param color will be used to color values detected by the pattern. + * @param pattern will be compiled to a {@link Pattern}. Has to be a valid regular expression. + */ + public void addPattern(Color color, String pattern) { + addRule(new RegexRule(color, pattern)); + } + + /** + * GWT-compatible regular expression highlight rule based on vis-ui-contrib. + * @author Kotcrab + */ + public static class RegexRule implements HighlightRule { + private Color color; + private Pattern pattern; + + public RegexRule(Color color, String regex) { + this.color = color; + pattern = Pattern.compile(regex); + } + + @Override + public void process(HighlightTextArea textArea, Array highlights) { + Matcher matcher = pattern.matcher(textArea.getText()); + while (matcher.find()) { + highlights.add(new Highlight(color, matcher.start(), matcher.end())); + } + } + } +} diff --git a/examples/gdx-lml-vis-tests/gwt/build.gradle b/examples/gdx-lml-vis-tests/gwt/build.gradle index 1bd8b16a..26ade947 100644 --- a/examples/gdx-lml-vis-tests/gwt/build.gradle +++ b/examples/gdx-lml-vis-tests/gwt/build.gradle @@ -28,6 +28,7 @@ dependencies { compile "com.github.czyzby:gdx-lml:$libVersion:sources" compile "com.github.czyzby:gdx-kiwi:$libVersion:sources" compile "com.kotcrab.vis:vis-ui:$visVersion:sources" + compile "com.github.tommyettinger:regexodus:0.1.7:sources" } task draftRun(type: JettyRunWar) { diff --git a/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml b/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml index 152fd41b..05638686 100644 --- a/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml +++ b/examples/gdx-lml-vis-tests/gwt/src/main/java/com/github/czyzby/tests/GdxDefinition.gwt.xml @@ -3,6 +3,7 @@ + diff --git a/lml-vis/README.md b/lml-vis/README.md index bdbfe6cc..13c2dcd7 100644 --- a/lml-vis/README.md +++ b/lml-vis/README.md @@ -40,13 +40,13 @@ To add non-GWT features (like the `FileChooser` support or various file validato In one of your components (possibly in a configuration component, if you have one), include an annotated field with syntax instance: -``` +```Java @LmlParserSyntax VisLmlSyntax syntax = new VisLmlSyntax(); ``` Make sure that you call `VisUI.load()` and register Vis skin in LML parser. This can be easily done with an initiation method: -``` +```Java @Initiate(priority = AutumnActionPriority.TOP_PRIORITY) // ...or custom, higher. private void initiate(final SkinService skinService) { VisUI.load(); // VisUI.load(Gdx.files.internal("path/to/your/skin.json")); @@ -56,7 +56,7 @@ Make sure that you call `VisUI.load()` and register Vis skin in LML parser. This By using `SkinService#addSkin` method, the disposing of VisUI skin and registering it in LML parser is already handled for you. Still, you might also want to manually dispose of the `ColorPicker` instance (as it is reused for performance reasons) if you ever used one: -``` +```Java @Destroy public static void destroyColorPicker() { ColorPickerContainer.dispose(); @@ -71,7 +71,7 @@ Make sure to check `gdx-lml` changes as well! 1.7 -> 1.8 -- Added support for new VisUI actors: `BusyBar`, `MultiSplitPane` and `ScrollableTextArea`. Usage examples are present in `gdx-lml-vis-tests`. +- Added support for new VisUI actors: `BusyBar`, `MultiSplitPane`, `ScrollableTextArea` and `HighlightTextArea`. Usage examples are present in `gdx-lml-vis-tests`. - Added `sorting`, `sortingOrderAscending`, `saveLastDirectory` and `focusFileScrollPaneOnShow` attributes to `FileChooser` tag accessible through `ExtendedVisLml`. - Added `menuListener` attribute to `menuBar`, `popupMenu` and `menu` tags. diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java index a528fe73..2129f3c7 100644 --- a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/VisLmlSyntax.java @@ -59,6 +59,7 @@ import com.github.czyzby.lml.vis.parser.impl.attribute.grid.ItemWidthLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.grid.fixed.BlockIndexesLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.grid.fixed.ItemsAmountLmlAttribute; +import com.github.czyzby.lml.vis.parser.impl.attribute.input.HighlighterLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.input.BlinkTimeLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.input.CursorLmlAttribute; import com.github.czyzby.lml.vis.parser.impl.attribute.input.DigitsOnlyLmlAttribute; @@ -244,6 +245,7 @@ protected void registerActorTags() { addTagProvider(new FloatingGroupLmlTagProvider(), "floatingGroup"); addTagProvider(new FormValidatorLmlTagProvider(), "form", "formValidator", "formTable"); addTagProvider(new GridGroupLmlTagProvider(), "gridGroup", "grid"); + addTagProvider(new HighlightTextAreaLmlTagProvider(), "highlightTextArea"); addTagProvider(new HorizontalFlowGroupLmlTagProvider(), "horizontalFlow", "horizontalFlowGroup"); addTagProvider(new LinkLabelLmlTagProvider(), "linkLabel", "link"); addTagProvider(new ListViewLmlTagProvider(), "listView"); @@ -412,6 +414,8 @@ protected void registerTextFieldAttributes() { addAttributeProcessor(new TextFieldListenerLmlAttribute(), "listener", "textListener", "textFieldListener"); // VisTextArea: addAttributeProcessor(new PrefRowsLmlAttribute(), "prefRows", "prefRowsAmount"); + // HighlightTextArea: + addAttributeProcessor(new HighlighterLmlAttribute(), "highlighter"); } @Override diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/input/HighlighterLmlAttribute.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/input/HighlighterLmlAttribute.java new file mode 100644 index 00000000..6f51509e --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/attribute/input/HighlighterLmlAttribute.java @@ -0,0 +1,35 @@ +package com.github.czyzby.lml.vis.parser.impl.attribute.input; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.action.ActorConsumer; +import com.github.czyzby.lml.parser.tag.LmlAttribute; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.kotcrab.vis.ui.util.highlight.BaseHighlighter; +import com.kotcrab.vis.ui.widget.HighlightTextArea; + +/** + * See {@link HighlightTextArea#setHighlighter(BaseHighlighter)}. Expects ID of a method that returns a + * {@link BaseHighlighter} instance. Mapped to "highlighter". + * @author MJ + */ +public class HighlighterLmlAttribute implements LmlAttribute { + @Override + public Class getHandledType() { + return HighlightTextArea.class; + } + + @Override + public void process(LmlParser parser, LmlTag tag, HighlightTextArea highlightTextArea, String rawAttributeData) { + @SuppressWarnings("unchecked") + final ActorConsumer action = (ActorConsumer) parser + .parseAction(rawAttributeData, highlightTextArea); + if (action == null) { + parser.throwErrorIfStrict( + "Highlighter attribute expects action ID of a method returning BaseHighlighter implementation. No method found for ID: " + + rawAttributeData); + return; + } + highlightTextArea.setHighlighter(action.consume(highlightTextArea)); + highlightTextArea.processHighlighter(); + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/HighlightTextAreaLmlTag.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/HighlightTextAreaLmlTag.java new file mode 100644 index 00000000..165a9b37 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/HighlightTextAreaLmlTag.java @@ -0,0 +1,28 @@ +package com.github.czyzby.lml.vis.parser.impl.tag; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.impl.tag.builder.TextLmlActorBuilder; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.util.LmlUtilities; +import com.kotcrab.vis.ui.util.highlight.BaseHighlighter; +import com.kotcrab.vis.ui.widget.HighlightTextArea; +import com.kotcrab.vis.ui.widget.ScrollableTextArea; +import com.kotcrab.vis.ui.widget.VisTextField; + +/** + * Manages {@link HighlightTextArea} widgets. Converts text between tags into text area content. Compatible with + * scroll pane widgets. Mapped to "highlightTextArea" + * @author MJ + */ +public class HighlightTextAreaLmlTag extends ScrollableTextAreaLmlTag { + public HighlightTextAreaLmlTag(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + super(parser, parentTag, rawTagData); + } + + @Override + protected VisTextField getNewInstanceOfTextField(TextLmlActorBuilder textBuilder) { + final HighlightTextArea textArea = new HighlightTextArea(textBuilder.getText(), textBuilder.getStyleName()); + LmlUtilities.getLmlUserObject(textArea).setData(Boolean.TRUE); // Setting as multiline by default. + return textArea; + } +} diff --git a/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/HighlightTextAreaLmlTagProvider.java b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/HighlightTextAreaLmlTagProvider.java new file mode 100644 index 00000000..d5f1d1c4 --- /dev/null +++ b/lml-vis/src/main/java/com/github/czyzby/lml/vis/parser/impl/tag/provider/HighlightTextAreaLmlTagProvider.java @@ -0,0 +1,17 @@ +package com.github.czyzby.lml.vis.parser.impl.tag.provider; + +import com.github.czyzby.lml.parser.LmlParser; +import com.github.czyzby.lml.parser.tag.LmlTag; +import com.github.czyzby.lml.parser.tag.LmlTagProvider; +import com.github.czyzby.lml.vis.parser.impl.tag.HighlightTextAreaLmlTag; + +/** + * Provides highlight text area widget tags. + * @author MJ + */ +public class HighlightTextAreaLmlTagProvider implements LmlTagProvider { + @Override + public LmlTag create(LmlParser parser, LmlTag parentTag, StringBuilder rawTagData) { + return new HighlightTextAreaLmlTag(parser, parentTag, rawTagData); + } +} From dd9e97dd0c37e3d085b8063ee0d9da7bc5497ed2 Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 9 Oct 2016 00:05:31 +0200 Subject: [PATCH 47/58] Adjusted syntax highlighting in gdx-lml-vis-tests. #28 --- .../assets/templates/examples/conditions.lml | 6 ++--- .../czyzby/tests/reflected/MainView.java | 2 +- .../widgets/LmlSourceHighlighter.java | 25 ++++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/examples/gdx-lml-vis-tests/assets/templates/examples/conditions.lml b/examples/gdx-lml-vis-tests/assets/templates/examples/conditions.lml index bce684d4..a3eb47d4 100644 --- a/examples/gdx-lml-vis-tests/assets/templates/examples/conditions.lml +++ b/examples/gdx-lml-vis-tests/assets/templates/examples/conditions.lml @@ -9,8 +9,8 @@ values. --> - - + + @@ -27,4 +27,4 @@ Multi Line - \ No newline at end of file + \ No newline at end of file diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java index b606baa4..2795a219 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/MainView.java @@ -131,7 +131,7 @@ public void parseTemplate() { private void onParsingError(final Exception exception) { // Printing the message without stack trace - we don't want to completely flood the console and its usually not // relevant anyway. Change to '(...), "Unable to parse LML template:", exception);' for stacks. - Gdx.app.error(Lml.LOGGER_TAG, "Unable to parse LML template: ", exception); + Gdx.app.error(Lml.LOGGER_TAG, "Unable to parse LML template: " + exception); resultTable.clear(); resultTable.add("Error occurred. Sorry."); parser.fillStage(getStage(), Gdx.files.internal("templates/dialogs/error.lml")); diff --git a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java index dea78300..59b939db 100644 --- a/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java +++ b/examples/gdx-lml-vis-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java @@ -15,15 +15,16 @@ */ public class LmlSourceHighlighter extends BaseHighlighter { public LmlSourceHighlighter() { + // Comments: addPattern(new Color(0.75f, 0.75f, 0.75f, 1f), "<[!][\\s\\S]*?[-!]>"); - addPattern(new Color(0.6f, 1f, 1f, 1f), "]?"); - addPattern(new Color(0.6f, 0.7f, 1f, 1f), "]?"); - addPattern(new Color(0.8f, 0.6f, 1f, 1f), "\\{.*\\}"); - addPattern(new Color(0.8f, 0.6f, 1f, 1f), "[#@$]"); - word(new Color(0.8f, 0.4f, 1f, 1f), "'"); - word(new Color(0.8f, 0.4f, 1f, 1f), "\""); - word(new Color(0.6f, 0.7f, 1f, 1f), ">"); - word(new Color(0.6f, 0.7f, 1f, 1f), "/>"); + // Macros: + addPattern(new Color(0.6f, 1f, 1f, 1f), "]*>"); + // Actors: + addPattern(new Color(0.6f, 0.7f, 1f, 1f), "]*>"); + // Simple arguments: + addPattern(new Color(0.8f, 0.6f, 1f, 1f), "\\{[\\w:]+}"); + // Preferences, i18n, methods: + addPattern(new Color(0.8f, 0.6f, 1f, 1f), "[#@$][\\w.]+"); } /** @@ -37,10 +38,10 @@ public void addPattern(Color color, String pattern) { /** * GWT-compatible regular expression highlight rule based on vis-ui-contrib. * @author Kotcrab - */ + */ // TODO Replace with vis-ui-contrib 1.2.4. public static class RegexRule implements HighlightRule { - private Color color; - private Pattern pattern; + private final Color color; + private final Pattern pattern; public RegexRule(Color color, String regex) { this.color = color; @@ -49,7 +50,7 @@ public RegexRule(Color color, String regex) { @Override public void process(HighlightTextArea textArea, Array highlights) { - Matcher matcher = pattern.matcher(textArea.getText()); + final Matcher matcher = pattern.matcher(textArea.getText()); while (matcher.find()) { highlights.add(new Highlight(color, matcher.start(), matcher.end())); } From 20910d442a37f1c2cd3160f212b07fb91d85824a Mon Sep 17 00:00:00 2001 From: MJ Date: Sun, 9 Oct 2016 00:32:57 +0200 Subject: [PATCH 48/58] Added syntax highlighting in gdx-lml-tests. #28 --- examples/gdx-lml-tests/assets/skin.json | 8 +- .../gdx-lml-tests/assets/templates/main.lml | 4 +- examples/gdx-lml-tests/core/build.gradle | 2 + .../java/com/github/czyzby/tests/Main.java | 4 + .../czyzby/tests/reflected/MainView.java | 3 +- .../tests/reflected/widgets/CodeTextArea.java | 74 +++++++++++++++++++ .../widgets/LmlSourceHighlighter.java | 59 +++++++++++++++ examples/gdx-lml-tests/gwt/build.gradle | 2 + .../github/czyzby/tests/GdxDefinition.gwt.xml | 2 + 9 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/CodeTextArea.java create mode 100644 examples/gdx-lml-tests/core/src/main/java/com/github/czyzby/tests/reflected/widgets/LmlSourceHighlighter.java diff --git a/examples/gdx-lml-tests/assets/skin.json b/examples/gdx-lml-tests/assets/skin.json index 9f350ac7..0dbdb7f1 100644 --- a/examples/gdx-lml-tests/assets/skin.json +++ b/examples/gdx-lml-tests/assets/skin.json @@ -6,6 +6,7 @@ com.badlogic.gdx.graphics.Color: { white: { a: 1, b: 1, g: 1, r: 1 }, black: { a: 1, b: 0, g: 0, r: 0 }, + dark-gray: { a: 1, b: 0.05, g: 0.05, r: 0.05 }, gray: { a: 1, b: 0.175, g: 0.175, r: 0.175 }, red: { a: 1, b: 0, g: 0, r: 0.3 }, green: { a: 1, b: 0, g: 0.5, r: 0 } @@ -15,6 +16,7 @@ red: { name: white, color: red }, white: { name: white, color: white }, gray: { name: white, color: gray }, + dark-gray: { name: white, color: dark-gray }, alpha: { name: white, color: { a: 0.5, b: 0, g: 0, r: 0 } }, red-alpha: { name: white, color: { a: 0.5, b: 0, g: 0, r: 0.4 } }, red-frame: { name: frame, color: red } @@ -64,8 +66,10 @@ toggle: { up: black, over: gray, down: red, checked: red, font: default, fontColor: white, pressedOffsetY: -1, pressedOffsetX: 1, disabled: gray } }, com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { - default: { selection: red-alpha, focusedBackground: gray, background: black, font: default, fontColor: white, cursor: cursor }, - code: { selection: red-alpha, focusedBackground: gray, background: black, font: code, fontColor: white, cursor: cursor } + default: { selection: red-alpha, focusedBackground: gray, background: black, font: default, fontColor: white, cursor: cursor } + }, + com.kotcrab.vis.ui.widget.VisTextField$VisTextFieldStyle: { + code: { selection: red-alpha, focusedBackground: dark-gray, background: black, font: code, fontColor: white, cursor: cursor } }, com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { default: { label: default, background: gray } diff --git a/examples/gdx-lml-tests/assets/templates/main.lml b/examples/gdx-lml-tests/assets/templates/main.lml index 63dcbd11..75879b18 100644 --- a/examples/gdx-lml-tests/assets/templates/main.lml +++ b/examples/gdx-lml-tests/assets/templates/main.lml @@ -5,7 +5,9 @@ -

6XtKTUOUK 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 z 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