From 2cf6703ff6ee86259aaf11dd2dedd7b9aca5bc9d Mon Sep 17 00:00:00 2001 From: fmittag Date: Tue, 3 Feb 2015 16:13:48 +0100 Subject: [PATCH 01/15] intial commit of a bundle for a UI component library for SSE --- .../SailingServer (No Proxy).launch | 2 +- java/com.sap.sse.gwt.theme/.classpath | 10 + java/com.sap.sse.gwt.theme/.gitignore | 6 + java/com.sap.sse.gwt.theme/.project | 39 ++ .../com.google.gwt.eclipse.core.prefs | 2 + .../META-INF/MANIFEST.MF | 19 + java/com.sap.sse.gwt.theme/SSETheme.css | 3 + java/com.sap.sse.gwt.theme/SSETheme.html | 54 +++ .../SSETheme_GWT sdm.launch | 27 ++ .../com.sap.sse.gwt.theme/SSETheme_GWT.launch | 26 + java/com.sap.sse.gwt.theme/WEB-INF/.gitignore | 2 + java/com.sap.sse.gwt.theme/WEB-INF/web.xml | 22 + java/com.sap.sse.gwt.theme/build.properties | 10 + java/com.sap.sse.gwt.theme/pom.xml | 107 +++++ .../com/sap/sse/gwt/theme/SSETheme.gwt.xml | 25 + .../sse/gwt/theme/client/ThemeEntryPoint.java | 20 + .../component/recentevent/RecentEvent.css | 47 ++ .../component/recentevent/RecentEvent.java | 69 +++ .../component/recentevent/RecentEvent.ui.xml | 22 + .../recentevent/RecentEventData.java | 16 + .../recentevent/RecentEventResources.java | 25 + .../recentevent/default_event_photo.jpg | Bin 0 -> 28976 bytes .../client/component/sapheader/SAPHeader.css | 44 ++ .../client/component/sapheader/SAPHeader.java | 51 ++ .../component/sapheader/SAPHeader.ui.xml | 21 + .../component/sapheader/SAPHeaderData.java | 5 + .../sapheader/SAPHeaderResources.java | 26 + .../component/sapheader/logo-small@2x.png | Bin 0 -> 6388 bytes .../client/resources/ThemeResources.java | 140 ++++++ .../client/resources/i18n/TextMessages.java | 10 + .../resources/i18n/TextMessages.properties | 1 + .../resources/i18n/TextMessages_de.properties | 1 + .../sse/gwt/theme/client/resources/main.gss | 417 ++++++++++++++++ .../sse/gwt/theme/client/resources/media.gss | 450 ++++++++++++++++++ .../client/showcase/ComponentShowCase.java | 53 +++ .../client/showcase/ComponentShowCase.ui.xml | 30 ++ .../gwt/theme/client/showcase/MainPage.java | 30 ++ .../gwt/theme/client/showcase/MainPage.ui.xml | 33 ++ .../gwt/theme/client/showcase/Section.java | 50 ++ .../gwt/theme/client/showcase/Section.ui.xml | 6 + .../showcase/ShowcaseStackLayoutPanel.java | 27 ++ .../recentevent/RecentEventShowcase.java | 131 +++++ .../recentevent/RecentEventShowcase.ui.xml | 35 ++ .../showcase/sapheader/SAPHeaderShowcase.java | 25 + .../sapheader/SAPHeaderShowcase.ui.xml | 29 ++ .../client/styleguide/typeface/typeface.html | 24 + .../gwt/theme/client/util/FullscreenUtil.java | 27 ++ 47 files changed, 2218 insertions(+), 1 deletion(-) create mode 100644 java/com.sap.sse.gwt.theme/.classpath create mode 100644 java/com.sap.sse.gwt.theme/.gitignore create mode 100644 java/com.sap.sse.gwt.theme/.project create mode 100644 java/com.sap.sse.gwt.theme/.settings/com.google.gwt.eclipse.core.prefs create mode 100644 java/com.sap.sse.gwt.theme/META-INF/MANIFEST.MF create mode 100644 java/com.sap.sse.gwt.theme/SSETheme.css create mode 100644 java/com.sap.sse.gwt.theme/SSETheme.html create mode 100644 java/com.sap.sse.gwt.theme/SSETheme_GWT sdm.launch create mode 100644 java/com.sap.sse.gwt.theme/SSETheme_GWT.launch create mode 100644 java/com.sap.sse.gwt.theme/WEB-INF/.gitignore create mode 100644 java/com.sap.sse.gwt.theme/WEB-INF/web.xml create mode 100644 java/com.sap.sse.gwt.theme/build.properties create mode 100644 java/com.sap.sse.gwt.theme/pom.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/SSETheme.gwt.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/ThemeEntryPoint.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/default_event_photo.jpg create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.css create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderResources.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/logo-small@2x.png create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/ThemeResources.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/main.gss create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/media.gss create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowcaseStackLayoutPanel.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/util/FullscreenUtil.java diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 8d2cd64f937..8f35a451c9c 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -33,5 +33,5 @@ - + diff --git a/java/com.sap.sse.gwt.theme/.classpath b/java/com.sap.sse.gwt.theme/.classpath new file mode 100644 index 00000000000..b983a4da697 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/java/com.sap.sse.gwt.theme/.gitignore b/java/com.sap.sse.gwt.theme/.gitignore new file mode 100644 index 00000000000..62f0b377a8a --- /dev/null +++ b/java/com.sap.sse.gwt.theme/.gitignore @@ -0,0 +1,6 @@ +/bin +/.gwt +/.generated +/gwt-unitCache +/extras +/com.sap.sse.gwt.theme.* diff --git a/java/com.sap.sse.gwt.theme/.project b/java/com.sap.sse.gwt.theme/.project new file mode 100644 index 00000000000..8e679e93a05 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/.project @@ -0,0 +1,39 @@ + + + com.sap.sse.gwt.theme + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + com.google.gdt.eclipse.core.webAppProjectValidator + + + + + com.google.gwt.eclipse.core.gwtProjectValidator + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + com.google.gwt.eclipse.core.gwtNature + + diff --git a/java/com.sap.sse.gwt.theme/.settings/com.google.gwt.eclipse.core.prefs b/java/com.sap.sse.gwt.theme/.settings/com.google.gwt.eclipse.core.prefs new file mode 100644 index 00000000000..e992774d99b --- /dev/null +++ b/java/com.sap.sse.gwt.theme/.settings/com.google.gwt.eclipse.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgSU5GT11dPjwvZXh0cmEtYXJncz48dm0tYXJncz48IVtDREFUQVstWG14NTEybV1dPjwvdm0tYXJncz48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc3NlLmd3dC50aGVtZS5TU0VUaGVtZTwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+ diff --git a/java/com.sap.sse.gwt.theme/META-INF/MANIFEST.MF b/java/com.sap.sse.gwt.theme/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..ff236c0cf0d --- /dev/null +++ b/java/com.sap.sse.gwt.theme/META-INF/MANIFEST.MF @@ -0,0 +1,19 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: SSE Base Theme +Bundle-SymbolicName: com.sap.sse.gwt.theme +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: SAP +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 +Bundle-ActivationPolicy: lazy +Bundle-ClassPath: WEB-INF/classes/ +Import-Package: org.osgi.framework;version="1.7.0", + javax.servlet;version="3.1.0", + javax.servlet.descriptor;version="3.1.0", + javax.servlet.http;version="3.1.0" +Require-Bundle: com.google.gwt.osgi;bundle-version="2.7.0", + com.sap.sailing.domain.common, + com.sap.sse.common, + com.sap.sse.gwt +Web-ContextPath: /theme +Export-Package: com.sap.sse.gwt.theme.client diff --git a/java/com.sap.sse.gwt.theme/SSETheme.css b/java/com.sap.sse.gwt.theme/SSETheme.css new file mode 100644 index 00000000000..9a49fb97ef1 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/SSETheme.css @@ -0,0 +1,3 @@ +.mainPanel { + +} \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/SSETheme.html b/java/com.sap.sse.gwt.theme/SSETheme.html new file mode 100644 index 00000000000..cb45c7aad46 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/SSETheme.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + SAP Sports Engine Theme + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt.theme/SSETheme_GWT sdm.launch b/java/com.sap.sse.gwt.theme/SSETheme_GWT sdm.launch new file mode 100644 index 00000000000..e61889df28b --- /dev/null +++ b/java/com.sap.sse.gwt.theme/SSETheme_GWT sdm.launch @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt.theme/SSETheme_GWT.launch b/java/com.sap.sse.gwt.theme/SSETheme_GWT.launch new file mode 100644 index 00000000000..497ba323966 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/SSETheme_GWT.launch @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt.theme/WEB-INF/.gitignore b/java/com.sap.sse.gwt.theme/WEB-INF/.gitignore new file mode 100644 index 00000000000..b30e141e749 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/WEB-INF/.gitignore @@ -0,0 +1,2 @@ +deploy +classes \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/WEB-INF/web.xml b/java/com.sap.sse.gwt.theme/WEB-INF/web.xml new file mode 100644 index 00000000000..7afb56e6574 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/WEB-INF/web.xml @@ -0,0 +1,22 @@ + + + + + + default + org.eclipse.jetty.servlet.DefaultServlet + + + dirAllowed + false + + + useFileMappedBuffer + false + + + + diff --git a/java/com.sap.sse.gwt.theme/build.properties b/java/com.sap.sse.gwt.theme/build.properties new file mode 100644 index 00000000000..95d385246a8 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/build.properties @@ -0,0 +1,10 @@ +source.WEB-INF/classes/ = src/main/java,\ + src/main/resources +output.WEB-INF/classes/ = bin +bin.includes = META-INF/,\ + WEB-INF/classes/,\ + WEB-INF/web.xml,\ + com.sap.sse.gwt.theme.SSETheme/,\ + SSETheme.css,\ + SSETheme.html +output.. = WEB-INF/classes/ diff --git a/java/com.sap.sse.gwt.theme/pom.xml b/java/com.sap.sse.gwt.theme/pom.xml new file mode 100644 index 00000000000..b426d91ca1a --- /dev/null +++ b/java/com.sap.sse.gwt.theme/pom.xml @@ -0,0 +1,107 @@ + + + 4.0.0 + + root + com.sap.sailing + 1.0.0-SNAPSHOT + + com.sap.sse.gwt.theme + eclipse-plugin + + + javax.validation + validation-api + 1.0.0.GA + + + javax.validation + validation-api + 1.0.0.GA + sources + + + com.sap.sailing + com.sap.sse.common + 1.0.0-SNAPSHOT + sources + + + com.sap.sailing + com.sap.sse.gwt + 1.0.0-SNAPSHOT + sources + + + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho-version} + + + plugin-source + generate-sources + + plugin-source + + + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwt.version} + + + + + -Dgwt.persistentunitcache=false + + + com.sap.sse.gwt.theme.Theme + + ${basedir}/.generated + 7 + ${basedir} + ${basedir}/src/main/resources + + + + compile + + + + + + + + + + debug.no-gwt-compile + + + + org.codehaus.mojo + gwt-maven-plugin + ${gwt.version} + + + + + + + + help + + + + + + + + + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/SSETheme.gwt.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/SSETheme.gwt.xml new file mode 100644 index 00000000000..8af42f07f54 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/SSETheme.gwt.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/ThemeEntryPoint.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/ThemeEntryPoint.java new file mode 100644 index 00000000000..99665fc24e3 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/ThemeEntryPoint.java @@ -0,0 +1,20 @@ +package com.sap.sse.gwt.theme.client; + +import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.user.client.ui.RootLayoutPanel; +import com.sap.sse.gwt.theme.client.resources.ThemeResources; +import com.sap.sse.gwt.theme.client.showcase.MainPage; + +/** + * Entry point classes define onModuleLoad(). + */ +public class ThemeEntryPoint implements EntryPoint { + + @Override + public void onModuleLoad() { + ThemeResources.INSTANCE.mediaCss().ensureInjected(); + ThemeResources.INSTANCE.mainCss().ensureInjected(); + + RootLayoutPanel.get().add(new MainPage()); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css new file mode 100644 index 00000000000..519353979c9 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css @@ -0,0 +1,47 @@ +.eventteasercontainer { + font-size: 1rem; + text-align: center; + width: 100%; + height: 24em; +} +.eventteaser { + font-size: 1rem; + display: inline-block; + margin-bottom: 3em; + text-align: left; + max-width: 100%; + width: 100%; +} +.eventteaser:hover { + text-decoration: none; +} +.eventteaser:hover .eventteaser_name { + text-decoration: underline; +} +.eventteaser:hover .eventteaser_image { + opacity: 0.9; +} +.eventteaser_image { + position: relative; + display: inline-block; + max-width: 100%; + width: 100%; + height: 240px; + background-position: center; + background-size: cover; + background-repeat: no-repeat; +} +.eventteaser_series { + position: absolute; + bottom: 0; + right: 0; +} +.eventteaser_name { + font-size: 1.466666666666667em; + font-weight: bold; + color: #008fcc; + margin-top: 0.333333333333333em; +} +.eventteaser_location { + color: #222; +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java new file mode 100644 index 00000000000..b5fde43544c --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java @@ -0,0 +1,69 @@ +package com.sap.sse.gwt.theme.client.component.recentevent; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.SpanElement; +import com.google.gwt.dom.client.Style.Display; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +public class RecentEvent extends Composite { + + @UiField + SpanElement eventNameUi; + + @UiField + SpanElement venueNameUi; + + @UiField + SpanElement eventDateUi; + + @UiField + Anchor eventOverviewUi; + + @UiField + DivElement eventImageContainerUi; + + @UiField + DivElement isLiveUi; + + interface RecentEventUiBinder extends UiBinder { + } + + private static RecentEventUiBinder uiBinder = GWT.create(RecentEventUiBinder.class); + private Command eventClickAction; + + public RecentEvent(RecentEventData data) { + + this.eventClickAction = data.getCommand(); + RecentEventResources.INSTANCE.css().ensureInjected(); + initWidget(uiBinder.createAndBindUi(this)); + + eventNameUi.setInnerText(data.getEventName()); + venueNameUi.setInnerText(data.getVenue()); + eventDateUi.setInnerText(data.getEventStart().toString().substring(10) + " " + + data.getEventEnd().toString().substring(10)); + + final StringBuilder thumbnailUrlBuilder = new StringBuilder("url('").append(data.getEventImageUrl()).append( + "')"); + GWT.log(thumbnailUrlBuilder.toString()); + eventImageContainerUi.getStyle().setBackgroundImage(thumbnailUrlBuilder.toString()); + if (data.isLive()) + isLiveUi.getStyle().setDisplay(Display.BLOCK); + else + isLiveUi.getStyle().setDisplay(Display.NONE); + } + + @UiHandler("eventOverviewUi") + public void goToEventOverview(ClickEvent e) { + eventClickAction.execute(); + e.preventDefault(); + } + +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml new file mode 100644 index 00000000000..92b0202e911 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml @@ -0,0 +1,22 @@ + + + + + + + + +
+ +
+
+
+
+
+ ,  +
+
+
+
+
diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java new file mode 100644 index 00000000000..b3788eaab89 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java @@ -0,0 +1,16 @@ +package com.sap.sse.gwt.theme.client.component.recentevent; + +import java.util.Date; + +import com.google.gwt.user.client.Command; + +public interface RecentEventData { + String getEventImageUrl(); + String getVenue(); + String getLocation(); + Date getEventStart(); + Date getEventEnd(); + Command getCommand(); + String getEventName(); + boolean isLive(); +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java new file mode 100644 index 00000000000..6d2229572a1 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java @@ -0,0 +1,25 @@ +package com.sap.sse.gwt.theme.client.component.recentevent; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; + +public interface RecentEventResources extends ClientBundle { + public static final RecentEventResources INSTANCE = GWT.create(RecentEventResources.class); + + @Source("RecentEvent.css") + LocalCss css(); + + public interface LocalCss extends CssResource { + String eventteaser(); + String eventteaser_name(); + String eventteaser_image(); + String eventteaser_series(); + String eventteaser_location(); + String eventteasercontainer(); + } + + @Source("default_event_photo.jpg") + ImageResource defaultEventPhotoImage(); +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/default_event_photo.jpg b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/default_event_photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..03f41052084a0cb160d540dc85c7ab3f9459db39 GIT binary patch literal 28976 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 literal 0 HcmV?d00001 diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.css b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.css new file mode 100644 index 00000000000..9de247011bb --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.css @@ -0,0 +1,44 @@ +.siteheader { + font-size: 15px; + font-size: 1rem; + background: #333; + border-bottom: 5px solid #f0ab00; + height: 70px; + line-height: 4em; + width: 100%; + overflow: hidden; + text-align:center; +} + +.siteheaderLeft { + float:left; + width: 25%; + text-align: left; +} + +.siteheaderCentered { + width: 50%; + display: inline-block; + margin:0 auto; +} + +.siteheaderRight { + float:right; + width: 25%; + text-align: right; +} + +.logo { + margin: 0.8em 10px; + float: left; +} +.logotitle { + display: inline; + color: #f6f9fc; + font-weight: bold; +} +.pagetitle { + color: #ffffff; + font-size: 1.5rem; + font-weight: bold; +} \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.java new file mode 100644 index 00000000000..83e30aaa36f --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.java @@ -0,0 +1,51 @@ +package com.sap.sse.gwt.theme.client.component.sapheader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.RepeatingCommand; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.dom.client.ParagraphElement; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.theme.client.util.FullscreenUtil; + +public class SAPHeader extends Composite { + private static SAPHeaderUiBinder uiBinder = GWT.create(SAPHeaderUiBinder.class); + + interface SAPHeaderUiBinder extends UiBinder { + } + + @UiField ParagraphElement applicationNameUi; + @UiField DivElement pageTitleUi; + @UiField Button startFullScreenButton; + + public SAPHeader(String applicationName, String pageTitle, boolean startInAutoScreenMode) { + SAPHeaderResources.INSTANCE.css().ensureInjected(); + + initWidget(uiBinder.createAndBindUi(this)); + + applicationNameUi.setInnerText(applicationName != null ? applicationName : " "); + pageTitleUi.setInnerText(pageTitle); + startFullScreenButton.setVisible(startInAutoScreenMode); + + // the 'fullscreen' button should disappear after some seconds (10) + if(startInAutoScreenMode) { + Scheduler.get().scheduleFixedPeriod(new RepeatingCommand() { + public boolean execute () { + startFullScreenButton.setVisible(false); + return false; + } + }, 10000); + } + } + + @UiHandler("startFullScreenButton") + void startFullScreenClicked(ClickEvent e) { + FullscreenUtil.requestFullscreen(); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.ui.xml new file mode 100644 index 00000000000..1138ddaf708 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeader.ui.xml @@ -0,0 +1,21 @@ + + + + + +
+
+ +

+
+
+
+
+
+ +   +
+
+
+
diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java new file mode 100644 index 00000000000..16804993bd9 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java @@ -0,0 +1,5 @@ +package com.sap.sse.gwt.theme.client.component.sapheader; + +public interface SAPHeaderData { + +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderResources.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderResources.java new file mode 100644 index 00000000000..cea0a1754d1 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderResources.java @@ -0,0 +1,26 @@ +package com.sap.sse.gwt.theme.client.component.sapheader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.ImageResource; + +public interface SAPHeaderResources extends ClientBundle { + public static final SAPHeaderResources INSTANCE = GWT.create(SAPHeaderResources.class); + + @Source("SAPHeader.css") + LocalCss css(); + + public interface LocalCss extends CssResource { + String siteheader(); + String siteheaderLeft(); + String siteheaderCentered(); + String siteheaderRight(); + String logo(); + String logotitle(); + String pagetitle(); + } + + @Source("logo-small@2x.png") + ImageResource logo(); +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/logo-small@2x.png b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/logo-small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d2daf91f3962deb5be2991141b8145186e982a GIT binary patch literal 6388 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 NVW?-STdnOB^*{MHr`-Sm literal 0 HcmV?d00001 diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/ThemeResources.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/ThemeResources.java new file mode 100644 index 00000000000..d6026a3ab87 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/ThemeResources.java @@ -0,0 +1,140 @@ +package com.sap.sse.gwt.theme.client.resources; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface ThemeResources extends ClientBundle { + public static final ThemeResources INSTANCE = GWT.create(ThemeResources.class); + + @Source("main.gss") + MainCss mainCss(); + + @Source("media.gss") + MediaCss mediaCss(); + + public interface MainCss extends CssResource{ + String wrapper(); + String navbar(); + String navbar_button(); + String navbar_buttonhidden(); + String navbar_buttonactive(); + String button(); + String buttonsmall(); + String buttonstrong(); + String buttoninactive(); + String buttonprimary(); + String buttonred(); + String buttonrefresh(); + String buttonarrowdown(); + String buttonsearch(); + String buttonarrowrightwhite(); + String label(); + String labellarge(); + String morelink(); + String dummy(); + String mainsection(); + String mainsection_header(); + String mainsection_header_title(); + String mainsection_navigation(); + String lightbox(); + String lightbox_overlay(); + String lightbox_content(); + String lightbox_close(); + String stickyheader(); + String slideto(); + String slidetonav(); + String slidetoactive(); + } + + public interface MediaCss extends CssResource{ + String grid(); + String stackenblochen(); + String column(); + String columns(); + String small1(); + String small2(); + String small3(); + String small4(); + String small5(); + String small6(); + String small7(); + String small8(); + String small9(); + String small10(); + String small11(); + String small12(); + String smalloffset0(); + String smalloffset1(); + String smalloffset2(); + String smalloffset3(); + String smalloffset4(); + String smalloffset5(); + String smalloffset6(); + String smalloffset7(); + String smalloffset8(); + String smalloffset9(); + String smalloffset10(); + String smalloffset11(); + String showonsmall(); + String hideonsmall(); + String showonmedium(); + String hideonmedium(); + String showonlarge(); + String hideonlarge(); + String smallcentered(); + String smalluncentered(); + String medium1(); + String medium2(); + String medium3(); + String medium4(); + String medium5(); + String medium6(); + String medium7(); + String medium8(); + String medium9(); + String medium10(); + String medium11(); + String medium12(); + String mediumoffset0(); + String mediumoffset1(); + String mediumoffset2(); + String mediumoffset3(); + String mediumoffset4(); + String mediumoffset5(); + String mediumoffset6(); + String mediumoffset7(); + String mediumoffset8(); + String mediumoffset9(); + String mediumoffset10(); + String mediumoffset11(); + String mediumcentered(); + String mediumuncentered(); + String large1(); + String large2(); + String large3(); + String large4(); + String large5(); + String large6(); + String large7(); + String large8(); + String large9(); + String large10(); + String large11(); + String large12(); + String largeoffset0(); + String largeoffset1(); + String largeoffset2(); + String largeoffset3(); + String largeoffset4(); + String largeoffset5(); + String largeoffset6(); + String largeoffset7(); + String largeoffset8(); + String largeoffset9(); + String largeoffset10(); + String largeoffset11(); + String largecentered(); + String largeuncentered(); + } +} \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java new file mode 100644 index 00000000000..3b9b9964efc --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java @@ -0,0 +1,10 @@ +package com.sap.sse.gwt.theme.client.resources.i18n; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.Messages; + +public interface TextMessages extends Messages { + public static final TextMessages INSTANCE = GWT.create(TextMessages.class); + + String chooseALanguage(); +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties new file mode 100644 index 00000000000..3bb701bcae5 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties @@ -0,0 +1 @@ +chooseALanguage=Choose a language diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties new file mode 100644 index 00000000000..c638bf7471d --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties @@ -0,0 +1 @@ +chooseALanguage=Wähle eine Sprache diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/main.gss b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/main.gss new file mode 100644 index 00000000000..ea60fb681f6 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/main.gss @@ -0,0 +1,417 @@ +/** + * The main styling styles + */ +*, +*:before, +*:after { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html, +body { + height: 100%; + font-family: 'Open Sans', sans-serif; + font-size: 93.75%; + line-height: 1.333; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -ms-content-zooming: none; +} +figure { + margin: 0; +} +a { + text-decoration: none; + color: #008fcc; +} +a:hover, +a:focus { + text-decoration: underline; +} +a img { + vertical-align: bottom; +} +hr { + font-size: 1rem; + margin: 0; + height: 1px; + border: none; + border-top: 1px solid #eee; +} +h1 { + font-size: 2.133333333333333em; +} +h2 { + font-size: 1.466666666666667em; + font-weight: bold; + color: #008fcc; + margin-top: 0.7em; + margin-bottom: 0.7em; +} +h3 { + font-size: 1.2em; + font-weight: bold; + margin: 0 0 0.5em; +} +h4 { + font-size: 1em; + font-weight: bold; + color: #008fcc; +} +h5 { + font-size: 0.866666666666667em; + font-weight: 600; + color: #008fcc; +} +figure img { + display: block; +} +figcaption { + margin-top: 1.333333333333333em; +} +.wrapper { + position: relative; + min-height: 100%; + margin-bottom: -5em; + padding-bottom: 8em; +} +.wrapper > * { + padding-left: 1.333333333333333em; + padding-right: 1.333333333333333em; +} +.navbar { + font-size: 1rem; +} +.navbar_button { + font-size: 1.2em; + display: inline-block; + font-weight: 600; + color: #666; + border: 1px solid #dedede; + padding: 0.833333333333333em 0.944444444444444em; + background-color: #eee; + -webkit-transition: background-color 0.2s, border-color 0.2s; + -moz-transition: background-color 0.2s, border-color 0.2s; + transition: background-color 0.2s, border-color 0.2s; + text-decoration: none; + margin-right: 0.833333333333333em; +} +.navbar_buttonhidden { + display: block; +} +.navbar_button:hover, +.navbar_button:focus { + background-color: #dedede; + outline: none; + text-decoration: none; +} +.navbar_buttonactive { + color: #333; + background-color: #fff; + border-bottom: 1px solid #fff; +} +.navbar_buttonactive:hover, +.navbar_buttonactive:focus { + background-color: #dedede; + border-bottom: 1px solid #dedede; +} +.button { + font-size: 1rem; + display: inline-block; + font-weight: 600; + color: #fff; + border: none; + padding: 0.666666666666667em 2em; + border-radius: 0.2em; + background-color: #f0ab00; + -webkit-transition: background-color 0.2s; + -moz-transition: background-color 0.2s; + transition: background-color 0.2s; + text-decoration: none; +} +.button:hover, +.button:focus { + background-color: #d89a00; + outline: none; + text-decoration: none; +} +.buttonsmall { + visibility: inherit; +} +.buttonstrong { + font-size: 0.933333333333333rem; + font-weight: 700; + text-transform: uppercase; + padding: 0.714285714285714em 1.071428571428571em; +} +.buttoninactive { + background-color: #eee; +} +.buttoninactive:hover, +.buttoninactive:focus { + background-color: #eee; +} +.buttonprimary { + background-color: #008fcc; +} +.buttonprimary:hover, +.buttonprimary:focus { + background-color: #0081b8; +} +.buttonred { + background-color: #e94a1b; +} +.buttonred:hover, +.buttonred:focus { + background-color: #d54115; +} +.buttonrefresh { + background-image: url("data:image/png;base64,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"); +} +.buttonrefresh, +.buttonarrowdown { + background-repeat: no-repeat; + background-position: left top; + background-size: cover; + width: 2.333333333333333em; + height: 0; + padding: 2.333333333333333em 0 0 0; + border: 0; + overflow: hidden; +} +.buttonsearch { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2NTg0MEE1MTVFN0UxMUU0QkNGMTk0Q0UzOUEwNUNFMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2NTg0MEE1MjVFN0UxMUU0QkNGMTk0Q0UzOUEwNUNFMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjY1ODQwQTRGNUU3RTExRTRCQ0YxOTRDRTM5QTA1Q0UzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjY1ODQwQTUwNUU3RTExRTRCQ0YxOTRDRTM5QTA1Q0UzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+tERf2gAAArFJREFUeNrMmE1kXFEUx28SwjAMjxCGIQwhzCoMQysVugqlhJBVyCqLbELpqtmEUFJddZFNFhVSpd20uqgw1VIhixgSIqREYiKRSExkhNTruZzhOO5999737m3m8DdzZt6773fP/Trn9cRxLBysD/QUNAaKQEP4eQI6xc/voN/Cl0lAC1VBG6Cr2M6aoHegkmX7WpkuKIPW4/R2B1oBRSEAJ0G3BoAz0DaoZbjuGEfBG+CS5kG7oFegiua+MYxYU3Gv7OyUD0AV3CFo2qHhHGhBM2efZQGcUjT4ER+YZg7JRbLF2msljEAiYFkx515nXYXYuS+s3QNQvyvghiJywpPyoAZr/4ULYFXRw5xHQKkh3HY6dmGz/fTifv2S7d+LoLbwa39Ab4gvT6BZm5MkYj3b9Rw5qojN84ZNBB+B+gnzexHOLvGs7lgFVEy6oQNI7asIax+YP2oCLBP/BrQXGHCH+RUT4ADxZcr0NzDgEfMLJsA88dsivN0wP2cCvCZ+/j8ARsw/NwGeEr+IWXNIK7kC7hNfbje1wIA1xQaeCPiL/TYRGHCSzfkfppMkx/K2Q9tMI2X6dU+e9dPmJGmzzVNWanOBorfE5viqbVWnyjSKnqNXY9E7thkp6qywlGvLY8pVVNQpc64Ja4S9ovbJA2QJMyRqm2lrkqoi7W9kKMBrmgpvPEtVN60pGZdBBYeorRnePAxnqYufa4rxFg677MQoSdlL6MtS8xtbDJkgk/6s4J7ow+qgCcVwGyFtC/CLlGBNtlpHXCFtJ3sBQesWUPe4Smc0+5wTZI/j+0GBCa488Acx+xkk7waP8Gw15ZUjoE28lybLT1jyIkTACs4kq0g+JKAV5EMDGiHTzMEQNgyqK+bk424B1EF+7hXdY/u4immNJLopgh2TLxLe4vf5fwIMADtbDGrkqxb2AAAAAElFTkSuQmCC"); + background-color: transparent; + background-size: contain; + background-position: center center; + background-repeat: no-repeat; + width: 1.333333333333333em; + height: 1.333333333333333em; + padding: 0; +} +.buttonsearch:hover, +.buttonsearch:focus { + background-color: transparent; + outline: none; + text-decoration: none; +} +.buttonarrowdown { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALFJREFUeNrs1TEOgjAUxnFx5iDscgPvwXkYuYdXwBPgAYwrsxPGIAPPvKQkxLQO5UE0+X9J06Ff0186tImI7H45CUCAAAECBAgQIMA1s1+y+dkUpUXna/QGY0Z/q0QztCcJddyauG7UOdHA8XWXKT7khNO47rbArj5kIeQnTrubA0NIS9xioA9piTMB+pBWODPgHGmJ02H6UD/OeaZzerxc+eoAAgQIECBAgAD/AvgWYACm/8hEADYaXwAAAABJRU5ErkJggg=="); + width: 2.666666666666667em; + padding: 2.733333333333333em 0 0 0; +} +.buttonarrowrightwhite:after { + content: ''; + display: inline-block; + margin-left: 0.666666666666667em; + width: 0.466666666666667em; + height: 0.8em; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAMCAYAAACulacQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFtJREFUeNpi+P///wEgPgzEokDMgIxBxMn/EHAVXQGIkIBKYCiAqUJXIIEsiVUBA5ojRJEUnGFiwAR/ofQvXLpQjMXpILxeOY8rEEAOegfER4DYAYhfI7sMIMAAiXvwy2upI1UAAAAASUVORK5CYII="); + background-size: contain; + background-repeat: no-repeat; +} +.label { + display: inline-block; + font-size: 0.8rem; + font-weight: 600; + color: #fff; + padding: 0.066666666666667em 0.666666666666667em; + position: relative; + margin-left: 0.833333333333333em; + height: 1.666666666666667em; + line-height: 1.666666666666667em; +} +.label:before { + content: ''; + position: absolute; + top: 0; + left: -0.833333333333333em; + width: 0; + height: 0; + border-top: 0.833333333333333em solid transparent; + border-bottom: 0.833333333333333em solid transparent; + border-right: 0.833333333333333em solid transparent; +} +.labellarge { + height: 2em; + line-height: 1.75em; + margin-left: 1em; +} +.labellarge:before { + left: -1em; + border-top-width: 1em; + border-bottom-width: 1em; + border-right-width: 1em; +} +.label[datalabeltype='live'] { + background-color: #e94a1b; + vertical-align: middle; + margin-top: -0.416666666666667em; +} +.label[datalabeltype='live']:before { + border-right-color: #e94a1b; +} +.label[datalabeltype='finished'] { + background-color: #8ab54e; + vertical-align: middle; + margin-top: -0.416666666666667em; +} +.label[datalabeltype='finished']:before { + border-right-color: #8ab54e; +} +.label[datalabeltype='progress'] { + background-color: #f0ab00; + vertical-align: middle; + margin-top: -0.416666666666667em; +} +.label[datalabeltype='progress']:before { + border-right-color: #f0ab00; +} +.label[datalabeltype='upcoming'] { + color: #333; + background-color: #eee; + vertical-align: middle; + margin-top: -0.416666666666667em; +} +.label[datalabeltype='upcoming']:before { + border-right-color: #eee; +} +.label[datalabeltype='new'], +.label[datalabeltype='updated'] { + background-color: #f0ab00; + text-transform: uppercase; + vertical-align: middle; +} +.label[datalabeltype='new']:before, +.label[datalabeltype='updated']:before { + border-right-color: #f0ab00; +} +.label[datalabeltype='ess'] { + background-color: #a71724; +} +.label[datalabeltype='ess']:before { + border-right-color: #a71724; +} +.label[datalabeltype='worldcup'] { + background-color: #c79242; +} +.label[datalabeltype='worldcup']:before { + border-right-color: #c79242; +} +.label[datalabeltype='bundesliga'] { + background-color: #005fa7; +} +.label[datalabeltype='bundesliga']:before { + border-right-color: #005fa7; +} +.morelink { + color: #008fcc; + text-transform: uppercase; + text-align: center; + font-size: 0.933333333333333em; + font-weight: 700; + padding: 1.866666666666667em; + display: block; + text-decoration: none; +} +.morelink:hover, +.morelink:focus { + text-decoration: underline; +} +.dummy { + font-size: 1rem; + min-height: 25em; + position: relative; +} +.dummy:after { + content: 'Dummy content'; + position: absolute; + top: 50%; + left: 50%; + font-weight: 700; + font-size: 6em; + color: #f7f7f7; + text-shadow: 1px 1px 0 #eee, 2px 2px 0 #eee, 3px 3px 0 #eee, 4px 4px 0 #eee, 5px 5px 0 #eee, 6px 6px 0 #eee, 7px 7px 0 #eee; + margin: -100px 0 0 -350px; +} +.mainsection { + padding-top: 5.333333333333333em; + padding-bottom: 5.333333333333333em; +} +.mainsection_header { + text-align: center; + margin-bottom: 3.666666666666667em; +} +.mainsection_header p { + margin-top: 0; + font-size: 1.2em; +} +.mainsection_header_title { + margin: 0; + font-size: 2.4em; + text-align: center; +} +.mainsection_navigation { + text-align: center; +} +.lightbox { + font-size: 1rem; +} +.lightbox_overlay { + display: none; + font-size: 1rem; + background: rgba(0,0,0,0.75); + width: 100%; + height: 100%; + position: fixed; + left: 0; + top: 0; + z-index: 10; + -webkit-transition: opacity 0.3s ease; + -moz-transition: opacity 0.3s ease; + transition: opacity 0.3s ease; +} +.lightbox_content { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + max-width: 90%; + max-height: 90%; + overflow: hidden; +} +.lightbox_close { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHVJREFUeNqsk4EJACEIReWawY2bMLh5LME7JNQEE4So/x9pCUTUVvaVuBKSieJpIAuOkYSgaDn6t/EmIdrMHtQHJ4g2/5pd4EFM8w7whK7ZAliQEZWWaVbY3AeqcbuEUhMj4fEZ8XTV6CNlzC7kyjCVxnkKMABEXRUAnXsRRQAAAABJRU5ErkJggg=="); + background-repeat: no-repeat; + background-position: center center; + width: 1.333333333333333em; + height: 0; + padding-top: 1.333333333333333em; + position: absolute; + top: 1.333333333333333em; + right: 1.333333333333333em; + cursor: pointer; + z-index: 2; +} +.stickyheader { + background: inherit; +} +.slideto { + background: inherit; + border-bottom: 0.266666666666667em solid transparent; +} +.slidetonav { + background: inherit; +} +.slidetoactive { + border-bottom-color: #f0ab00; + text-decoration: none; + color: #dedede; +} +.slidetoactive:hover, +.slidetoactive:focus { + border-bottom-color: #d89a00; +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/media.gss b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/media.gss new file mode 100644 index 00000000000..611ff15f214 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/media.gss @@ -0,0 +1,450 @@ +/** + * The grid styles + */ +.grid, +.stackenblochen { + display: block; + width: 100%; + max-width: 80rem; + list-style: none; + margin: 0 auto; + zoom: 1; +} +.grid:before, +.stackenblochen:before, +.grid:after, +.stackenblochen:after { + content: ""; + display: table; +} +.grid:after, +.stackenblochen:after { + clear: both; +} +.grid *, +.stackenblochen * { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.grid .grid, +.stackenblochen .grid, +.grid .stackenblochen, +.stackenblochen .stackenblochen { + width: auto; + max-width: none; + margin-left: -1rem; + margin-right: -1rem; +} +.column, +.columns { + float: left; + padding: 0 1rem; + position: relative; + width: 100%; +} +.column img, +.columns img { + max-width: 100%; + height: auto; + ms-interpolation-mode: bicubic; +} +.small1 { + width: 8.3333333333333%; +} +.small2 { + width: 16.6666666666667%; +} +.small3 { + width: 25%; +} +.small4 { + width: 33.3333333333333%; +} +.small5 { + width: 41.6666666666667%; +} +.small6 { + width: 50%; +} +.small7 { + width: 58.3333333333333%; +} +.small8 { + width: 66.6666666666667%; +} +.small9 { + width: 75%; +} +.small10 { + width: 83.3333333333333%; +} +.small11 { + width: 91.6666666666667%; +} +.small12 { + width: 100%; +} +.smalloffset0 { + margin-left: 0% !important; +} +.smalloffset1 { + margin-left: 8.3333333333333% !important; +} +.smalloffset2 { + margin-left: 16.6666666666667% !important; +} +.smalloffset3 { + margin-left: 25% !important; +} +.smalloffset4 { + margin-left: 33.3333333333333% !important; +} +.smalloffset5 { + margin-left: 41.6666666666667% !important; +} +.smalloffset6 { + margin-left: 50% !important; +} +.smalloffset7 { + margin-left: 58.3333333333333% !important; +} +.smalloffset8 { + margin-left: 66.6666666666667% !important; +} +.smalloffset9 { + margin-left: 75% !important; +} +.smalloffset10 { + margin-left: 83.3333333333333% !important; +} +.smalloffset11 { + margin-left: 91.6666666666667% !important; +} +.showonsmall { + display: inherit !important; +} +.hideonsmall { + display: none !important; +} +table.showonsmall { + display: table !important; +} +tr.showonsmall { + display: table-row !important; +} +td.showonsmall, +th.showonsmall { + display: table-cell !important; +} +.showonmedium { + display: none !important; +} +.hideonmedium { + display: inherit !important; +} +table.hideonmedium { + display: table !important; +} +tr.hideonmedium { + display: table-row !important; +} +td.hideonmedium, +th.hideonmedium { + display: table-cell !important; +} +.showonlarge { + display: none !important; +} +.hideonlarge { + display: inherit !important; +} +table.hideonlarge { + display: table !important; +} +tr.hideonlarge { + display: table-row !important; +} +td.hideonlarge, +th.hideonlarge { + display: table-cell !important; +} +.column.smallcentered, +.columns.smallcentered { + margin-left: auto; + margin-right: auto; + float: none; +} +.column.smalluncentered, +.columns.smalluncentered { + margin-left: 0; + margin-right: 0; + float: left !important; +} +@media (min-width: 45em) { + .medium1 { + width: 8.3333333333333%; + } + .medium2 { + width: 16.6666666666667%; + } + .medium3 { + width: 25%; + } + .medium4 { + width: 33.3333333333333%; + } + .medium5 { + width: 41.6666666666667%; + } + .medium6 { + width: 50%; + } + .medium7 { + width: 58.3333333333333%; + } + .medium8 { + width: 66.6666666666667%; + } + .medium9 { + width: 75%; + } + .medium10 { + width: 83.3333333333333%; + } + .medium11 { + width: 91.6666666666667%; + } + .medium12 { + width: 100%; + } + .mediumoffset0 { + margin-left: 0% !important; + } + .mediumoffset1 { + margin-left: 8.3333333333333% !important; + } + .mediumoffset2 { + margin-left: 16.6666666666667% !important; + } + .mediumoffset3 { + margin-left: 25% !important; + } + .mediumoffset4 { + margin-left: 33.3333333333333% !important; + } + .mediumoffset5 { + margin-left: 41.6666666666667% !important; + } + .mediumoffset6 { + margin-left: 50% !important; + } + .mediumoffset7 { + margin-left: 58.3333333333333% !important; + } + .mediumoffset8 { + margin-left: 66.6666666666667% !important; + } + .mediumoffset9 { + margin-left: 75% !important; + } + .mediumoffset10 { + margin-left: 83.3333333333333% !important; + } + .mediumoffset11 { + margin-left: 91.6666666666667% !important; + } + .showonsmall { + display: none !important; + } + .hideonsmall { + display: inherit !important; + } + table.hideonsmall { + display: table !important; + } + tr.hideonsmall { + display: table-row !important; + } + td.hideonsmall, + th.hideonsmall { + display: table-cell !important; + } + .showonmedium { + display: inherit !important; + } + .hideonmedium { + display: none !important; + } + table.showonmedium { + display: table !important; + } + tr.showonmedium { + display: table-row !important; + } + td.showonmedium, + th.showonmedium { + display: table-cell !important; + } + .showonlarge { + display: none !important; + } + .hideonlarge { + display: inherit !important; + } + table.hideonlarge { + display: table !important; + } + tr.hideonlarge { + display: table-row !important; + } + td.hideonlarge, + th.hideonlarge { + display: table-cell !important; + } + .column.mediumcentered, + .columns.mediumcentered { + margin-left: auto; + margin-right: auto; + float: none; + } + .column.mediumuncentered, + .columns.mediumuncentered { + margin-left: 0; + margin-right: 0; + float: left !important; + } +} +@media (min-width: 61em) { + .large1 { + width: 8.3333333333333%; + } + .large2 { + width: 16.6666666666667%; + } + .large3 { + width: 25%; + } + .large4 { + width: 33.3333333333333%; + } + .large5 { + width: 41.6666666666667%; + } + .large6 { + width: 50%; + } + .large7 { + width: 58.3333333333333%; + } + .large8 { + width: 66.6666666666667%; + } + .large9 { + width: 75%; + } + .large10 { + width: 83.3333333333333%; + } + .large11 { + width: 91.6666666666667%; + } + .large12 { + width: 100%; + } + .largeoffset0 { + margin-left: 0% !important; + } + .largeoffset1 { + margin-left: 8.3333333333333% !important; + } + .largeoffset2 { + margin-left: 16.6666666666667% !important; + } + .largeoffset3 { + margin-left: 25% !important; + } + .largeoffset4 { + margin-left: 33.3333333333333% !important; + } + .largeoffset5 { + margin-left: 41.6666666666667% !important; + } + .largeoffset6 { + margin-left: 50% !important; + } + .largeoffset7 { + margin-left: 58.3333333333333% !important; + } + .largeoffset8 { + margin-left: 66.6666666666667% !important; + } + .largeoffset9 { + margin-left: 75% !important; + } + .largeoffset10 { + margin-left: 83.3333333333333% !important; + } + .largeoffset11 { + margin-left: 91.6666666666667% !important; + } + .showonsmall { + display: none !important; + } + .hideonsmall { + display: inherit !important; + } + table.hideonsmall { + display: table !important; + } + tr.hideonsmall { + display: table-row !important; + } + td.hideonsmall, + th.hideonsmall { + display: table-cell !important; + } + .showonmedium { + display: none !important; + } + .hideonmedium { + display: inherit !important; + } + table.hideonmedium { + display: table !important; + } + tr.hideonmedium { + display: table-row !important; + } + td.hideonmedium, + th.hideonmedium { + display: table-cell !important; + } + .showonlarge { + display: inherit !important; + } + .hideonlarge { + display: none !important; + } + table.showonlarge { + display: table !important; + } + tr.showonlarge { + display: table-row !important; + } + td.showonlarge, + th.showonlarge { + display: table-cell !important; + } + .column.largecentered, + .columns.largecentered { + margin-left: auto; + margin-right: auto; + float: none; + } + .column.largeuncentered, + .columns.largeuncentered { + margin-left: 0; + margin-right: 0; + float: left !important; + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.java new file mode 100644 index 00000000000..bd6f890cc59 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.java @@ -0,0 +1,53 @@ +package com.sap.sse.gwt.theme.client.showcase; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiChild; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; + +public class ComponentShowCase extends Composite { + + private static ComponentShowCaseUiBinder uiBinder = GWT.create(ComponentShowCaseUiBinder.class); + + interface ComponentShowCaseUiBinder extends UiBinder { + } + + @UiField + DivElement componentNameUi; + + @UiField + SimplePanel componentDescriptionUi; + + @UiField + SimplePanel componentPanelUi; + + private String name; + + public ComponentShowCase() { + initWidget(uiBinder.createAndBindUi(this)); + } + + public void setName(String name) { + this.name = name; + componentNameUi.setInnerText(name); + } + + @UiChild + public void addDescription(Widget description) { + componentDescriptionUi.setWidget(description); + } + + @UiChild + public void addComponent(Widget w) { + componentPanelUi.setWidget(w); + } + + public String getName() { + return this.name; + } + +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml new file mode 100644 index 00000000000..cfad5712d50 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml @@ -0,0 +1,30 @@ + + + + .outerpanel { + margin: 20px; + } + .componentName { + font-size: 20px; + font-weight: bold; + magin-bottom: 10px; + + } + .componentDescription { + margin-bottom: 30px; + border-bottom: 3px solid black; + padding: 20px; + width: 100%; + + } + + +
+ + + + + +
+
\ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.java new file mode 100644 index 00000000000..7ab3fd01d6c --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.java @@ -0,0 +1,30 @@ +package com.sap.sse.gwt.theme.client.showcase; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; + +public class MainPage extends Composite { + + private static MainPageUiBinder uiBinder = GWT.create(MainPageUiBinder.class); + + interface MainPageUiBinder extends UiBinder { + } + + @UiField(provided = true) + SimplePanel contentUi; + + @UiField(provided = true) + ShowcaseStackLayoutPanel stackLayoutPanelUi; + + public MainPage() { + contentUi = new SimplePanel(); + stackLayoutPanelUi = new ShowcaseStackLayoutPanel(Unit.EM); + stackLayoutPanelUi.setTarget(contentUi); + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml new file mode 100644 index 00000000000..6a61941b82d --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml @@ -0,0 +1,33 @@ + + + + + + + Styleguide + + + tbd. + + + + + Components + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.java new file mode 100644 index 00000000000..d6407623138 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.java @@ -0,0 +1,50 @@ +package com.sap.sse.gwt.theme.client.showcase; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiChild; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.AcceptsOneWidget; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; + +public class Section extends Composite { + private static ShowCaseSectionUiBinder uiBinder = GWT.create(ShowCaseSectionUiBinder.class); + + interface ShowCaseSectionUiBinder extends UiBinder { + } + + private AcceptsOneWidget target; + + @UiField + FlowPanel panelUi; + + public Section() { + initWidget(uiBinder.createAndBindUi(this)); + } + + public void setTargetContentArea(AcceptsOneWidget target) { + this.target = target; + } + + @UiChild + public void addItem(final Widget widget, String name) { + SimplePanel p = new SimplePanel(); + Anchor showCaseItem = new Anchor(name); + p.setWidget(showCaseItem); + showCaseItem.addClickHandler(new ClickHandler() { + + @Override + public void onClick(ClickEvent event) { + target.setWidget(widget); + } + }); + + panelUi.add(p); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.ui.xml new file mode 100644 index 00000000000..7f8562acc98 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/Section.ui.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowcaseStackLayoutPanel.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowcaseStackLayoutPanel.java new file mode 100644 index 00000000000..4889e6aa5ec --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowcaseStackLayoutPanel.java @@ -0,0 +1,27 @@ +package com.sap.sse.gwt.theme.client.showcase; + +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.StackLayoutPanel; +import com.google.gwt.user.client.ui.Widget; + +public class ShowcaseStackLayoutPanel extends StackLayoutPanel { + private SimplePanel target; + + public ShowcaseStackLayoutPanel(Unit unit) { + super(unit); + } + + public void setTarget(SimplePanel target) { + this.target = target; + } + + @Override + public void add(Widget widget, String header, boolean asHtml, double headerSize) { + if (widget instanceof Section) { + Section section = (Section) widget; + section.setTargetContentArea(target); + } + super.add(widget, header, asHtml, headerSize); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java new file mode 100644 index 00000000000..a4b84a55a22 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java @@ -0,0 +1,131 @@ +package com.sap.sse.gwt.theme.client.showcase.recentevent; + +import java.util.Date; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.theme.client.component.recentevent.RecentEvent; +import com.sap.sse.gwt.theme.client.component.recentevent.RecentEventData; + +public class RecentEventShowcase extends Composite { + + private static RecentEventShowcaseUiBinder uiBinder = GWT.create(RecentEventShowcaseUiBinder.class); + + interface RecentEventShowcaseUiBinder extends UiBinder { + } + + @UiField(provided = true) + RecentEvent finishedItem; + + @UiField(provided = true) + RecentEvent liveItem; + + public RecentEventShowcase() { + finishedItem = new RecentEvent(new RecentEventData() { + + @Override + public boolean isLive() { + return false; + } + + @Override + public String getVenue() { + return "Venue1"; + } + + @Override + public String getLocation() { + return "Loc1"; + } + + @Override + public Date getEventStart() { + return new Date(); + } + + @Override + public String getEventName() { + return "SomeName"; + } + + @Override + public String getEventImageUrl() { + + return "http://demotivators.despair.com/demotivational/mistakesdemotivator.jpg"; + } + + @Override + public Date getEventEnd() { + return new Date(); + } + + @Override + public Command getCommand() { + return new Command() { + + @Override + public void execute() { + Window.alert("done"); + } + }; + } + }); + + liveItem = new RecentEvent(new RecentEventData() { + + @Override + public boolean isLive() { + return true; + } + + @Override + public String getVenue() { + return "Venue2"; + } + + @Override + public String getLocation() { + return "Loc2"; + } + + @Override + public Date getEventStart() { + return new Date(); + } + + @Override + public String getEventName() { + return "SomeName"; + } + + @Override + public String getEventImageUrl() { + + return "http://demotivators.despair.com/demotivational/mistakesdemotivator.jpg"; + } + + @Override + public Date getEventEnd() { + return new Date(); + } + + @Override + public Command getCommand() { + return new Command() { + + @Override + public void execute() { + Window.alert("done"); + } + }; + } + }); + + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml new file mode 100644 index 00000000000..0e292882202 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml @@ -0,0 +1,35 @@ + + + + .holder { + width: 400px; + display: block; + magin: 10px; + + } + + + + + This is a very cool recent event widget. +

Import: xmlns:ubi="urn:import:com.sap.sse.gwt.theme.client.sailing"

+
+
+ + +

FINISHED:

+
+ +
+ +

LIVE:

+
+ +
+
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.java new file mode 100644 index 00000000000..8e16cf7a833 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.java @@ -0,0 +1,25 @@ +package com.sap.sse.gwt.theme.client.showcase.sapheader; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.theme.client.component.sapheader.SAPHeader; + +public class SAPHeaderShowcase extends Composite { + + private static SAPHeaderShowcaseUiBinder uiBinder = GWT.create(SAPHeaderShowcaseUiBinder.class); + + interface SAPHeaderShowcaseUiBinder extends UiBinder { + } + + @UiField(provided = true) + SAPHeader sapHeader; + + public SAPHeaderShowcase() { + sapHeader = new SAPHeader("Sailing Analytics", "Demo page", false); + + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml new file mode 100644 index 00000000000..108308c4951 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml @@ -0,0 +1,29 @@ + + + + .holder { + width: 400px; + display: block; + magin: 10px; + + } + + + + + A simple header with SAP logo and title. +

Import: xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.sapheader"

+
+
+ + +
+ +
+
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html new file mode 100644 index 00000000000..5e580d7c2be --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html @@ -0,0 +1,24 @@ +
+
Typeface Open Sans
+
+
+
REGULAR
</> +
+
Grumpy wizards make toxic brew for the evil queen and jack.
+
Code und sooo
+
+
+
+
SEMIBOLD
</> +
+
Grumpy wizards make toxic brew for the evil queen and jack.
+
Code und sooo
+
+
+
+
BOLD
</> +
+
Grumpy wizards make toxic brew for the evil queen and jack.
+
Code und sooo
+
+
diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/util/FullscreenUtil.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/util/FullscreenUtil.java new file mode 100644 index 00000000000..27ff25bebd3 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/util/FullscreenUtil.java @@ -0,0 +1,27 @@ +package com.sap.sse.gwt.theme.client.util; + +/** + * A utility class to set the browser to fullscreen mode + * @author c5163874 (Frank) + * + */ +public class FullscreenUtil { + + public static void requestFullscreen() { + nativeRequestFullScreen(); + }; + + private static native void nativeRequestFullScreen() /*-{ + var element = $doc.documentElement; + if(element.requestFullscreen) { + element.requestFullscreen(); + } else if(element.mozRequestFullScreen) { + element.mozRequestFullScreen(); + } else if(element.webkitRequestFullscreen) { + element.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + } else if(element.msRequestFullscreen) { + element.msRequestFullscreen(); + } + }-*/; + +} From d172ed8e50ff806394cb51e127c29420709d7895 Mon Sep 17 00:00:00 2001 From: fmittag Date: Wed, 4 Feb 2015 18:28:44 +0100 Subject: [PATCH 02/15] added simple footer to component lib as sample --- java/com.sap.sse.gwt.theme/.classpath | 1 - java/com.sap.sse.gwt.theme/build.properties | 3 +- .../component/recentevent/RecentEvent.css | 47 ------- .../component/recentevent/RecentEvent.java | 69 --------- .../component/recentevent/RecentEvent.ui.xml | 22 --- .../recentevent/RecentEventData.java | 16 --- .../recentevent/RecentEventResources.java | 25 ---- .../recentevent/default_event_photo.jpg | Bin 28976 -> 0 bytes .../client/component/sapfooter/SAPFooter.gss | 55 ++++++++ .../client/component/sapfooter/SAPFooter.java | 68 +++++++++ .../component/sapfooter/SAPFooter.ui.xml | 33 +++++ .../sapfooter/SAPFooterResources.java | 21 +++ .../component/sapheader/SAPHeaderData.java | 5 - .../client/resources/i18n/TextMessages.java | 7 + .../resources/i18n/TextMessages.properties | 7 +- .../resources/i18n/TextMessages_de.properties | 8 +- .../gwt/theme/client/showcase/MainPage.ui.xml | 20 +-- .../recentevent/RecentEventShowcase.java | 131 ------------------ .../recentevent/RecentEventShowcase.ui.xml | 35 ----- .../showcase/sapfooter/SAPFooterShowcase.java | 25 ++++ .../sapfooter/SAPFooterShowcase.ui.xml | 26 ++++ .../sapheader/SAPHeaderShowcase.ui.xml | 13 +- 22 files changed, 264 insertions(+), 373 deletions(-) delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/default_event_photo.jpg create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.gss create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooterResources.java delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.ui.xml diff --git a/java/com.sap.sse.gwt.theme/.classpath b/java/com.sap.sse.gwt.theme/.classpath index b983a4da697..ffa9f4e615c 100644 --- a/java/com.sap.sse.gwt.theme/.classpath +++ b/java/com.sap.sse.gwt.theme/.classpath @@ -1,7 +1,6 @@ - diff --git a/java/com.sap.sse.gwt.theme/build.properties b/java/com.sap.sse.gwt.theme/build.properties index 95d385246a8..41365161d8b 100644 --- a/java/com.sap.sse.gwt.theme/build.properties +++ b/java/com.sap.sse.gwt.theme/build.properties @@ -1,5 +1,4 @@ -source.WEB-INF/classes/ = src/main/java,\ - src/main/resources +source.WEB-INF/classes/ = src/main/java output.WEB-INF/classes/ = bin bin.includes = META-INF/,\ WEB-INF/classes/,\ diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css deleted file mode 100644 index 519353979c9..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.css +++ /dev/null @@ -1,47 +0,0 @@ -.eventteasercontainer { - font-size: 1rem; - text-align: center; - width: 100%; - height: 24em; -} -.eventteaser { - font-size: 1rem; - display: inline-block; - margin-bottom: 3em; - text-align: left; - max-width: 100%; - width: 100%; -} -.eventteaser:hover { - text-decoration: none; -} -.eventteaser:hover .eventteaser_name { - text-decoration: underline; -} -.eventteaser:hover .eventteaser_image { - opacity: 0.9; -} -.eventteaser_image { - position: relative; - display: inline-block; - max-width: 100%; - width: 100%; - height: 240px; - background-position: center; - background-size: cover; - background-repeat: no-repeat; -} -.eventteaser_series { - position: absolute; - bottom: 0; - right: 0; -} -.eventteaser_name { - font-size: 1.466666666666667em; - font-weight: bold; - color: #008fcc; - margin-top: 0.333333333333333em; -} -.eventteaser_location { - color: #222; -} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java deleted file mode 100644 index b5fde43544c..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.sap.sse.gwt.theme.client.component.recentevent; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.DivElement; -import com.google.gwt.dom.client.SpanElement; -import com.google.gwt.dom.client.Style.Display; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Command; -import com.google.gwt.user.client.ui.Anchor; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; - -public class RecentEvent extends Composite { - - @UiField - SpanElement eventNameUi; - - @UiField - SpanElement venueNameUi; - - @UiField - SpanElement eventDateUi; - - @UiField - Anchor eventOverviewUi; - - @UiField - DivElement eventImageContainerUi; - - @UiField - DivElement isLiveUi; - - interface RecentEventUiBinder extends UiBinder { - } - - private static RecentEventUiBinder uiBinder = GWT.create(RecentEventUiBinder.class); - private Command eventClickAction; - - public RecentEvent(RecentEventData data) { - - this.eventClickAction = data.getCommand(); - RecentEventResources.INSTANCE.css().ensureInjected(); - initWidget(uiBinder.createAndBindUi(this)); - - eventNameUi.setInnerText(data.getEventName()); - venueNameUi.setInnerText(data.getVenue()); - eventDateUi.setInnerText(data.getEventStart().toString().substring(10) + " " - + data.getEventEnd().toString().substring(10)); - - final StringBuilder thumbnailUrlBuilder = new StringBuilder("url('").append(data.getEventImageUrl()).append( - "')"); - GWT.log(thumbnailUrlBuilder.toString()); - eventImageContainerUi.getStyle().setBackgroundImage(thumbnailUrlBuilder.toString()); - if (data.isLive()) - isLiveUi.getStyle().setDisplay(Display.BLOCK); - else - isLiveUi.getStyle().setDisplay(Display.NONE); - } - - @UiHandler("eventOverviewUi") - public void goToEventOverview(ClickEvent e) { - eventClickAction.execute(); - e.preventDefault(); - } - -} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml deleted file mode 100644 index 92b0202e911..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEvent.ui.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - -
- -
-
-
-
-
- ,  -
-
-
-
-
diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java deleted file mode 100644 index b3788eaab89..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventData.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sap.sse.gwt.theme.client.component.recentevent; - -import java.util.Date; - -import com.google.gwt.user.client.Command; - -public interface RecentEventData { - String getEventImageUrl(); - String getVenue(); - String getLocation(); - Date getEventStart(); - Date getEventEnd(); - Command getCommand(); - String getEventName(); - boolean isLive(); -} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java deleted file mode 100644 index 6d2229572a1..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/RecentEventResources.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sap.sse.gwt.theme.client.component.recentevent; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.resources.client.ClientBundle; -import com.google.gwt.resources.client.CssResource; -import com.google.gwt.resources.client.ImageResource; - -public interface RecentEventResources extends ClientBundle { - public static final RecentEventResources INSTANCE = GWT.create(RecentEventResources.class); - - @Source("RecentEvent.css") - LocalCss css(); - - public interface LocalCss extends CssResource { - String eventteaser(); - String eventteaser_name(); - String eventteaser_image(); - String eventteaser_series(); - String eventteaser_location(); - String eventteasercontainer(); - } - - @Source("default_event_photo.jpg") - ImageResource defaultEventPhotoImage(); -} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/default_event_photo.jpg b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/recentevent/default_event_photo.jpg deleted file mode 100644 index 03f41052084a0cb160d540dc85c7ab3f9459db39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28976 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 diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.gss b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.gss new file mode 100644 index 00000000000..05a39fd654a --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.gss @@ -0,0 +1,55 @@ +/** + * Website footer styling + */ +.sitefooter { + font-size: 1rem; + background: #333; + border-top: 5px solid #fff; + color: #fff; + line-height: 5em; + width: 100%; + padding: 0 1.333333333333333em; +} +.sitefooter_copyright { + font-weight: 600; + margin-right: 2em; +} +@media (min-width: 45em) { + .sitefooter_copyright { + float: left; + } +} +.sitefooter_links { + text-align: left; + font-size: 1em; + font-weight: 600; + text-transform: uppercase; +} +.sitefooter_links_link { + display: block; + color: #fff; + text-decoration: none; + margin-right: 2em; +} +.sitefooter_links_link:last-child { + margin-right: 0; +} +@media (min-width: 45em) { + .sitefooter_links_link { + display: inline-block; + } +} +.sitefooter_language { + text-align: left; +} +@media (min-width: 45em) { + .sitefooter_language { + text-align: right; + } +} +.sitefooter_language_link { + color: #f0ab00; + display: inline-block; + cursor: pointer; + margin-left: 0.666666666666667em; +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.java new file mode 100644 index 00000000000..88fc59bed9c --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.java @@ -0,0 +1,68 @@ +package com.sap.sse.gwt.theme.client.component.sapfooter; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.DivElement; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.http.client.UrlBuilder; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.Window.Location; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +public class SAPFooter extends Composite { + private static SAPFooterPanelUiBinder uiBinder = GWT.create(SAPFooterPanelUiBinder.class); + + interface SAPFooterPanelUiBinder extends UiBinder { + } + + @UiField Anchor changeLanguageLink; + @UiField DivElement languageSelectionDiv; + + private final Map localeAndLanguages; + + public SAPFooter() { + localeAndLanguages = new HashMap(); + localeAndLanguages.put("default", "English"); + localeAndLanguages.put("de", "Deutsch"); + + SAPFooterResources.INSTANCE.css().ensureInjected(); + + initWidget(uiBinder.createAndBindUi(this)); + + updateUI(); + } + + @UiHandler("changeLanguageLink") + public void changeLanguage(ClickEvent e) { + String selectedLanguage = changeLanguageLink.getText(); + String selectedLocale = null; + for (Entry entry: localeAndLanguages.entrySet()) { + if (entry.getValue().equals(selectedLanguage)) { + selectedLocale = entry.getKey(); + } + } + if(selectedLocale != null) { + UrlBuilder builder = Location.createUrlBuilder().setParameter("locale", selectedLocale); + Window.Location.replace(builder.buildString()); + } + } + + private void updateUI() { + LocaleInfo currentLocale = LocaleInfo.getCurrentLocale(); + HashMap languagesToSelectFrom = new HashMap(localeAndLanguages); + languagesToSelectFrom.remove(currentLocale.getLocaleName()); + + if(languagesToSelectFrom.size() == 1) { + changeLanguageLink.setText(languagesToSelectFrom.values().iterator().next()); + } + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.ui.xml new file mode 100644 index 00000000000..e91510e8856 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.ui.xml @@ -0,0 +1,33 @@ + + + + + + + + + + \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooterResources.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooterResources.java new file mode 100644 index 00000000000..0009fba40a4 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooterResources.java @@ -0,0 +1,21 @@ +package com.sap.sse.gwt.theme.client.component.sapfooter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface SAPFooterResources extends ClientBundle { + public static final SAPFooterResources INSTANCE = GWT.create(SAPFooterResources.class); + + @Source("com/sap/sse/gwt/theme/client/component/sapfooter/SAPFooter.gss") + LocalCss css(); + + public interface LocalCss extends CssResource { + String sitefooter(); + String sitefooter_copyright(); + String sitefooter_links(); + String sitefooter_links_link(); + String sitefooter_language(); + String sitefooter_language_link(); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java deleted file mode 100644 index 16804993bd9..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/sapheader/SAPHeaderData.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sap.sse.gwt.theme.client.component.sapheader; - -public interface SAPHeaderData { - -} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java index 3b9b9964efc..32cf93c7b04 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.java @@ -7,4 +7,11 @@ public interface TextMessages extends Messages { public static final TextMessages INSTANCE = GWT.create(TextMessages.class); String chooseALanguage(); + + String footerCopyright(); + String footerLanguage(); + String footerLegal(); + String footerPrivacy(); + String footerFeedback(); + } diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties index 3bb701bcae5..b5aa42979c2 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages.properties @@ -1 +1,6 @@ -chooseALanguage=Choose a language +chooseALanguage = Choose a language +footerCopyright = \u00A9 2014 SAP Sailing Analytics +footerFeedback = Feedback +footerLanguage = SAP Sailing offered in +footerLegal = Legal Disclosure +footerPrivacy = Privacy diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties index c638bf7471d..6b3cbc592e8 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/resources/i18n/TextMessages_de.properties @@ -1 +1,7 @@ -chooseALanguage=Wähle eine Sprache +chooseALanguage = W\u00E4hle eine Sprache +footerCopyright = \u00A9 2014 SAP Sailing Analytics +footerFeedback = Feedback +footerLanguage = SAP Sailing in +footerLegal = Impressum +footerPrivacy = Datenschutz + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml index 6a61941b82d..f14b9af839d 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml @@ -5,22 +5,22 @@ - - Styleguide - - - tbd. - - - Components - - + + + + + + + Styleguide + + + tbd. diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java deleted file mode 100644 index a4b84a55a22..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.sap.sse.gwt.theme.client.showcase.recentevent; - -import java.util.Date; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.user.client.Command; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sse.gwt.theme.client.component.recentevent.RecentEvent; -import com.sap.sse.gwt.theme.client.component.recentevent.RecentEventData; - -public class RecentEventShowcase extends Composite { - - private static RecentEventShowcaseUiBinder uiBinder = GWT.create(RecentEventShowcaseUiBinder.class); - - interface RecentEventShowcaseUiBinder extends UiBinder { - } - - @UiField(provided = true) - RecentEvent finishedItem; - - @UiField(provided = true) - RecentEvent liveItem; - - public RecentEventShowcase() { - finishedItem = new RecentEvent(new RecentEventData() { - - @Override - public boolean isLive() { - return false; - } - - @Override - public String getVenue() { - return "Venue1"; - } - - @Override - public String getLocation() { - return "Loc1"; - } - - @Override - public Date getEventStart() { - return new Date(); - } - - @Override - public String getEventName() { - return "SomeName"; - } - - @Override - public String getEventImageUrl() { - - return "http://demotivators.despair.com/demotivational/mistakesdemotivator.jpg"; - } - - @Override - public Date getEventEnd() { - return new Date(); - } - - @Override - public Command getCommand() { - return new Command() { - - @Override - public void execute() { - Window.alert("done"); - } - }; - } - }); - - liveItem = new RecentEvent(new RecentEventData() { - - @Override - public boolean isLive() { - return true; - } - - @Override - public String getVenue() { - return "Venue2"; - } - - @Override - public String getLocation() { - return "Loc2"; - } - - @Override - public Date getEventStart() { - return new Date(); - } - - @Override - public String getEventName() { - return "SomeName"; - } - - @Override - public String getEventImageUrl() { - - return "http://demotivators.despair.com/demotivational/mistakesdemotivator.jpg"; - } - - @Override - public Date getEventEnd() { - return new Date(); - } - - @Override - public Command getCommand() { - return new Command() { - - @Override - public void execute() { - Window.alert("done"); - } - }; - } - }); - - initWidget(uiBinder.createAndBindUi(this)); - } -} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml deleted file mode 100644 index 0e292882202..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/recentevent/RecentEventShowcase.ui.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - .holder { - width: 400px; - display: block; - magin: 10px; - - } - - - - - This is a very cool recent event widget. -

Import: xmlns:ubi="urn:import:com.sap.sse.gwt.theme.client.sailing"

-
-
- - -

FINISHED:

-
- -
- -

LIVE:

-
- -
-
-
-
-
\ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.java new file mode 100644 index 00000000000..3d4f769b33b --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.java @@ -0,0 +1,25 @@ +package com.sap.sse.gwt.theme.client.showcase.sapfooter; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.theme.client.component.sapfooter.SAPFooter; + +public class SAPFooterShowcase extends Composite { + + private static SAPHeaderShowcaseUiBinder uiBinder = GWT.create(SAPHeaderShowcaseUiBinder.class); + + interface SAPHeaderShowcaseUiBinder extends UiBinder { + } + + @UiField(provided = true) + SAPFooter sapFooter; + + public SAPFooterShowcase() { + sapFooter = new SAPFooter(); + + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.ui.xml new file mode 100644 index 00000000000..fd55cb46f05 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.ui.xml @@ -0,0 +1,26 @@ + + + + .showcase_content { + width: 100%; + display: block; + margin: 10px; + } + + + + + A SAP footer. +

Import: xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.sapfooter"

+
+
+ + + + + +
+
\ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml index 108308c4951..cd72d089a03 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml @@ -4,11 +4,10 @@ xmlns:ux="urn:import:com.sap.sse.gwt.theme.client.showcase" xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.sapheader"> - .holder { - width: 400px; + .showcase_content { + width: 100%; display: block; - magin: 10px; - + margin: 10px; } @@ -19,10 +18,8 @@ - -
- -
+ +
From 696165574f960ed6fd939bee944cbb5c59dfdddf Mon Sep 17 00:00:00 2001 From: fmittag Date: Thu, 5 Feb 2015 14:42:33 +0100 Subject: [PATCH 03/15] implemented sample styleguide (Typeface) --- .../client/showcase/ComponentShowCase.ui.xml | 1 - .../gwt/theme/client/showcase/MainPage.ui.xml | 6 +- .../client/showcase/ShowCaseResources.java | 31 ++++++++ .../SAPFooterShowcase.java | 2 +- .../SAPFooterShowcase.ui.xml | 12 +-- .../SAPHeaderShowcase.java | 2 +- .../SAPHeaderShowcase.ui.xml | 12 +-- .../gwt/theme/client/showcase/showcase.gss | 78 +++++++++++++++++++ .../AbstractStyleguideComposite.java | 13 ++++ .../styleguide/TypefaceStyleguide.java | 19 +++++ .../styleguide/TypefaceStyleguide.ui.xml | 44 +++++++++++ .../client/styleguide/typeface/typeface.html | 24 ------ 12 files changed, 196 insertions(+), 48 deletions(-) create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowCaseResources.java rename java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/{sapfooter => components}/SAPFooterShowcase.java (92%) rename java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/{sapfooter => components}/SAPFooterShowcase.ui.xml (77%) rename java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/{sapheader => components}/SAPHeaderShowcase.java (93%) rename java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/{sapheader => components}/SAPHeaderShowcase.ui.xml (78%) create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/showcase.gss create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/AbstractStyleguideComposite.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.ui.xml delete mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml index cfad5712d50..eeabbc8f25d 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ComponentShowCase.ui.xml @@ -25,6 +25,5 @@ - \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml index f14b9af839d..794aff49f7e 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml @@ -9,10 +9,10 @@ Components - + - + @@ -20,7 +20,7 @@ Styleguide - tbd. + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowCaseResources.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowCaseResources.java new file mode 100644 index 00000000000..2147603cd48 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/ShowCaseResources.java @@ -0,0 +1,31 @@ +package com.sap.sse.gwt.theme.client.showcase; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface ShowCaseResources extends ClientBundle { + public static final ShowCaseResources INSTANCE = GWT.create(ShowCaseResources.class); + + @Source("showcase.gss") + ShowcaseCss css(); + + public interface ShowcaseCss extends CssResource{ + String showcaseHeader(); + String showcaseContent(); + String styleGuideHeader(); + String styleGuideContent(); + + String styleGuideRow(); + String styleGuideRowDescription(); + String styleGuideRowDescriptionTitle(); + String styleGuideRowContent(); + String styleGuideRowCode(); + String styleGuideRowDescription_codeLink(); + + // TODO: these style should come from the main.css + String styleGuideDetailsTypeface_semibold(); + String styleGuideDetailsTypeface_bold(); + String styleGuideDetailsTypeface_regular(); + } +} \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPFooterShowcase.java similarity index 92% rename from java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.java rename to java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPFooterShowcase.java index 3d4f769b33b..7b570db82ce 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.java +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPFooterShowcase.java @@ -1,4 +1,4 @@ -package com.sap.sse.gwt.theme.client.showcase.sapfooter; +package com.sap.sse.gwt.theme.client.showcase.components; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPFooterShowcase.ui.xml similarity index 77% rename from java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.ui.xml rename to java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPFooterShowcase.ui.xml index fd55cb46f05..2b993681cc1 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapfooter/SAPFooterShowcase.ui.xml +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPFooterShowcase.ui.xml @@ -3,22 +3,16 @@ xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:ux="urn:import:com.sap.sse.gwt.theme.client.showcase" xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.sapfooter"> - - .showcase_content { - width: 100%; - display: block; - margin: 10px; - } - + - + A SAP footer.

Import: xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.sapfooter"

- + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPHeaderShowcase.java similarity index 93% rename from java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.java rename to java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPHeaderShowcase.java index 8e16cf7a833..aa07434270e 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.java +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPHeaderShowcase.java @@ -1,4 +1,4 @@ -package com.sap.sse.gwt.theme.client.showcase.sapheader; +package com.sap.sse.gwt.theme.client.showcase.components; import com.google.gwt.core.client.GWT; import com.google.gwt.uibinder.client.UiBinder; diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPHeaderShowcase.ui.xml similarity index 78% rename from java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml rename to java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPHeaderShowcase.ui.xml index cd72d089a03..ccf44dc116c 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/sapheader/SAPHeaderShowcase.ui.xml +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/SAPHeaderShowcase.ui.xml @@ -3,22 +3,16 @@ xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:ux="urn:import:com.sap.sse.gwt.theme.client.showcase" xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.sapheader"> - - .showcase_content { - width: 100%; - display: block; - margin: 10px; - } - + - + A simple header with SAP logo and title.

Import: xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.sapheader"

- + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/showcase.gss b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/showcase.gss new file mode 100644 index 00000000000..1a9a5c4b88e --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/showcase.gss @@ -0,0 +1,78 @@ +.showcaseHeader { + width: 100%; + display: block; + margin: 5px; +} + +.showcaseContent { + width: 100%; + display: block; + margin: 5px; +} + +.styleGuideHeader { + width: 100%; + display: block; + margin: 5px; +} + +.styleGuideContent { + width: 100%; + display: block; + margin: 5px; +} + +.styleGuideRow { + clear: both; + margin-top: 50px; + overflow: hidden; +} + +.styleGuideRowDescription { + float: left; + font-weight: 700; +} + +.styleGuideRowDescriptionTitle { + float: left; +} + +.styleGuideRowContent { + float: left; +} + +.styleGuideRowCode { + background-color: #EEEEEE; + border: 1px solid #CCCCCC; + display: none; + float: left; + font-family: "Lucida Console",Monaco,"Courier New",Courier,monospace; + margin-top: 20px; + padding: 20px 10px; +} + +.styleGuideRowDescription_codeLink { + color: #999999; + display: none; + float: right; + font-family: monospace; + font-size: 12px; + font-weight: 400; + line-height: 23px; + margin-right: 25px; +} + +.styleGuideDetailsTypeface_semibold { + font-size: 22px; + font-weight: 600; +} + +.styleGuideDetailsTypeface_regular { + font-size: 22px; +} + +.styleGuideDetailsTypeface_bold { + font-size: 22px; + font-weight: 700; +} + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/AbstractStyleguideComposite.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/AbstractStyleguideComposite.java new file mode 100644 index 00000000000..45919a4a389 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/AbstractStyleguideComposite.java @@ -0,0 +1,13 @@ +package com.sap.sse.gwt.theme.client.showcase.styleguide; + +import com.google.gwt.user.client.ui.Composite; +import com.sap.sse.gwt.theme.client.resources.ThemeResources; +import com.sap.sse.gwt.theme.client.showcase.ShowCaseResources; + +public class AbstractStyleguideComposite extends Composite { + public AbstractStyleguideComposite() { + ThemeResources.INSTANCE.mediaCss().ensureInjected(); + ThemeResources.INSTANCE.mainCss().ensureInjected(); + ShowCaseResources.INSTANCE.css().ensureInjected(); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.java new file mode 100644 index 00000000000..f6162d6643f --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.java @@ -0,0 +1,19 @@ +package com.sap.sse.gwt.theme.client.showcase.styleguide; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.ui.Widget; + +public class TypefaceStyleguide extends AbstractStyleguideComposite { + + private static TypefaceStyleguideUiBinder uiBinder = GWT.create(TypefaceStyleguideUiBinder.class); + + interface TypefaceStyleguideUiBinder extends UiBinder { + } + + public TypefaceStyleguide() { + super(); + + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.ui.xml new file mode 100644 index 00000000000..64479c7583c --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/styleguide/TypefaceStyleguide.ui.xml @@ -0,0 +1,44 @@ + + + + + + + + Typeface styleguide + + + + +
+
+
+
REGULAR
+ </> +
+
Grumpy wizards make toxic brew for the evil queen and jack.
+
Code und sooo
+
+
+
+
SEMIBOLD
+ </> +
+
Grumpy wizards make toxic brew for the evil queen and jack.
+
Code und sooo
+
+
+
+
BOLD
+ </> +
+
Grumpy wizards make toxic brew for the evil queen and jack.
+
Code und sooo
+
+
+
+
+
+
\ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html deleted file mode 100644 index 5e580d7c2be..00000000000 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/styleguide/typeface/typeface.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
Typeface Open Sans
-
-
-
REGULAR
</> -
-
Grumpy wizards make toxic brew for the evil queen and jack.
-
Code und sooo
-
-
-
-
SEMIBOLD
</> -
-
Grumpy wizards make toxic brew for the evil queen and jack.
-
Code und sooo
-
-
-
-
BOLD
</> -
-
Grumpy wizards make toxic brew for the evil queen and jack.
-
Code und sooo
-
-
From ff2f66fa330cd3a5a72e618b4485e09c29ad2875 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 9 Feb 2015 12:31:59 +0100 Subject: [PATCH 04/15] added welcome file to web.xml --- java/com.sap.sse.gwt.theme/WEB-INF/web.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/com.sap.sse.gwt.theme/WEB-INF/web.xml b/java/com.sap.sse.gwt.theme/WEB-INF/web.xml index 7afb56e6574..af72bde0bba 100644 --- a/java/com.sap.sse.gwt.theme/WEB-INF/web.xml +++ b/java/com.sap.sse.gwt.theme/WEB-INF/web.xml @@ -19,4 +19,7 @@ + + SSETheme.html + From 9417921af8c2fba0197a46d23e79bd70bd7327dd Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 9 Feb 2015 16:48:43 +0100 Subject: [PATCH 05/15] added an unstyled loading indicator component --- .../loadingindicator/LoadingIndicator.css | 2 ++ .../loadingindicator/LoadingIndicator.java | 19 +++++++++++++++ .../loadingindicator/LoadingIndicator.ui.xml | 9 ++++++++ .../LoadingIndicatorResources.java | 16 +++++++++++++ .../gwt/theme/client/showcase/MainPage.ui.xml | 3 +++ .../components/LoadingIndicatorShowcase.java | 23 +++++++++++++++++++ .../LoadingIndicatorShowcase.ui.xml | 20 ++++++++++++++++ 7 files changed, 92 insertions(+) create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.css create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.ui.xml create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicatorResources.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.java create mode 100644 java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.ui.xml diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.css b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.css new file mode 100644 index 00000000000..3251d4bb461 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.css @@ -0,0 +1,2 @@ +.loadingIndicator { +} \ No newline at end of file diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.java new file mode 100644 index 00000000000..f385113684f --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.java @@ -0,0 +1,19 @@ +package com.sap.sse.gwt.theme.client.component.loadingindicator; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; + +public class LoadingIndicator extends Composite { + private static LoadingIndicatorUiBinder uiBinder = GWT.create(LoadingIndicatorUiBinder.class); + + interface LoadingIndicatorUiBinder extends UiBinder { + } + + public LoadingIndicator() { + LoadingIndicatorResources.INSTANCE.css().ensureInjected(); + + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.ui.xml new file mode 100644 index 00000000000..506bb27b6de --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicator.ui.xml @@ -0,0 +1,9 @@ + + + + + + Loading... + + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicatorResources.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicatorResources.java new file mode 100644 index 00000000000..683743fdc7d --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/component/loadingindicator/LoadingIndicatorResources.java @@ -0,0 +1,16 @@ +package com.sap.sse.gwt.theme.client.component.loadingindicator; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public interface LoadingIndicatorResources extends ClientBundle { + public static final LoadingIndicatorResources INSTANCE = GWT.create(LoadingIndicatorResources.class); + + @Source("LoadingIndicator.css") + LocalCss css(); + + public interface LocalCss extends CssResource { + String loadingIndicator(); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml index 794aff49f7e..bd21ccd17ee 100644 --- a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/MainPage.ui.xml @@ -14,6 +14,9 @@ + + + diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.java b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.java new file mode 100644 index 00000000000..dcd61d485e6 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.java @@ -0,0 +1,23 @@ +package com.sap.sse.gwt.theme.client.showcase.components; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sse.gwt.theme.client.component.loadingindicator.LoadingIndicator; + +public class LoadingIndicatorShowcase extends Composite { + + private static LoadingIndicatorShowcaseUiBinder uiBinder = GWT.create(LoadingIndicatorShowcaseUiBinder.class); + + interface LoadingIndicatorShowcaseUiBinder extends UiBinder { + } + + @UiField + LoadingIndicator loadingIndicator; + + public LoadingIndicatorShowcase() { + initWidget(uiBinder.createAndBindUi(this)); + } +} diff --git a/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.ui.xml b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.ui.xml new file mode 100644 index 00000000000..ee194856838 --- /dev/null +++ b/java/com.sap.sse.gwt.theme/src/main/java/com/sap/sse/gwt/theme/client/showcase/components/LoadingIndicatorShowcase.ui.xml @@ -0,0 +1,20 @@ + + + + + + + A Loading indicator. +

Import: xmlns:sap="urn:import:com.sap.sse.gwt.theme.client.component.loadingindicator"

+
+
+ + + + + +
+
\ No newline at end of file From ce87cf97ca29a81ab6bcfcc79afb24539f47e362 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 9 Feb 2015 18:10:36 +0100 Subject: [PATCH 06/15] removed warSourceDirectory from pom.xml --- java/com.sap.sse.gwt.theme/pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/com.sap.sse.gwt.theme/pom.xml b/java/com.sap.sse.gwt.theme/pom.xml index b426d91ca1a..3770ea11724 100644 --- a/java/com.sap.sse.gwt.theme/pom.xml +++ b/java/com.sap.sse.gwt.theme/pom.xml @@ -67,8 +67,6 @@ ${basedir}/.generated 7 ${basedir} - ${basedir}/src/main/resources - compile From daa3c680513ea0fb25318735298f3b986745d037 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 9 Feb 2015 18:10:59 +0100 Subject: [PATCH 07/15] added theme project to main pom.xml --- java/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/java/pom.xml b/java/pom.xml index 94d1f27c721..ffb0963fe6a 100755 --- a/java/pom.xml +++ b/java/pom.xml @@ -36,6 +36,7 @@ com.sap.sse.common.test com.sap.sse.filestorage com.sap.sse.filestorage.test + com.sap.sse.gwt.theme com.sap.sailing.domain.common com.sap.sailing.domain.shared.android com.sap.sailing.domain From c477d0ed1e78659d9ec96a2f076329458f10d837 Mon Sep 17 00:00:00 2001 From: fmittag Date: Tue, 10 Feb 2015 10:30:49 +0100 Subject: [PATCH 08/15] fixed gw module name in pom.xml of theme bundle --- java/com.sap.sse.gwt.theme/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com.sap.sse.gwt.theme/pom.xml b/java/com.sap.sse.gwt.theme/pom.xml index 3770ea11724..eb3460c70c9 100644 --- a/java/com.sap.sse.gwt.theme/pom.xml +++ b/java/com.sap.sse.gwt.theme/pom.xml @@ -62,7 +62,7 @@ -Dgwt.persistentunitcache=false - com.sap.sse.gwt.theme.Theme + com.sap.sse.gwt.theme.SSETheme ${basedir}/.generated 7 From 746a92d886301fb83297ce159964f33d58a1d433 Mon Sep 17 00:00:00 2001 From: fmittag Date: Thu, 12 Feb 2015 13:09:51 +0100 Subject: [PATCH 09/15] added again com.sap.sse.gwt.theme to main pom.xml after master merge --- java/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/java/pom.xml b/java/pom.xml index db2fd02e399..62f570dfaf8 100755 --- a/java/pom.xml +++ b/java/pom.xml @@ -28,6 +28,7 @@ com.sap.sse.operationaltransformation com.sap.sse.replication com.sap.sse.filestorage + com.sap.sse.gwt.theme com.sap.sailing.domain.common com.sap.sailing.domain.shared.android com.sap.sailing.domain From 648d9fd2da4ece74255e10f46b25002acbfcca94 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 16 Feb 2015 12:14:43 +0100 Subject: [PATCH 10/15] moved some code to a RaceStateSerializer --- .../impl/EventRaceStatesJsonGetServlet.java | 55 ++------------- .../gateway/jaxrs/api/EventsResource.java | 4 +- .../jaxrs/api/RaceStateSerializer.java | 68 +++++++++++++++++++ 3 files changed, 75 insertions(+), 52 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java index e769a35ed4e..402417da056 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java @@ -17,21 +17,17 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastFlagsFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; -import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; -import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; -import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; -import com.sap.sailing.domain.common.RaceIdentifier; -import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.racelog.RaceStateOfSameDayHelper; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; +import com.sap.sailing.server.gateway.jaxrs.api.RaceStateSerializer; import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util.Pair; public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { private static final long serialVersionUID = -4820965681871902242L; @@ -79,6 +75,7 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { result.put(FIELD_EVENT_ID, event.getId().toString()); JSONArray raceStatesLogEntriesJson = new JSONArray(); result.put(FIELD_RACE_STATES, raceStatesLogEntriesJson); + RaceStateSerializer raceStateSerializer = new RaceStateSerializer(); for (CourseArea courseArea : event.getVenue().getCourseAreas()) { if(filterByCourseAreaParam == null || courseArea.getName().equals(filterByCourseAreaParam)) { for (Leaderboard leaderboard : getService().getLeaderboards().values()) { @@ -89,7 +86,7 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { if(!filterByDayOffset || isRaceStateOfSameDay(raceColumn, fleet, dayToCheck)) { - JSONObject raceStateJson = createRaceStateJsonObject(raceColumn, fleet); + JSONObject raceStateJson = raceStateSerializer.serialize(new Pair(raceColumn, fleet)); raceStateJson.put("courseAreaName", courseArea.getName()); raceStateJson.put("leaderboardName", leaderboardName); raceStateJson.put("leaderboardDisplayName", leaderboardDisplayName); @@ -122,50 +119,6 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { return result; } - private JSONObject createRaceStateJsonObject(RaceColumn raceColumn, Fleet fleet) { - JSONObject result = new JSONObject(); - result.put("raceName", raceColumn.getName()); - result.put("fleetName", fleet.getName()); - RaceIdentifier raceIdentifier = raceColumn.getRaceIdentifier(fleet); - result.put("trackedRaceName", raceIdentifier != null ? raceIdentifier.getRaceName() : null); - result.put("trackedRaceId", raceIdentifier != null ? raceIdentifier.toString() : null); - RaceLog raceLog = raceColumn.getRaceLog(fleet); - if (raceLog != null && !raceLog.isEmpty()) { - ReadonlyRaceState state = ReadonlyRaceStateImpl.create(raceLog); - RaceLogRaceStatus status = state.getStatus(); - TimePoint startTime = state.getStartTime(); - TimePoint finishedTime = state.getFinishedTime(); - JSONObject raceLogStateJson = new JSONObject(); - result.put("raceState", raceLogStateJson); - raceLogStateJson.put("startTime", startTime != null ? startTime.toString() : null); - raceLogStateJson.put("endTime", finishedTime != null ? finishedTime.toString() : null); - raceLogStateJson.put("lastStatus", status.name()); - ReadonlyGateStartRacingProcedure procedure = state.getTypedReadonlyRacingProcedure(ReadonlyGateStartRacingProcedure.class); - if (procedure != null) { - raceLogStateJson.put("pathfinderId", procedure.getPathfinder()); - raceLogStateJson.put("gateLineOpeningTime", procedure.getGateLaunchStopTime()); - } - AbortingFlagFinder abortingFlagFinder = new AbortingFlagFinder(raceLog); - RaceLogFlagEvent abortingFlagEvent = abortingFlagFinder.analyze(); - LastFlagsFinder lastFlagFinder = new LastFlagsFinder(raceLog); - RaceLogFlagEvent lastFlagEvent = LastFlagsFinder.getMostRecent(lastFlagFinder.analyze()); - if (lastFlagEvent != null) { - setLastFlagField(raceLogStateJson, lastFlagEvent.getUpperFlag().name(), lastFlagEvent.getLowerFlag().name(), lastFlagEvent.isDisplayed()); - } else if (status.equals(RaceLogRaceStatus.UNSCHEDULED) && abortingFlagEvent != null) { - setLastFlagField(raceLogStateJson, abortingFlagEvent.getUpperFlag().name(), abortingFlagEvent.getLowerFlag().name(), abortingFlagEvent.isDisplayed()); - } else { - setLastFlagField(raceLogStateJson, null, null, null); - } - } - return result; - } - - private void setLastFlagField(JSONObject raceLogStateJson, String upperFlagName, String lowerFlagName, Boolean isDisplayed) { - raceLogStateJson.put("lastUpperFlag", upperFlagName); - raceLogStateJson.put("lastLowerFlag", lowerFlagName); - raceLogStateJson.put("displayed", isDisplayed); - } - /** * Tries to convert the given identifier to a UUID. When the identifier is not a UUID, null is returned. * @param identifierToConvert the identifier as a String diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java index ce7a2f336a9..57fce1587d5 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java @@ -6,6 +6,7 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; @@ -71,7 +72,8 @@ public class EventsResource extends AbstractSailingServerResource { @GET @Produces("application/json;charset=UTF-8") @Path("{eventId}/racestates") - public Response getRaceStates(@PathParam("eventId") String eventId) { + public Response getRaceStates(@PathParam("eventId") String eventId, @QueryParam("filterByLeaderboard") String filterByLeaderboard, + @QueryParam("filterByCourseArea") String filterByCourseArea, @QueryParam("filterByDayOffset") String filterByDayOffset) { return Response.noContent().build(); } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java new file mode 100644 index 00000000000..803886e34ad --- /dev/null +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java @@ -0,0 +1,68 @@ +package com.sap.sailing.server.gateway.jaxrs.api; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.abstractlog.race.RaceLog; +import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastFlagsFinder; +import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; +import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; +import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.common.RaceIdentifier; +import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util.Pair; + +public class RaceStateSerializer implements JsonSerializer> { + @Override + public JSONObject serialize(Pair raceColumnAndFleet) { + RaceColumn raceColumn = raceColumnAndFleet.getA(); + Fleet fleet = raceColumnAndFleet.getB(); + + JSONObject result = new JSONObject(); + result.put("raceName", raceColumn.getName()); + result.put("fleetName", fleet.getName()); + RaceIdentifier raceIdentifier = raceColumn.getRaceIdentifier(fleet); + result.put("trackedRaceName", raceIdentifier != null ? raceIdentifier.getRaceName() : null); + result.put("trackedRaceId", raceIdentifier != null ? raceIdentifier.toString() : null); + RaceLog raceLog = raceColumn.getRaceLog(fleet); + if (raceLog != null && !raceLog.isEmpty()) { + ReadonlyRaceState state = ReadonlyRaceStateImpl.create(raceLog); + RaceLogRaceStatus status = state.getStatus(); + TimePoint startTime = state.getStartTime(); + TimePoint finishedTime = state.getFinishedTime(); + JSONObject raceLogStateJson = new JSONObject(); + result.put("raceState", raceLogStateJson); + raceLogStateJson.put("startTime", startTime != null ? startTime.toString() : null); + raceLogStateJson.put("endTime", finishedTime != null ? finishedTime.toString() : null); + raceLogStateJson.put("lastStatus", status.name()); + ReadonlyGateStartRacingProcedure procedure = state.getTypedReadonlyRacingProcedure(ReadonlyGateStartRacingProcedure.class); + if (procedure != null) { + raceLogStateJson.put("pathfinderId", procedure.getPathfinder()); + raceLogStateJson.put("gateLineOpeningTime", procedure.getGateLaunchStopTime()); + } + AbortingFlagFinder abortingFlagFinder = new AbortingFlagFinder(raceLog); + RaceLogFlagEvent abortingFlagEvent = abortingFlagFinder.analyze(); + LastFlagsFinder lastFlagFinder = new LastFlagsFinder(raceLog); + RaceLogFlagEvent lastFlagEvent = LastFlagsFinder.getMostRecent(lastFlagFinder.analyze()); + if (lastFlagEvent != null) { + setLastFlagField(raceLogStateJson, lastFlagEvent.getUpperFlag().name(), lastFlagEvent.getLowerFlag().name(), lastFlagEvent.isDisplayed()); + } else if (status.equals(RaceLogRaceStatus.UNSCHEDULED) && abortingFlagEvent != null) { + setLastFlagField(raceLogStateJson, abortingFlagEvent.getUpperFlag().name(), abortingFlagEvent.getLowerFlag().name(), abortingFlagEvent.isDisplayed()); + } else { + setLastFlagField(raceLogStateJson, null, null, null); + } + } + return result; + } + + private void setLastFlagField(JSONObject raceLogStateJson, String upperFlagName, String lowerFlagName, Boolean isDisplayed) { + raceLogStateJson.put("lastUpperFlag", upperFlagName); + raceLogStateJson.put("lastLowerFlag", lowerFlagName); + raceLogStateJson.put("displayed", isDisplayed); + } +} From ea1b6e3dcf7186e2e0b7603ea46510aa56ee2959 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 16 Feb 2015 12:24:37 +0100 Subject: [PATCH 11/15] moved some more code to RaceStateSerializer --- .../impl/EventRaceStatesJsonGetServlet.java | 26 +++---------------- .../jaxrs/api/RaceStateSerializer.java | 22 ++++++++++++++++ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java index 402417da056..7eb8508c592 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java @@ -13,20 +13,13 @@ import javax.servlet.http.HttpServletResponse; import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import com.sap.sailing.domain.abstractlog.race.RaceLog; -import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; -import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.racelog.RaceStateOfSameDayHelper; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; import com.sap.sailing.server.gateway.jaxrs.api.RaceStateSerializer; -import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util.Pair; public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { @@ -85,8 +78,9 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { String leaderboardDisplayName = leaderboard.getDisplayName(); for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { for (Fleet fleet : raceColumn.getFleets()) { - if(!filterByDayOffset || isRaceStateOfSameDay(raceColumn, fleet, dayToCheck)) { - JSONObject raceStateJson = raceStateSerializer.serialize(new Pair(raceColumn, fleet)); + Pair raceColumnAndFleet = new Pair(raceColumn, fleet); + if(!filterByDayOffset || raceStateSerializer.isRaceStateOfSameDay(raceColumnAndFleet, dayToCheck)) { + JSONObject raceStateJson = raceStateSerializer.serialize(raceColumnAndFleet); raceStateJson.put("courseAreaName", courseArea.getName()); raceStateJson.put("leaderboardName", leaderboardName); raceStateJson.put("leaderboardDisplayName", leaderboardDisplayName); @@ -105,20 +99,6 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { } } - private boolean isRaceStateOfSameDay(RaceColumn raceColumn, Fleet fleet, Calendar now) { - boolean result = false; - RaceLog raceLog = raceColumn.getRaceLog(fleet); - if (raceLog != null && !raceLog.isEmpty()) { - TimePoint startTime = new StartTimeFinder(raceLog).analyze(); - TimePoint finishedTime = new FinishedTimeFinder(raceLog).analyze(); - RaceLogFlagEvent abortingFlagEvent = new AbortingFlagFinder(raceLog).analyze(); - TimePoint abortingTime = abortingFlagEvent != null ? abortingFlagEvent.getLogicalTimePoint() : null; - - result = RaceStateOfSameDayHelper.isRaceStateOfSameDay(startTime, finishedTime, abortingTime, now); - } - return result; - } - /** * Tries to convert the given identifier to a UUID. When the identifier is not a UUID, null is returned. * @param identifierToConvert the identifier as a String diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java index 803886e34ad..ba4e7484024 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java @@ -1,11 +1,15 @@ package com.sap.sailing.server.gateway.jaxrs.api; +import java.util.Calendar; + import org.json.simple.JSONObject; import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogFlagEvent; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.AbortingFlagFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.LastFlagsFinder; +import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder; import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.ReadonlyRaceStateImpl; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.ReadonlyGateStartRacingProcedure; @@ -13,6 +17,7 @@ import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.common.RaceIdentifier; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; +import com.sap.sailing.domain.racelog.RaceStateOfSameDayHelper; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sse.common.TimePoint; import com.sap.sse.common.Util.Pair; @@ -65,4 +70,21 @@ public class RaceStateSerializer implements JsonSerializer raceColumnAndFleet, Calendar dayToCheck) { + RaceColumn raceColumn = raceColumnAndFleet.getA(); + Fleet fleet = raceColumnAndFleet.getB(); + + boolean result = false; + RaceLog raceLog = raceColumn.getRaceLog(fleet); + if (raceLog != null && !raceLog.isEmpty()) { + TimePoint startTime = new StartTimeFinder(raceLog).analyze(); + TimePoint finishedTime = new FinishedTimeFinder(raceLog).analyze(); + RaceLogFlagEvent abortingFlagEvent = new AbortingFlagFinder(raceLog).analyze(); + TimePoint abortingTime = abortingFlagEvent != null ? abortingFlagEvent.getLogicalTimePoint() : null; + + result = RaceStateOfSameDayHelper.isRaceStateOfSameDay(startTime, finishedTime, abortingTime, dayToCheck); + } + return result; + } } From f146b815c9f8e63686841a516e96f35ce4b73681 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 16 Feb 2015 13:58:20 +0100 Subject: [PATCH 12/15] added a EventRaceStatesSerializer --- .../impl/EventRaceStatesJsonGetServlet.java | 59 ++----------- .../jaxrs/api/EventRaceStatesSerializer.java | 87 +++++++++++++++++++ .../gateway/jaxrs/api/EventsResource.java | 21 ++++- 3 files changed, 112 insertions(+), 55 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventRaceStatesSerializer.java diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java index 7eb8508c592..1897a5ec74a 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/EventRaceStatesJsonGetServlet.java @@ -1,8 +1,6 @@ package com.sap.sailing.server.gateway.impl; import java.io.IOException; -import java.util.Calendar; -import java.util.Date; import java.util.UUID; import java.util.logging.Logger; @@ -10,16 +8,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.json.simple.JSONArray; import org.json.simple.JSONObject; -import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Event; -import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; -import com.sap.sailing.server.gateway.jaxrs.api.RaceStateSerializer; +import com.sap.sailing.server.gateway.jaxrs.api.EventRaceStatesSerializer; import com.sap.sse.common.Util.Pair; public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { @@ -28,33 +22,17 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { private final static Logger logger = Logger.getLogger(EventRaceStatesJsonGetServlet.class.getName()); private static final String PARAM_NAME_EVENTID = "eventId"; - // private static final String PARAM_NAME_FILTER_BY_REGATTA = "filterByRegatta"; private static final String PARAM_NAME_FILTER_BY_LEADERBOARD = "filterByLeaderboard"; private static final String PARAM_NAME_FILTER_BY_COURSEAREA = "filterByCourseArea"; private static final String PARAM_NAME_FILTER_BY_DAYOFFSET = "filterByDayOffset"; - public static final String FIELD_EVENT_NAME = "name"; - public static final String FIELD_EVENT_ID = "id"; - public static final String FIELD_RACE_STATES = "raceStates"; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String eventIdParam = request.getParameter(PARAM_NAME_EVENTID); String filterByCourseAreaParam = request.getParameter(PARAM_NAME_FILTER_BY_COURSEAREA); String filterByLeaderboardParam = request.getParameter(PARAM_NAME_FILTER_BY_LEADERBOARD); String filterByDayOffsetParam = request.getParameter(PARAM_NAME_FILTER_BY_DAYOFFSET); - boolean filterByDayOffset = false; - Calendar dayToCheck = Calendar.getInstance(); - dayToCheck.setTime(new Date()); - if(filterByDayOffsetParam != null) { - try { - int dayOffset = Integer.parseInt(filterByDayOffsetParam); - filterByDayOffset = true; - dayToCheck.add(Calendar.DAY_OF_YEAR, dayOffset); - } catch (NumberFormatException e) { - // invalid integer - } - } + if (eventIdParam == null) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "You need to specify a event id using the "+ PARAM_NAME_EVENTID + " parameter"); @@ -63,36 +41,9 @@ public class EventRaceStatesJsonGetServlet extends AbstractJsonHttpServlet { if (event == null) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Event "+eventIdParam+" not found"); } else { - JSONObject result = new JSONObject(); - result.put(FIELD_EVENT_NAME, event.getName()); - result.put(FIELD_EVENT_ID, event.getId().toString()); - JSONArray raceStatesLogEntriesJson = new JSONArray(); - result.put(FIELD_RACE_STATES, raceStatesLogEntriesJson); - RaceStateSerializer raceStateSerializer = new RaceStateSerializer(); - for (CourseArea courseArea : event.getVenue().getCourseAreas()) { - if(filterByCourseAreaParam == null || courseArea.getName().equals(filterByCourseAreaParam)) { - for (Leaderboard leaderboard : getService().getLeaderboards().values()) { - if (filterByLeaderboardParam == null || leaderboard.getName().equals(filterByLeaderboardParam)) { - if (leaderboard.getDefaultCourseArea() != null && leaderboard.getDefaultCourseArea().equals(courseArea)) { - String leaderboardName = leaderboard.getName(); - String leaderboardDisplayName = leaderboard.getDisplayName(); - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - for (Fleet fleet : raceColumn.getFleets()) { - Pair raceColumnAndFleet = new Pair(raceColumn, fleet); - if(!filterByDayOffset || raceStateSerializer.isRaceStateOfSameDay(raceColumnAndFleet, dayToCheck)) { - JSONObject raceStateJson = raceStateSerializer.serialize(raceColumnAndFleet); - raceStateJson.put("courseAreaName", courseArea.getName()); - raceStateJson.put("leaderboardName", leaderboardName); - raceStateJson.put("leaderboardDisplayName", leaderboardDisplayName); - raceStatesLogEntriesJson.add(raceStateJson); - } - } - } - } - } - } - } - } + EventRaceStatesSerializer eventRaceStatesSerializer = new EventRaceStatesSerializer(filterByCourseAreaParam, + filterByLeaderboardParam, filterByDayOffsetParam); + JSONObject result = eventRaceStatesSerializer.serialize(new Pair>(event, getService().getLeaderboards().values())); setJsonResponseHeader(response); result.writeJSONString(response.getWriter()); } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventRaceStatesSerializer.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventRaceStatesSerializer.java new file mode 100644 index 00000000000..7b3e83dc649 --- /dev/null +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventRaceStatesSerializer.java @@ -0,0 +1,87 @@ +package com.sap.sailing.server.gateway.jaxrs.api; + +import java.util.Calendar; +import java.util.Date; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.Event; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sse.common.Util.Pair; + +public class EventRaceStatesSerializer implements JsonSerializer>> { + public static final String FIELD_EVENT_NAME = "name"; + public static final String FIELD_EVENT_ID = "id"; + public static final String FIELD_RACE_STATES = "raceStates"; + + private String filterByCourseArea; + private String filterByLeaderboardName; + private Calendar filterDay; + + public EventRaceStatesSerializer() { + this.filterByCourseArea = null; + this.filterByLeaderboardName = null; + this.filterDay = null; + } + + public EventRaceStatesSerializer(String filterByCourseArea, String filterByLeaderboard, String filterByDayOffset) { + this.filterByCourseArea = filterByCourseArea; + this.filterByLeaderboardName = filterByLeaderboard; + + Integer dayOffset = null; + if(filterByDayOffset != null) { + try { + dayOffset = Integer.parseInt(filterByDayOffset); + filterDay = Calendar.getInstance(); + filterDay.setTime(new Date()); + filterDay.add(Calendar.DAY_OF_YEAR, dayOffset); + } catch (NumberFormatException e) { + // invalid integer + filterDay = null; + } + } + } + + @Override + public JSONObject serialize(Pair> eventAndLeaderboards) { + Event event = eventAndLeaderboards.getA(); + Iterable leaderboards = eventAndLeaderboards.getB(); + + JSONObject result = new JSONObject(); + result.put(FIELD_EVENT_NAME, event.getName()); + result.put(FIELD_EVENT_ID, event.getId().toString()); + JSONArray raceStatesLogEntriesJson = new JSONArray(); + result.put(FIELD_RACE_STATES, raceStatesLogEntriesJson); + RaceStateSerializer raceStateSerializer = new RaceStateSerializer(); + for (CourseArea courseArea : event.getVenue().getCourseAreas()) { + if(filterByCourseArea == null || courseArea.getName().equals(filterByCourseArea)) { + for (Leaderboard leaderboard : leaderboards) { + if (filterByLeaderboardName == null || leaderboard.getName().equals(filterByLeaderboardName)) { + if (leaderboard.getDefaultCourseArea() != null && leaderboard.getDefaultCourseArea().equals(courseArea)) { + String leaderboardName = leaderboard.getName(); + String leaderboardDisplayName = leaderboard.getDisplayName(); + for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { + for (Fleet fleet : raceColumn.getFleets()) { + Pair raceColumnAndFleet = new Pair(raceColumn, fleet); + if(filterDay == null || raceStateSerializer.isRaceStateOfSameDay(raceColumnAndFleet, filterDay)) { + JSONObject raceStateJson = raceStateSerializer.serialize(raceColumnAndFleet); + raceStateJson.put("courseAreaName", courseArea.getName()); + raceStateJson.put("leaderboardName", leaderboardName); + raceStateJson.put("leaderboardDisplayName", leaderboardDisplayName); + raceStatesLogEntriesJson.add(raceStateJson); + } + } + } + } + } + } + } + } + return result; + } +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java index 57fce1587d5..6da6328ffc9 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java @@ -16,12 +16,14 @@ import org.json.simple.JSONObject; import com.sap.sailing.domain.base.Event; import com.sap.sailing.domain.base.EventBase; +import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; import com.sap.sailing.server.gateway.serialization.JsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.EventBaseJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.LeaderboardGroupBaseJsonSerializer; import com.sap.sailing.server.gateway.serialization.impl.VenueJsonSerializer; +import com.sap.sse.common.Util.Pair; @Path("/v1/events") public class EventsResource extends AbstractSailingServerResource { @@ -74,7 +76,24 @@ public class EventsResource extends AbstractSailingServerResource { @Path("{eventId}/racestates") public Response getRaceStates(@PathParam("eventId") String eventId, @QueryParam("filterByLeaderboard") String filterByLeaderboard, @QueryParam("filterByCourseArea") String filterByCourseArea, @QueryParam("filterByDayOffset") String filterByDayOffset) { - return Response.noContent().build(); + Response response; + UUID eventUuid; + try { + eventUuid = UUID.fromString(eventId); + } catch (IllegalArgumentException e) { + return getBadEventErrorResponse(eventId); + } + Event event = getService().getEvent(eventUuid); + if (event == null) { + response = getBadEventErrorResponse(eventId); + } else { + EventRaceStatesSerializer eventRaceStatesSerializer = new EventRaceStatesSerializer(filterByCourseArea, + filterByLeaderboard, filterByDayOffset); + JSONObject raceStatesJson = eventRaceStatesSerializer.serialize(new Pair>(event, getService().getLeaderboards().values())); + String json = raceStatesJson.toJSONString(); + response = Response.ok(json, MediaType.APPLICATION_JSON).build(); + } + return response; } } \ No newline at end of file From 0d713fa02bbdfb1659e958cb40664e9a85384262 Mon Sep 17 00:00:00 2001 From: fmittag Date: Mon, 16 Feb 2015 18:14:23 +0100 Subject: [PATCH 13/15] added documentation of the new API to the webservices doc --- .../api/v1/eventRaceStatesGetDoc.html | 50 +++++++++++++++++++ .../webservices/api/v1/index.html | 12 +++-- 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway/webservices/api/v1/eventRaceStatesGetDoc.html diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/eventRaceStatesGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/eventRaceStatesGetDoc.html new file mode 100644 index 00000000000..c1ceefc855f --- /dev/null +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/eventRaceStatesGetDoc.html @@ -0,0 +1,50 @@ + + + + + + + + SAP Sailing Analytics Webservices API Version 1.0 Beta + + +

SAP Sailing Analytics Webservices API Version 1.0 Beta

+

URL: /api/v1/events/{eventId}/racestates

+ +Description: +

The service gets the race states of all races of an sailing event

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Webservice Type:REST
Output format:Json
Mandatory parameters:None
Optional parameters: +
filterByLeaderboard (filters the race states by the name of the leaderboard)
+
filterByCourseArea (filters the race states by the name of the course area)
+
filterByDayOffset (filters the race states by a day offset for current day, e.g. 1 means yesterday)
+
Request method:GET
Example:http://www.sapsailing.com/sailingserver/api/v1/events/41de25fd-0f22-4200-bdac-5574e7d5225d/racestates
+
+Back to Web Service Overview + + diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html index 766f399ca1a..08c69864290 100644 --- a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html +++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html @@ -40,6 +40,10 @@ name to make sure you get to the event you're interested in. /api/v1/events/{id} Gets the details of an event + + /api/v1/events/{id}/racestates + Gets the race states of all races of an event + /api/v1/regattas Gets all regattas @@ -96,6 +100,10 @@ name to make sure you get to the event you're interested in. /api/v1/leaderboards/{name} Gets the details of a leaderboard + + /api/v1/leaderboards/{name}/competitors/{id} + Gets the details of a competitor in the context of a leaderboard + /api/v1/gps_fixes Adds GPS-fixes that originated from a device with a unique identifier @@ -104,10 +112,6 @@ name to make sure you get to the event you're interested in. /api/v1/competitors/{id} Gets the details of a competitor - - /api/v1/leaderboards/{name}/competitors/{id} - Gets the details of a competitor in the context of a leaderboard -
From 2c7f3c4174ef23298dc74b5475bd54a8f6706132 Mon Sep 17 00:00:00 2001 From: fmittag Date: Tue, 17 Feb 2015 17:13:12 +0100 Subject: [PATCH 14/15] added gwt.theme project to all launch configs --- java/com.sap.sailing.server/SailingServer (No Proxy).launch | 2 +- .../SailingServer (No Proxy, Cached MTB).launch | 4 ++-- .../SailingServer (No Proxy, Jetty on 8889).launch | 2 +- ...SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch | 4 ++-- .../SailingServer (No Proxy, Jetty on 8890).launch | 2 +- .../SailingServer (No Proxy, Remote Debug SAP VM).launch | 4 ++-- java/com.sap.sailing.server/SailingServer (Proxy).launch | 2 +- .../SailingServer (Proxy, Jetty on 8889).launch | 2 +- .../SailingServer (Proxy, Remote Debug SAP VM).launch | 4 ++-- .../SailingServer (Proxy, SwissTiming Live Simulation).launch | 2 +- .../SailingServer (Proxy, winddbTest).launch | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy).launch b/java/com.sap.sailing.server/SailingServer (No Proxy).launch index 8a9f6b5f5a2..21627fd6acd 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy).launch @@ -34,5 +34,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch index ded8c572ff2..68dd7191370 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -29,9 +29,9 @@ - + - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch index 4a87c5dcac8..3ec0f77dfc2 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch index 3a7fa0de9c5..7dc838a1181 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8889, Cached MTB).launch @@ -16,7 +16,7 @@ - + @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch index 254ba26fee7..4e7742996a4 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Jetty on 8890).launch @@ -26,6 +26,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch index 723697b6c4f..a0b813374ec 100755 --- a/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Remote Debug SAP VM).launch @@ -15,7 +15,7 @@ - + @@ -26,5 +26,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy).launch b/java/com.sap.sailing.server/SailingServer (Proxy).launch index 73c1d33df86..6d252d818a5 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy).launch @@ -34,6 +34,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch index 49611a87c36..6d2ff20591f 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Jetty on 8889).launch @@ -27,6 +27,6 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch index 9e99a5d1946..90ea164e7fd 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, Remote Debug SAP VM).launch @@ -16,7 +16,7 @@ - + @@ -26,5 +26,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch index 59df666c599..cfa760728db 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, SwissTiming Live Simulation).launch @@ -26,5 +26,5 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch b/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch index 1851792927f..0f9e209026a 100755 --- a/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch +++ b/java/com.sap.sailing.server/SailingServer (Proxy, winddbTest).launch @@ -28,6 +28,6 @@ - + From 02d54a725fe2ae0db9d338ec4026cf17796c54cd Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Tue, 17 Feb 2015 18:20:13 +0100 Subject: [PATCH 15/15] upgraded TracAPI from 3.0.9 to 3.0.10, hopefully fixing bug 2630 --- .../META-INF/MANIFEST.MF | 2 +- java/com.tractrac.clientmodule/README.txt | 15 +++++++++++++++ .../com.tractrac.clientmodule/lib/TracAPI.jar | Bin 765744 -> 765760 bytes 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF index b10a81fdeaa..900b4166852 100644 --- a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF +++ b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: TracTrac Client module Bundle-SymbolicName: com.tractrac.clientmodule -Bundle-Version: 3.0.9 +Bundle-Version: 3.0.10 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ClassPath: ., lib/TracAPI.jar diff --git a/java/com.tractrac.clientmodule/README.txt b/java/com.tractrac.clientmodule/README.txt index 08aed822c98..a8c6776fdc9 100644 --- a/java/com.tractrac.clientmodule/README.txt +++ b/java/com.tractrac.clientmodule/README.txt @@ -16,6 +16,21 @@ It contains also some files: - test.sh -> script that compiles the code in the src folder, creates the test.jar library and execute the code of the example. - Manifest.txt -> manifest used to create the test.jar file +******************************************** +************* TracAPI 3.0.10 *************** +******************************************** +This is a final version. Only fixes bugs in the implementation + +Release date: 17/02/2015 +Build number: 9938 + + 1) Bugs + + - It fixes the same bug described in the release 3.0.9 that it was not fixed. The release 3.0.9 fixed + the synchronization issue between different threads but the ConcurrentModificationException happens + when the same thread is accessing to the list. The synchronization at method level doesn't work + in this case (Reported by Axel Uhl,07/02/2015) + ******************************************** ************* TracAPI 3.0.9 **************** ******************************************** diff --git a/java/com.tractrac.clientmodule/lib/TracAPI.jar b/java/com.tractrac.clientmodule/lib/TracAPI.jar index f3d5016f5d8701a8b5eda0eedd0cce3e1c4d1112..7a33f5cd105e7e59e972181e8dcc50eccf1178ed 100644 GIT binary patch delta 45432 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

-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 F{tqm7(lG!4 delta 45520 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 TXx}1p(*pE9$mU;Ki`V%-jFG$N