From 4c4b0d64499524e9436ba49cfd763068349ecfd7 Mon Sep 17 00:00:00 2001 From: Laurent Guerin Date: Tue, 23 Aug 2011 19:46:54 +0200 Subject: [PATCH] Switch on public repo --- .gitignore | 7 + README | 0 pom.xml | 149 ++++++++ .../demo/components/ComponentDemoLayout.java | 41 +++ .../t5/demo/components/HighlightBody.java | 16 + .../t5/demo/components/HighlightTMLPage.java | 48 +++ .../fr/exanpe/t5/demo/components/Layout.java | 44 +++ .../fr/exanpe/t5/demo/data/CountryEnum.java | 23 ++ .../exanpe/t5/demo/data/FranceCityEnum.java | 6 + .../fr/exanpe/t5/demo/data/ThirdEnum.java | 6 + .../fr/exanpe/t5/demo/data/UKCityEnum.java | 6 + .../fr/exanpe/t5/demo/data/USACityEnum.java | 6 + .../java/fr/exanpe/t5/demo/data/User.java | 31 ++ .../java/fr/exanpe/t5/demo/grouping/Mail.java | 73 ++++ .../exanpe/t5/demo/grouping/MailboxSumUp.java | 59 +++ .../java/fr/exanpe/t5/demo/pages/About.java | 6 + .../java/fr/exanpe/t5/demo/pages/Contact.java | 6 + .../java/fr/exanpe/t5/demo/pages/Index.java | 10 + .../t5/demo/pages/components/Grouping.java | 99 +++++ .../pages/components/accordion/Example1.java | 5 + .../pages/components/accordion/Example2.java | 5 + .../pages/components/accordion/Example3.java | 5 + .../pages/components/accordion/Example4.java | 5 + .../pages/components/accordion/Example5.java | 5 + .../pages/components/ajaxLoader/Example1.java | 21 ++ .../pages/components/ajaxLoader/Example2.java | 21 ++ .../pages/components/ajaxLoader/Example3.java | 19 + .../pages/components/border/Example1.java | 5 + .../components/colorPicker/Example1.java | 13 + .../pages/components/dialog/Example1.java | 5 + .../pages/components/dialog/Example2.java | 5 + .../pages/components/dialog/Example3.java | 5 + .../pages/components/dialog/Example4.java | 5 + .../pages/components/exanpeSkin/Example1.java | 68 ++++ .../components/hideablePanel/Example1.java | 5 + .../components/hideablePanel/Example2.java | 5 + .../components/securePassword/Example1.java | 21 ++ .../components/securePassword/Example2.java | 21 ++ .../components/securePassword/Example3.java | 17 + .../components/selectLoader/Example1.java | 85 +++++ .../components/selectLoader/Example2.java | 147 ++++++++ .../pages/components/slider/Example1.java | 11 + .../pages/components/slider/Example2.java | 11 + .../pages/components/slider/Example3.java | 11 + .../pages/components/slider/Example4.java | 11 + .../pages/components/tabview/Example1.java | 6 + .../pages/components/tabview/Example2.java | 6 + .../pages/components/tabview/Example3.java | 6 + .../pages/components/tabview/Example4.java | 20 ++ .../pages/components/tooltip/Example1.java | 6 + .../pages/components/tooltip/Example2.java | 6 + .../pages/components/tooltip/Example3.java | 6 + .../fr/exanpe/t5/demo/services/AppModule.java | 148 ++++++++ .../exanpe/t5/demo/services/DataService.java | 46 +++ .../t5/demo/services/MailboxService.java | 30 ++ .../demo/components/ComponentDemoLayout.tml | 46 +++ .../t5/demo/components/HighlightBody.tml | 10 + .../t5/demo/components/HighlightTMLPage.tml | 8 + .../fr/exanpe/t5/demo/components/Layout.tml | 68 ++++ .../demo/pages/components/Grouping.properties | 22 ++ .../components/accordion/Example2.properties | 6 + .../components/ajaxLoader/Example2.properties | 1 + .../components/dialog/Example3.properties | 2 + .../components/dialog/Example4.properties | 2 + .../components/tabview/Example3.properties | 5 + .../components/tooltip/Example1.properties | 1 + .../components/tooltip/Example2.properties | 1 + src/main/resources/log4j.properties | 45 +++ src/main/webapp/About.tml | 7 + src/main/webapp/Contact.tml | 7 + src/main/webapp/Index.tml | 107 ++++++ src/main/webapp/WEB-INF/app.properties | 4 + src/main/webapp/WEB-INF/appengine-web.xml | 7 + src/main/webapp/WEB-INF/web.xml | 22 ++ src/main/webapp/components/Grouping.tml | 101 ++++++ .../webapp/components/accordion/Example1.tml | 19 + .../webapp/components/accordion/Example2.tml | 30 ++ .../webapp/components/accordion/Example3.tml | 21 ++ .../webapp/components/accordion/Example4.tml | 21 ++ .../webapp/components/accordion/Example5.tml | 27 ++ .../webapp/components/ajaxLoader/Example1.tml | 18 + .../webapp/components/ajaxLoader/Example2.tml | 25 ++ .../webapp/components/ajaxLoader/Example3.tml | 31 ++ .../webapp/components/border/Example1.tml | 17 + .../components/colorPicker/Example1.tml | 29 ++ .../webapp/components/dialog/Example1.tml | 18 + .../webapp/components/dialog/Example2.tml | 17 + .../webapp/components/dialog/Example3.tml | 24 ++ .../webapp/components/dialog/Example4.tml | 25 ++ .../webapp/components/exanpeSkin/Example1.tml | 59 +++ .../components/hideablePanel/Example1.tml | 32 ++ .../components/hideablePanel/Example2.tml | 34 ++ .../components/securePassword/Example1.tml | 35 ++ .../components/securePassword/Example2.tml | 20 ++ .../components/securePassword/Example3.tml | 30 ++ .../components/selectLoader/Example1.tml | 74 ++++ .../components/selectLoader/Example2.tml | 33 ++ .../webapp/components/slider/Example1.tml | 29 ++ .../webapp/components/slider/Example2.tml | 29 ++ .../webapp/components/slider/Example3.tml | 29 ++ .../webapp/components/slider/Example4.tml | 28 ++ .../webapp/components/tabview/Example1.tml | 30 ++ .../webapp/components/tabview/Example2.tml | 31 ++ .../webapp/components/tabview/Example3.tml | 36 ++ .../webapp/components/tabview/Example4.tml | 44 +++ .../webapp/components/tooltip/Example1.tml | 30 ++ .../webapp/components/tooltip/Example2.tml | 25 ++ .../webapp/components/tooltip/Example3.tml | 26 ++ src/main/webapp/css/github.css | 129 +++++++ src/main/webapp/favicon.ico | Bin 0 -> 894 bytes src/main/webapp/img/grouping/email_open.png | Bin 0 -> 783 bytes src/main/webapp/img/grouping/emails.png | Bin 0 -> 641 bytes src/main/webapp/img/grouping/information.png | Bin 0 -> 778 bytes src/main/webapp/img/tab/application.png | Bin 0 -> 464 bytes src/main/webapp/img/tab/comments.png | Bin 0 -> 557 bytes src/main/webapp/img/tab/email.png | Bin 0 -> 641 bytes src/main/webapp/js/exanpe-demo.js | 2 + src/main/webapp/js/highlight.js | 1 + src/main/webapp/layout/highlight.css | 36 ++ src/main/webapp/layout/images/img01.jpg | Bin 0 -> 752 bytes src/main/webapp/layout/images/img02.jpg | Bin 0 -> 3878 bytes src/main/webapp/layout/images/img03.jpg | Bin 0 -> 2913 bytes src/main/webapp/layout/images/img04.jpg | Bin 0 -> 3287 bytes src/main/webapp/layout/images/img05.gif | Bin 0 -> 105 bytes src/main/webapp/layout/images/img06.gif | Bin 0 -> 813 bytes src/main/webapp/layout/images/img07.gif | Bin 0 -> 861 bytes src/main/webapp/layout/images/img08.gif | Bin 0 -> 297 bytes src/main/webapp/layout/images/img09.gif | Bin 0 -> 1808 bytes src/main/webapp/layout/images/img10.gif | Bin 0 -> 1344 bytes src/main/webapp/layout/images/img11.gif | Bin 0 -> 289 bytes src/main/webapp/layout/images/img12.gif | Bin 0 -> 970 bytes src/main/webapp/layout/images/img13.gif | Bin 0 -> 155 bytes src/main/webapp/layout/images/img14.gif | Bin 0 -> 155 bytes src/main/webapp/layout/images/img15.gif | Bin 0 -> 2066 bytes src/main/webapp/layout/images/img16.gif | Bin 0 -> 1021 bytes src/main/webapp/layout/images/img17.gif | Bin 0 -> 608 bytes src/main/webapp/layout/images/img18.gif | Bin 0 -> 1082 bytes src/main/webapp/layout/images/img19.gif | Bin 0 -> 1042 bytes src/main/webapp/layout/images/img20.gif | Bin 0 -> 1041 bytes src/main/webapp/layout/images/spacer.gif | Bin 0 -> 43 bytes src/main/webapp/layout/layout.css | 340 ++++++++++++++++++ src/main/webapp/layout/license.txt | 243 +++++++++++++ src/site/apt/index.apt | 9 + src/site/site.xml | 17 + src/test/conf/testng.xml | 8 + src/test/conf/webdefault.xml | 278 ++++++++++++++ src/test/java/PLACEHOLDER | 1 + src/test/resources/PLACEHOLDER | 1 + 148 files changed, 3966 insertions(+) create mode 100644 .gitignore create mode 100644 README create mode 100644 pom.xml create mode 100644 src/main/java/fr/exanpe/t5/demo/components/ComponentDemoLayout.java create mode 100644 src/main/java/fr/exanpe/t5/demo/components/HighlightBody.java create mode 100644 src/main/java/fr/exanpe/t5/demo/components/HighlightTMLPage.java create mode 100644 src/main/java/fr/exanpe/t5/demo/components/Layout.java create mode 100644 src/main/java/fr/exanpe/t5/demo/data/CountryEnum.java create mode 100644 src/main/java/fr/exanpe/t5/demo/data/FranceCityEnum.java create mode 100644 src/main/java/fr/exanpe/t5/demo/data/ThirdEnum.java create mode 100644 src/main/java/fr/exanpe/t5/demo/data/UKCityEnum.java create mode 100644 src/main/java/fr/exanpe/t5/demo/data/USACityEnum.java create mode 100644 src/main/java/fr/exanpe/t5/demo/data/User.java create mode 100644 src/main/java/fr/exanpe/t5/demo/grouping/Mail.java create mode 100644 src/main/java/fr/exanpe/t5/demo/grouping/MailboxSumUp.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/About.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/Contact.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/Index.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/Grouping.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example3.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example4.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example5.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example3.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/border/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/colorPicker/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example3.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example4.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/exanpeSkin/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example3.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example3.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example4.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example3.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example4.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example1.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example2.java create mode 100644 src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example3.java create mode 100644 src/main/java/fr/exanpe/t5/demo/services/AppModule.java create mode 100644 src/main/java/fr/exanpe/t5/demo/services/DataService.java create mode 100644 src/main/java/fr/exanpe/t5/demo/services/MailboxService.java create mode 100644 src/main/resources/fr/exanpe/t5/demo/components/ComponentDemoLayout.tml create mode 100644 src/main/resources/fr/exanpe/t5/demo/components/HighlightBody.tml create mode 100644 src/main/resources/fr/exanpe/t5/demo/components/HighlightTMLPage.tml create mode 100644 src/main/resources/fr/exanpe/t5/demo/components/Layout.tml create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/Grouping.properties create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/accordion/Example2.properties create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.properties create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example3.properties create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example4.properties create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/tabview/Example3.properties create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example1.properties create mode 100644 src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example2.properties create mode 100644 src/main/resources/log4j.properties create mode 100644 src/main/webapp/About.tml create mode 100644 src/main/webapp/Contact.tml create mode 100644 src/main/webapp/Index.tml create mode 100644 src/main/webapp/WEB-INF/app.properties create mode 100644 src/main/webapp/WEB-INF/appengine-web.xml create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/components/Grouping.tml create mode 100644 src/main/webapp/components/accordion/Example1.tml create mode 100644 src/main/webapp/components/accordion/Example2.tml create mode 100644 src/main/webapp/components/accordion/Example3.tml create mode 100644 src/main/webapp/components/accordion/Example4.tml create mode 100644 src/main/webapp/components/accordion/Example5.tml create mode 100644 src/main/webapp/components/ajaxLoader/Example1.tml create mode 100644 src/main/webapp/components/ajaxLoader/Example2.tml create mode 100644 src/main/webapp/components/ajaxLoader/Example3.tml create mode 100644 src/main/webapp/components/border/Example1.tml create mode 100644 src/main/webapp/components/colorPicker/Example1.tml create mode 100644 src/main/webapp/components/dialog/Example1.tml create mode 100644 src/main/webapp/components/dialog/Example2.tml create mode 100644 src/main/webapp/components/dialog/Example3.tml create mode 100644 src/main/webapp/components/dialog/Example4.tml create mode 100644 src/main/webapp/components/exanpeSkin/Example1.tml create mode 100644 src/main/webapp/components/hideablePanel/Example1.tml create mode 100644 src/main/webapp/components/hideablePanel/Example2.tml create mode 100644 src/main/webapp/components/securePassword/Example1.tml create mode 100644 src/main/webapp/components/securePassword/Example2.tml create mode 100644 src/main/webapp/components/securePassword/Example3.tml create mode 100644 src/main/webapp/components/selectLoader/Example1.tml create mode 100644 src/main/webapp/components/selectLoader/Example2.tml create mode 100644 src/main/webapp/components/slider/Example1.tml create mode 100644 src/main/webapp/components/slider/Example2.tml create mode 100644 src/main/webapp/components/slider/Example3.tml create mode 100644 src/main/webapp/components/slider/Example4.tml create mode 100644 src/main/webapp/components/tabview/Example1.tml create mode 100644 src/main/webapp/components/tabview/Example2.tml create mode 100644 src/main/webapp/components/tabview/Example3.tml create mode 100644 src/main/webapp/components/tabview/Example4.tml create mode 100644 src/main/webapp/components/tooltip/Example1.tml create mode 100644 src/main/webapp/components/tooltip/Example2.tml create mode 100644 src/main/webapp/components/tooltip/Example3.tml create mode 100644 src/main/webapp/css/github.css create mode 100644 src/main/webapp/favicon.ico create mode 100644 src/main/webapp/img/grouping/email_open.png create mode 100644 src/main/webapp/img/grouping/emails.png create mode 100644 src/main/webapp/img/grouping/information.png create mode 100644 src/main/webapp/img/tab/application.png create mode 100644 src/main/webapp/img/tab/comments.png create mode 100644 src/main/webapp/img/tab/email.png create mode 100644 src/main/webapp/js/exanpe-demo.js create mode 100644 src/main/webapp/js/highlight.js create mode 100644 src/main/webapp/layout/highlight.css create mode 100644 src/main/webapp/layout/images/img01.jpg create mode 100644 src/main/webapp/layout/images/img02.jpg create mode 100644 src/main/webapp/layout/images/img03.jpg create mode 100644 src/main/webapp/layout/images/img04.jpg create mode 100644 src/main/webapp/layout/images/img05.gif create mode 100644 src/main/webapp/layout/images/img06.gif create mode 100644 src/main/webapp/layout/images/img07.gif create mode 100644 src/main/webapp/layout/images/img08.gif create mode 100644 src/main/webapp/layout/images/img09.gif create mode 100644 src/main/webapp/layout/images/img10.gif create mode 100644 src/main/webapp/layout/images/img11.gif create mode 100644 src/main/webapp/layout/images/img12.gif create mode 100644 src/main/webapp/layout/images/img13.gif create mode 100644 src/main/webapp/layout/images/img14.gif create mode 100644 src/main/webapp/layout/images/img15.gif create mode 100644 src/main/webapp/layout/images/img16.gif create mode 100644 src/main/webapp/layout/images/img17.gif create mode 100644 src/main/webapp/layout/images/img18.gif create mode 100644 src/main/webapp/layout/images/img19.gif create mode 100644 src/main/webapp/layout/images/img20.gif create mode 100644 src/main/webapp/layout/images/spacer.gif create mode 100644 src/main/webapp/layout/layout.css create mode 100644 src/main/webapp/layout/license.txt create mode 100644 src/site/apt/index.apt create mode 100644 src/site/site.xml create mode 100644 src/test/conf/testng.xml create mode 100644 src/test/conf/webdefault.xml create mode 100644 src/test/java/PLACEHOLDER create mode 100644 src/test/resources/PLACEHOLDER diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4805370 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +test-output +bin +.classpath +.project +.settings +target +.metadata \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..72d09a0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,149 @@ + + + 4.0.0 + exanpe-t5-demo + fr.exanpe + 1.0.0-SNAPSHOT + war + exanpe-t5-demo + Showcase for exanpe-t5-lib project. + + + + + fr.exanpe + exanpe-t5-lib + 1.0.0-SNAPSHOT + + + + org.apache.tapestry + tapestry-core + ${tapestry-release-version} + + + + org.testng + testng + 5.12.1 + test + + + + org.easymock + easymock + 2.5.2 + test + + + + org.apache.tapestry + tapestry-test + ${tapestry-release-version} + test + + + + commons-io + commons-io + 2.0.1 + + + + commons-lang + commons-lang + 2.6 + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + + + + + lguerin + Laurent Guerin + zlau.dreamcat@gmail.com + + + jmaupoux + Julien Maupoux + attonnnn@gmail.com + + + + + exanpe-t5-demo + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + true + + + + + + org.mortbay.jetty + maven-jetty-plugin + 6.1.16 + + + + + true + + + + + net.kindleit + maven-gae-plugin + 0.8.4 + + gae + + + + net.kindleit + gae-runtime + ${gae.version} + pom + + + + + + + + + + + apache-snapshots + http://repository.apache.org/snapshots/ + + + + + + UTF-8 + 5.2.6 + 1.5.1 + + diff --git a/src/main/java/fr/exanpe/t5/demo/components/ComponentDemoLayout.java b/src/main/java/fr/exanpe/t5/demo/components/ComponentDemoLayout.java new file mode 100644 index 0000000..5327071 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/components/ComponentDemoLayout.java @@ -0,0 +1,41 @@ +package fr.exanpe.t5.demo.components; + +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.Block; +import org.apache.tapestry5.annotations.Import; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.services.javascript.JavaScriptSupport; + +/** + * Layout component for pages of application exanpe-t5-demo. + */ +@Import(stylesheet="context:layout/layout.css") +public class ComponentDemoLayout +{ + + @Property + @Parameter(required = true, allowNull = false, defaultPrefix = BindingConstants.LITERAL) + private String title; + + @Property + @Parameter + private Block description; + + @Property + @Parameter + private Block code; + + @Property + @Parameter + private Block javacode; + + @Property + @Parameter + private Block notice; + + @Inject + private JavaScriptSupport javaScriptSupport; + +} diff --git a/src/main/java/fr/exanpe/t5/demo/components/HighlightBody.java b/src/main/java/fr/exanpe/t5/demo/components/HighlightBody.java new file mode 100644 index 0000000..e4d9754 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/components/HighlightBody.java @@ -0,0 +1,16 @@ +package fr.exanpe.t5.demo.components; + +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.annotations.Import; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.Property; + +@Import(stylesheet="context:css/github.css", library={"context:js/highlight.js", "context:js/exanpe-demo.js"}) +public class HighlightBody { + + @Property + @Parameter(defaultPrefix = BindingConstants.LITERAL, required = true, allowNull = false, value="xml") + private String type; + + +} diff --git a/src/main/java/fr/exanpe/t5/demo/components/HighlightTMLPage.java b/src/main/java/fr/exanpe/t5/demo/components/HighlightTMLPage.java new file mode 100644 index 0000000..810fc20 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/components/HighlightTMLPage.java @@ -0,0 +1,48 @@ +package fr.exanpe.t5.demo.components; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.io.IOUtils; +import org.apache.tapestry5.BindingConstants; +import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.annotations.AfterRender; +import org.apache.tapestry5.annotations.Import; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.SetupRender; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.services.RequestGlobals; + +@Import(stylesheet="context:css/github.css", library={"context:js/highlight.js", "context:js/exanpe-demo.js"}) +public class HighlightTMLPage { + + @Property + @Parameter(defaultPrefix = BindingConstants.LITERAL, required = true, allowNull = false, value="") + private String codeStart; + + @Property + @Parameter(defaultPrefix = BindingConstants.LITERAL, required = true, allowNull = false, value="") + private String codeEnd; + + @Property + private String highlight; + + @Inject + private RequestGlobals request; + + @SetupRender + public void init() throws IOException{ + InputStream stream = request.getHTTPServletRequest().getSession().getServletContext().getResourceAsStream("/"+request.getActivePageName()+".tml"); + + String s = IOUtils.toString(stream); + + int start = s.indexOf(codeStart); + if(start == -1) + throw new IllegalStateException("The hightlight component requires a "+codeStart+" tag in the calling page"); + + highlight = s.substring(start+codeStart.length(), s.indexOf(codeEnd)); + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/components/Layout.java b/src/main/java/fr/exanpe/t5/demo/components/Layout.java new file mode 100644 index 0000000..0e044d3 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/components/Layout.java @@ -0,0 +1,44 @@ +package fr.exanpe.t5.demo.components; + +import org.apache.tapestry5.*; +import org.apache.tapestry5.annotations.*; +import org.apache.tapestry5.ioc.annotations.*; +import org.apache.tapestry5.BindingConstants; + +/** + * Layout component for pages of application exanpe-t5-demo. + */ +@Import(stylesheet="context:layout/layout.css") +public class Layout +{ + /** The page title, for the element and the <h1> element. */ + @Property + @Parameter(required = true, defaultPrefix = BindingConstants.LITERAL) + private String title; + + @Property + private String pageName; + + @Property + @Parameter(defaultPrefix = BindingConstants.LITERAL) + private String sidebarTitle; + + @Property + @Parameter(defaultPrefix = BindingConstants.LITERAL) + private Block sidebar; + + @Inject + private ComponentResources resources; + + public String getClassForPageName() + { + return resources.getPageName().equalsIgnoreCase(pageName) + ? "current_page_item" + : null; + } + + public String[] getPageNames() + { + return new String[] { "Index", "About", "Contact" }; + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/data/CountryEnum.java b/src/main/java/fr/exanpe/t5/demo/data/CountryEnum.java new file mode 100644 index 0000000..4cf666c --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/data/CountryEnum.java @@ -0,0 +1,23 @@ +package fr.exanpe.t5.demo.data; + +import java.io.Serializable; + +public enum CountryEnum implements Serializable +{ + FRANCE(new String[] + { "Paris", "Lyon", "Marseille" }), UK(new String[] + { "London", "Liverpool", "Manchester" }), USA(new String[] + { "New York", "Washington", "Los Angeles", "San Francisco", "Miami" }); + + private final String[] cities; + + private CountryEnum(String[] cities) + { + this.cities = cities; + } + + public String[] getCities() + { + return cities; + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/data/FranceCityEnum.java b/src/main/java/fr/exanpe/t5/demo/data/FranceCityEnum.java new file mode 100644 index 0000000..c5eb6a1 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/data/FranceCityEnum.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.data; + +public enum FranceCityEnum +{ + PARIS, LYON, NANTES; +} diff --git a/src/main/java/fr/exanpe/t5/demo/data/ThirdEnum.java b/src/main/java/fr/exanpe/t5/demo/data/ThirdEnum.java new file mode 100644 index 0000000..92f61cd --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/data/ThirdEnum.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.data; + +public enum ThirdEnum +{ + HOUSE, FLAT, CAVE; +} diff --git a/src/main/java/fr/exanpe/t5/demo/data/UKCityEnum.java b/src/main/java/fr/exanpe/t5/demo/data/UKCityEnum.java new file mode 100644 index 0000000..da7581a --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/data/UKCityEnum.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.data; + +public enum UKCityEnum +{ + LONDON, MANCHESTER, LIVERPOOL; +} diff --git a/src/main/java/fr/exanpe/t5/demo/data/USACityEnum.java b/src/main/java/fr/exanpe/t5/demo/data/USACityEnum.java new file mode 100644 index 0000000..6c7fff0 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/data/USACityEnum.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.data; + +public enum USACityEnum +{ + NEW_YORK, WASHINGTON, LOS_ANGELES, SAN_FRANCISCO, MIAMI; +} diff --git a/src/main/java/fr/exanpe/t5/demo/data/User.java b/src/main/java/fr/exanpe/t5/demo/data/User.java new file mode 100644 index 0000000..3b2b79c --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/data/User.java @@ -0,0 +1,31 @@ +package fr.exanpe.t5.demo.data; + +import org.apache.tapestry5.beaneditor.NonVisual; + +public class User +{ + @NonVisual + private long id; + + private String firstName; + + private String lastName; + + private int age; + + public long getId() { return id; } + + public void setId(long id) { this.id = id; } + + public String getFirstName() { return firstName; } + + public void setFirstName(String firstName) { this.firstName = firstName; } + + public String getLastName() { return lastName; } + + public void setLastName(String lastName) { this.lastName = lastName; } + + public int getAge() { return age; } + + public void setAge(int age) { this.age = age; } +} \ No newline at end of file diff --git a/src/main/java/fr/exanpe/t5/demo/grouping/Mail.java b/src/main/java/fr/exanpe/t5/demo/grouping/Mail.java new file mode 100644 index 0000000..b0ed5cf --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/grouping/Mail.java @@ -0,0 +1,73 @@ +package fr.exanpe.t5.demo.grouping; + +import java.io.Serializable; +import java.util.Date; + +public class Mail implements Serializable +{ + private int id; + private String subject; + private String content; + private Date date; + private String from; + + public Mail(int id, String subject, String content, Date date, String from) + { + this.id = id; + this.subject = subject; + this.content = content; + this.date = date; + this.from = from; + } + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public String getSubject() + { + return subject; + } + + public void setSubject(String subject) + { + this.subject = subject; + } + + public String getContent() + { + return content; + } + + public void setContent(String content) + { + this.content = content; + } + + public Date getDate() + { + return date; + } + + public void setDate(Date date) + { + this.date = date; + } + + public String getFrom() + { + return from; + } + + public void setFrom(String from) + { + this.from = from; + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/grouping/MailboxSumUp.java b/src/main/java/fr/exanpe/t5/demo/grouping/MailboxSumUp.java new file mode 100644 index 0000000..6261613 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/grouping/MailboxSumUp.java @@ -0,0 +1,59 @@ +package fr.exanpe.t5.demo.grouping; + +public class MailboxSumUp +{ + private int total; + private int unread; + private int sent; + private int deleted; + + public MailboxSumUp(int total, int unread, int sent, int deleted) + { + super(); + this.total = total; + this.unread = unread; + this.sent = sent; + this.deleted = deleted; + } + + public int getTotal() + { + return total; + } + + public void setTotal(int total) + { + this.total = total; + } + + public int getUnread() + { + return unread; + } + + public void setUnread(int unread) + { + this.unread = unread; + } + + public int getSent() + { + return sent; + } + + public void setSent(int sent) + { + this.sent = sent; + } + + public int getDeleted() + { + return deleted; + } + + public void setDeleted(int deleted) + { + this.deleted = deleted; + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/About.java b/src/main/java/fr/exanpe/t5/demo/pages/About.java new file mode 100644 index 0000000..e2b01e2 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/About.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages; + +public class About +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/Contact.java b/src/main/java/fr/exanpe/t5/demo/pages/Contact.java new file mode 100644 index 0000000..9bad6a4 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/Contact.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages; + +public class Contact +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/Index.java b/src/main/java/fr/exanpe/t5/demo/pages/Index.java new file mode 100644 index 0000000..55dc7cf --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/Index.java @@ -0,0 +1,10 @@ +package fr.exanpe.t5.demo.pages; + + +/** + * Start page of application exanpe-t5-demo. + */ +public class Index +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/Grouping.java b/src/main/java/fr/exanpe/t5/demo/pages/components/Grouping.java new file mode 100644 index 0000000..0bb7749 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/Grouping.java @@ -0,0 +1,99 @@ +package fr.exanpe.t5.demo.pages.components; + +import java.util.LinkedList; +import java.util.List; + +import org.apache.tapestry5.EventConstants; +import org.apache.tapestry5.annotations.Component; +import org.apache.tapestry5.annotations.OnEvent; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.ioc.annotations.Inject; + +import fr.exanpe.t5.demo.grouping.Mail; +import fr.exanpe.t5.demo.grouping.MailboxSumUp; +import fr.exanpe.t5.demo.services.MailboxService; +import fr.exanpe.t5.lib.components.TabView; + +public class Grouping +{ + @Property + private MailboxSumUp sumUp; + + @Property + @Persist + private List<Mail> mailsOpen; + + @Property + @Persist + private List<Mail> mailsReceived; + + @Property + private Mail iteMail; + + @Inject + private MailboxService service; + + @Component(id = "tabview") + private TabView tabView; + + void onActivate() + { + sumUp = service.getSumUp(); + } + + @OnEvent(value = EventConstants.ACTION, component = "received") + void initReceivedMails() + { + mailsReceived = service.getMailsReceived(); + tabView.setSelectedTab("tabReceived"); + } + + void onActionFromOpen(int mailId) + { + if (mailsOpen == null) + mailsOpen = new LinkedList<Mail>(); + + for (Mail m : mailsReceived) + if (m.getId() == mailId) + { + mailsOpen.add(m); + break; + } + } + + void onActionFromClose(int mailId) + { + if (mailsOpen == null) + return; + + for (Mail m : mailsReceived) + if (m.getId() == mailId) + { + mailsOpen.remove(m); + break; + } + tabView.setSelectedTab("tabReceived"); + } + + public String getShortenedSubject() + { + if (iteMail.getSubject().length() > 20) + return iteMail.getSubject().substring(0, 20) + "..."; + return iteMail.getSubject(); + } + + public String getShortenedContent() + { + if (iteMail.getContent().length() > 40) + return iteMail.getContent().substring(0, 40) + "..."; + return iteMail.getContent(); + } + + public String getShortenedFrom() + { + if (iteMail.getFrom().length() > 20) + return iteMail.getFrom().substring(0, 20) + "..."; + return iteMail.getFrom(); + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example1.java new file mode 100644 index 0000000..ab23787 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example1.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.accordion; + +public class Example1 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example2.java new file mode 100644 index 0000000..0a390e3 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example2.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.accordion; + +public class Example2 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example3.java b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example3.java new file mode 100644 index 0000000..1c5745f --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example3.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.accordion; + +public class Example3 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example4.java b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example4.java new file mode 100644 index 0000000..c2df07e --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example4.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.accordion; + +public class Example4 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example5.java b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example5.java new file mode 100644 index 0000000..9aee724 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/accordion/Example5.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.accordion; + +public class Example5 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example1.java new file mode 100644 index 0000000..1961d25 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example1.java @@ -0,0 +1,21 @@ +package fr.exanpe.t5.demo.pages.components.ajaxLoader; + +public class Example1 +{ + + public String getSleep() + { + try + { + Thread.currentThread().sleep(2000); + } + catch (InterruptedException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return ""; + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.java new file mode 100644 index 0000000..31f7d93 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.java @@ -0,0 +1,21 @@ +package fr.exanpe.t5.demo.pages.components.ajaxLoader; + +public class Example2 +{ + + public String getSleep() + { + try + { + Thread.currentThread().sleep(2000); + } + catch (InterruptedException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return ""; + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example3.java b/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example3.java new file mode 100644 index 0000000..ffda916 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example3.java @@ -0,0 +1,19 @@ +package fr.exanpe.t5.demo.pages.components.ajaxLoader; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.tapestry5.annotations.Property; + +public class Example3 +{ + + @Property + private String date; + + public void onActivate() + { + date = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss").format(new Date()); + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/border/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/border/Example1.java new file mode 100644 index 0000000..ff1aa57 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/border/Example1.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.border; + +public class Example1 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/colorPicker/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/colorPicker/Example1.java new file mode 100644 index 0000000..a8a0196 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/colorPicker/Example1.java @@ -0,0 +1,13 @@ +package fr.exanpe.t5.demo.pages.components.colorPicker; + +import java.awt.Color; + +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example1 +{ + @Property + @Persist + private Color color; +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example1.java new file mode 100644 index 0000000..e24255c --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example1.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.dialog; + +public class Example1 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example2.java new file mode 100644 index 0000000..b77ad33 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example2.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.dialog; + +public class Example2 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example3.java b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example3.java new file mode 100644 index 0000000..4a6fe58 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example3.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.dialog; + +public class Example3 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example4.java b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example4.java new file mode 100644 index 0000000..dfba3fe --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/dialog/Example4.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.dialog; + +public class Example4 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/exanpeSkin/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/exanpeSkin/Example1.java new file mode 100644 index 0000000..50e7d4f --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/exanpeSkin/Example1.java @@ -0,0 +1,68 @@ +package fr.exanpe.t5.demo.pages.components.exanpeSkin; + +import java.util.List; + +import org.apache.tapestry5.SelectModel; +import org.apache.tapestry5.ValueEncoder; +import org.apache.tapestry5.annotations.Import; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.SetupRender; +import org.apache.tapestry5.ioc.Messages; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.util.EnumSelectModel; +import org.apache.tapestry5.util.EnumValueEncoder; + +import fr.exanpe.t5.demo.data.User; +import fr.exanpe.t5.demo.services.DataService; + +@Import(stylesheet = "${exanpe.asset-base}/css/exanpe-t5-lib-skin.css") +public class Example1 +{ + @Inject + private DataService dataService; + + @Inject + private Messages messages; + + /** GRID **/ + @Property + private List<User> users; + + @Property + private User iteUser; + + /** Auto Complete **/ + @Property + private String country; + + public List<String> onProvideCompletionsFromCountryName(String partial) + { + return dataService.getListOfString(); + } + + /** Palette **/ + + @Property + private final ValueEncoder<PaletteEnum> encoder = new EnumValueEncoder(PaletteEnum.class); + + @Property + private final SelectModel model = new EnumSelectModel(PaletteEnum.class, messages); + + @Property + private List<PaletteEnum> selected; + + public enum PaletteEnum + { + TEST, TEST2, TEST3, TEST4; + } + + /** BeanEditor */ + @Property + private User userEdit; + + @SetupRender + public void init() + { + users = dataService.getListUsers(); + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example1.java new file mode 100644 index 0000000..307f2b1 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example1.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.hideablePanel; + +public class Example1 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example2.java new file mode 100644 index 0000000..fd77ac5 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/hideablePanel/Example2.java @@ -0,0 +1,5 @@ +package fr.exanpe.t5.demo.pages.components.hideablePanel; + +public class Example2 { + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example1.java new file mode 100644 index 0000000..d770a6d --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example1.java @@ -0,0 +1,21 @@ +package fr.exanpe.t5.demo.pages.components.securePassword; + +import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example1 +{ + @Property + private String passwordValue; + + @Persist(PersistenceConstants.FLASH) + @Property + private String val; + + void onSubmit() + { + val = passwordValue; + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example2.java new file mode 100644 index 0000000..5347ace --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example2.java @@ -0,0 +1,21 @@ +package fr.exanpe.t5.demo.pages.components.securePassword; + +import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example2 +{ + @Property + private String passwordValue; + + @Persist(PersistenceConstants.FLASH) + @Property + private String val; + + void onSubmit() + { + val = passwordValue; + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example3.java b/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example3.java new file mode 100644 index 0000000..7407000 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/securePassword/Example3.java @@ -0,0 +1,17 @@ +package fr.exanpe.t5.demo.pages.components.securePassword; + +import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example3 +{ + @Persist(PersistenceConstants.FLASH) + @Property + private String passwordValue; + + void onSubmit() + { + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example1.java new file mode 100644 index 0000000..afe6795 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example1.java @@ -0,0 +1,85 @@ +package fr.exanpe.t5.demo.pages.components.selectLoader; + +import org.apache.commons.lang.StringUtils; +import org.apache.tapestry5.OptionModel; +import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.SelectModel; +import org.apache.tapestry5.ValueEncoder; +import org.apache.tapestry5.annotations.OnEvent; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.SetupRender; +import org.apache.tapestry5.internal.OptionModelImpl; +import org.apache.tapestry5.internal.SelectModelImpl; +import org.apache.tapestry5.internal.services.EnumValueEncoderFactory; +import org.apache.tapestry5.ioc.Messages; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.util.EnumSelectModel; + +import fr.exanpe.t5.demo.data.CountryEnum; +import fr.exanpe.t5.demo.services.DataService; +import fr.exanpe.t5.lib.constants.ExanpeEventConstants; + +public class Example1 +{ + @Inject + private DataService dataService; + + @Inject + private Messages messages; + + @Property + private ValueEncoder<CountryEnum> countryEncoder = new EnumValueEncoderFactory().create(CountryEnum.class); + + @Property + private SelectModel country; + + @Property + @Persist(PersistenceConstants.FLASH) + private CountryEnum countryValue; + + @Property + private SelectModel city; + + @Property + @Persist(PersistenceConstants.FLASH) + private String cityValue; + + @SetupRender + public void ini() + { + country = new EnumSelectModel(CountryEnum.class, messages); + loadCountrySelect(); + } + + public void onSubmit() + { + loadCountrySelect(); + } + + private void loadCountrySelect() + { + if (countryValue == null) + city = new SelectModelImpl(new OptionModelImpl[0]); + else + city = populateSelect(countryValue.toString()); + } + + @OnEvent(value = ExanpeEventConstants.SELECTLOADER_EVENT) + public SelectModel populateSelect(String value) + { + if (StringUtils.isEmpty(value)) + return null; + + String[] cities = dataService.getCitiesFromCountry(CountryEnum.valueOf(value)); + + OptionModel[] om = new OptionModel[cities.length]; + + for (int i = 0; i < cities.length; i++) + om[i] = new OptionModelImpl(cities[i]); + + city = new SelectModelImpl(om); + + return city; + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example2.java new file mode 100644 index 0000000..9bb79fd --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/selectLoader/Example2.java @@ -0,0 +1,147 @@ +package fr.exanpe.t5.demo.pages.components.selectLoader; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.apache.tapestry5.OptionModel; +import org.apache.tapestry5.PersistenceConstants; +import org.apache.tapestry5.SelectModel; +import org.apache.tapestry5.ValueEncoder; +import org.apache.tapestry5.annotations.OnEvent; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.annotations.SetupRender; +import org.apache.tapestry5.internal.OptionModelImpl; +import org.apache.tapestry5.internal.SelectModelImpl; +import org.apache.tapestry5.internal.services.EnumValueEncoderFactory; +import org.apache.tapestry5.ioc.Messages; +import org.apache.tapestry5.ioc.annotations.Inject; +import org.apache.tapestry5.util.EnumSelectModel; + +import fr.exanpe.t5.demo.data.CountryEnum; +import fr.exanpe.t5.demo.data.ThirdEnum; +import fr.exanpe.t5.demo.services.DataService; +import fr.exanpe.t5.lib.constants.ExanpeEventConstants; + +public class Example2 +{ + @Inject + private DataService dataService; + + @Inject + private Messages messages; + + @Property + private ValueEncoder<CountryEnum> countryEncoder = new EnumValueEncoderFactory().create(CountryEnum.class); + + @Property + private SelectModel country; + + @Property + private SelectModel city; + + @Property + private SelectModel type; + + @Property + @Persist(PersistenceConstants.FLASH) + private CountryEnum countryValue; + + @Property + @Persist(PersistenceConstants.FLASH) + private String cityValue; + + @Property + @Persist(PersistenceConstants.FLASH) + private String typeValue; + + @SetupRender + public void ini() + { + country = new EnumSelectModel(CountryEnum.class, messages); + loadCitySelect(); + loadTypeSelect(); + + } + + private void loadCitySelect() + { + if (countryValue == null) + city = new SelectModelImpl(new OptionModelImpl[0]); + else + { + List<OptionModel> opts = createCityOpt(countryValue.toString()); + OptionModel[] om = new OptionModel[opts.size()]; + city = new SelectModelImpl((OptionModel[]) opts.toArray(om)); + } + } + + private void loadTypeSelect() + { + if (cityValue == null) + type = new SelectModelImpl(new OptionModelImpl[0]); + else + { + List<OptionModel> opts = createTypeOpt(cityValue.toString()); + OptionModel[] om = new OptionModel[opts.size()]; + type = new SelectModelImpl((OptionModel[]) opts.toArray(om)); + } + } + + public void onSubmit() + { + + } + + private List<OptionModel> createCityOpt(String value) + { + if (StringUtils.isEmpty(value)) + return null; + + List<OptionModel> opts = new ArrayList<OptionModel>(); + + String[] cities = dataService.getCitiesFromCountry(CountryEnum.valueOf(value)); + + for (int i = 0; i < cities.length; i++) + opts.add(new OptionModelImpl(cities[i])); + + return opts; + } + + private List<OptionModel> createTypeOpt(String value) + { + if (StringUtils.isEmpty(value)) + return null; + + ThirdEnum[] te = ThirdEnum.values(); + + List<OptionModel> opts = new ArrayList<OptionModel>(3); + + for (int i = 0; i < te.length; i++) + opts.add(new OptionModelImpl(te[i].toString())); + + return opts; + } + + @OnEvent(value = ExanpeEventConstants.SELECTLOADER_EVENT, component = "country") + public SelectModel populateSelectCity(String value) + { + List<OptionModel> opts = createCityOpt(value); + opts.add(0, new OptionModelImpl(" ", " ")); + + OptionModel[] om = new OptionModel[opts.size()]; + + return new SelectModelImpl((OptionModel[]) opts.toArray(om)); + } + + @OnEvent(value = ExanpeEventConstants.SELECTLOADER_EVENT, component = "city") + public SelectModel populateSelectType(String value) + { + List<OptionModel> opts = createTypeOpt(value); + + OptionModel[] om = new OptionModel[opts.size()]; + + return new SelectModelImpl((OptionModel[]) opts.toArray(om)); + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example1.java new file mode 100644 index 0000000..ee6576f --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example1.java @@ -0,0 +1,11 @@ +package fr.exanpe.t5.demo.pages.components.slider; + +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example1 +{ + @Property + @Persist + private int sliderValue; +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example2.java new file mode 100644 index 0000000..e628ac4 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example2.java @@ -0,0 +1,11 @@ +package fr.exanpe.t5.demo.pages.components.slider; + +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example2 +{ + @Property + @Persist + private float sliderValue; +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example3.java b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example3.java new file mode 100644 index 0000000..cf74a86 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example3.java @@ -0,0 +1,11 @@ +package fr.exanpe.t5.demo.pages.components.slider; + +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example3 +{ + @Property + @Persist + private int sliderValue; +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example4.java b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example4.java new file mode 100644 index 0000000..b176bfa --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/slider/Example4.java @@ -0,0 +1,11 @@ +package fr.exanpe.t5.demo.pages.components.slider; + +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; + +public class Example4 +{ + @Property + @Persist + private int sliderValue; +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example1.java new file mode 100644 index 0000000..deb6e99 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example1.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages.components.tabview; + +public class Example1 +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example2.java new file mode 100644 index 0000000..5538f4e --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example2.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages.components.tabview; + +public class Example2 +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example3.java b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example3.java new file mode 100644 index 0000000..814bb78 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example3.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages.components.tabview; + +public class Example3 +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example4.java b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example4.java new file mode 100644 index 0000000..fccb891 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/tabview/Example4.java @@ -0,0 +1,20 @@ +package fr.exanpe.t5.demo.pages.components.tabview; + +import org.apache.tapestry5.annotations.Component; +import org.apache.tapestry5.annotations.Property; + +import fr.exanpe.t5.lib.components.TabView; + +public class Example4 +{ + @Component(id = "tabv") + private TabView tabView; + + @Property + private String defaultTab = "tab2"; + + public void onActionFromSetThird() + { + tabView.setSelectedTab("tab3"); + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example1.java b/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example1.java new file mode 100644 index 0000000..e75459d --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example1.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages.components.tooltip; + +public class Example1 +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example2.java b/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example2.java new file mode 100644 index 0000000..6598224 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example2.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages.components.tooltip; + +public class Example2 +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example3.java b/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example3.java new file mode 100644 index 0000000..b8c55a9 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/pages/components/tooltip/Example3.java @@ -0,0 +1,6 @@ +package fr.exanpe.t5.demo.pages.components.tooltip; + +public class Example3 +{ + +} diff --git a/src/main/java/fr/exanpe/t5/demo/services/AppModule.java b/src/main/java/fr/exanpe/t5/demo/services/AppModule.java new file mode 100644 index 0000000..b43e0f9 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/services/AppModule.java @@ -0,0 +1,148 @@ +package fr.exanpe.t5.demo.services; + +import java.io.IOException; + +import org.apache.tapestry5.SymbolConstants; +import org.apache.tapestry5.ioc.Configuration; +import org.apache.tapestry5.ioc.MappedConfiguration; +import org.apache.tapestry5.ioc.OrderedConfiguration; +import org.apache.tapestry5.ioc.ServiceBinder; +import org.apache.tapestry5.ioc.annotations.Local; +import org.apache.tapestry5.ioc.annotations.SubModule; +import org.apache.tapestry5.ioc.services.Coercion; +import org.apache.tapestry5.ioc.services.CoercionTuple; +import org.apache.tapestry5.services.Request; +import org.apache.tapestry5.services.RequestFilter; +import org.apache.tapestry5.services.RequestHandler; +import org.apache.tapestry5.services.Response; +import org.apache.tapestry5.util.StringToEnumCoercion; +import org.slf4j.Logger; + +import fr.exanpe.t5.demo.data.CountryEnum; +import fr.exanpe.t5.demo.data.FranceCityEnum; +import fr.exanpe.t5.demo.data.ThirdEnum; +import fr.exanpe.t5.lib.services.ExanpeLibraryModule; + +/** + * This module is automatically included as part of the Tapestry IoC Registry, it's a good place to + * configure and extend Tapestry, or to place your own service definitions. + */ +@SubModule(ExanpeLibraryModule.class) +public class AppModule +{ + public static void bind(ServiceBinder binder) + { + // binder.bind(MyServiceInterface.class, MyServiceImpl.class); + + // Make bind() calls on the binder object to define most IoC services. + // Use service builder methods (example below) when the implementation + // is provided inline, or requires more initialization than simply + // invoking the constructor. + binder.bind(DataService.class, DataService.class); + binder.bind(MailboxService.class, MailboxService.class); + } + + public static void contributeApplicationDefaults(MappedConfiguration<String, String> configuration) + { + // Contributions to ApplicationDefaults will override any contributions to + // FactoryDefaults (with the same key). Here we're restricting the supported + // locales to just "en" (English). As you add localised message catalogs and other assets, + // you can extend this list of locales (it's a comma separated series of locale names; + // the first locale name is the default when there's no reasonable match). + + configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en"); + + // The factory default is true but during the early stages of an application + // overriding to false is a good idea. In addition, this is often overridden + // on the command line as -Dtapestry.production-mode=false + configuration.add(SymbolConstants.PRODUCTION_MODE, "true"); + + // The application version number is incorprated into URLs for some + // assets. Web browsers will cache assets because of the far future expires + // header. If existing assets are changed, the version number should also + // change, to force the browser to download new versions. + configuration.add(SymbolConstants.APPLICATION_VERSION, "1.0.0-SNAPSHOT"); + } + + /** + * This is a service definition, the service will be named "TimingFilter". The interface, + * RequestFilter, is used within the RequestHandler service pipeline, which is built from the + * RequestHandler service configuration. Tapestry IoC is responsible for passing in an + * appropriate Logger instance. Requests for static resources are handled at a higher level, so + * this filter will only be invoked for Tapestry related requests. + * <p> + * Service builder methods are useful when the implementation is inline as an inner class (as + * here) or require some other kind of special initialization. In most cases, use the static + * bind() method instead. + * <p> + * If this method was named "build", then the service id would be taken from the service + * interface and would be "RequestFilter". Since Tapestry already defines a service named + * "RequestFilter" we use an explicit service id that we can reference inside the contribution + * method. + */ + public RequestFilter buildTimingFilter(final Logger log) + { + return new RequestFilter() + { + public boolean service(Request request, Response response, RequestHandler handler) throws IOException + { + long startTime = System.currentTimeMillis(); + + try + { + // The responsibility of a filter is to invoke the corresponding method + // in the handler. When you chain multiple filters together, each filter + // received a handler that is a bridge to the next filter. + + return handler.service(request, response); + } + finally + { + long elapsed = System.currentTimeMillis() - startTime; + + log.info(String.format("Request time: %d ms", elapsed)); + } + } + }; + } + + /** + * This is a contribution to the RequestHandler service configuration. This is how we extend + * Tapestry using the timing filter. A common use for this kind of filter is transaction + * management or security. The @Local annotation selects the desired service by type, but only + * from the same module. Without @Local, there would be an error due to the other service(s) + * that implement RequestFilter (defined in other modules). + */ + public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration, @Local + RequestFilter filter) + { + // Each contribution to an ordered configuration has a name, When necessary, you may + // set constraints to precisely control the invocation order of the contributed filter + // within the pipeline. + + configuration.add("Timing", filter); + } + + public static void contributeTypeCoercer(@SuppressWarnings("rawtypes") + Configuration<CoercionTuple> configuration) + { + configuration.add(CoercionTuple.create(String.class, CountryEnum.class, StringToEnumCoercion.create(CountryEnum.class))); + configuration.add(CoercionTuple.create(String.class, FranceCityEnum.class, StringToEnumCoercion.create(FranceCityEnum.class))); + configuration.add(CoercionTuple.create(String.class, ThirdEnum.class, StringToEnumCoercion.create(ThirdEnum.class))); + // configuration.add(CoercionTuple.create(String.class, CountryEnum.class, + // StringToEnumCoercion.create(CountryEnum.class))); + // configuration.add(CoercionTuple.create(String.class, CountryEnum.class, + // StringToEnumCoercion.create(CountryEnum.class))); + + Coercion<CountryEnum, String> countryEnum = new Coercion<CountryEnum, String>() + { + public String coerce(CountryEnum input) + { + return input.toString(); + } + }; + + configuration.add(new CoercionTuple<CountryEnum, String>(CountryEnum.class, String.class, countryEnum)); + } + +} diff --git a/src/main/java/fr/exanpe/t5/demo/services/DataService.java b/src/main/java/fr/exanpe/t5/demo/services/DataService.java new file mode 100644 index 0000000..b5acb07 --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/services/DataService.java @@ -0,0 +1,46 @@ +package fr.exanpe.t5.demo.services; + +import java.util.ArrayList; +import java.util.List; + +import fr.exanpe.t5.demo.data.CountryEnum; +import fr.exanpe.t5.demo.data.User; + +public class DataService +{ + + private User createUser(int id, String name, String firstName, int age) + { + User u = new User(); + u.setId(id); + u.setLastName(name); + u.setFirstName(firstName); + u.setAge(age); + return u; + } + + public List<User> getListUsers() + { + List<User> users = new ArrayList<User>(); + + for (int i = 0; i < 50; i++) + users.add(createUser(i, "Name " + i, "First Name " + i, 20 + i)); + + return users; + } + + public List<String> getListOfString() + { + List<String> list = new ArrayList<String>(); + + for (int i = 0; i < 30; i++) + list.add("Hello World " + i); + + return list; + } + + public String[] getCitiesFromCountry(CountryEnum e) + { + return e.getCities(); + } +} diff --git a/src/main/java/fr/exanpe/t5/demo/services/MailboxService.java b/src/main/java/fr/exanpe/t5/demo/services/MailboxService.java new file mode 100644 index 0000000..5a256fb --- /dev/null +++ b/src/main/java/fr/exanpe/t5/demo/services/MailboxService.java @@ -0,0 +1,30 @@ +package fr.exanpe.t5.demo.services; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import fr.exanpe.t5.demo.grouping.Mail; +import fr.exanpe.t5.demo.grouping.MailboxSumUp; + +public class MailboxService +{ + private static final int NB_MAIL_RECEIVED = 32; + + public MailboxSumUp getSumUp() + { + return new MailboxSumUp(NB_MAIL_RECEIVED, 4, 12, 120); + } + + public List<Mail> getMailsReceived() + { + List<Mail> list = new ArrayList<Mail>(NB_MAIL_RECEIVED); + + for (int i = 1; i < NB_MAIL_RECEIVED + 1; i++) + list.add(new Mail(i, "Subject " + i, + "Hey what's up ! \n This representents a mail content. No real interest writing a new one everytime ! Just to notice this is the mail number " + + i, new Date(), "sender" + i + "@mail.com")); + + return list; + } +} diff --git a/src/main/resources/fr/exanpe/t5/demo/components/ComponentDemoLayout.tml b/src/main/resources/fr/exanpe/t5/demo/components/ComponentDemoLayout.tml new file mode 100644 index 0000000..e154fbf --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/components/ComponentDemoLayout.tml @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html t:type="layout" title="prop:title" + xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" + xmlns:p="tapestry:parameter"> + + <div class="description"> + Description + </div> + <t:delegate to="description"/> + <br/><br/><br/> + + <t:if test="code"> + <div class="inaction"> + In Action + </div> + <t:delegate to="code"/> + <br/><br/><br/> + + <div class="tmlSource"> + TML Source code + </div> + <t:highlightTMLPage/> + <br/><br/><br/> + </t:if> + + <t:body/> + + <t:if test="javacode"> + <div class="javacode"> + Java code + </div> + <t:highlightBody type="java"> + <t:delegate to="javacode"/> + </t:highlightBody> + <br/> + </t:if> + + <t:if test="notice"> + <div class="notice"> + Notice + </div> + <t:delegate to="notice"/> + <br/> + </t:if> + +</html> diff --git a/src/main/resources/fr/exanpe/t5/demo/components/HighlightBody.tml b/src/main/resources/fr/exanpe/t5/demo/components/HighlightBody.tml new file mode 100644 index 0000000..7a95fb2 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/components/HighlightBody.tml @@ -0,0 +1,10 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<t:container xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> + <div class="${type}"> + <pre> + <code> + <t:body/> + </code> + </pre> + </div> +</t:container> diff --git a/src/main/resources/fr/exanpe/t5/demo/components/HighlightTMLPage.tml b/src/main/resources/fr/exanpe/t5/demo/components/HighlightTMLPage.tml new file mode 100644 index 0000000..158dd53 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/components/HighlightTMLPage.tml @@ -0,0 +1,8 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<t:container xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> + <div class="xml"> + <pre> + <code>${highlight}</code> + </pre> + </div> +</t:container> diff --git a/src/main/resources/fr/exanpe/t5/demo/components/Layout.tml b/src/main/resources/fr/exanpe/t5/demo/components/Layout.tml new file mode 100644 index 0000000..cc56d77 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/components/Layout.tml @@ -0,0 +1,68 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!-- + +Design by Free CSS Templates +http://www.freecsstemplates.org +Released for free under a Creative Commons Attribution 2.5 License + +Title : Concrete +Version : 1.0 +Released : 20080825 +Description: A Web 2.0 design with fluid width suitable for blogs and small websites. +--> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" + xmlns:p="tapestry:parameter"> + <head> + <meta http-equiv="content-type" content="text/html; charset=utf-8"/> + <title>${title} + + + + + + +
+ +
+
+
+

${title}

+
+
+ +
+
+
+ +
+
+ + + + + + diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/Grouping.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/Grouping.properties new file mode 100644 index 0000000..4dc3cf5 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/Grouping.properties @@ -0,0 +1,22 @@ +cat-title=Webmail + +mail-title=Mailbox +calendar-title=Calendar +calendar-content=Not implemented +tasks-title=Tasks +tasks-content=Not implemented + +receivedLink=Received +sentLink=Sent +deletedLink=Deleted + +tabpres-title=Presentation +tabpres-icon=context:/img/grouping/information.png + +tabReceived-title=Received +tabReceived-icon=context:/img/grouping/emails.png + +showInTab-label=Show in new tab + +not-implemented=This action is not implemented +not-implemented-title=Sorry ! \ No newline at end of file diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/accordion/Example2.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/accordion/Example2.properties new file mode 100644 index 0000000..7cd8e09 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/accordion/Example2.properties @@ -0,0 +1,6 @@ +item1-title=Title of item 1 +item2-title=Title of item 2 + +item1-content=Content of item 1 +item2-content=Content of item 2 + diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.properties new file mode 100644 index 0000000..9f05d0b --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/ajaxLoader/Example2.properties @@ -0,0 +1 @@ +please-wait=Please wait... \ No newline at end of file diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example3.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example3.properties new file mode 100644 index 0000000..965a895 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example3.properties @@ -0,0 +1,2 @@ +dialogtitle=Information +dialogmessage=This link is currently not active \ No newline at end of file diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example4.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example4.properties new file mode 100644 index 0000000..95ad247 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/dialog/Example4.properties @@ -0,0 +1,2 @@ +link1-title=Information +link1-message=This link is currently not active \ No newline at end of file diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/tabview/Example3.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/tabview/Example3.properties new file mode 100644 index 0000000..14e86e4 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/tabview/Example3.properties @@ -0,0 +1,5 @@ +tab1-title=Title of tab 1 +tab1-icon=context:/img/tab/application.png + +tab2-title=Title of tab 2 +tab2-icon=context:/img/tab/comments.png \ No newline at end of file diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example1.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example1.properties new file mode 100644 index 0000000..4f98108 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example1.properties @@ -0,0 +1 @@ +tooltip-message-example=Do you see me ? \ No newline at end of file diff --git a/src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example2.properties b/src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example2.properties new file mode 100644 index 0000000..193ee93 --- /dev/null +++ b/src/main/resources/fr/exanpe/t5/demo/pages/components/tooltip/Example2.properties @@ -0,0 +1 @@ +tooltip-tooltip=This is the tooltip content \ No newline at end of file diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000..6e42abd --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,45 @@ +# Default to info level output; this is very handy if you eventually use Hibernate as well. +log4j.rootCategory=info, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=[%p] %c{2} %m%n + +# Service category names are the name of the defining module class +# and then the service id. +log4j.category.fr.exanpe.t5.demo.services.AppModule.TimingFilter=info + +# Outputs a list of pages, components and mixins at startup. +log4j.category.org.apache.tapestry5.services.TapestryModule.ComponentClassResolver=info + +# Outputs startup statistics; elapsed time to setup and initialize the registry, and a list of +# available services. +log4j.category.org.apache.tapestry5.TapestryFilter=info +#log4j.category.fr.exanpe.t5.lib=debug + + +# Turning on debug mode for a page's or component's transformer logger +# will show all of the code changes that occur when the +# class is loaded. + +# log4j.category.tapestry.transformer.fr.exanpe.t5.demo.pages.Index=debug + +# Turning on debug mode for a component's events logger will show all the events triggered on the +# component, and which component methods are invoked as a result. + +# log4j.category.tapestry.events.fr.exanpe.t5.demo.pages.Index=debug + +# Turning on trace mode for a page's render logger provides extended information about every step +# in rendering (this is not generally helpful). Turning on debug mode will add a one-line +# summary that includes the elapsed render time, which can be useful in tracking down +# performance issues. + +# log4j.category.tapestry.render.fr.exanpe.t5.demo.pages.Index=debug + +# Turn on some verbose debugging about everything in the application. This is nice initially, +# while getting everything set up. You'll probably want to remove this once you are +# up and running, replacing it with more selective debugging output. +log4j.category.fr.exanpe.t5.demo=debug \ No newline at end of file diff --git a/src/main/webapp/About.tml b/src/main/webapp/About.tml new file mode 100644 index 0000000..cdf4434 --- /dev/null +++ b/src/main/webapp/About.tml @@ -0,0 +1,7 @@ + + +

About exanpe-t5-demo application ...

+ + diff --git a/src/main/webapp/Contact.tml b/src/main/webapp/Contact.tml new file mode 100644 index 0000000..8ffe12c --- /dev/null +++ b/src/main/webapp/Contact.tml @@ -0,0 +1,7 @@ + + +

Contact fr.exanpe ...

+ + diff --git a/src/main/webapp/Index.tml b/src/main/webapp/Index.tml new file mode 100644 index 0000000..d5bb783 --- /dev/null +++ b/src/main/webapp/Index.tml @@ -0,0 +1,107 @@ + + + +

+ Welcome to the Exanpe T5 lib Demo !
+ This application have been created to show the components in action and help you get on with them by displaying some samples of code for every component's use case.

+ Here are the components in action:

+ + +
+ + + +
+
    +
  • Accordion +
      +
    • Standard Accordion
    • +
    • Accordion built from resources file
    • +
    • Accordion event on mouseover
    • +
    • Accordion with a single item open allowed
    • +
    • Accordion and JavaScript interaction
    • +
    +
  • +
  • AjaxLoader +
      +
    • Basic AjaxLoader
    • +
    • AjaxLoader with text customized
    • +
    • AjaxLoader loaded on demand, without panel
    • +
    +
  • +
  • Border +
      +
    • A simple Border
    • +
    +
  • +
  • ColorPicker +
      +
    • The Color Picker component in action
    • +
    +
  • +
  • Dialog +
      +
    • A Dialog presentation displaying an information
    • +
    • A Dialog displaying a confirmation
    • +
    • A Dialog with title and message customized
    • +
    • A Dialog with title and message consolidated through injected id
    • +
    +
  • +
  • Hideable Panel +
      +
    • A basic Hideable Panel
    • +
    • A Hideable Panel with some customing and JavaScript interaction
    • +
    +
  • +
+
+
    +
  • Secure Password +
      +
    • A basic Secure Password
    • +
    • A Secure Password with some hover recording and maxlength customised
    • +
    • Secure Password with character set and grid size redefined
    • +
    +
  • +
  • SelectLoader +
      +
    • SelectLoader mixin demonstration
    • +
    • Chain 3 selects
    • +
    +
  • +
  • Slider +
      +
    • Basic Slider example
    • +
    • Slider with selection customized : min, max, and gap value
    • +
    • Slider displaying the real time value in a custom html element
    • +
    • Slider vertically oriented
    • +
    +
  • +
  • TabView +
      +
    • A basic TabView
    • +
    • A "client side" TabView
    • +
    • Load the tabs attributes (text + icon) from a resources file
    • +
    • A tabView with full control over the selected tab
    • +
    +
  • +
  • Tooltip +
      +
    • A basic Tooltip
    • +
    • Tooltip built from resources file
    • +
    • Tooltip displaying a rich content defined in the page
    • +
    +
  • +
+
+ + diff --git a/src/main/webapp/WEB-INF/app.properties b/src/main/webapp/WEB-INF/app.properties new file mode 100644 index 0000000..1c29931 --- /dev/null +++ b/src/main/webapp/WEB-INF/app.properties @@ -0,0 +1,4 @@ +# This is where global application properties go. +# You can also have individual message catalogs for each page and each +# component that override these defaults. +# The name of this file is based on the element in web. \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/appengine-web.xml b/src/main/webapp/WEB-INF/appengine-web.xml new file mode 100644 index 0000000..7864cd6 --- /dev/null +++ b/src/main/webapp/WEB-INF/appengine-web.xml @@ -0,0 +1,7 @@ + + + exanpe-t5-lib + + 1-0-0-snapshot + true + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..f1dfb4f --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,22 @@ + + + + exanpe-t5-demo Tapestry 5 Application + + + tapestry.app-package + fr.exanpe.t5.demo + + + app + org.apache.tapestry5.TapestryFilter + + + app + /* + + + diff --git a/src/main/webapp/components/Grouping.tml b/src/main/webapp/components/Grouping.tml new file mode 100644 index 0000000..d77e801 --- /dev/null +++ b/src/main/webapp/components/Grouping.tml @@ -0,0 +1,101 @@ + + + + + This page displays a webmail including the Exanpe components.

+ +
+ + + + + + + ${message:receivedLink}
+
+ + + ${message:sentLink}
+
+
+ + + ${message:deletedLink}
+
+
+
+ + +
+ +
+ + + + This page presents many components of Exanpe library and Tapestry core grouped together to render a "real" view.
+ Here is a case that demonstrate the Exanpe library : +
    +
  • On the left site, an Accordion groups some actions.
  • +
  • The layout is built over a HideablePanel, allowing the right zone to be increased.
  • +
  • The right side is structured over a TabView
  • +
  • On the left site, hover Received. A Tooltip appears.
  • +
  • Click Received.
  • +
  • A skinned Tapestry Grid appears on the right side, into a new Tab.
  • +
  • For a mail : +
      +
    • If you click Open Mail, the mail will open in a new Tab.
    • +
    • If you click Delete Mail, a Dialog component appear, informing that we did not implement that functionality.
    • +
    +
  • +
+
+ + + +
+
+ + + ${shortenedSubject } + + + ${shortenedContent } + + + ${shortenedFrom } + + + Open mail + + + Delete mail + + +
+
+ +
+ + + + ${iteMail.content}

+
+ Close mail +
+
+
+
+
+
+
+ diff --git a/src/main/webapp/components/accordion/Example1.tml b/src/main/webapp/components/accordion/Example1.tml new file mode 100644 index 0000000..8095096 --- /dev/null +++ b/src/main/webapp/components/accordion/Example1.tml @@ -0,0 +1,19 @@ + + + + This page shows a standard accordion, with a title and the first item opened. + + + + + + + Content coded in body + + + + + diff --git a/src/main/webapp/components/accordion/Example2.tml b/src/main/webapp/components/accordion/Example2.tml new file mode 100644 index 0000000..030f094 --- /dev/null +++ b/src/main/webapp/components/accordion/Example2.tml @@ -0,0 +1,30 @@ + + + + This page shows an accordion built entirely from data located in a resources file.
+ Mainly useful for short contents. +
+ + + + + + + + + + These keys are defined in the property file of the current page :

+ + + item1-title=Title of item 1 + item2-title=Title of item 2 + + item1-content=Content of item 1 + item2-content=Content of item 2 + +
+ + diff --git a/src/main/webapp/components/accordion/Example3.tml b/src/main/webapp/components/accordion/Example3.tml new file mode 100644 index 0000000..bb97793 --- /dev/null +++ b/src/main/webapp/components/accordion/Example3.tml @@ -0,0 +1,21 @@ + + + + This page shows an accordion expanded when title are hovered. No click required. + + + + + + Content coded in body + + + Content 2 coded in body + + + + + diff --git a/src/main/webapp/components/accordion/Example4.tml b/src/main/webapp/components/accordion/Example4.tml new file mode 100644 index 0000000..62815fd --- /dev/null +++ b/src/main/webapp/components/accordion/Example4.tml @@ -0,0 +1,21 @@ + + + + This page shows an accordion allowing a single content to be opened at once. + + + + + + Content coded in body + + + Content 2 coded in body + + + + + diff --git a/src/main/webapp/components/accordion/Example5.tml b/src/main/webapp/components/accordion/Example5.tml new file mode 100644 index 0000000..09f16c0 --- /dev/null +++ b/src/main/webapp/components/accordion/Example5.tml @@ -0,0 +1,27 @@ + + + + This page shows the way to interact with the accordion with JavaScript.
+ It also boots the duration of the accordion animation +
+ + + + + Content coded in body + + + Content 2 coded in body + + + + + + + + + + diff --git a/src/main/webapp/components/ajaxLoader/Example1.tml b/src/main/webapp/components/ajaxLoader/Example1.tml new file mode 100644 index 0000000..f2fabc7 --- /dev/null +++ b/src/main/webapp/components/ajaxLoader/Example1.tml @@ -0,0 +1,18 @@ + + + + This page shows a standard AjaxLoader, with content loaded on page load. + + + + + This text is loaded on demand.
+ A sleep timer has been set server side on getSleep() method to see the Ajax loading.
+ ${sleep} +
+
+ + diff --git a/src/main/webapp/components/ajaxLoader/Example2.tml b/src/main/webapp/components/ajaxLoader/Example2.tml new file mode 100644 index 0000000..a514cc5 --- /dev/null +++ b/src/main/webapp/components/ajaxLoader/Example2.tml @@ -0,0 +1,25 @@ + + + + This page shows an AjaxLoader with loading text customized from resources file.
+ Notice the property key please-wait added to the current page resource file. +
+ + + + This text is loaded on demand.
+ A sleep timer has been set server side on getSleep() method to see the Ajax loading.
+ ${sleep} +
+
+ + + + item1-title=Title of item 1 + + + + diff --git a/src/main/webapp/components/ajaxLoader/Example3.tml b/src/main/webapp/components/ajaxLoader/Example3.tml new file mode 100644 index 0000000..8eafcac --- /dev/null +++ b/src/main/webapp/components/ajaxLoader/Example3.tml @@ -0,0 +1,31 @@ + + + + This page shows an AjaxLoader loaded on demand, and disabling the loading panel.
+ Notice the attribute autoLoad set to false, as the showPanel one.
+ Also, a button allow the content reloading on demand. +
+ + + + This text is loaded on demand.
+ No time server side.
+ Curent Datetime : ${date} +
+ +
+ + + + diff --git a/src/main/webapp/components/border/Example1.tml b/src/main/webapp/components/border/Example1.tml new file mode 100644 index 0000000..5863d92 --- /dev/null +++ b/src/main/webapp/components/border/Example1.tml @@ -0,0 +1,17 @@ + + + + This page displays a simple border.
+ Nothing special provided by the component. +
+ + + + This text is wrapped inside a border. + + + + diff --git a/src/main/webapp/components/colorPicker/Example1.tml b/src/main/webapp/components/colorPicker/Example1.tml new file mode 100644 index 0000000..0f50ef9 --- /dev/null +++ b/src/main/webapp/components/colorPicker/Example1.tml @@ -0,0 +1,29 @@ + + + + This page displays a color picker.
+ It is bound to a value into the page.
+ A coercer have been implemented between String and java.awt.Color.
+ It has to be enclosed inside a form. +
+ + + + + + + + + Color submitted : ${color} + + + + + diff --git a/src/main/webapp/components/dialog/Example1.tml b/src/main/webapp/components/dialog/Example1.tml new file mode 100644 index 0000000..dee2c8e --- /dev/null +++ b/src/main/webapp/components/dialog/Example1.tml @@ -0,0 +1,18 @@ + + + + This page displays a simple dialog component.
+ This components acts like a proxy to confirm a user action or display information.
+ The dialog gets bound into an other components through a t:mixins="exanpe/dialog" attribute.
+ Notice the t:renderMode and t:message attribute, coming along with the mixin. +
+ + + Go to index + + + diff --git a/src/main/webapp/components/dialog/Example2.tml b/src/main/webapp/components/dialog/Example2.tml new file mode 100644 index 0000000..c0dd5bf --- /dev/null +++ b/src/main/webapp/components/dialog/Example2.tml @@ -0,0 +1,17 @@ + + + + This page displays a dialog component with a confirmation required.
+ Activation takes place on Ok click.
+ Notice the t:renderMode to confirm. +
+ + + Go to index + + + diff --git a/src/main/webapp/components/dialog/Example3.tml b/src/main/webapp/components/dialog/Example3.tml new file mode 100644 index 0000000..34939e4 --- /dev/null +++ b/src/main/webapp/components/dialog/Example3.tml @@ -0,0 +1,24 @@ + + + + This page displays a dialog component with its title and message customized.
+ Keys have been declared into this page's resources file. +
+ + + Go to index + + + + These keys are defined in the property file of the current page :

+ + dialogtitle=Information + dialogmessage=This link is currently not active + +
+ + diff --git a/src/main/webapp/components/dialog/Example4.tml b/src/main/webapp/components/dialog/Example4.tml new file mode 100644 index 0000000..422f5bd --- /dev/null +++ b/src/main/webapp/components/dialog/Example4.tml @@ -0,0 +1,25 @@ + + + + This page displays a dialog component with its title and message customized.
+ Keys have been declared into this page's resources file and automatically get from the injected component's id.
+ Notice the t:id="link1" attribute. +
+ + + Go to index + + + + These keys are defined in the property file of the current page :

+ + link1-title=Information + link1-message=This link is currently not active + +
+ + diff --git a/src/main/webapp/components/exanpeSkin/Example1.tml b/src/main/webapp/components/exanpeSkin/Example1.tml new file mode 100644 index 0000000..9834149 --- /dev/null +++ b/src/main/webapp/components/exanpeSkin/Example1.tml @@ -0,0 +1,59 @@ + + + + + + This page displays the core Tapestry components skinned with the Exanpe graphic style.
+ These components are not working properly. Just here to show their look.
+ So easy to set up : +
    +
  • Add a HTML tag with class="exanpe-skin" anywhere around the component to skin
  • +
  • Import our CSS stylesheet in the Page you want to reskin : @Import(stylesheet = "$ {exanpe.asset-base}/css/exanpe-t5-lib-skin.css")
  • +
  • No conflict ! Skin only what you want to skin
  • +
+
+ + +
+ ... +
+
+ +
+ Grid :
+ +
+ +
+
+ + Autocomplete :
+ + Type in a country name: + + +
+ + Palette :
+ + + +
+ + Bean Editform :
+ +
+ + diff --git a/src/main/webapp/components/hideablePanel/Example1.tml b/src/main/webapp/components/hideablePanel/Example1.tml new file mode 100644 index 0000000..c3f14aa --- /dev/null +++ b/src/main/webapp/components/hideablePanel/Example1.tml @@ -0,0 +1,32 @@ + + + + This page displays a basic HideablePanel.
+ The width of the left side hideable panel is required. +
+ + + + + + This
+ content
+ is
+ hideable
+
+ + + This
+ content
+ is
+ always
+ visible
+
+ +
+
+ + diff --git a/src/main/webapp/components/hideablePanel/Example2.tml b/src/main/webapp/components/hideablePanel/Example2.tml new file mode 100644 index 0000000..466dfca --- /dev/null +++ b/src/main/webapp/components/hideablePanel/Example2.tml @@ -0,0 +1,34 @@ + + + + This page displays a HideablePanel customized.
+ Here are defined the duration of the animation and allow some JavaScript interaction. +
+ + + + + + This
+ content
+ is
+ hideable
+
+ + + This
+ content
+ is
+ always
+ visible
+
+ +
+ + +
+ + diff --git a/src/main/webapp/components/securePassword/Example1.tml b/src/main/webapp/components/securePassword/Example1.tml new file mode 100644 index 0000000..6d56800 --- /dev/null +++ b/src/main/webapp/components/securePassword/Example1.tml @@ -0,0 +1,35 @@ + + + + This page displays a basic SecurePassword.
+ Click a number to record it.
+ It is bound to a Page variable to submit the value (parameter value).
+ It has to be enclosed inside a t:form component. +
+ + + + + Value sent : ${prop:val}
+ +
+
+ + + + diff --git a/src/main/webapp/components/securePassword/Example2.tml b/src/main/webapp/components/securePassword/Example2.tml new file mode 100644 index 0000000..19b018d --- /dev/null +++ b/src/main/webapp/components/securePassword/Example2.tml @@ -0,0 +1,20 @@ + + + + This page displays a SecurePassword triggered on hover, with eventType attribute.
+ Hover a number to record it.
+ The maxlength has been reduced on force a maximum of 6 characters to be entered. +
+ + + + + Value sent : ${prop:val}
+ +
+
+ + diff --git a/src/main/webapp/components/securePassword/Example3.tml b/src/main/webapp/components/securePassword/Example3.tml new file mode 100644 index 0000000..8c3e02b --- /dev/null +++ b/src/main/webapp/components/securePassword/Example3.tml @@ -0,0 +1,30 @@ + + + + This page displays a SecurePassword with a custom character set to select.
+ Its size has been adapted.
+ Note that when submitting, the value entered stay recorded in the component. +
+ + + + + Value sent : ${prop:passwordValue}
+ +
+
+ + + + diff --git a/src/main/webapp/components/selectLoader/Example1.tml b/src/main/webapp/components/selectLoader/Example1.tml new file mode 100644 index 0000000..8c93836 --- /dev/null +++ b/src/main/webapp/components/selectLoader/Example1.tml @@ -0,0 +1,74 @@ + + + + This page displays the SelectLoader mixin.
+ Notice the t:mixins associated to the t:targetId attribute. +
+ + + + + + + + + + Submitted country : ${countryValue }
+ Submitted city : ${cityValue }
+
+ + + + + + diff --git a/src/main/webapp/components/selectLoader/Example2.tml b/src/main/webapp/components/selectLoader/Example2.tml new file mode 100644 index 0000000..b6ea19a --- /dev/null +++ b/src/main/webapp/components/selectLoader/Example2.tml @@ -0,0 +1,33 @@ + + + + This page displays the SelectLoader mixin, chaining 3 selects. + + + + + + + + + + + + + Submitted country : ${countryValue }
+ Submitted city : ${cityValue }
+ Submitted type : ${typeValue }
+
+ + + + diff --git a/src/main/webapp/components/slider/Example1.tml b/src/main/webapp/components/slider/Example1.tml new file mode 100644 index 0000000..43649a6 --- /dev/null +++ b/src/main/webapp/components/slider/Example1.tml @@ -0,0 +1,29 @@ + + + + This example shows a basic Slider component.
+ This component has to be enclosed inside a form.
+ It is bound to a page @Property sliderValue +
+ + + + + + + + Submitted value : ${sliderValue}
+
+ + + + + + diff --git a/src/main/webapp/components/slider/Example2.tml b/src/main/webapp/components/slider/Example2.tml new file mode 100644 index 0000000..90f58ef --- /dev/null +++ b/src/main/webapp/components/slider/Example2.tml @@ -0,0 +1,29 @@ + + + + This example shows a Slider component with imposed values to choose, chosen from an interval.
+ The min and max values have been specified.
+ Notice the interval, min and max attributes. +
+ + + + + + + + Submitted value : ${sliderValue}
+
+ + + + + + diff --git a/src/main/webapp/components/slider/Example3.tml b/src/main/webapp/components/slider/Example3.tml new file mode 100644 index 0000000..5cfe8a8 --- /dev/null +++ b/src/main/webapp/components/slider/Example3.tml @@ -0,0 +1,29 @@ + + + + This example shows a Slider component that displays its value in a custom element.
+ Notice here the displayId attribute. +
+ + + You are about to select the value , just press submit.
+ + + + + + Submitted value : ${sliderValue}
+
+ + + + + + diff --git a/src/main/webapp/components/slider/Example4.tml b/src/main/webapp/components/slider/Example4.tml new file mode 100644 index 0000000..8035512 --- /dev/null +++ b/src/main/webapp/components/slider/Example4.tml @@ -0,0 +1,28 @@ + + + + This example shows a vertical oriented Slider.
+ Every horizontal customization can be applied to a vertical slider. +
+ + + + + + + + Submitted value : ${sliderValue}
+
+ + + + + + diff --git a/src/main/webapp/components/tabview/Example1.tml b/src/main/webapp/components/tabview/Example1.tml new file mode 100644 index 0000000..d5c38a7 --- /dev/null +++ b/src/main/webapp/components/tabview/Example1.tml @@ -0,0 +1,30 @@ + + + + This page displays a basic Tab View.
+ This TabView is said as "server side", meaning all the tabs content are not loaded on page load.
+ It does keep its state on page refresh. +
+ + + + + This is my tab 1
1
1


+ content 1 +
+ + This is my tab 2
2
2


+ content 2 +
+ + This is my tab 3
3
3


+ content 3 +
+
+
+ + + diff --git a/src/main/webapp/components/tabview/Example2.tml b/src/main/webapp/components/tabview/Example2.tml new file mode 100644 index 0000000..0dd971c --- /dev/null +++ b/src/main/webapp/components/tabview/Example2.tml @@ -0,0 +1,31 @@ + + + + This page displays a basic Tab View.
+ This TabView is said as "client side", meaning all the tabs are loaded on page load.
+ Notice the loadAll attribute.
+ It does NOT keep its state on page refresh. +
+ + + + + This is my tab 1
1
1


+ content 1 +
+ + This is my tab 2
2
2


+ content 2 +
+ + This is my tab 3
3
3


+ content 3 +
+
+
+ + + diff --git a/src/main/webapp/components/tabview/Example3.tml b/src/main/webapp/components/tabview/Example3.tml new file mode 100644 index 0000000..78cfdb9 --- /dev/null +++ b/src/main/webapp/components/tabview/Example3.tml @@ -0,0 +1,36 @@ + + + + This page displays Tab View with data loaded from resources file.
+ Note that only tab 1 and 2 load from resources file, whereas tab3 is declared inline (not recommended in a real application code =)) +
+ + + + + This is my tab 1
1
1


+ content 1 +
+ + This is my tab 2
2
2


+ content 2 +
+ + This is my tab 3
3
3


+ content 3 +
+
+
+ + + tab1-title=Title of tab 1 + tab1-icon=context:/img/tab/application.png + + tab2-title=Title of tab 2 + tab2-icon=context:/img/tab/comments.png + + + diff --git a/src/main/webapp/components/tabview/Example4.tml b/src/main/webapp/components/tabview/Example4.tml new file mode 100644 index 0000000..1b0547f --- /dev/null +++ b/src/main/webapp/components/tabview/Example4.tml @@ -0,0 +1,44 @@ + + + + This page displays a Tab View controlled server side.
+ The default one is specified on server (second tab), and a click on the link Activate Third set the third tab active. +
+ + + + + This is my tab 1
1
1


+ content 1 +
+ + This is my tab 2
2
2


+ content 2 +
+ + This is my tab 3
3
3


+ content 3 +
+
+
+ Activate third +
+ + + + + diff --git a/src/main/webapp/components/tooltip/Example1.tml b/src/main/webapp/components/tooltip/Example1.tml new file mode 100644 index 0000000..3649ce5 --- /dev/null +++ b/src/main/webapp/components/tooltip/Example1.tml @@ -0,0 +1,30 @@ + + + + This page displays a basic Tooltip.
+ Set the tooltip component around the one you want to display the tooltip.
+ The message is gathered from the page's resources file. +
+ + + + Mouseover this text + +
+ + Mouseover this other text + +
+ + + Property file : + + tooltip-message-example=Do you see me ? + + + + + diff --git a/src/main/webapp/components/tooltip/Example2.tml b/src/main/webapp/components/tooltip/Example2.tml new file mode 100644 index 0000000..4912172 --- /dev/null +++ b/src/main/webapp/components/tooltip/Example2.tml @@ -0,0 +1,25 @@ + + + + This page displays a Tooltip automatically configured through its id.
+ Notice the page's resources file containing a well formed key. +
+ + + + Mouseover this text + + + + + Property file : + + tooltip-tooltip=This is the tooltip content + + + + + diff --git a/src/main/webapp/components/tooltip/Example3.tml b/src/main/webapp/components/tooltip/Example3.tml new file mode 100644 index 0000000..4d2358f --- /dev/null +++ b/src/main/webapp/components/tooltip/Example3.tml @@ -0,0 +1,26 @@ + + + + This page displays a Tooltip containing some rich content declared in the page.
+ Notice the block tooltipBlock in the page. It will automatically loaded in the tooltip.
+ This block is reusable among several tooltips. +
+ + + + Mouseover this text + +
+ + Mouseover this other text + + + + Thats a tooltip said RICH + +
+ + diff --git a/src/main/webapp/css/github.css b/src/main/webapp/css/github.css new file mode 100644 index 0000000..bd778a7 --- /dev/null +++ b/src/main/webapp/css/github.css @@ -0,0 +1,129 @@ +/* + +github.com style (c) Vasily Polovnyov + +*/ + +pre code { + display: block; padding: 0.5em; + color: #000; + background: #f8f8ff +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .javadoc { + color: #998; + font-style: italic +} + +pre .keyword, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .lisp .title, +pre .subst { + color: #000; + font-weight: bold +} + +pre .number, +pre .hexcolor { + color: #40a070 +} + +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula { + color: #d14 +} + +pre .title, +pre .id { + color: #900; + font-weight: bold +} + +pre .javascript .title, +pre .lisp .title, +pre .subst { + font-weight: normal +} + +pre .class .title, +pre .haskell .label, +pre .tex .command { + color: #458; + font-weight: bold +} + +pre .tag, +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword { + color: #000080; + font-weight: normal +} + +pre .attribute, +pre .variable, +pre .instancevar, +pre .lisp .body { + color: #008080 +} + +pre .regexp { + color: #009926 +} + +pre .class { + color: #458; + font-weight: bold +} + +pre .symbol, +pre .ruby .symbol .string, +pre .ruby .symbol .keyword, +pre .ruby .symbol .keymethods, +pre .lisp .keyword, +pre .tex .special, +pre .input_number { + color: #990073 +} + +pre .builtin, +pre .built_in, +pre .lisp .title { + color: #0086b3 +} + +pre .preprocessor, +pre .pi, +pre .doctype, +pre .shebang, +pre .cdata { + color: #999; + font-weight: bold +} + +pre .deletion { + background: #fdd +} + +pre .addition { + background: #dfd +} + +pre .diff .change { + background: #0086b3 +} + +pre .chunk { + color: #aaa +} + +pre .tex .formula { + opacity: 0.5; +} diff --git a/src/main/webapp/favicon.ico b/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ffd53d634617db10734c8bcadfb66a936e631934 GIT binary patch literal 894 zcmb7@TT@a|6vt1~7x1a+vB$nZHBMt=In{$UiW-&TDCrD3Du`hk;;k&nG`!_C%e)~C zYM5qecmoN?$P3^>Q4=qCSBl$#!(p|_9-MmWe`fF5d!65Zt+n@@gJCDo~{Oc#)ej_)o3(0j+@P9hr@y5$EZI`r_;G= zm|K#x4m~Mo=On#i#dUC!Mjz*yI+`~Z7hEpaaf{VzRgVm53-|;h#74hrjSM0p0zI?< zZ^(Hn_?$7DJEI;)g^nyvhfOITRPlL^r0A8qbXEAZm8ct*SQ-@<22s}`Jir}tVV299 zQLEf;H|lL=9-l5Qbnz15X%5QJ7IRBM58g{^6rsUsyV)3p`awq~<@0PmF{i&#|h@?M&*w8&ju3dMQ8gCs=}v`fydb*fWL^+*vT ztq>_X-x^hlZG&DjHe8yR@J^7qE)qI~c}_l?OlGXHnWWun`J(jnb(7yFk>y{lb#>r{ zg1I!7DgL%W+=}l1aB<-fzSV;bu;9Ik{s;wNZa9cjkmFi_|&uZzI%Ja^xF;Sldv1-DdiBQ z8iffZs73%?6e`-<0M(^rnb59M{Ind9BzeT6+2bbcre)JWKlQN(KFB~O0dW&mTfX1Z RN$6)OH*rM%{XhKg{uielMk)XR literal 0 HcmV?d00001 diff --git a/src/main/webapp/img/grouping/email_open.png b/src/main/webapp/img/grouping/email_open.png new file mode 100644 index 0000000000000000000000000000000000000000..7b6f9813d41f1d95c8f1cf1495c2314dcf16d3fb GIT binary patch literal 783 zcmV+q1MvKbP)FGA|gUiBpPKsNC^f4AtjM-BOo6I z6r`2%Aq86cL2037X}jIFyW8#V&zXS`i5Q*a$xLSEecpE_F9(1-jh2z%g|>+>+9xA0 zkA`ml?cS-I4VJBEmYFboVFjV6ilGGo&n=#={}R-6x+aGgB1p&v)GVM86wScQ&nTXB zxV()Yx6hm^cssa#jvorBcDDqH1WO7Kif0)qmB@%>Gn58D97J7@zwm_MRj>bE`@}Bp zw=N%IUV^D*3FYq{D0}w<#cynQ*tSI0c9ar2tzlGk`gkVb2Lt-h!U1+kCK~*&K_&Eg zBa1QAcKdbiwZ-XEGCIUmmSv@bUpq<3R0cN(WOi1<+aaYj^vwovvBKizD$OfKf^3*t zR*wY-2^CREWpg+t!?!14)f;1Hg^#T$ZeGF0j);QBIfEujA4UQ4w zNg^VWy=WTlU;>5#6gAADc`ObgsZas9yG=GGSPAOrw~1)(ceCIa2^Lcs1{H>cG-|sx z&^i^zCubH1(vjd+-8>UG_jIg=bbMYEQ2D`$>W=jjJZN)b-Xmkum1P_Y3Lece!FpJS z!>?lC`#zZ!Ci@+_*F777byLAt?~&jo5nMJ|NvG*p4yY_Uy|}ik{~@5z3VKO`8J7Yf zK`WRCms>h+q)5+>IRvcjsPGB~y!!?`1Q)?g*ou&Kgj7kMY4<4@AgvzQmr(HHo5AH2 zwR@tHqVEVPBc9SA${J~94M{}<6;sj#nUXm~5M|xA5s~vvmM!jVVbes;o!;2_ve8U# z#kiJNIi=-SS+z^mR_#j7w05;_TDwNLUVq4q`svKor(cqJAz`{eoOom?Tf*9)f$7n8&|1&5M4#i^32;+&E? zC3Q;bRFQN#y*%%=_V)Mfa<$xe^kB0TO;vJPkN*k(2v-CI7)OaWj?&eKPos(H4wGh_ zIC;6#q1B5SMap5{(Hc0~XO7OfqZ=x{kupu8-H&9azl`L1pTuu^Znm3EA)kCoG=JuwsyNLEtY83i->Z~j3y~F)`RA1k>zTES07po!kBVS2y#L{jCt|CMY&v{ zxmqM|`OA#P2{R&)OcQd}v0kt6_Dh#`Z$i5_;q|93je3Q^PcfR{TmBHRmr;rWahz~G z2x-&;d_O~HkmKXt5Cd#Bs?-+qj3zOiUdU24KowBIUPg(gPNmxqX)Fiia~V*$y;5L( zrGNmU;81MA$F2k%oeUXQ@}N%bXz=qOij$4IYk4W=jfhDxfCz{PGXe-#ge#VfYTyoj zh4JvDePrW{lf(Oux2xG;VZmlSvDU+Qf@i=O!B`MLglhttCUHDIKkc7BVme|mWaqy4$_pJm?y9KM{-*hp?1+Ey3e-CEDooTa!B;e(Q>TSF?bj>5At13y1p zriN3w3x~5SfZj{@J4M{kp{?=M_Lh2bV+5LH)Q)5W!-ePA$RgE1@5f1cyHki0Y}JyVEYZF(LD$xXlt$7A5CgE@ zpV-&l%vf;=5kZ2-2gi@Y6J&=cuwt>!vJ^#(&n|LcZyUzi6Duj$$hJ1s*HD-#;k-w@ zpdrwAuoDG_N2bvb07G$Zk*?Hc)JLtW4yqOnic_$zO7NZ#l>Fm){;fE?b$IbOaX2fe z0la4g0Dfw2xk7Wi7NapVD8YMPCZu?A1QCK*67dgsvRKBLFtrM>?$%&_lD1882mzdO zWPdw5KWw6IT`m1b_8=lS5jt8D3=RDa=&jWzR-)S@56WMslZ~mKu1)-wpXB>rNBQ>N zU#K`#1B&v|_AQK;7I~B}OdGiUT9LX>f0xm6<;LeP!=vFjPsUQF*wCJ*dO)4YBypgdiuF!=i@6Zyi7F|q#K zz?tlSZULa@t1D?$e;f@b36&N!V2mjOHw|*0WbcEP)8e6`gpm!y1M!N^ZV(=IC*t) z{^;nqJv-tM$9J1L2QJ2DN!#51=1_l@G`2=6e0lehL%sic%`_4--LFM}IF!KzJCseW zq1I3__Z40|e?qyK1__gzP(qrBf-G7SQbQ`#Lw94WVe(o`qg+f4hy;Qju)q#I(9{`% zQmAGomzhQ!b|gq>KqL@IkO~$=Koi}a$u6d07kiS}NoYVMJjAeZpaB*;wwcDdEbK@K zNP;B7RzhQ|H9AlUO<`J>m1(5R)Pb-iLBb@7Jp)}LHdAb-VVgYxVoTzGoqu{~a>6uj zeqCRFI9pC#h09bGwy9;oHcp6(RB%jeY^F=Ll!S+9JkVe4nDG7tJMQiP0000kO-!8JjERGZgNx4o8zwI5pnrkJT^AW7B+k01lLkoCLBu@bfRhnJSkT}{ z5cwz-C?AEk;`Q7|NyO0V@Jst%?>X<@)8|?6hNplZoH}p}R=_wBd4A);huvr*D{8ta zv>weaRZy(zA{a{x)NMK$oUyoq;&Q_jA9Yid>V_!Q3{lkDazCTg+2GL8fKO$yVv7pZ zw#ZdlB3o|B^q?JFdAt+nq80!As0d}1Z|KFR(*lEh^G}{es&~_I}wY;n4d5jAs0d}gj@(+ z%6*K*29I(Myv%_UPWDD&5qS@s3~ZAJGDH vT*SlN0ce3)r#d%-F%SaNZe6;L@E^Vb!Ji3~dec0&00000NkvXXu0mjflI-*P literal 0 HcmV?d00001 diff --git a/src/main/webapp/img/tab/email.png b/src/main/webapp/img/tab/email.png new file mode 100644 index 0000000000000000000000000000000000000000..7348aed77fe6a64c2210a202f12c6eccae7fcf24 GIT binary patch literal 641 zcmV-{0)G98P)Az`{eoOom?Tf*9)f$7n8&|1&5M4#i^32;+&E? zC3Q;bRFQN#y*%%=_V)Mfa<$xe^kB0TO;vJPkN*k(2v-CI7)OaWj?&eKPos(H4wGh_ zIC;6#q1B5SMap5{(Hc0~XO7OfqZ=x{kupu8-H&9azl`L1pTuu^Znm3EA)kCoG=JuwsyNLEtY83i->Z~j3y~F)`RA1k>zTES07po!kBVS2y#L{jCt|CMY&v{ zxmqM|`OA#P2{R&)OcQd}v0kt6_Dh#`Z$i5_;q|93je3Q^PcfR{TmBHRmr;rWahz~G z2x-&;d_O~HkmKXt5Cd#Bs?-+qj3zOiUdU24KowBIUPg(gPNmxqX)Fiia~V*$y;5L( zrGNmU;81MA$F2k%oeUXQ@}N%bXz=qOij$4IYk4W=jfhDxfCz{PGXe-#ge#VfYTyoj zh4JvDePrW{lf(Oux2xG;VZmlSvDU+Qf@i=O!B`MLglhttCUHDIKkc7"}while(x.length||y.length){var u=t().splice(0,1)[0];v+=l(w.substr(q,u.offset-q));q=u.offset;if(u.event=="start"){v+=r(u.node);s.push(u.node)}else{if(u.event=="stop"){var p=s.length;do{p--;var o=s[p];v+=("")}while(o!=u.node);s.splice(p,1);while(p'+l(K[0])+""}else{M+=l(K[0])}O=N.lR.lastIndex;K=N.lR.exec(L)}M+=l(L.substr(O,L.length-O));return M}function J(r,L){if(L.sL&&d[L.sL]){var K=f(L.sL,r);s+=K.keyword_count;return K.value}else{return E(r,L)}}function H(L,r){var K=L.cN?'':"";if(L.rB){p+=K;L.buffer=""}else{if(L.eB){p+=l(r)+K;L.buffer=""}else{p+=K;L.buffer=r}}B.push(L);A+=L.r}function D(N,K,P){var Q=B[B.length-1];if(P){p+=J(Q.buffer+N,Q);return false}var L=y(K,Q);if(L){p+=J(Q.buffer+N,Q);H(L,K);return L.rB}var r=v(B.length-1,K);if(r){var M=Q.cN?"":"";if(Q.rE){p+=J(Q.buffer+N,Q)+M}else{if(Q.eE){p+=J(Q.buffer+N,Q)+M+l(K)}else{p+=J(Q.buffer+N+K,Q)+M}}while(r>1){M=B[B.length-2].cN?"":"";p+=M;r--;B.length--}var O=B[B.length-1];B.length--;B[B.length-1].buffer="";if(O.starts){H(O.starts,"")}return Q.rE}if(w(K,Q)){throw"Illegal"}}var G=d[I];var B=[G.dM];var A=0;var s=0;var p="";try{var u=0;G.dM.buffer="";do{var x=q(C,u);var t=D(x[0],x[1],x[2]);u+=x[0].length;if(!t){u+=x[1].length}}while(!x[2]);if(B.length>1){throw"Illegal"}return{language:I,r:A,keyword_count:s,value:p}}catch(F){if(F=="Illegal"){return{language:null,r:0,keyword_count:0,value:l(C)}}else{throw F}}}function h(){function o(t,s,u){if(t.compiled){return}if(!u){t.bR=c(s,t.b?t.b:"\\B|\\b");if(!t.e&&!t.eW){t.e="\\B|\\b"}if(t.e){t.eR=c(s,t.e)}}if(t.i){t.iR=c(s,t.i)}if(t.r==undefined){t.r=1}if(t.k){t.lR=c(s,t.l||hljs.IR,true)}for(var r in t.k){if(!t.k.hasOwnProperty(r)){continue}if(t.k[r] instanceof Object){t.kG=t.k}else{t.kG={keyword:t.k}}break}if(!t.c){t.c=[]}t.compiled=true;for(var q=0;qx.keyword_count+x.r){x=u}if(u.keyword_count+u.r>w.keyword_count+w.r){x=w;w=u}}}var s=t.className;if(!s.match(w.language)){s=s?(s+" "+w.language):w.language}var o=b(t);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=k(o,b(q),A)}if(y){w.value=w.value.replace(/^((<[^>]+>|\t)+)/gm,function(B,E,D,C){return E.replace(/\t/g,y)})}if(p){w.value=w.value.replace(/\n/g,"
")}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){var q=t.parentNode;var v=document.createElement("div");v.innerHTML="
"+w.value+"
";t=v.firstChild.firstChild;v.firstChild.cN=q.cN;q.parentNode.replaceChild(v.firstChild,q)}else{t.innerHTML=w.value}t.className=s;t.dataset={};t.dataset.result={language:w.language,kw:w.keyword_count,re:w.r};if(x&&x.language){t.dataset.second_best={language:x.language,kw:x.keyword_count,re:x.r}}}function j(){if(j.called){return}j.called=true;e();var q=document.getElementsByTagName("pre");for(var o=0;o|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(o,r){var q={};for(var p in o){q[p]=o[p]}if(r){for(var p in r){q[p]=r[p]}}return q}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/.*?[^\\\\/]/[gim]*"}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@font-face",l:"[a-z-]+",k:{"font-face":1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"",rE:true,sL:"css"}},{cN:"tag",b:"",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"",c:[{cN:"title",b:"[^ />]+"},a]}]}}}();hljs.LANGUAGES.java={dM:{k:{"false":1,"synchronized":1,"int":1,"abstract":1,"float":1,"private":1,"char":1,"interface":1,"boolean":1,"static":1,"null":1,"if":1,"const":1,"for":1,"true":1,"while":1,"long":1,"throw":1,strictfp:1,"finally":1,"protected":1,"extends":1,"import":1,"native":1,"final":1,"implements":1,"return":1,"void":1,"enum":1,"else":1,"break":1,"transient":1,"new":1,"catch":1,"instanceof":1,"byte":1,"super":1,"class":1,"volatile":1,"case":1,assert:1,"short":1,"package":1,"default":1,"double":1,"public":1,"try":1,"this":1,"switch":1,"continue":1,"throws":1},c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:"class",b:"(class |interface )",e:"{",k:{"class":1,"interface":1},i:":",c:[{b:"(implements|extends)",k:{"extends":1,"implements":1},r:10},{cN:"title",b:hljs.UIR}]},hljs.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}};hljs.LANGUAGES.ini={cI:true,dM:{i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9_\\[\\]]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:{on:1,off:1,"true":1,"false":1,yes:1,no:1},c:[hljs.QSM,hljs.NM]}]}]}}; \ No newline at end of file diff --git a/src/main/webapp/layout/highlight.css b/src/main/webapp/layout/highlight.css new file mode 100644 index 0000000..3a09522 --- /dev/null +++ b/src/main/webapp/layout/highlight.css @@ -0,0 +1,36 @@ +.xml_plain { +color: rgb(0,0,0); +} +.xml_tag_name { +color: rgb(0,55,255); +} +.xml_comment { +color: rgb(147,147,147); background-color: rgb(247,247,247); +} +.xml_tag_symbols { +color: rgb(0,59,255); +} +.xml_rife_tag { +color: rgb(0,0,0); background-color: rgb(228,230,160); +} +.xml_attribute_value { +color: rgb(193,0,0); +} +.xml_attribute_name { +color: rgb(0,0,0); font-weight: bold; +} +.xml_char_data { +color: rgb(0,0,0); +} +code { +color: rgb(0,0,0); font-family: monospace; font-size: 12px; white-space: nowrap; +} +.xml_rife_name { +color: rgb(0,0,196); background-color: rgb(228,230,160); +} +h1 { +font-family: sans-serif; font-size: 16pt; font-weight: bold; color: rgb(0,0,0); background: rgb(210,210,210); border: solid 1px black; padding: 5px; text-align: center; +} +.xml_processing_instruction { +color: rgb(0,0,0); font-weight: bold; font-style: italic; +} \ No newline at end of file diff --git a/src/main/webapp/layout/images/img01.jpg b/src/main/webapp/layout/images/img01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b17fcc1ba5803c14c15c532b98d273a21b6f71f9 GIT binary patch literal 752 zcmex=C5UDGKfoZ!!N|kF#mp$kz$D1XEXer(2tzN> zVGKaifbN6=RyKAZ+LQY=i&j6hidpdMy6c0P8P4hF^#3q=AGCthR=!iUT(BL8nO z@Gt{iBgibsV9)S{cf&sSckzPPYIA<{D!N)f4Nk1-zq3zy&957mM9fdEm)&+xH7@2~ZvTc57qT{Hbb zo$9Z;t9$<5&wBpx5?_5!b@|IHf9CD{JK?W=*1fvt_I(rbR-{b)d5m|H;w1Oy%sJB^ zKF{K|yxTe9^H%1$C)Xa%FY@}@D>UKuor!BQj3lagRtJX741Cf7WCUE+5{hp=QYN%k z>9G;N;0?ElY9~sJ3;fpe^4t+H(kR*0w`P;imyLYW1Fv?<>TKoO9yIB!?u+w{K*q$S zd->TM7tH;^B`3vszkz$hY30pcCdWEcoOSxnN+mmaUs!Xk?{e`y6>Zan#ue)iZI04= zUY6#xIZEc8Z=Ss9&80OTch!Dc$=~(n;(6)WPecDQ#drm6T5FVWLG{Q|ZK)J}XP=v{ oHlH?2JG9N*)NZpTmv!yYnQ~j_&M+5Csk+9V0FOu{hW!7V02@i;_y7O^ literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img02.jpg b/src/main/webapp/layout/images/img02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9e932d1dafe45c80bf083de76d200b10e87f7bee GIT binary patch literal 3878 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img03.jpg b/src/main/webapp/layout/images/img03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5ab627a99ee8c1c157992cde84db85a86841222 GIT binary patch literal 2913 zcmcIjcU03!7yTun2+~4TiV8#wAk7FYA}yhXfIvWc5eNuUB2}8wgisZuL;>k76hRb- zvh*SrkRpf>nxHfR37|+bo85Ky`*;8O-prgc=id9?-1p8I`Um<9z+oQ5CjUMcL9|Q+mOFD!|C4vhOmK{m|0jszZlRz1fyxlAtq*4 z7B(J$;e(m!5EBzK^It53fdagYEO8}10UdLf+ChmktTB@Ohmb@IH-GHVJGOvW1PTUa zjDd-jiItg|?eC(DF+w3s;!5VceEiHh{xJnEcWNbESyL_ zIQlri!Eg$OGG5XGs8KEbtq1-U%^f4hhWE_Lv_@0vq-3UP`h4aKRASf6(`M(~&xllc zcjF#TI#9`0rdjz(he^agYI6;ogIc1L+Tq0H&b@v7Fl=!)`iAwbvX!D@@a%Mdt9^6O z=&5hzx8--RmlcXI)^xyNV(ijx0$S`7G4M2Te}QO@HCP9zD?1jK{BV6+2~`U?tEXbw z-0k?_V7swk8)1Z__`{W9E~Rqv@zv?UK@UeO7LP_0%QeS$d={o@vLhq^AR&gVsh&Do zpvO5>Y0tKcseM5Sd1?o1)py?gPTLxb_F45sc&$Ipxv}j*YxOLvsj_829=@7_fq7F) zrL@+{(UxAwW$#}aKicnJH8tdaH5F0RcSb%_;Ti_`j$bm0ei+63+qWS6@`O*DO2|`{ zyu+AW?gbImRmW_v{Ylq})p0B3zyC$8)~RZf{oy zRkse^c(+$sj*zp>SN8Lcdzb0qPWFE?ANH2mw<&#r8?M`Tip9atJgMgulN{5%-Ox|+ zEm_A?!|yD$+((qXcpsE#6P^qx7wpNU-R($_K$JJYjqxJMR(Qu@lk0H z)W@<^ZW%9VH2+k&^wq<2Tn+K3W-P8bv&i$)+d%5{oCnwU|G(T`Fj#-;Lg!ub^ma3eqxVQX+j?0>p+1b4Wvp$aUv%IeeS%@2I1sR2Rj_N4e^7Yn>sNh*h zy=}eCXyNg{$MO*%T1NvN@1h(Wf#dvHdhV$ za{o%*Y4Bt~pTtUmez zGse#wIozxBsm@QXAQiZTUNi%&cw@Q>)9P)VQO0Uye|`%Ze{lu~6SpYU9zr0=U(ILo zGTQ&(c6F64!|oGTY#PE@L2P!hi@Ygd1n8FXYD*uNZqgsnf<6u!9zl4)CVn8pGYqCC zkM{aq!JWt}l?xuy(I+8?@=1Cd>e3sI(Dm=}Fo?Gdds3IpS+Yg#R%2EJwC%%?)P*D1 zm?o^(SlCuTgy8~v6-PBR_5K5)Gz%Yg-uN;Dp4TfX1N;H<4v!LSh-jlc^jWd`obDo( zn*)u9iF9DWQ`29VgnN{q73|xYW}7bn&3wseXz;`d-CRotJDJxgpas8jt&Q_4*!wiz zYfOU0U5sr3H}t508GnL|4WBkxuM2x7rC#!&723udW2R*7b+J2vsOTmmO7gy6ai#Ja zl=*PMiTk!s8mX4O?N|CJOzsIs&Ps}#!(nL2$yOdA$IAzen!*?>ozW? zB=8C1$$?^BFcOAh^SCLWT|1W7?^!(jH%R>+b6KEmAlxXH4_Tvz@@^pDBhZ25=;SAs zaA$SHL{7zi_$_x^$s{{U$~jVcn91j9?*}K5g=ROi8qA#bWRySn$XWKCm&TNcqhdo^ z<4h3g)rpQVP;LZIwM?xdSCU~|Y+qRXys}+xV^=IiYWp3!sNe$m=aR-Fc(!UXzqU<4 zwDP0^H>7xAmn^r{Xni=_TgsDS`?en#Y{*CLZ#E;C&vj~SxrB3&-NGIKpO;;Lv zz;~u!@BZC;4#VSXm`8@}%Aceb*t=6I>RVzFqO&5Vco!8RH<(5`Ap&a&N1s!gCGdmMoF% z>0qj5qG>UK=6$+5DiZr%eQp`wv0WoPyE7vv!UeXi zy8jIRN3$F*5x>1Q(np;c!#6>bqT2Z-2Nbkx%cDtwIyg#-IM-c=EhGq( ze2>t`f0Sa560NBl%qg&<&X+$MHG->p0#}lU)7D+uOgnihL$6)pBpO>b$QI)&;taxEX7n%N9RN2e46&K0&euD(M&Nlz+ISWrY^pDd;db zoy7m3$*AdBq>N!Zmqh6LyzLZRHY~P?$Xe2T3jRV^JOdC!kx%xQ4t;!Y@2T-4Mrs3V za#8`t#Vx;o;rL-{XjC^hMav@`KV>39{x&^v?BO=|8lR%ijpI}Wzl}73HIixZ)|%^% zho-TITk`O3C(5g-Qf&mHz$c;8b^9%uHk5QIeA~FZ(Fr7miQ`Sd9YyC^! z8$$W~U+G>v4dI=+K02N*?Kg8Ex2Sp7aHr8JJi>vXz7YB#6OF_4bs9^?2no<6v~^ED N6g7><1ySf@e*h^fA%Oq@ literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img04.jpg b/src/main/webapp/layout/images/img04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..869a3e31da6443e6237dd7fbb0232db2e069905e GIT binary patch literal 3287 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 literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img08.gif b/src/main/webapp/layout/images/img08.gif new file mode 100644 index 0000000000000000000000000000000000000000..95e6227d70c97becfdd2ef3a5be39d7bd14d8ba6 GIT binary patch literal 297 zcmZ?wbhEHbWMs%=xXQp#Sy@?DR#skKUQtm|T3Y)1_wQf7etrG=^~aAN@87?F`}Xa% zYu7Gax^(g4#k+U!e*XOV`}gnPzI{7;_U!H3w{vrIU%q_#@ZrPz_wT=W@#52`Pk;XW z`S|hUqeqXfU%&qB*|QHHK3utS<>$|zU%q^K{rdIOr%&I#d-weL^EYqa+`M`7{Q2{b zA3wfx=T2f`A_KWV@h1yds}6_+`N@IJ&4Kqxa@10WhJy|Y90ELxgwq{8^k$!9dNe^Z z)I(gPxz$B${h0=`B@%74x|1(4nyQGTHie~o`Lt(dcd_(1GFSru?B$L) literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img09.gif b/src/main/webapp/layout/images/img09.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4fe2f153ecc1bd56176cd4f23e085a976fa20da GIT binary patch literal 1808 zcmV+r2k-btNk%w1VJ!hc0K@_{rvp=`uh6&`}_I%`S|$w_xJbq_V)Gl z_4M@g^Yioa^78TV@$c{N@bK{N?(P5p00000000000000000000000000000000000 z000000000000000A^8LV00000EC2ui04)JQ06+!*ARvxpSq5kztZeJPa4gSsZQppV z?|kp~seoxn9I6TfgQLM%EEI_Z0&%Dw4A?A|!0md!;IMd1E}PHjw0g~MyWd=`)_Rym z6;4LOVHgwyLPY@uR0m8?Qdb591xN!eL6MS^l$Dm3n3 z7N$;h`~x#4H~=mr^<2udsnZiFS(BTJr4xw7TUm@{kM zj2Us9SNgE+0f5n)i9rY);6h~B;LV~>W6Peste!-QuUKId3=1Z$1P{n1Qp5=4FW9t` zD_?Gelz@AwDz4i1AVIfpgj6T;hy;>f=HSCGw|zVMD&GGfCRsq5d(hY4#mk@1G-XhH zssJo_36K^70Eame5>E6LXy8siJvR;i0RSM-4NNEuz~FoE5qRK*7&bHsP^JKQ6>`Cl zLdpTGG_Vx|D01b*iY&J1;)^iGDC3MY)@b96IOeG1jy(3*Vu~r62*m-v{NfWh0w}Rn zS77NfMIm%VDdm(@R%zvxSZ1l^mRxq}<(FWFspXS)+;JC*dl-Nuh(;t4fC7iGM$i@k zB4+2Ec;>0+o_zM{=bwNED(Iku7HVjrU1R~8ZlWoG)m6cOgMa{f5H{Q*=TP{=rkr-_ z>8GHEDk={5p+e1cqA?% zS7e&bt-3br>@c?7gB!2_R7ZgSZ?yzBt4GFJ`0Tgf0^}TYs)SZ8H?1O7>^R6`THLa1 zhAVHb(fX0-bo^MCuB6&ck!($`%`5P?^{!M6M-H%x9RdwBXilcy#XIoC^O5%)KKcCD zfWqnt)L^pj!pkhhB-3XfbopEasd@(N1M)`$dRy|$;6)|vXXNmwUa=hosHsRa2VHZ5 zrN+?`0V~r37=Qr7C-l=5lUFopMD>>hO`0AzGSpnp7L|g2bkvu)VH;2QK*Fgcol3;fN=$_~MK=?)c+~yBH)Bfjvi6 zGkMbj=aNr&B^H^Whc5d6=%kl!`st{ruKMb%x9p^6f%T-6 zas)5@@WdBy{PD;qul(}NH}CxO&^IsTlV)P02On!z1r8U3brprbint5M_~e&w{`u&q zuf7?I9?aZuBq!my}QhzbTfbT2m{n+3<)+OrjE($iz$Z3OA@?fOYhBf&mzUQbYV#t%5+e zEt11C($O;yBiJ4%4l-dGU?%sF$h4*ou5*WEQo!MHUNU6PdyBk9c#= z#iq4GZJ_HL*;>s6x9CPdI&vLyJe4(e^MFI*(OABtRU6Uv$WA6BlI6NXwWxT>;IxZ{ zoAjhA*%3+e=wp=EnMF9*wZ@60a+SDbh8*#OuYRNlh_h@-EzuFMTpBZX;|k*{IO5BF zWv3-Xw8?RfNzJMVa*&cl7{`FgFlfH4J29)KICo_?Z03U_8~bHU>enzLf)i-tj3-3E zI1xz#pp18a zqC@3rvz1hhL_a#CM-uj-zn^JzqvPyoL|LMMkRFt0EF@-yP#RF8KvlKYwVHR8##CSu0suSiK49Yj literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img10.gif b/src/main/webapp/layout/images/img10.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7f8530947e4c4d3934f0a1d314009125360b2b2 GIT binary patch literal 1344 zcmV-G1;6@7Nk%w1VJ!hN0K@_{rvp=`}_O)`uh3#`SgwwB^z`!b^7Hfa<>lq;>+9j+;qLD4 z>FMd?wOqugbV{vSuUIRoZ~zzzgzz%O%9_vUw0eCF92W<|0f8`l z!^-A!&+q&HP;7#OgoROV1`8Dt3j_-Z2?uj_b_JGTc$rHBN}ZdZprN9pq@zuzsHv(X zfUT~tP%DPBY(@nL4GI$x8XFWH9Uc-AAH>8T#m2+K#mURh!yeMY64Joe*uWIq5EKyI z-x%T>;~VB0=;<8m4DAdN@DUgD7WMTL_!;^W85REi3IYmrK+wU1gAW=gT-acN!-okR zLV|Q4lBA20=xD6Nk&;J`mqLoXL;zE!lVUjkDKW(a6(CwLW6GRKlhz7O09rbEQnRPe zpFoQUAb=prN}Vdo1YOFsX(2ZS5(KDY3D20FEu3oI%9Y3pq7O0zph)Kn$xy1&s$I)g zPf}QLE77tNLf4<<0caN&(aix}r@989>d#*c^-E2dPy?8wI^QA*}i%2eCStmJCm zTqbMX94ktcG=L!RMZl(0t6t6eqT$zv7b}JgS+Z?Sm2+Rc%o{W3J~T-XIH8B<=i|te zi@1qo6PdZnqf2Kh+Bmi4A#S|p5@AZH^m z_!A-vC~$!W2NdvEMuOD=5^XTXSX)V8M0VSa7>cstDj)Wkm3t!2V1xk)IG~p=5L8e= z0Hj6q$V5;^Vi9VsRk<2$h1ng=Bpc;DeJ7R1bIja#CZs$t-SUsTu#M#*6XlAGM5ul z`Vp%vf3_T}Q?koOd)|;qIF}#)dD3P(U3J&(W}LR*M)w^6;UTM3xab~t7rEuOBy76y za<#5m?2Q-iy;}X}1-aI$=F&{#tg}lz*XqK=K3hCg&=znI2d6E*7?P=Ahy7*KXgz&x)PF38@OKSl zu-5}}tmxWCTh?tisWFO;64PcwjJ9SYOkLiPLF1&}b zhIgqYiCszwDH{x}cknk>Q3D4#(Ea}W_wT;~`um;$3-SPiSn7ZYNr?Cq;*jx?k5lHm z5^P4*n7ru?H)InJb~LoPT2ZG%o4B9|M`$XQC@q6Hi(lW|!nug8?u9Unp$yd!0suRF CIh`c{ literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img11.gif b/src/main/webapp/layout/images/img11.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4aa4eae17a35a2b745a226a34b8fd7b681583df GIT binary patch literal 289 zcmZ?wbhEHbWM|-ExXQrr|NsA)$6lq*x@_NjA$iu-Nrzu3x1Md^`=Vz1!_tlSvu9lm zUU0i;!~Nd<&laA3v*NuABB;`u*ph zO~?7lEf11bJe+y#rET{G=NZ=;cRa4!`Y>_D-SSNjcHj8C_{>|W%99cWM;f+2o^ar~ z_v~vqGcLF8dAauD`+}L5ty|92Zhuj}>Av%%%k6ufm~@_;1ztHKt|I!$42}%e07mPx# literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img12.gif b/src/main/webapp/layout/images/img12.gif new file mode 100644 index 0000000000000000000000000000000000000000..6fea9b159e29e3ec8375994489907a1aef74c11d GIT binary patch literal 970 zcmZ?wbhEHb8pVue8oh|zJ>*J?;yKYrl{`>L%+x0cyuXf*V zu>XFs@!!9{f8JmJ{cPv=E3IEIPPsGR@%h2p_Xnyz?#ub}?d^vRYXATJ{r33ew+l5d z*R=lmc;mi+J)qJO_W{Jgj1w$8fUJ@n$Pqjf}vg)P89OkI71JlbqOD#F&=d5ombg+_>6k&y*9%EN-)m z#edX%G<4<{Ve`GkvBR0YxlxukPUqu;1xF_C^Y`-x+WN#h)x-NgWUg jveSW8Lcz(!c_D*SfkFRNpMyaTEg_Oqm`$1mm>8@9)7njn literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img14.gif b/src/main/webapp/layout/images/img14.gif new file mode 100644 index 0000000000000000000000000000000000000000..8363ce6d766f47d82a59d167499ad875b5579c2c GIT binary patch literal 155 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 A!2kdN literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img17.gif b/src/main/webapp/layout/images/img17.gif new file mode 100644 index 0000000000000000000000000000000000000000..81c42e1300f761a1e6956d9773fec6d66fd33f9a GIT binary patch literal 608 zcmZ?wbhEHb6ky`J@@|GudXd;Uw;0PIBQSe_Vdp^et-1l^V4@< zo_zfN?%S`A-+z7l_UrfGe+e^pzxw#?^_QQYfBydT^!(G02|F(Q`t$eA*Poxh|9bK1$Lf=}mmj zkKcY?v*yJ6@4vtP`W-iYcj@vYG1GV5e)0asvv++-6>ATuC zo_YKA*UOLJ4&8Wq_QC5nUw;)YIehok$De=xE;@WYecry;Uw_uFIq~TIx1YcNtUYz- z%>7r9lXraj@$1Xa-&qR|y!`YnY1W?TX**wi`T6+mm;6PCo`3kd_~?y~-+$hF^|5!` z`P_vEUw{6-@7j~qCvG#43lx8{fVJv?NKl+OurE4Gt_m%xsBV9UDRxNH%D*giM%O^w?=Bt5TGUX5ypSe9UQC V8Iqrwof(QWc@!)^>k2Sf0|2W_MaKXD literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img18.gif b/src/main/webapp/layout/images/img18.gif new file mode 100644 index 0000000000000000000000000000000000000000..752a683ce213ee72b6c55eba434883d7a2680dec GIT binary patch literal 1082 zcmd^;?@!bP9LGNg3=d2_3}e$)+yR=^bmkGKQr?xoP=fOi?!YDx7(a^kRS2UJ?w6O4 zw@~TeP@Lc)7(XK_Ag2&4i}fTe8(XW>+#=QktjzJ~74~oRdhp)+>Fd3{)6!E7+ln-z zk^3SnQ7jx3%7s$FpU2`onsaEiajb+m;ohH&xmf(0Y#~9oa}!@KpE?++@#9r`tGPSRseLq*(pOu5SfR?HeT z%Bp9xFnE+xiLw52}Q!YG3550j2{S zHd2zx-8tIIxLC=BN;<08D13XFD=j=OT=L+{;f&K>rBIM0|0lGIVgKnq{U9HF!l*`m zv8jz_akxTPuhb}aK9q=M8GA)FA!{G0m7iv_%Nyc02cGqJsDs~igv6{Y`TCa8?zMzV zU@jPHUt_D5jNRwsCf-|Tcs^lclrE$*!xuTC{Ul`~EM`Tlz0F}alxW{&DcX@O#+zc~c*9|+O>XXHAVSV)JEn#m(=evXM z*Vh(Ct8B5Ut2C;If-ifcHbhD4GZvMSaC9*NeRRQp T<62YWrk=<8EEA?oqwM$>&EUOY literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/images/img19.gif b/src/main/webapp/layout/images/img19.gif new file mode 100644 index 0000000000000000000000000000000000000000..da86ca8fd5cda7c59c474e1d1d6ff542dca6d550 GIT binary patch literal 1042 zcmZ?wbhEHb6ky-+vo+zWV?Fzuycy&k0s> zOKvu7e_XX|wvhL>vW@pYeg6|O@2Ya^**|~(rLVg4@%taK)C0kDuYUaYr)1-UytVfl zcRs%J=6mciuP;CU`p&R@`T5t|ufMZf(pH{-8@tqd?S(f9OK%shzb6v1^W~>s9#b4% zeEOBMIWl+69n;=(i_g4GTXE~_&%c%1o^8JN(X#)1^|ptmJ(o)Bi@yE(TeRW6ROQJH zS3V>!zct~&^Rl{Cl1x8Hdi9)-@&%2*$^=FTfBhlEs6+34-Pr2ka?NZ#* zTM`Aw0_R;54d1=}#;21HK1tV{%wE^O?A-gHIgS>sB{yGwvzv6`(YqgI+om^d+j#Z) z*Wd-WqZeK8JMbc5h2Nqx?~+zLbe?fd*nj(;+n*YDJTBfc^~3i+xohthwr5xFPA#a; z^O$k@-M8PxE&1Nl96R?s*?Ik)O;=X?o+ppq|5$nc{l9(9TOru4&iKgBG*S+wDF$KGecLE9Nd0cr>+{$v3Q=zvI2o^arJ&%nqb z<1t}DhoVu^pASzS3Nf;=6a{D{GO#Og^GYo^nS7#ij#BE9KQE2aI+s{ARi#{TILIQd z;3=_mr}JS~7DmRRS7$1f1KE}43v~n*BseU!Z0Ivke4KuTEpU#>jEjONCM|OlXpvbJ zqW)!@2Cu9m$p!B`f&|jfjwv0}bZJ zWdSe0IGtA(jZ^TnXi&J^B9ORGK!br%L`b<>E~e9o<6s9TD^H4s!$VIlW`zWehsvA2KaE3NkAs7Q!5RQE*rVSU^ST*DOtEbQRZG60Q^~sW`UmxDxSvKX>$^Ca0Pr5m? z_3D)RxqDUi`03o9(|LPt_v6ir@2{G9xwGiywahF1mA7WK-8>Wh_vg=}5A2U+``=kU z?Q~7bp*uG3ubo?eTI2L1#~U--x~9ZF-MeAeHPaVIcAm-$e7bGE5bYcXvy!IBCdA*I z)qZPz+qM46tJ7PrO>6q|+6@# z_ih|X^Vkz)bmwf`?~m_qu4(=H=+1{57q1=*e{mz@Vtc{eQ?2(_OuN)wx-ZP^<-sji zx=a83{&jtN^Q%K!`=%wYI;wtqLGQ6WHhTl~ug_@R?Wfz>pSky@#lOFQ9;})3Xw#y9 zzkVIvV*mE^f%d+X+Q#f-S-yM2%oiV0`uyP5s}p;lY+uDN3MdN!#h)x-19U(nC{H+W zyklVGknxz1&?9Th77$>-;3s7~>B^LijfnyhY|3tDHZrMtNDCLOJ5!OU5wyV7M<&LD z;RFMZzVx{X7nGaWiUY*fA+TZ6E$rti4py5D^d}515!~_n;7TtUy1&@QNP5t_c zAt@RY4s*_DFF7Y~#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 literal 0 HcmV?d00001 diff --git a/src/main/webapp/layout/layout.css b/src/main/webapp/layout/layout.css new file mode 100644 index 0000000..c2c4c00 --- /dev/null +++ b/src/main/webapp/layout/layout.css @@ -0,0 +1,340 @@ +/* +Design by Free CSS Templates +http://www.freecsstemplates.org +Released for free under a Creative Commons Attribution 2.5 License +*/ + +body { + margin: 0; + padding: 0; + background: #FFFFFF url( images/img01.jpg ) repeat-x; + text-align: justify; + font: 15px Arial, Helvetica, sans-serif; + color: #626262; +} + +form { + margin: 0; + padding: 0; +} +h1{ + margin: 0; +} + +/* Header */ + +#header { + height: 42px; +} + +#logo h1, #logo p { + float: left; + text-transform: lowercase; +} + +#logo h1 { + padding: 0px 0 0 40px; +} + +#logo p { + margin: 0; + padding: 14px 0 0 4px; + line-height: normal; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 14px; +} + +#logo a { + text-decoration: none; + color: #D0C7A6; +} + +#menu { + float: right; +} + +#menu ul { + margin: 0; + padding: 0; + list-style: none; +} + +#menu li { + display: block; + float: left; + height: 42px; +} + +#menu a { + display: block; + padding: 8px 20px 0px 20px; + text-decoration: none; + text-align: center; + text-transform: lowercase; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-weight: normal; + font-size: 14px; + color: #CEC5A4; +} + +#menu .last { + margin-right: 20px; +} + +#menu a:hover { + color: #FFFFFF; +} + +#menu .current_page_item A { + text-decoration: underline; +} + +#menu .current_page_item a { +} + +/* Page */ + +#page { + padding-left: 40px; + padding-right: 40px; +} + +/* Content */ + +#content { + /* margin-right: 340px; */ +} + +.post { + margin-bottom: 10px; +} + +.post .title h2 { + padding: 30px 30px 0 0px; + text-transform: lowercase; + font-weight: normal; + font-size: 2.2em; + border-bottom: 1px #999999 dashed; + font-family: Tahoma, Georgia, "Times New Roman", Times, serif; +} + +.post .title p { + margin: 0; + padding: 0 0 10px 0px; + line-height: normal; + color: #BABABA; +} + +.post .title p a { + color: #BABABA; +} + +.post .entry { + padding: 20px 0px 20px 0px; +} + +.post .links { + margin: 0; + padding: 0 30px 30px 0px; +} + +.post .links a { + display: block; + float: left; + margin-right: 10px; + margin-bottom: 5px; + text-align: center; + text-decoration: none; + font-weight: bold; + color: #FFFFFF; +} + +.post .links a:hover { +} + +.post .links .more { + width: 128px; + height: 30px; + background: url( images/img03.jpg ) no-repeat left center; +} + +.post .links .comments { + width: 152px; + height: 30px; + background: url( images/img04.jpg ) no-repeat left center; +} + +/* Sidebar */ + +#sidebar { + float: right; + width: 300px; + margin-top: 30px; +} + +#sidebar ul { + margin: 0; + padding: 0; + list-style: none; +} + +#sidebar li { + margin-bottom: 10px; + background: url( images/img10.gif ) no-repeat left bottom; +} + +#sidebar li ul { + padding: 0 30px 40px 30px; +} + +#sidebar li li { + margin: 0; + padding-left: 20px; +} + +#sidebar h2 { + padding: 30px 30px 5px 10px; + background: url( images/img09.gif ) no-repeat; + text-transform: lowercase; + font-weight: normal; + font-size: 1.6em; + color: #302D26; +} + +#sidebar DIV.sidebar-content { + width: 265px; + margin-left: 10px; + padding-bottom: 1px; +} + +/* Search */ + +#search { + padding: 20px 30px 40px 30px; +} + +#search input { + padding: 0; + width: 70px; + height: 29px; + background: #DFDFDF url( images/img14.gif ) repeat-x; + font-weight: bold; +} + +#search #s { + padding: 5px; + width: 150px; + height: auto; + background: #FEFEFE url( images/img13.gif ) repeat-x; + border: 1px solid #626262; + font: normal 1em Arial, Helvetica, sans-serif; +} + +#search br { + display: none; +} + +/* Categories */ + +#sidebar #categories li { + background: url( images/img12.gif ) no-repeat left center; +} + +/* Calendar */ + +#calendar_wrap { + padding: 0 30px 40px 30px; +} + +#calendar table { + width: 100%; + text-align: center; +} + +#calendar thead { + background: #F1F1F1; +} + +#calendar tbody td { + border: 1px solid #F1F1F1; +} + +#calendar #prev { + text-align: left; +} + +#calendar #next { + text-align: right; +} + +#calendar tfoot a { + text-decoration: none; + font-weight: bold; +} + +#calendar #today { + background: #FFF3A7; + border: 1px solid #EB1400; + font-weight: bold; + color: #EB1400 +} + +/* Footer */ + +#footer { + padding: 70px 0 50px 0; + background: #757575 url( images/img08.gif ) repeat-x; +} + +#footer p { + margin-bottom: 1em; + text-align: center; + line-height: normal; + font-size: .9em; + color: #BABABA; +} + +#footer a { + padding: 0 20px; + text-decoration: none; + color: #DDDDDD; +} + +#footer a:hover { + color: #FFFFFF; +} + +#footer .rss { + background: url( images/img18.gif ) no-repeat left center; +} + +#footer .xhtml { + background: url( images/img19.gif ) no-repeat left center; +} + +#footer .css { + background: url( images/img20.gif ) no-repeat left center; +} + +#footer .legal a { + padding: 0; +} + + +.description, .inaction, .tmlSource, .javacode, .notice{ + font-size: 24px; + border-bottom:1px dotted #999999; +} + +pre { + margin:0; +} + +pre code{ + border:1px solid silver; +} + +.post .title h2{ + margin-bottom:0; + text-align:center; +} \ No newline at end of file diff --git a/src/main/webapp/layout/license.txt b/src/main/webapp/layout/license.txt new file mode 100644 index 0000000..4a3e47b --- /dev/null +++ b/src/main/webapp/layout/license.txt @@ -0,0 +1,243 @@ +Creative Commons + +Creative Commons Legal Code + +*Attribution 2.5* + +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE +LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN +ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION +ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE +INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM +ITS USE. + +/License/ + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE +RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS +AND CONDITIONS. + +*1. Definitions* + + 1. *"Collective Work"* means a work, such as a periodical issue, + anthology or encyclopedia, in which the Work in its entirety in + unmodified form, along with a number of other contributions, + constituting separate and independent works in themselves, are + assembled into a collective whole. A work that constitutes a + Collective Work will not be considered a Derivative Work (as + defined below) for the purposes of this License. + 2. *"Derivative Work"* means a work based upon the Work or upon the + Work and other pre-existing works, such as a translation, musical + arrangement, dramatization, fictionalization, motion picture + version, sound recording, art reproduction, abridgment, + condensation, or any other form in which the Work may be recast, + transformed, or adapted, except that a work that constitutes a + Collective Work will not be considered a Derivative Work for the + purpose of this License. For the avoidance of doubt, where the + Work is a musical composition or sound recording, the + synchronization of the Work in timed-relation with a moving image + ("synching") will be considered a Derivative Work for the purpose + of this License. + 3. *"Licensor"* means the individual or entity that offers the Work + under the terms of this License. + 4. *"Original Author"* means the individual or entity who created the + Work. + 5. *"Work"* means the copyrightable work of authorship offered under + the terms of this License. + 6. *"You"* means an individual or entity exercising rights under this + License who has not previously violated the terms of this License + with respect to the Work, or who has received express permission + from the Licensor to exercise rights under this License despite a + previous violation. + +*2. Fair Use Rights.* Nothing in this license is intended to reduce, +limit, or restrict any rights arising from fair use, first sale or other +limitations on the exclusive rights of the copyright owner under +copyright law or other applicable laws. + +*3. License Grant.* Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + 1. to reproduce the Work, to incorporate the Work into one or more + Collective Works, and to reproduce the Work as incorporated in the + Collective Works; + 2. to create and reproduce Derivative Works; + 3. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission the Work including as incorporated in Collective Works; + 4. to distribute copies or phonorecords of, display publicly, perform + publicly, and perform publicly by means of a digital audio + transmission Derivative Works. + 5. + + For the avoidance of doubt, where the work is a musical composition: + + 1. *Performance Royalties Under Blanket Licenses*. Licensor + waives the exclusive right to collect, whether individually + or via a performance rights society (e.g. ASCAP, BMI, + SESAC), royalties for the public performance or public + digital performance (e.g. webcast) of the Work. + 2. *Mechanical Rights and Statutory Royalties*. Licensor waives + the exclusive right to collect, whether individually or via + a music rights agency or designated agent (e.g. Harry Fox + Agency), royalties for any phonorecord You create from the + Work ("cover version") and distribute, subject to the + compulsory license created by 17 USC Section 115 of the US + Copyright Act (or the equivalent in other jurisdictions). + 6. *Webcasting Rights and Statutory Royalties*. For the avoidance of + doubt, where the Work is a sound recording, Licensor waives the + exclusive right to collect, whether individually or via a + performance-rights society (e.g. SoundExchange), royalties for the + public digital performance (e.g. webcast) of the Work, subject to + the compulsory license created by 17 USC Section 114 of the US + Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights +in other media and formats. All rights not expressly granted by Licensor +are hereby reserved. + +*4. Restrictions.*The license granted in Section 3 above is expressly +made subject to and limited by the following restrictions: + + 1. You may distribute, publicly display, publicly perform, or + publicly digitally perform the Work only under the terms of this + License, and You must include a copy of, or the Uniform Resource + Identifier for, this License with every copy or phonorecord of the + Work You distribute, publicly display, publicly perform, or + publicly digitally perform. You may not offer or impose any terms + on the Work that alter or restrict the terms of this License or + the recipients' exercise of the rights granted hereunder. You may + not sublicense the Work. You must keep intact all notices that + refer to this License and to the disclaimer of warranties. You may + not distribute, publicly display, publicly perform, or publicly + digitally perform the Work with any technological measures that + control access or use of the Work in a manner inconsistent with + the terms of this License Agreement. The above applies to the Work + as incorporated in a Collective Work, but this does not require + the Collective Work apart from the Work itself to be made subject + to the terms of this License. If You create a Collective Work, + upon notice from any Licensor You must, to the extent practicable, + remove from the Collective Work any credit as required by clause + 4(b), as requested. If You create a Derivative Work, upon notice + from any Licensor You must, to the extent practicable, remove from + the Derivative Work any credit as required by clause 4(b), as + requested. + 2. If you distribute, publicly display, publicly perform, or publicly + digitally perform the Work or any Derivative Works or Collective + Works, You must keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) + the name of the Original Author (or pseudonym, if applicable) if + supplied, and/or (ii) if the Original Author and/or Licensor + designate another party or parties (e.g. a sponsor institute, + publishing entity, journal) for attribution in Licensor's + copyright notice, terms of service or by other reasonable means, + the name of such party or parties; the title of the Work if + supplied; to the extent reasonably practicable, the Uniform + Resource Identifier, if any, that Licensor specifies to be + associated with the Work, unless such URI does not refer to the + copyright notice or licensing information for the Work; and in the + case of a Derivative Work, a credit identifying the use of the + Work in the Derivative Work (e.g., "French translation of the Work + by Original Author," or "Screenplay based on original Work by + Original Author"). Such credit may be implemented in any + reasonable manner; provided, however, that in the case of a + Derivative Work or Collective Work, at a minimum such credit will + appear where any other comparable authorship credit appears and in + a manner at least as prominent as such other comparable authorship + credit. + +*5. Representations, Warranties and Disclaimer* + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE +EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +*6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY +APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF +LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +*7. Termination* + + 1. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Derivative Works or + Collective Works from You under this License, however, will not + have their licenses terminated provided such individuals or + entities remain in full compliance with those licenses. Sections + 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + 2. Subject to the above terms and conditions, the license granted + here is perpetual (for the duration of the applicable copyright in + the Work). Notwithstanding the above, Licensor reserves the right + to release the Work under different license terms or to stop + distributing the Work at any time; provided, however that any such + election will not serve to withdraw this License (or any other + license that has been, or is required to be, granted under the + terms of this License), and this License will continue in full + force and effect unless terminated as stated above. + +*8. Miscellaneous* + + 1. Each time You distribute or publicly digitally perform the Work or + a Collective Work, the Licensor offers to the recipient a license + to the Work on the same terms and conditions as the license + granted to You under this License. + 2. Each time You distribute or publicly digitally perform a + Derivative Work, Licensor offers to the recipient a license to the + original Work on the same terms and conditions as the license + granted to You under this License. + 3. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability + of the remainder of the terms of this License, and without further + action by the parties to this agreement, such provision shall be + reformed to the minimum extent necessary to make such provision + valid and enforceable. + 4. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in + writing and signed by the party to be charged with such waiver or + consent. + 5. This License constitutes the entire agreement between the parties + with respect to the Work licensed here. There are no + understandings, agreements or representations with respect to the + Work not specified here. Licensor shall not be bound by any + additional provisions that may appear in any communication from + You. This License may not be modified without the mutual written + agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty +whatsoever in connection with the Work. Creative Commons will not be +liable to You or any party on any legal theory for any damages +whatsoever, including without limitation any general, special, +incidental or consequential damages arising in connection to this +license. Notwithstanding the foregoing two (2) sentences, if Creative +Commons has expressly identified itself as the Licensor hereunder, it +shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work +is licensed under the CCPL, neither party will use the trademark +"Creative Commons" or any related trademark or logo of Creative Commons +without the prior written consent of Creative Commons. Any permitted use +will be in compliance with Creative Commons' then-current trademark +usage guidelines, as may be published on its website or otherwise made +available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/ +. + +� Back to Commons Deed <./> diff --git a/src/site/apt/index.apt b/src/site/apt/index.apt new file mode 100644 index 0000000..88ee759 --- /dev/null +++ b/src/site/apt/index.apt @@ -0,0 +1,9 @@ + ---- + Module fr.exanpe:exanpe-t5-demo + ---- + +fr.exanpe:exanpe-t5-demo Documentation + + This is where you can start to document your module. + + Create new files in the Maven APT format, and update the site.xml file to point to them. diff --git a/src/site/site.xml b/src/site/site.xml new file mode 100644 index 0000000..deb2526 --- /dev/null +++ b/src/site/site.xml @@ -0,0 +1,17 @@ + + + + + + + + + +

+ + + + + + + diff --git a/src/test/conf/testng.xml b/src/test/conf/testng.xml new file mode 100644 index 0000000..a5eba22 --- /dev/null +++ b/src/test/conf/testng.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/test/conf/webdefault.xml b/src/test/conf/webdefault.xml new file mode 100644 index 0000000..c587ac7 --- /dev/null +++ b/src/test/conf/webdefault.xml @@ -0,0 +1,278 @@ + + + + + Default web.xml file. + This file is applied to a Web application before it's own WEB_INF/web.xml file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + org.mortbay.jetty.servlet.Default + + acceptRanges + true + + + dirAllowed + true + + + putAllowed + false + + + delAllowed + false + + + redirectWelcome + false + + + minGzipLength + 8192 + + 0 + + + + + default + / + + + + + 30 + + + + + + index.html + index.htm + + + + + + ar + ISO-8859-6 + + + be + ISO-8859-5 + + + bg + ISO-8859-5 + + + ca + ISO-8859-1 + + + cs + ISO-8859-2 + + + da + ISO-8859-1 + + + de + ISO-8859-1 + + + el + ISO-8859-7 + + + en + ISO-8859-1 + + + es + ISO-8859-1 + + + et + ISO-8859-1 + + + fi + ISO-8859-1 + + + fr + ISO-8859-1 + + + hr + ISO-8859-2 + + + hu + ISO-8859-2 + + + is + ISO-8859-1 + + + it + ISO-8859-1 + + + iw + ISO-8859-8 + + + ja + Shift_JIS + + + ko + EUC-KR + + + lt + ISO-8859-2 + + + lv + ISO-8859-2 + + + mk + ISO-8859-5 + + + nl + ISO-8859-1 + + + no + ISO-8859-1 + + + pl + ISO-8859-2 + + + pt + ISO-8859-1 + + + ro + ISO-8859-2 + + + ru + ISO-8859-5 + + + sh + ISO-8859-5 + + + sk + ISO-8859-2 + + + sl + ISO-8859-2 + + + sq + ISO-8859-2 + + + sr + ISO-8859-5 + + + sv + ISO-8859-1 + + + tr + ISO-8859-9 + + + uk + ISO-8859-5 + + + zh + GB2312 + + + zh_TW + Big5 + + + + + + diff --git a/src/test/java/PLACEHOLDER b/src/test/java/PLACEHOLDER new file mode 100644 index 0000000..62c163c --- /dev/null +++ b/src/test/java/PLACEHOLDER @@ -0,0 +1 @@ +This placeholder exists to ensure the directory is created. It may be deleted when real files are placed under src/test/java. \ No newline at end of file diff --git a/src/test/resources/PLACEHOLDER b/src/test/resources/PLACEHOLDER new file mode 100644 index 0000000..05ace36 --- /dev/null +++ b/src/test/resources/PLACEHOLDER @@ -0,0 +1 @@ +This placeholder exists to ensure the directory is created. It may be deleted when real files are placed under src/test/resources. \ No newline at end of file