Merge branch 'master' of ssh://sapsailing.com/home/trac/git

This commit is contained in:
Peter Siegmund committed 2015-04-07 11:53:38 +02:00
commit 09bbdd1e2e
24 files changed
+1149 -760

No files matched your search

@@ -1,47 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<booleanAttribute key="com.google.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/dashboards/RibDashboard.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.dashboards.gwt"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-servlet.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-superDevMode -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9998 com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.dashboards.gwt"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m"/>
</launchConfiguration>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.google.gdt.eclipse.suite.webapp">
<booleanAttribute key="com.google.gdt.eclipse.core.RUN_SERVER" value="false"/>
<stringAttribute key="com.google.gdt.eclipse.suiteMainTypeProcessor.PREVIOUSLY_SET_MAIN_TYPE_NAME" value="com.google.gwt.dev.GWTShell"/>
<booleanAttribute key="com.google.gdt.eclipse.suiteWarArgumentProcessor.IS_WAR_FROM_PROJECT_PROPERTIES" value="false"/>
<stringAttribute key="com.google.gwt.eclipse.core.CODE_SERVER_PORT" value="9998"/>
<listAttribute key="com.google.gwt.eclipse.core.ENTRY_POINT_MODULES">
<listEntry value="com.sap.sailing.dashboards.gwt.RibDashboard"/>
</listAttribute>
<booleanAttribute key="com.google.gwt.eclipse.core.SUPERDEVMODE_ENABLED" value="true"/>
<stringAttribute key="com.google.gwt.eclipse.core.URL" value="/dashboards/RibDashboard.html"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.dashboards.gwt"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry containerPath=&quot;org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6&quot; path=&quot;1&quot; type=&quot;4&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.gwt.ui/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/java&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.dashboards.gwt/src/main/resources&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.server/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry id=&quot;org.eclipse.jdt.launching.classpathentry.defaultClasspath&quot;&gt;&#10;&lt;memento exportedEntriesOnly=&quot;false&quot; project=&quot;com.sap.sailing.dashboards.gwt&quot;/&gt;&#10;&lt;/runtimeClasspathEntry&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-servlet.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.google.gwt.osgi/lib/gwt-user.jar&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sailing.domain.common/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/org.moxieapps.gwt.highcharts/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
<listEntry value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/com.sap.sse.gwt.adminconsole/src&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="com.google.gwt.eclipse.core.moduleClasspathProvider"/>
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.google.gwt.dev.DevMode"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-superDevMode -incremental -war &quot;${project_loc:com.sap.sailing.dashboards.gwt}&quot; -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI &quot;${gwt_remote_ui_server_port}:${unique_id}&quot; -logLevel INFO -codeServerPort 9998 com.sap.sailing.dashboards.gwt.RibDashboard"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.dashboards.gwt"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2048m"/>
</launchConfiguration>
+15 -12
View File
@@ -214,16 +214,19 @@ input.magnifier {
border-bottom: 1px solid rgba(0, 0, 0, 0.25);
}
.dataMiningPanel-settingsButton {
background: url(images/settings_white.png), url(images/btn-cta-orangeleft.png);
background-position: center, center 0;
background-repeat: no-repeat, repeat-x;
width: 27px;
height: 23px;
margin: 0 12px 0 1px;
-webkit-border-radius: 0px 3px 3px 0px;
-moz-border-radius: 0px 3px 3px 0px;
-o-border-radius: 0px 3px 3px 0px;
-ms-border-radius: 0px 3px 3px 0px;
border-radius: 0px 3px 3px 0px;
.settingsAnchor {
position: relative;
top: 9px;
}
.groupingProviderElement {
margin: 2px;
}
.definitionProviderControls {
margin: 2px;
}
.definitionProviderControlsElements {
margin: 2px;
}
@@ -1124,6 +1124,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String errorCommunicatingWithServer();
String userManagement();
String structureImportUrls();
String filteredBy();
String filterBy();
String editSeries();
String pleaseSelectAtLeastOneRegatta();
@@ -1210,4 +1211,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String dashboardSpeedInKts();
String fixedMarkPassing();
String suppressedMarkPassing();
String currentFilterSelection();
}
@@ -1104,7 +1104,7 @@ serverReplies=Server replies
errorCommunicatingWithServer=Error communicating with server
userManagement=User Management
structureImportUrls=Regatta Structure Import
filterBy=filtered by
filteredBy=filtered by
editSeries=Edit Series
pleaseSelectAtLeastOneRegatta=Please select at least one regatta
pleaseSelectAnEvent=Please select an event
@@ -1186,4 +1186,6 @@ dashboardTeam=Team
dashboardDistanceToLineInM=Distance to line in m
dashboardSpeedInKts=Speed in kts
fixedMarkPassing=(fixed)
suppressedMarkPassing=(suppressed)
suppressedMarkPassing=(suppressed)
filterBy=Filter by
currentFilterSelection=Current filter selection
@@ -1099,7 +1099,7 @@ errorCommunicatingWithServer=Fehler bei der Kommunikation mit dem Server
userManagement=Benutzerverwaltung
structureImportUrls=Regattastruktur-Import
editSeries=Serie bearbeiten
filterBy=gefiltert nach
filteredBy=gefiltert nach
pleaseSelectAtLeastOneRegatta=Bitte wenigstens eine Regatta auswählen
pleaseSelectAnEvent=Bitte eine Veranstaltung auswählen
errorTryingToGetEvents=Fehler beim Laden von Veranstaltungen: {0}
@@ -1176,4 +1176,6 @@ dashboardTeam=Team
dashboardDistanceToLineInM=Distanz zur Linie in m
dashboardSpeedInKts=Geschwindigkeit in kts
fixedMarkPassing=(fest)
suppressedMarkPassing=(unterdrückt)
suppressedMarkPassing=(unterdrückt)
filterBy=Filtern nach
currentFilterSelection=Aktuelle Filter-Selektion
@@ -1048,7 +1048,7 @@ errorCommunicatingWithServer=Error communicating with server
userManagement=User Management
structureImportUrls=Regatta structure import
editSeries=Edit Series
filterBy=filtered by
filteredBy=filtered by
pleaseSelectAtLeastOneRegatta=Please select at least one regatta
pleaseSelectAnEvent=Please select an event
errorTryingToGetEvents=Error trying to get events: {0}
@@ -1125,4 +1125,6 @@ dashboardTeam=Team
dashboardDistanceToLineInM=Distance to line in m
dashboardSpeedInKts=Speed in kts
fixedMarkPassing=(fixed)
suppressedMarkPassing=(suppressed)
suppressedMarkPassing=(suppressed)
filterBy=Filter by
currentFilterSelection=Current filter selection
@@ -11,11 +11,8 @@ import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.SplitLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint;
import com.sap.sailing.gwt.ui.client.GlobalNavigationPanel;
import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel;
@@ -46,7 +43,7 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
EntryPointHelper.registerASyncService((ServiceDefTarget) dataMiningService, RemoteServiceMappingConstants.dataMiningServiceRemotePath);
RootLayoutPanel rootPanel = RootLayoutPanel.get();
SplitLayoutPanel splitPanel = new SplitLayoutPanel();
SplitLayoutPanel splitPanel = new SplitLayoutPanel(15);
rootPanel.add(splitPanel);
DockLayoutPanel selectionDockPanel = new DockLayoutPanel(Unit.PX);
@@ -65,9 +62,19 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
splitPanel.add(selectionDockPanel);
QueryRunner queryRunner = new SimpleQueryRunner(session, getStringMessages(), dataMiningService, this, queryDefinitionProviderWithControls, resultsPresenter);
final QueryRunner queryRunner = new SimpleQueryRunner(session, getStringMessages(), dataMiningService, this, queryDefinitionProviderWithControls, resultsPresenter);
queryDefinitionProviderWithControls.addControl(queryRunner.getEntryWidget());
queryDefinitionProviderWithControls.addControl(createSettingsControlWidget(queryRunner, queryDefinitionProviderWithControls));
Anchor settingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml());
settingsAnchor.addStyleName("settingsAnchor");
settingsAnchor.setTitle(getStringMessages().settings());
settingsAnchor.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
new SettingsDialog<QueryRunnerSettings>(queryRunner, getStringMessages()).show();
}
});
queryDefinitionProviderWithControls.addControl(settingsAnchor);
}
private LogoAndTitlePanel createLogoAndTitlePanel() {
@@ -78,23 +85,4 @@ public class DataMiningEntryPoint extends AbstractSailingEntryPoint {
return logoAndTitlePanel;
}
private Widget createSettingsControlWidget(final QueryRunner queryRunner, final QueryDefinitionProvider queryDefinitionProvider) {
HorizontalPanel panel = new HorizontalPanel();
panel.setSpacing(5);
Label runnerSettingsLabel = new Label(queryRunner.getLocalizedShortName() + ":");
panel.add(runnerSettingsLabel);
Anchor runnerSettingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml());
runnerSettingsAnchor.setTitle(getStringMessages().settings());
runnerSettingsAnchor.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
new SettingsDialog<QueryRunnerSettings>(queryRunner, getStringMessages()).show();
}
});
panel.add(runnerSettingsAnchor);
return panel;
}
}
@@ -0,0 +1,7 @@
package com.sap.sailing.gwt.ui.datamining;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
public interface FilterSelectionPresenter extends Component<Object> {
}
@@ -8,11 +8,11 @@ import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sse.datamining.shared.QueryDefinitionDTO;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
public interface SelectionProvider<SettingsType> extends Component<SettingsType> {
public interface FilterSelectionProvider extends Component<Object> {
public void addSelectionChangedListener(SelectionChangedListener listener);
public Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> getFilterSelection();
public Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> getSelection();
public void applySelection(QueryDefinitionDTO queryDefinition);
@@ -13,6 +13,4 @@ public interface QueryDefinitionProvider extends Component<Object> {
public void addQueryDefinitionChangedListener(QueryDefinitionChangedListener listener);
public void removeQueryDefinitionChangedListener(QueryDefinitionChangedListener listener);
public abstract SelectionProvider<?> getSelectionProvider();
}
@@ -0,0 +1,180 @@
package com.sap.sailing.gwt.ui.datamining.presentation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionChangedListener;
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionProvider;
import com.sap.sailing.gwt.ui.datamining.FilterSelectionPresenter;
import com.sap.sailing.gwt.ui.datamining.FilterSelectionProvider;
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO;
public class PlainFilterSelectionPresenter implements FilterSelectionPresenter, SelectionChangedListener,
DataRetrieverChainDefinitionChangedListener {
private final FilterSelectionProvider filterSelectionProvider;
private DataRetrieverChainDefinitionDTO retrieverChain;
private final HorizontalPanel mainPanel;
private final VerticalPanel presentationPanel;
public PlainFilterSelectionPresenter(StringMessages stringMessages, DataRetrieverChainDefinitionProvider retrieverChainProvider,
FilterSelectionProvider filterSelectionProvider) {
this.filterSelectionProvider = filterSelectionProvider;
this.filterSelectionProvider.addSelectionChangedListener(this);
retrieverChainProvider.addDataRetrieverChainDefinitionChangedListener(this);
Label currentSelectionLabel = new Label(stringMessages.currentFilterSelection());
currentSelectionLabel.setWidth("75px");
currentSelectionLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD);
presentationPanel = new VerticalPanel();
mainPanel = new HorizontalPanel();
mainPanel.add(currentSelectionLabel);
mainPanel.add(presentationPanel);
}
@Override
public void dataRetrieverChainDefinitionChanged(DataRetrieverChainDefinitionDTO newDataRetrieverChainDefinition) {
if (!Objects.equals(retrieverChain, newDataRetrieverChainDefinition)) {
retrieverChain = newDataRetrieverChainDefinition;
presentationPanel.clear();
}
}
@Override
public void selectionChanged() {
presentationPanel.clear();
Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> selection = filterSelectionProvider.getSelection();
List<Integer> sortedLevels = new ArrayList<>(selection.keySet());
Collections.sort(sortedLevels);
boolean first = true;
for (Integer levelIndex : sortedLevels) {
Map<FunctionDTO, Collection<? extends Serializable>> levelSelection = selection.get(levelIndex);
LocalizedTypeDTO level = retrieverChain.getRetrievedDataTypesChain().get(levelIndex);
RetrieverLevelFilterSelectionPresenter levelSelectionPresenter = new RetrieverLevelFilterSelectionPresenter(level, levelSelection);
if (!first) {
levelSelectionPresenter.getEntryWidget().getElement().getStyle().setMarginTop(5, Unit.PX);
}
presentationPanel.add(levelSelectionPresenter.getEntryWidget());
first = false;
}
}
private class RetrieverLevelFilterSelectionPresenter {
private final HorizontalPanel mainPanel;
public RetrieverLevelFilterSelectionPresenter(LocalizedTypeDTO level,
Map<FunctionDTO, Collection<? extends Serializable>> levelSelection) {
Label levelLabel = new Label(level.getDisplayName());
levelLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD);
levelLabel.setWidth("75px");
VerticalPanel presentationPanel = new VerticalPanel();
List<FunctionDTO> sortedDimensions = new ArrayList<>(levelSelection.keySet());
Collections.sort(sortedDimensions);
for (FunctionDTO dimension : sortedDimensions) {
Collection<? extends Serializable> dimensionSelection = levelSelection.get(dimension);
DimensionFilterSelectionPresenter dimensionSelectionPresenter = new DimensionFilterSelectionPresenter(dimension, dimensionSelection);
presentationPanel.add(dimensionSelectionPresenter.getEntryWidget());
}
mainPanel = new HorizontalPanel();
mainPanel.add(levelLabel);
mainPanel.add(presentationPanel);
}
public Widget getEntryWidget() {
return mainPanel;
}
}
private class DimensionFilterSelectionPresenter {
private final HorizontalPanel mainPanel;
public DimensionFilterSelectionPresenter(FunctionDTO dimension,
Collection<? extends Serializable> dimensionSelection) {
mainPanel = new HorizontalPanel();
Label dimensionLabel = new Label(dimension.getDisplayName() + ":");
dimensionLabel.getElement().getStyle().setMarginRight(2, Unit.PX);
mainPanel.add(dimensionLabel);
StringBuilder selectionStringBuilder = new StringBuilder();
boolean first = true;
for (Object selection : dimensionSelection) {
if (!first) {
selectionStringBuilder.append(", ");
}
selectionStringBuilder.append(selection.toString());
first = false;
}
mainPanel.add(new Label(selectionStringBuilder.toString()));
}
public Widget getEntryWidget() {
return mainPanel;
}
}
@Override
public String getLocalizedShortName() {
return getClass().getSimpleName();
}
@Override
public Widget getEntryWidget() {
return mainPanel;
}
@Override
public boolean isVisible() {
return mainPanel.isVisible();
}
@Override
public void setVisible(boolean visibility) {
mainPanel.setVisible(visibility);
}
@Override
public String getDependentCssClassName() {
return "plainFilterSelectionPresenter";
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public SettingsDialogComponent<Object> getSettingsDialogComponent() {
return null;
}
@Override
public void updateSettings(Object newSettings) {
}
}
@@ -99,8 +99,6 @@ public class ResultsChart implements ResultsPresenter<Number> {
sortByPanel = new HorizontalPanel();
sortByPanel.setSpacing(5);
sortByPanel.setVisible(false);
mainPanel.addNorth(sortByPanel, 50);
sortByPanel.add(new Label(stringMessages.sortBy()));
keyComparatorListBox = new ValueListBox<>(new AbstractRenderer<Comparator<?>>() {
@Override
@@ -116,6 +114,8 @@ public class ResultsChart implements ResultsPresenter<Number> {
}
});
sortByPanel.add(keyComparatorListBox);
mainPanel.addNorth(sortByPanel, 40);
mainPanel.setWidgetHidden(sortByPanel, true);
presentationPanel = new ResizingSimplePanel() {
@Override
@@ -177,7 +177,7 @@ public class ResultsChart implements ResultsPresenter<Number> {
}
private void updateKeyComparatorListBox() {
boolean visible = false;
boolean hidden = true;
Comparator<GroupKey> valueToBeSelected = standardKeyComparator;
Collection<Comparator<GroupKey>> acceptableValues = new ArrayList<>();
acceptableValues.add(valueToBeSelected);
@@ -185,11 +185,12 @@ public class ResultsChart implements ResultsPresenter<Number> {
valueToBeSelected = getKeyComparator() != null ? getKeyComparator() : valueToBeSelected;
acceptableValues.add(ascendingByValueKeyComparator);
acceptableValues.add(descendingByValueKeyComparator);
visible = true;
hidden = false;
}
keyComparatorListBox.setValue(valueToBeSelected);
keyComparatorListBox.setAcceptableValues(acceptableValues);
sortByPanel.setVisible(visible);
mainPanel.setWidgetHidden(sortByPanel, hidden);
mainPanel.forceLayout();
}
private boolean isCurrentResultSimple() {
@@ -5,26 +5,26 @@ import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SplitLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.client.shared.panels.ResizingFlowPanel;
import com.sap.sailing.gwt.ui.datamining.DataMiningControls;
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionChangedListener;
import com.sap.sailing.gwt.ui.datamining.FilterSelectionProvider;
import com.sap.sailing.gwt.ui.datamining.GroupingChangedListener;
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
import com.sap.sailing.gwt.ui.datamining.SelectionProvider;
import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener;
import com.sap.sailing.gwt.ui.datamining.StatisticProvider;
import com.sap.sse.datamining.shared.DataMiningSession;
@@ -47,32 +47,24 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
private final Timer queryDefinitionReleaseTimer;
private final FlowPanel mainPanel;
private HorizontalPanel controlsPanel;
private final DockLayoutPanel mainPanel;
private FlowPanel controlsPanel;
private StatisticProvider statisticProvider;
private SimpleDataRetrieverChainDefinitionProvider retrieverChainProvider;
private MultiDimensionalGroupingProvider groupBySelectionPanel;
private SelectionProvider<?> selectionProvider;
private FilterSelectionProvider selectionProvider;
public BufferingQueryDefinitionProviderWithControls(DataMiningSession session, StringMessages stringMessages, SailingServiceAsync sailingService, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter) {
super(stringMessages, sailingService, dataMiningService, errorReporter);
mainPanel = new ResizingFlowPanel() {
@Override
public void onResize() {
Widget selectionWidget = selectionProvider.getEntryWidget();
if (selectionWidget instanceof RequiresResize) {
((RequiresResize) selectionWidget).onResize();
}
}
};
mainPanel = new DockLayoutPanel(Unit.PX);
mainPanel.add(createFunctionsPanel());
mainPanel.addNorth(createFunctionsPanel(), 92);
selectionProvider = new RetrieverLevelSpecificSelectionProvider(session, stringMessages, dataMiningService, errorReporter, retrieverChainProvider);
selectionProvider = new ListRetrieverChainFilterSelectionProvider(session, stringMessages, dataMiningService, errorReporter, retrieverChainProvider);
selectionProvider.addSelectionChangedListener(new SelectionChangedListener() {
@Override
public void selectionChanged() {
@@ -90,10 +82,7 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
}
private Widget createFunctionsPanel() {
HorizontalPanel functionsPanel = new HorizontalPanel();
functionsPanel.setSpacing(5);
VerticalPanel statisticAndRetrieverChainPanel = new VerticalPanel();
FlowPanel statisticAndRetrieverChainPanel = new FlowPanel();
statisticProvider = new SimpleStatisticProvider(getStringMessages(), getDataMiningService(), getErrorReporter());
statisticProvider.addStatisticChangedListener(new StatisticChangedListener() {
@Override
@@ -111,7 +100,6 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
}
});
statisticAndRetrieverChainPanel.add(retrieverChainProvider.getEntryWidget());
functionsPanel.add(statisticAndRetrieverChainPanel);
groupBySelectionPanel = new MultiDimensionalGroupingProvider(getStringMessages(), getDataMiningService(), getErrorReporter(), statisticProvider);
groupBySelectionPanel.addGroupingChangedListener(new GroupingChangedListener() {
@@ -120,7 +108,10 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
scheduleQueryDefinitionChanged();
}
});
functionsPanel.add(groupBySelectionPanel.getEntryWidget());
ScrollPanel groupBySelectionScrollPanel = new ScrollPanel(groupBySelectionPanel.getEntryWidget());
controlsPanel = new FlowPanel();
controlsPanel.addStyleName("definitionProviderControls");
Button clearSelectionButton = new Button(this.getStringMessages().clearSelection());
clearSelectionButton.addClickHandler(new ClickHandler() {
@@ -129,13 +120,13 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
selectionProvider.clearSelection();
}
});
functionsPanel.add(clearSelectionButton);
addControl(clearSelectionButton);
controlsPanel = new HorizontalPanel();
controlsPanel.setSpacing(5);
functionsPanel.add(controlsPanel);
return functionsPanel;
SplitLayoutPanel controlsSplitPanel = new SplitLayoutPanel(15);
controlsSplitPanel.addWest(new ScrollPanel(statisticAndRetrieverChainPanel), 800);
controlsSplitPanel.addEast(new ScrollPanel(controlsPanel), 130);
controlsSplitPanel.add(groupBySelectionScrollPanel);
return controlsSplitPanel;
}
private void scheduleQueryDefinitionChanged() {
@@ -151,7 +142,7 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
queryDTO.appendDimensionToGroupBy(dimension);
}
for (Entry<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> filterSelectionEntry : selectionProvider.getFilterSelection().entrySet()) {
for (Entry<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> filterSelectionEntry : selectionProvider.getSelection().entrySet()) {
queryDTO.setFilterSelectionFor(filterSelectionEntry.getKey(), filterSelectionEntry.getValue());
}
@@ -172,6 +163,7 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
@Override
public void addControl(Widget controlWidget) {
controlWidget.addStyleName("definitionProviderControlsElements");
controlsPanel.add(controlWidget);
}
@@ -180,11 +172,6 @@ public class BufferingQueryDefinitionProviderWithControls extends AbstractQueryD
return mainPanel;
}
@Override
public SelectionProvider<?> getSelectionProvider() {
return selectionProvider;
}
@Override
public String getLocalizedShortName() {
return getStringMessages().queryDefinitionProvider();
@@ -0,0 +1,180 @@
package com.sap.sailing.gwt.ui.datamining.selection;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Set;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ToggleButton;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.gwt.ui.client.shared.components.AbstractObjectRenderer;
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.QueryResult;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
class DimensionFilterSelectionProvider {
private final DataMiningServiceAsync dataMiningService;
private final ErrorReporter errorReporter;
private final DataMiningSession session;
private final RetrieverLevelFilterSelectionProvider retrieverLevelSelectionProvider;
private final FlowPanel mainPanel;
private final HorizontalPanel controlsPanel;
private final ValueListBox<FunctionDTO> dimensionListBox;
private final DimensionChangedHandler dimensionChangedHandler;
private final ToggleButton toggleFilterButton;
private final SimpleBusyIndicator busyIndicator;
private final FilterableSelectionTable<?> selectionTable;
public DimensionFilterSelectionProvider(DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter, DataMiningSession session,
RetrieverLevelFilterSelectionProvider retrieverLevelSelectionProvider) {
this.dataMiningService = dataMiningService;
this.errorReporter = errorReporter;
this.session = session;
this.retrieverLevelSelectionProvider = retrieverLevelSelectionProvider;
mainPanel = new FlowPanel();
controlsPanel = new HorizontalPanel();
controlsPanel.setSpacing(2);
mainPanel.add(controlsPanel);
dimensionListBox = new ValueListBox<FunctionDTO>(new AbstractObjectRenderer<FunctionDTO>() {
@Override
protected String convertObjectToString(FunctionDTO function) {
return function.getDisplayName();
}
});
dimensionChangedHandler = new DimensionChangedHandler();
dimensionListBox.addValueChangeHandler(dimensionChangedHandler);
controlsPanel.add(dimensionListBox);
toggleFilterButton = new ToggleButton("S");
toggleFilterButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
selectionTable.setFilteringEnabled(toggleFilterButton.isDown());
}
});
toggleFilterButton.setVisible(false);
controlsPanel.add(toggleFilterButton);
busyIndicator = new SimpleBusyIndicator(true, 0.7f);
busyIndicator.setVisible(false);
mainPanel.add(busyIndicator);
selectionTable = new FilterableSelectionTable<>();
selectionTable.setVisible(false);
mainPanel.add(selectionTable);
}
private class DimensionChangedHandler implements ValueChangeHandler<FunctionDTO> {
boolean firstChange = true;
Collection<?> selectionToBeApplied;
@Override
public void onValueChange(ValueChangeEvent<FunctionDTO> event) {
final FunctionDTO dimension = event.getValue();
if (dimension != null) {
Collection<FunctionDTO> dimensionDTOs = new ArrayList<>();
dimensionDTOs.add(dimension);
busyIndicator.setVisible(true);
dataMiningService.getDimensionValuesFor(session, retrieverLevelSelectionProvider
.getDataRetrieverChain(), retrieverLevelSelectionProvider.getRetrieverLevel(), dimensionDTOs,
LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<QueryResult<Set<Object>>>() {
@Override
public void onSuccess(QueryResult<Set<Object>> result) {
GroupKey contentKey = new GenericGroupKey<FunctionDTO>(dimension);
Collection<?> content = result.getResults().get(contentKey);
selectionTable.setContent(content == null ? new ArrayList<>() : content);
if (selectionToBeApplied != null) {
selectionTable.setSelection(selectionToBeApplied);
selectionToBeApplied = null;
}
busyIndicator.setVisible(false);
selectionTable.setVisible(true);
toggleFilterButton.setVisible(true);
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error fetching the dimension values of " + dimension + ": "
+ caught.getMessage());
}
});
if (firstChange && retrieverLevelSelectionProvider.canAddDimensionFilter()) {
retrieverLevelSelectionProvider.createAndAddDimensionFilter();
}
firstChange = false;
} else if (retrieverLevelSelectionProvider.shouldRemoveDimensionFilter()) {
retrieverLevelSelectionProvider.removeDimensionFilter(DimensionFilterSelectionProvider.this);
firstChange = false;
} else {
selectionTable.clearSelection();
selectionTable.setContent(new ArrayList<>());
selectionTable.setVisible(false);
toggleFilterButton.setVisible(false);
firstChange = true;
}
retrieverLevelSelectionProvider.updateAvailableDimensions();
}
}
void setAvailableDimensions(Collection<FunctionDTO> availableDimensions) {
dimensionListBox.setAcceptableValues(availableDimensions);
}
public FunctionDTO getSelectedDimension() {
return dimensionListBox.getValue();
}
public Collection<? extends Serializable> getSelection() {
return selectionTable.getSelection();
}
void clearSelection() {
selectionTable.clearSelection();
}
void setSelectedDimensionAndValues(FunctionDTO functionDTO, Collection<?> selection) {
dimensionChangedHandler.firstChange = false;
dimensionChangedHandler.selectionToBeApplied = selection;
dimensionListBox.setValue(functionDTO, true);
}
void addSelectionChangeHandler(SelectionChangeEvent.Handler handler) {
selectionTable.addSelectionChangeHandler(handler);
}
public Widget getEntryWidget() {
return mainPanel;
}
public void resizeToHeight(int heightInPX) {
int widthInPX = controlsPanel.getOffsetWidth();
mainPanel.setSize(widthInPX + "px", heightInPX + "px");
int remainingHeightInPX = Math.max(0, heightInPX - controlsPanel.getOffsetHeight());
selectionTable.resizeTo(widthInPX, remainingHeightInPX);
}
}
@@ -3,8 +3,6 @@ package com.sap.sailing.gwt.ui.datamining.selection;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.cellview.client.TextColumn;
@@ -13,21 +11,21 @@ import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.ProvidesKey;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.gwt.client.panels.AbstractFilterablePanel;
public class SelectionTable<ContentType extends Serializable> extends FlowPanel {
public class FilterableSelectionTable<ContentType extends Serializable> extends FlowPanel {
private FunctionDTO dimension;
private Collection<ContentType> allData;
private final Collection<ContentType> allData;
private int width;
private int height;
private AbstractFilterablePanel<ContentType> filterPanel;
private DataGrid<ContentType> table;
private MultiSelectionModel<ContentType> selectionModel;
private ListDataProvider<ContentType> dataProvider;
private final AbstractFilterablePanel<ContentType> filterPanel;
private String filterText;
private final DataGrid<ContentType> table;
private final MultiSelectionModel<ContentType> selectionModel;
private final ListDataProvider<ContentType> dataProvider;
public SelectionTable(FunctionDTO dimension, boolean withHeader) {
this.dimension = dimension;
public FilterableSelectionTable() {
allData = new ArrayList<ContentType>();
table = new DataGrid<ContentType>();
@@ -37,14 +35,11 @@ public class SelectionTable<ContentType extends Serializable> extends FlowPanel
TextColumn<ContentType> contentColumn = new TextColumn<ContentType>() {
@Override
public String getValue(ContentType content) {
return SelectionTable.this.getElementAsString(content);
return FilterableSelectionTable.this.getElementAsString(content);
}
};
if (withHeader) {
table.addColumn(contentColumn, dimension.getDisplayName());
} else {
table.addColumn(contentColumn);
}
table.addColumn(contentColumn);
selectionModel = new MultiSelectionModel<ContentType>();
table.setSelectionModel(selectionModel);
@@ -64,82 +59,46 @@ public class SelectionTable<ContentType extends Serializable> extends FlowPanel
return searchableStrings;
}
};
filterPanel.setWidth("100%");
filterPanel.getTextBox().setWidth("90%");
filterPanel.setSpacing(2);
filterPanel.setWidth("95%");
filterPanel.getTextBox().setWidth("95%");
filterPanel.setVisible(false);
filterText = "";
add(filterPanel);
add(table);
}
public FunctionDTO getDimension() {
return dimension;
private String getElementAsString(ContentType element) {
return element.toString();
}
/**
* Replaces the current content of the table with the new one, while preserving the current selection.<br />
* Returns <code>true</code>, if:
* <ul>
* <li>Previously selected elements have been removed</li>
* <li>Nothing was selected and elements have been added or removed</li>
* </ul>
*
* @param newContent The new content.
* @return <code>true</code>, if query related elements has been changed.
*/
@SuppressWarnings("unchecked") //You can't use instanceof for generic type parameters
public boolean updateContent(Collection<?> newContent) {
public void setContent(Collection<?> newContent) {
Collection<ContentType> specificNewContent = null;
try {
specificNewContent = (Collection<ContentType>) newContent;
} catch (ClassCastException e) {
return false;
return;
}
Collection<ContentType> oldContent = new ArrayList<ContentType>(dataProvider.getList());
Collection<ContentType> selection = selectionModel.getSelectedSet();
dataProvider.getList().clear();
dataProvider.getList().addAll(specificNewContent);
allData.clear();
allData.addAll(specificNewContent);
dataProvider.getList().clear();
dataProvider.getList().addAll(allData);
clearSelection();
filterPanel.updateAll(allData);
return selection.isEmpty() ? elementsHaveBeenAddedOrRemoved(oldContent, specificNewContent) : selectedElementsHaveBeenRemoved(selection, specificNewContent);
}
private boolean selectedElementsHaveBeenRemoved(Collection<ContentType> selection, Collection<ContentType> newContent) {
Set<Object> selectionKeys = getKeysFor(selection);
Set<Object> newContentKeys = getKeysFor(newContent);
return !newContentKeys.containsAll(selectionKeys);
}
private boolean elementsHaveBeenAddedOrRemoved(Collection<ContentType> oldContent, Collection<ContentType> newContent) {
if (oldContent.size() != newContent.size()) {
return true;
}
Set<Object> oldContentKeys = getKeysFor(oldContent);
Set<Object> newContentKeys = getKeysFor(newContent);
return !newContentKeys.containsAll(oldContentKeys);
}
private Set<Object> getKeysFor(Collection<ContentType> content) {
Set<Object> contentKeys = new HashSet<Object>();
for (ContentType element : content) {
contentKeys.add(dataProvider.getKey(element));
}
return contentKeys;
}
public Collection<ContentType> getSelectionAsValues() {
public Collection<ContentType> getSelection() {
return selectionModel.getSelectedSet();
}
public void setSelection(Iterable<?> elements) {
clearSelection();
try {
@SuppressWarnings("unchecked") //You can't use instanceof for generic type parameters
Iterable<ContentType> specificContent = (Iterable<ContentType>) elements;
clearSelection();
for (ContentType element : specificContent) {
selectionModel.setSelected(element, true);
}
@@ -150,24 +109,46 @@ public class SelectionTable<ContentType extends Serializable> extends FlowPanel
selectionModel.clear();
}
public String getElementAsString(ContentType element) {
return element.toString();
}
public void addSelectionChangeHandler(SelectionChangeEvent.Handler handler) {
selectionModel.addSelectionChangeHandler(handler);
}
@Override
public void setWidth(String width) {
super.setWidth(width);
table.setWidth(width);
public boolean isFilteringEnabled() {
return filterPanel.isVisible();
}
public void setFilteringEnabled(boolean visible) {
if (visible) {
filterPanel.getTextBox().setText(filterText);
filterPanel.filter();
} else {
filterText = filterPanel.getTextBox().getText();
filterPanel.getTextBox().setText("");
filterPanel.filter();
}
filterPanel.setVisible(visible);
resizeTo(width, height);
}
@Override
public void setHeight(String height) {
super.setHeight(height);
table.setHeight(height);
public void setVisible(boolean visible) {
super.setVisible(visible);
//FIXME Force a rerendering of the table. Switching the retriever level fixes the display
table.redraw();
}
public void resizeTo(int widthInPX, int heightInPX) {
width = widthInPX;
height = heightInPX;
setSize(width + "px", height+ "px");
filterPanel.setWidth(width + "px");
int tableHeight = filterPanel.isVisible() ? Math.max(0, height - filterPanel.getOffsetHeight()) : height;
table.setSize(width + "px", tableHeight + "px");
//FIXME Force a rerendering of the table. Switching the retriever level fixes the display
table.redraw();
}
}
@@ -0,0 +1,304 @@
package com.sap.sailing.gwt.ui.datamining.selection;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CustomScrollPanel;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionChangedListener;
import com.sap.sailing.gwt.ui.datamining.FilterSelectionPresenter;
import com.sap.sailing.gwt.ui.datamining.FilterSelectionProvider;
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
import com.sap.sailing.gwt.ui.datamining.presentation.PlainFilterSelectionPresenter;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.QueryDefinitionDTO;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO;
import com.sap.sse.gwt.client.ErrorReporter;
public class ListRetrieverChainFilterSelectionProvider implements FilterSelectionProvider, DataRetrieverChainDefinitionChangedListener {
private final DataMiningSession session;
private final StringMessages stringMessages;
private final DataMiningServiceAsync dataMiningService;
private final ErrorReporter errorReporter;
private final Set<SelectionChangedListener> listeners;
private DataRetrieverChainDefinitionDTO retrieverChain;
private final Map<LocalizedTypeDTO, RetrieverLevelFilterSelectionProvider> selectionProvidersMappedByRetrieverLevel;
private final SelectionChangedListener retrieverLevelSelectionChangedListener;
private final DockLayoutPanel mainPanel;
private final CellList<LocalizedTypeDTO> retrieverLevelList;
private final SingleSelectionModel<LocalizedTypeDTO> retrieverLevelSelectionModel;
private final ListDataProvider<LocalizedTypeDTO> retrieverLevelDataProvider;
private final SizeProvidingScrollPanel selectionPanel;
private final FilterSelectionPresenter selectionPresenter;
private final ScrollPanel selectionPresenterScrollPanel;
public ListRetrieverChainFilterSelectionProvider(DataMiningSession session, StringMessages stringMessages,
DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter,
SimpleDataRetrieverChainDefinitionProvider retrieverChainProvider) {
this.session = session;
this.stringMessages = stringMessages;
this.dataMiningService = dataMiningService;
this.errorReporter = errorReporter;
listeners = new HashSet<>();
retrieverChainProvider.addDataRetrieverChainDefinitionChangedListener(this);
retrieverChain = null;
selectionProvidersMappedByRetrieverLevel = new HashMap<>();
retrieverLevelSelectionChangedListener = new SelectionChangedListener() {
@Override
public void selectionChanged() {
mainPanel.setWidgetHidden(selectionPresenterScrollPanel, getSelection().isEmpty());
notifyListeners();
}
};
retrieverLevelList = new CellList<LocalizedTypeDTO>(new RetrieverLevelCell());
retrieverLevelSelectionModel = new RetrieverLevelSelectionModel();
retrieverLevelList.setSelectionModel(retrieverLevelSelectionModel);
retrieverLevelDataProvider = new ListDataProvider<>();
retrieverLevelDataProvider.addDataDisplay(retrieverLevelList);
ScrollPanel retrieverLevelListScrollPanel = new ScrollPanel(retrieverLevelList);
DockLayoutPanel selectionDockLayoutPanel = new DockLayoutPanel(Unit.PX);
selectionDockLayoutPanel.addNorth(new Label(this.stringMessages.filterBy()), 18);
selectionPanel = new SizeProvidingScrollPanel();
selectionDockLayoutPanel.add(selectionPanel);
selectionPresenter = new PlainFilterSelectionPresenter(stringMessages, retrieverChainProvider, this);
selectionPresenterScrollPanel = new ScrollPanel(selectionPresenter.getEntryWidget());
mainPanel = new DockLayoutPanel(Unit.PX);
mainPanel.addSouth(selectionPresenterScrollPanel, 100);
mainPanel.addWest(retrieverLevelListScrollPanel, 300);
mainPanel.add(selectionDockLayoutPanel);
mainPanel.setWidgetHidden(selectionPresenterScrollPanel, true);
}
@Override
public void dataRetrieverChainDefinitionChanged(DataRetrieverChainDefinitionDTO newDataRetrieverChainDefinition) {
if (!Objects.equals(retrieverChain, newDataRetrieverChainDefinition)) {
retrieverChain = newDataRetrieverChainDefinition;
if (retrieverChain != null) {
updateRetrievalLevels();
} else {
clearContent();
}
}
}
private void updateRetrievalLevels() {
clearContent();
retrieverLevelDataProvider.getList().addAll(retrieverChain.getRetrievedDataTypesChain());
retrieverLevelList.setPageSize(retrieverLevelDataProvider.getList().size());
dataMiningService.getDimensionsFor(retrieverChain, LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<Iterable<FunctionDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error fetching the dimensions of the retrieval chain from the server: " + caught.getMessage());
}
@Override
public void onSuccess(Iterable<FunctionDTO> dimensions) {
Map<String, Collection<FunctionDTO>> dimensionsMappedBySourceType = mapBySourceType(dimensions);
int retrieverLevelIndex = 0;
LocalizedTypeDTO firstFilterableRetrieverLevel = null;
for (LocalizedTypeDTO retrieverLevel : retrieverChain.getRetrievedDataTypesChain()) {
String sourceTypeName = retrieverLevel.getTypeName();
if (dimensionsMappedBySourceType.containsKey(sourceTypeName) &&
!dimensionsMappedBySourceType.get(sourceTypeName).isEmpty()) {
firstFilterableRetrieverLevel = firstFilterableRetrieverLevel == null ? retrieverLevel : firstFilterableRetrieverLevel;
RetrieverLevelFilterSelectionProvider selectionProvider =
new RetrieverLevelFilterSelectionProvider(session, dataMiningService, errorReporter, retrieverChain,
retrieverLevel, retrieverLevelIndex, selectionPanel);
selectionProvider.setAvailableDimensions(dimensionsMappedBySourceType.get(sourceTypeName));
selectionProvider.addSelectionChangedListener(retrieverLevelSelectionChangedListener);
selectionProvidersMappedByRetrieverLevel.put(retrieverLevel, selectionProvider);
}
retrieverLevelIndex++;
}
retrieverLevelSelectionModel.setSelected(firstFilterableRetrieverLevel, true);
}
});
}
private Map<String, Collection<FunctionDTO>> mapBySourceType(Iterable<FunctionDTO> dimensions) {
Map<String, Collection<FunctionDTO>> dimensionsMappedBySourceType = new HashMap<>();
for (FunctionDTO dimension : dimensions) {
if (!dimensionsMappedBySourceType.containsKey(dimension.getSourceTypeName())) {
dimensionsMappedBySourceType.put(dimension.getSourceTypeName(), new HashSet<FunctionDTO>());
}
dimensionsMappedBySourceType.get(dimension.getSourceTypeName()).add(dimension);
}
return dimensionsMappedBySourceType;
}
private void clearContent() {
retrieverLevelDataProvider.getList().clear();
retrieverLevelSelectionModel.clear();
selectionPanel.clear();
clearSelection();
selectionProvidersMappedByRetrieverLevel.clear();
}
@Override
public Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> getSelection() {
Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> filterSelection = new HashMap<>();
for (RetrieverLevelFilterSelectionProvider selectionProvider : selectionProvidersMappedByRetrieverLevel.values()) {
Map<FunctionDTO, Collection<? extends Serializable>> levelFilterSelection = selectionProvider.getFilterSelection();
if (!levelFilterSelection.isEmpty()) {
filterSelection.put(selectionProvider.getRetrieverLevel(),
new HashMap<FunctionDTO, Collection<? extends Serializable>>(levelFilterSelection));
}
}
return filterSelection;
}
@Override
public void applySelection(QueryDefinitionDTO queryDefinition) {
for (RetrieverLevelFilterSelectionProvider selectionProvider : selectionProvidersMappedByRetrieverLevel.values()) {
Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> filterSelection = queryDefinition.getFilterSelection();
int retrieverLevel = selectionProvider.getRetrieverLevel();
if (filterSelection.containsKey(retrieverLevel)) {
selectionProvider.applySelection(filterSelection.get(retrieverLevel));
}
}
}
@Override
public void clearSelection() {
for (RetrieverLevelFilterSelectionProvider selectionProvider : selectionProvidersMappedByRetrieverLevel.values()) {
selectionProvider.clearSelection();
}
}
@Override
public void addSelectionChangedListener(SelectionChangedListener listener) {
listeners.add(listener);
}
private void notifyListeners() {
for (SelectionChangedListener listener : listeners) {
listener.selectionChanged();
}
}
private class RetrieverLevelCell extends AbstractCell<LocalizedTypeDTO> {
@Override
public void render(Cell.Context context, LocalizedTypeDTO value, SafeHtmlBuilder sb) {
if (value == null) {
return;
}
sb.appendHtmlConstant("<table>");
sb.appendHtmlConstant("<tr><td>" + value.getDisplayName() + "</td></tr>");
List<LocalizedTypeDTO> dataList = retrieverLevelDataProvider.getList();
if (!dataList.get(dataList.size() - 1).equals(value)) {
sb.appendHtmlConstant("<tr><td>|</td></tr>");
}
sb.appendHtmlConstant("</table>");
}
}
private class RetrieverLevelSelectionModel extends SingleSelectionModel<LocalizedTypeDTO> {
public RetrieverLevelSelectionModel() {
super();
addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
selectionPanel.setWidget(selectionProvidersMappedByRetrieverLevel.get(retrieverLevelSelectionModel.getSelectedObject()).getEntryWidget());
}
});
}
@Override
public void setSelected(LocalizedTypeDTO item, boolean selected) {
if (!selected || !selectionProvidersMappedByRetrieverLevel.containsKey(item)) {
//Prevents the selection of retriever levels, that don't have any dimensions and can't filter
return;
}
super.setSelected(item, selected);
}
}
private class SizeProvidingScrollPanel extends CustomScrollPanel implements SizeProvider {
@Override
public int getFreeWidthInPX() {
return getOffsetWidth() - getVerticalScrollbar().asWidget().getOffsetWidth();
}
@Override
public int getFreeHeightInPX() {
//Subtracting a value prevents weird scroll behavior
return getOffsetHeight() - getHorizontalScrollbar().asWidget().getOffsetHeight() - 3;
}
}
@Override
public String getLocalizedShortName() {
return getClass().getSimpleName();
}
@Override
public Widget getEntryWidget() {
return mainPanel;
}
@Override
public boolean isVisible() {
return mainPanel.isVisible();
}
@Override
public void setVisible(boolean visibility) {
mainPanel.setVisible(visibility);
}
@Override
public String getDependentCssClassName() {
return "listRetrieverChainSelectionProvider";
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public SettingsDialogComponent<Object> getSettingsDialogComponent() {
return null;
}
@Override
public void updateSettings(Object newSettings) {
}
}
@@ -12,7 +12,6 @@ import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.Widget;
@@ -28,15 +27,18 @@ import com.sap.sse.datamining.shared.QueryDefinitionDTO;
import com.sap.sse.datamining.shared.components.AggregatorType;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.panels.HorizontalFlowPanel;
public class MultiDimensionalGroupingProvider implements GroupingProvider, StatisticChangedListener {
private static final String GROUPING_PROVIDER_ELEMENT_STYLE = "groupingProviderElement";
private final StringMessages stringMessages;
private final DataMiningServiceAsync dataMiningService;
private final ErrorReporter errorReporter;
private final Set<GroupingChangedListener> listeners;
private final HorizontalPanel mainPanel;
private final HorizontalFlowPanel mainPanel;
private final List<ValueListBox<FunctionDTO>> dimensionToGroupByBoxes;
private FunctionDTO currentStatisticToCalculate;
@@ -52,9 +54,10 @@ public class MultiDimensionalGroupingProvider implements GroupingProvider, Stati
availableDimensions = new ArrayList<>();
dimensionToGroupByBoxes = new ArrayList<ValueListBox<FunctionDTO>>();
mainPanel = new HorizontalPanel();
mainPanel.setSpacing(5);
mainPanel.add(new Label(this.stringMessages.groupBy() + ":"));
mainPanel = new HorizontalFlowPanel();
Label groupByLabel = new Label(this.stringMessages.groupBy() + ":");
groupByLabel.addStyleName(GROUPING_PROVIDER_ELEMENT_STYLE);
mainPanel.add(groupByLabel);
ValueListBox<FunctionDTO> firstDimensionToGroupByBox = createDimensionToGroupByBox();
addDimensionToGroupByBoxAndUpdateAcceptableValues(firstDimensionToGroupByBox);
@@ -115,6 +118,7 @@ public class MultiDimensionalGroupingProvider implements GroupingProvider, Stati
}
});
dimensionToGroupByBox.addStyleName(GROUPING_PROVIDER_ELEMENT_STYLE);
dimensionToGroupByBox.addValueChangeHandler(new ValueChangeHandler<FunctionDTO>() {
private boolean firstChange = true;
@@ -0,0 +1,249 @@
package com.sap.sailing.gwt.ui.datamining.selection;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ProvidesResize;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.gwt.ui.client.shared.components.Component;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO;
import com.sap.sse.gwt.client.ErrorReporter;
public class RetrieverLevelFilterSelectionProvider implements Component<Object> {
private final DataMiningServiceAsync dataMiningService;
private final ErrorReporter errorReporter;
private final Set<SelectionChangedListener> listeners;
private final DataMiningSession session;
private final DataRetrieverChainDefinitionDTO retrieverChain;
private final LocalizedTypeDTO retrievedDataType;
private final int retrieverLevel;
private final Collection<FunctionDTO> availableDimensions;
private final HorizontalLayoutPanel mainPanel;
private final Collection<DimensionFilterSelectionProvider> dimensionFilters;
private final SelectionChangeEvent.Handler selectionTablesChangedListener;
private final SizeProvider sizeProvider;
public RetrieverLevelFilterSelectionProvider(DataMiningSession session, DataMiningServiceAsync dataMiningService,
ErrorReporter errorReporter, DataRetrieverChainDefinitionDTO retrieverChain,
LocalizedTypeDTO retrievedDataType, int retrieverLevel, SizeProvider sizeProvider) {
this.dataMiningService = dataMiningService;
this.errorReporter = errorReporter;
listeners = new HashSet<>();
this.session = session;
this.retrieverChain = retrieverChain;
this.retrievedDataType = retrievedDataType;
this.retrieverLevel = retrieverLevel;
availableDimensions = new ArrayList<>();
mainPanel = new HorizontalLayoutPanel();
dimensionFilters = new ArrayList<>();
selectionTablesChangedListener = new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
notifyListeners();
}
};
this.sizeProvider = sizeProvider;
}
public void setAvailableDimensions(Collection<FunctionDTO> dimensions) {
availableDimensions.clear();
availableDimensions.addAll(dimensions);
initializeDimensionFilters();
}
private void initializeDimensionFilters() {
DimensionFilterSelectionProvider dimensionFilter = createDimensionFilter();
List<FunctionDTO> availableDimensionsList = new ArrayList<>(availableDimensions);
Collections.sort(availableDimensionsList);
dimensionFilter.setAvailableDimensions(availableDimensionsList);
addDimensionFilter(dimensionFilter);
}
boolean canAddDimensionFilter() {
return availableDimensions.size() != getSelectedDimensions().size();
}
void createAndAddDimensionFilter() {
addDimensionFilter(createDimensionFilter());
}
private DimensionFilterSelectionProvider createDimensionFilter() {
DimensionFilterSelectionProvider dimensionFilter = new DimensionFilterSelectionProvider(dataMiningService, errorReporter, session, this);
dimensionFilter.addSelectionChangeHandler(selectionTablesChangedListener);
return dimensionFilter;
}
private void addDimensionFilter(DimensionFilterSelectionProvider dimensionFilter) {
dimensionFilters.add(dimensionFilter);
mainPanel.add(dimensionFilter.getEntryWidget());
mainPanel.onResize();
}
boolean shouldRemoveDimensionFilter() {
return availableDimensions.size() - getSelectedDimensions().size() > 1;
}
void removeDimensionFilter(DimensionFilterSelectionProvider dimensionFilter) {
dimensionFilter.clearSelection(); // Notifies the listeners, if values were selected
dimensionFilters.remove(dimensionFilter);
mainPanel.remove(dimensionFilter.getEntryWidget());
mainPanel.onResize();
}
void updateAvailableDimensions() {
Collection<FunctionDTO> remainingDimensionsBase = new ArrayList<FunctionDTO>(availableDimensions);
remainingDimensionsBase.removeAll(getSelectedDimensions());
for (DimensionFilterSelectionProvider dimensionFilter : dimensionFilters) {
List<FunctionDTO> remainingDimensions = new ArrayList<>(remainingDimensionsBase);
FunctionDTO selectedDimension = dimensionFilter.getSelectedDimension();
if (selectedDimension != null) {
remainingDimensions.add(selectedDimension);
}
Collections.sort(remainingDimensions);
remainingDimensions.add(null);
dimensionFilter.setAvailableDimensions(remainingDimensions);
}
mainPanel.onResize();
}
private Collection<FunctionDTO> getSelectedDimensions() {
Collection<FunctionDTO> selectedDimensions = new ArrayList<>();
for (DimensionFilterSelectionProvider dimensionFilter : dimensionFilters) {
FunctionDTO selectedDimension = dimensionFilter.getSelectedDimension();
if (selectedDimension != null) {
selectedDimensions.add(selectedDimension);
}
}
return selectedDimensions;
}
public Map<FunctionDTO, Collection<? extends Serializable>> getFilterSelection() {
HashMap<FunctionDTO, Collection<? extends Serializable>> filterSelection = new HashMap<>();
for (DimensionFilterSelectionProvider dimensionFilter : dimensionFilters) {
Collection<? extends Serializable> dimensionFilterSelection = dimensionFilter.getSelection();
if (!dimensionFilterSelection.isEmpty()) {
filterSelection.put(dimensionFilter.getSelectedDimension(), dimensionFilterSelection);
}
}
return filterSelection;
}
public void applySelection(Map<FunctionDTO, Collection<? extends Serializable>> filterSelection) {
dimensionFilters.clear();
mainPanel.clear();
List<FunctionDTO> sortedDimensions = new ArrayList<>(filterSelection.keySet());
Collections.sort(sortedDimensions);
for (FunctionDTO functionDTO : sortedDimensions) {
DimensionFilterSelectionProvider dimensionFilter = createDimensionFilter();
addDimensionFilter(dimensionFilter);
updateAvailableDimensions();
dimensionFilter.setSelectedDimensionAndValues(functionDTO, filterSelection.get(functionDTO));
}
}
public void clearSelection() {
mainPanel.clear();
for (DimensionFilterSelectionProvider dimensionFilter : dimensionFilters) {
dimensionFilter.clearSelection();
}
dimensionFilters.clear();
initializeDimensionFilters();
}
public void addSelectionChangedListener(SelectionChangedListener listener) {
listeners.add(listener);
}
private void notifyListeners() {
for (SelectionChangedListener listener : listeners) {
listener.selectionChanged();
}
}
DataRetrieverChainDefinitionDTO getDataRetrieverChain() {
return retrieverChain;
}
public int getRetrieverLevel() {
return retrieverLevel;
}
public LocalizedTypeDTO getRetrievedDataType() {
return retrievedDataType;
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public SettingsDialogComponent<Object> getSettingsDialogComponent() {
return null;
}
@Override
public void updateSettings(Object newSettings) {
}
@Override
public String getLocalizedShortName() {
return getClass().getSimpleName();
}
@Override
public Widget getEntryWidget() {
return mainPanel;
}
@Override
public boolean isVisible() {
return mainPanel.isVisible();
}
@Override
public void setVisible(boolean visibility) {
mainPanel.setVisible(visibility);
}
@Override
public String getDependentCssClassName() {
return "singleRetrieverLevelSelectionPanel";
}
private class HorizontalLayoutPanel extends HorizontalPanel implements RequiresResize, ProvidesResize {
@Override
public void onResize() {
int heightInPX = sizeProvider.getFreeHeightInPX();
setHeight(heightInPX + "px");
for (DimensionFilterSelectionProvider selectionProvider : dimensionFilters) {
selectionProvider.resizeToHeight(heightInPX);
}
}
}
}
@@ -1,215 +0,0 @@
package com.sap.sailing.gwt.ui.datamining.selection;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent;
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionChangedListener;
import com.sap.sailing.gwt.ui.datamining.DataRetrieverChainDefinitionProvider;
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
import com.sap.sailing.gwt.ui.datamining.SelectionProvider;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.QueryDefinitionDTO;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO;
import com.sap.sse.gwt.client.ErrorReporter;
public class RetrieverLevelSpecificSelectionProvider implements SelectionProvider<Object>, DataRetrieverChainDefinitionChangedListener {
private final DataMiningSession session;
private final StringMessages stringMessages;
private final DataMiningServiceAsync dataMiningService;
private final ErrorReporter errorReporter;
private final Set<SelectionChangedListener> listeners;
private final SelectionChangedListener singleRetrieverLevelSelectionProvidersListener;
private DataRetrieverChainDefinitionDTO retrieverChain;
private final ScrollPanel mainPanel;
private final VerticalPanel contentPanel;
private final Collection<SingleRetrieverLevelSelectionProviderPrototype> singleRetrieverLevelSelectionProviders;
public RetrieverLevelSpecificSelectionProvider(DataMiningSession session, StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter,
DataRetrieverChainDefinitionProvider dataRetrieverChainDefinitionProvider) {
this.session = session;
this.stringMessages = stringMessages;
this.dataMiningService = dataMiningService;
this.errorReporter = errorReporter;
listeners = new HashSet<>();
singleRetrieverLevelSelectionProvidersListener = new SelectionChangedListener() {
@Override
public void selectionChanged() {
for (SelectionChangedListener listener : listeners) {
listener.selectionChanged();
}
}
};
singleRetrieverLevelSelectionProviders = new ArrayList<>();
contentPanel = new VerticalPanel();
mainPanel = new ScrollPanel(contentPanel);
dataRetrieverChainDefinitionProvider.addDataRetrieverChainDefinitionChangedListener(this);
}
@Override
public void dataRetrieverChainDefinitionChanged(DataRetrieverChainDefinitionDTO newDataRetrieverChainDefinition) {
if (!Objects.equals(retrieverChain, newDataRetrieverChainDefinition)) {
retrieverChain = newDataRetrieverChainDefinition;
if (retrieverChain != null) {
updateRetrievalLevels();
} else {
contentPanel.clear();
singleRetrieverLevelSelectionProviders.clear();
}
}
}
private void updateRetrievalLevels() {
contentPanel.clear();
singleRetrieverLevelSelectionProviders.clear();
int retrieverLevel = 0;
boolean first = true;
for (LocalizedTypeDTO retrievedDataType : retrieverChain.getRetrievedDataTypesChain()) {
if (!first) {
contentPanel.add(new Label("|"));
}
first = false;
SingleRetrieverLevelSelectionProviderPrototype singleRetrieverLevelSelectionProvider = new SingleRetrieverLevelSelectionProviderPrototype(session, stringMessages, dataMiningService, errorReporter,
retrieverChain, retrievedDataType, retrieverLevel );
singleRetrieverLevelSelectionProvider.addSelectionChangedListener(singleRetrieverLevelSelectionProvidersListener);
contentPanel.add(singleRetrieverLevelSelectionProvider);
singleRetrieverLevelSelectionProviders.add(singleRetrieverLevelSelectionProvider);
retrieverLevel++;
}
udpateAvailableDimensions();
}
private void udpateAvailableDimensions() {
dataMiningService.getDimensionsFor(retrieverChain, LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<Iterable<FunctionDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error fetching the dimensions of the retrieval chain from the server: " + caught.getMessage());
}
@Override
public void onSuccess(Iterable<FunctionDTO> dimensions) {
Map<String, Collection<FunctionDTO>> dimensionsMappedBySourceType = mapBySourceType(dimensions);
for (SingleRetrieverLevelSelectionProviderPrototype singleRetrieverLevelSelectionProvider : singleRetrieverLevelSelectionProviders) {
String sourceType = singleRetrieverLevelSelectionProvider.getRetrievedDataType().getTypeName();
if (dimensionsMappedBySourceType.containsKey(sourceType)) {
singleRetrieverLevelSelectionProvider.setAvailableDimensions(dimensionsMappedBySourceType.get(sourceType));
}
}
}
});
}
private Map<String, Collection<FunctionDTO>> mapBySourceType(Iterable<FunctionDTO> dimensions) {
Map<String, Collection<FunctionDTO>> dimensionsMappedBySourceType = new HashMap<>();
for (FunctionDTO dimension : dimensions) {
if (!dimensionsMappedBySourceType.containsKey(dimension.getSourceTypeName())) {
dimensionsMappedBySourceType.put(dimension.getSourceTypeName(), new HashSet<FunctionDTO>());
}
dimensionsMappedBySourceType.get(dimension.getSourceTypeName()).add(dimension);
}
return dimensionsMappedBySourceType;
}
@Override
public Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> getFilterSelection() {
Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> filterSelection = new HashMap<>();
for (SingleRetrieverLevelSelectionProviderPrototype singleRetrieverLevelSelectionProvider : singleRetrieverLevelSelectionProviders) {
Map<FunctionDTO, Collection<? extends Serializable>> levelFilterSelection = singleRetrieverLevelSelectionProvider.getFilterSelection();
if (!levelFilterSelection.isEmpty()) {
filterSelection.put(singleRetrieverLevelSelectionProvider.getRetrieverLevel(),
new HashMap<FunctionDTO, Collection<? extends Serializable>>(levelFilterSelection));
}
}
return filterSelection;
}
@Override
public void applySelection(QueryDefinitionDTO queryDefinition) {
for (SingleRetrieverLevelSelectionProviderPrototype singleRetrieverLevelSelectionProvider : singleRetrieverLevelSelectionProviders) {
Map<Integer, Map<FunctionDTO, Collection<? extends Serializable>>> filterSelection = queryDefinition.getFilterSelection();
int retrieverLevel = singleRetrieverLevelSelectionProvider.getRetrieverLevel();
if (filterSelection.containsKey(retrieverLevel)) {
singleRetrieverLevelSelectionProvider.applySelection(filterSelection.get(retrieverLevel));
}
}
}
@Override
public void clearSelection() {
for (SingleRetrieverLevelSelectionProviderPrototype singleRetrieverLevelSelectionProvider : singleRetrieverLevelSelectionProviders) {
singleRetrieverLevelSelectionProvider.clearSelection();
}
}
@Override
public void addSelectionChangedListener(SelectionChangedListener listener) {
listeners.add(listener);
}
@Override
public String getLocalizedShortName() {
return RetrieverLevelSpecificSelectionProvider.class.getSimpleName();
}
@Override
public Widget getEntryWidget() {
return mainPanel;
}
@Override
public boolean isVisible() {
return mainPanel.isVisible();
}
@Override
public void setVisible(boolean visibility) {
mainPanel.setVisible(visibility);
}
@Override
public String getDependentCssClassName() {
return "retrieverLevelSpecificSelectionProvider";
}
@Override
public boolean hasSettings() {
return false;
}
@Override
public SettingsDialogComponent<Object> getSettingsDialogComponent() {
return null;
}
@Override
public void updateSettings(Object newSettings) {
}
}
@@ -1,317 +0,0 @@
package com.sap.sailing.gwt.ui.datamining.selection;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.AbstractObjectRenderer;
import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync;
import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener;
import com.sap.sse.datamining.shared.DataMiningSession;
import com.sap.sse.datamining.shared.GroupKey;
import com.sap.sse.datamining.shared.QueryResult;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
import com.sap.sse.datamining.shared.impl.GenericGroupKey;
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
public class SingleRetrieverLevelSelectionProviderPrototype extends HorizontalPanel {
/* This implementation is a prototype and mustn't be used to develop a productive UI component.
* Instead start from scratch and use this prototype as orientation to get a cleaner result.
* */
private final DataMiningSession session;
private final DataMiningServiceAsync dataMiningService;
private final ErrorReporter errorReporter;
private final Set<SelectionChangedListener> listeners;
private final DataRetrieverChainDefinitionDTO retrieverChain;
private final LocalizedTypeDTO retrievedDataType;
private final int retrieverLevel;
private final List<FunctionDTO> availableDimensions;
private final Map<GroupKey, Set<Object>> dimensionValuesMappedByDimension;
private final SelectionChangeEvent.Handler selectionTablesChangedListener;
private Map<FunctionDTO, Collection<? extends Serializable>> filterSelectionToBeApplied;
private final Label filterByLabel;
private final HorizontalPanel labeledBusyIndicator;
private final HorizontalPanel filterSelectionPanel;
private final List<ValueListBox<FunctionDTO>> dimensionToFilterByBoxes;
private final Map<ValueListBox<?>, VerticalPanel> singleDimensionFilterSelectionPanelsMappedBySelectionBox;
private final Map<ValueListBox<?>, SelectionTable<?>> selectionTablesMappedBySelectionBox;
public SingleRetrieverLevelSelectionProviderPrototype(DataMiningSession session, StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter,
DataRetrieverChainDefinitionDTO retrieverChain, LocalizedTypeDTO retrievedDataType, int retrieverLevel) {
this.session = session;
this.dataMiningService = dataMiningService;
this.errorReporter = errorReporter;
listeners = new HashSet<>();
this.retrieverChain = retrieverChain;
this.retrievedDataType = retrievedDataType;
this.retrieverLevel = retrieverLevel;
availableDimensions = new ArrayList<>();
dimensionValuesMappedByDimension = new HashMap<>();
selectionTablesChangedListener = new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
notifyListeners();
}
};
this.setSpacing(5);
add(new Label(retrievedDataType.getDisplayName()));
filterByLabel = new Label(stringMessages.filterBy());
filterByLabel.setVisible(false);
add(filterByLabel);
labeledBusyIndicator = new HorizontalPanel();
labeledBusyIndicator.setVisible(false);
labeledBusyIndicator.setSpacing(5);
BusyIndicator busyIndicator = new SimpleBusyIndicator(true, 0.7f);
labeledBusyIndicator.add(busyIndicator);
labeledBusyIndicator.add(new Label(stringMessages.loadingDimensionValues()));
add(labeledBusyIndicator);
filterSelectionPanel = new HorizontalPanel();
filterSelectionPanel.setVisible(false);
add(filterSelectionPanel);
dimensionToFilterByBoxes = new ArrayList<>();
singleDimensionFilterSelectionPanelsMappedBySelectionBox = new HashMap<>();
selectionTablesMappedBySelectionBox = new HashMap<>();
}
public LocalizedTypeDTO getRetrievedDataType() {
return retrievedDataType;
}
public int getRetrieverLevel() {
return retrieverLevel;
}
public void setAvailableDimensions(Collection<FunctionDTO> dimensions) {
clearFilterSelectionComponents();
availableDimensions.clear();
availableDimensions.addAll(dimensions);
boolean isFiltrationPossible = !availableDimensions.isEmpty();
filterByLabel.setVisible(isFiltrationPossible);
filterSelectionPanel.setVisible(isFiltrationPossible);
if (isFiltrationPossible) {
Collections.sort(availableDimensions);
labeledBusyIndicator.setVisible(true);
dataMiningService.getDimensionValuesFor(session, retrieverChain, retrieverLevel, dimensions, LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback<QueryResult<Set<Object>>>() {
@Override
public void onSuccess(QueryResult<Set<Object>> result) {
dimensionValuesMappedByDimension.clear();
dimensionValuesMappedByDimension.putAll(result.getResults());
ValueListBox<FunctionDTO> firstDimensionToFilterByBox = createDimensionToGroupByBox();
addDimensionToFilterByBox(firstDimensionToFilterByBox);
updateAcceptableValues();
if (filterSelectionToBeApplied != null) {
applySelection(filterSelectionToBeApplied);
filterSelectionToBeApplied = null;
}
labeledBusyIndicator.setVisible(false);
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Error fetching the dimension values: " + caught.getMessage());
labeledBusyIndicator.setVisible(false);
}
});
}
}
private ValueListBox<FunctionDTO> createDimensionToGroupByBox() {
ValueListBox<FunctionDTO> dimensionToGroupByBox = new ValueListBox<FunctionDTO>(new AbstractObjectRenderer<FunctionDTO>() {
@Override
protected String convertObjectToString(FunctionDTO function) {
return function.getDisplayName();
}
});
dimensionToGroupByBox.addValueChangeHandler(new ValueChangeHandler<FunctionDTO>() {
private boolean firstChange = true;
@Override
public void onValueChange(ValueChangeEvent<FunctionDTO> event) {
ValueListBox<?> changedDimensionToFilterByBox = (ValueListBox<?>) event.getSource();
FunctionDTO selectedDimension = event.getValue();
if (firstChange && selectedDimension != null) {
ValueListBox<FunctionDTO> newDimensionToFilterByBox = createDimensionToGroupByBox();
addDimensionToFilterByBox(newDimensionToFilterByBox);
}
boolean selectionWasNotEmpty = selectionTablesMappedBySelectionBox.containsKey(changedDimensionToFilterByBox) &&
!selectionTablesMappedBySelectionBox.get(changedDimensionToFilterByBox).getSelectionAsValues().isEmpty();
if (selectedDimension != null) {
SelectionTable<?> selectionTable = new SelectionTable<>(selectedDimension, false);
selectionTable.addSelectionChangeHandler(selectionTablesChangedListener);
setSelectionTableFor(changedDimensionToFilterByBox, selectionTable);
selectionTable.updateContent(getDimensionValuesFor(selectedDimension));
if (!firstChange && selectionWasNotEmpty) {
notifyListeners();
}
} else if (selectedDimension == null) {
removeDimensionToFilterByBox(changedDimensionToFilterByBox);
if (selectionWasNotEmpty) {
notifyListeners();
}
}
updateAcceptableValues();
firstChange = false;
}
});
return dimensionToGroupByBox;
}
private void addDimensionToFilterByBox(ValueListBox<FunctionDTO> dimensionToFilterByBox) {
dimensionToFilterByBoxes.add(dimensionToFilterByBox);
VerticalPanel singleDimensionFilterSelectionPanel = new VerticalPanel();
singleDimensionFilterSelectionPanel.add(dimensionToFilterByBox);
singleDimensionFilterSelectionPanelsMappedBySelectionBox.put(dimensionToFilterByBox, singleDimensionFilterSelectionPanel);
filterSelectionPanel.add(singleDimensionFilterSelectionPanel);
}
private void setSelectionTableFor(ValueListBox<?> changedDimensionToFilterByBox, SelectionTable<?> selectionTable) {
if (selectionTablesMappedBySelectionBox.containsKey(changedDimensionToFilterByBox)) {
SelectionTable<?> oldSelectionTable = selectionTablesMappedBySelectionBox.get(changedDimensionToFilterByBox);
singleDimensionFilterSelectionPanelsMappedBySelectionBox.get(changedDimensionToFilterByBox).remove(oldSelectionTable);
selectionTablesMappedBySelectionBox.remove(changedDimensionToFilterByBox);
}
VerticalPanel singleDimensionFilteringSelectionPanel = singleDimensionFilterSelectionPanelsMappedBySelectionBox.get(changedDimensionToFilterByBox);
singleDimensionFilteringSelectionPanel.add(selectionTable);
selectionTable.setWidth(singleDimensionFilteringSelectionPanel.getOffsetWidth() + "px");
selectionTable.setHeight("200px");
selectionTablesMappedBySelectionBox.put(changedDimensionToFilterByBox, selectionTable);
}
private Collection<?> getDimensionValuesFor(FunctionDTO selectedDimension) {
GroupKey selectedDimensionAsGroupKey = new GenericGroupKey<>(selectedDimension);
return dimensionValuesMappedByDimension.containsKey(selectedDimensionAsGroupKey) ? dimensionValuesMappedByDimension.get(selectedDimensionAsGroupKey) : new ArrayList<>();
}
private void removeDimensionToFilterByBox(ValueListBox<?> dimensionToFilterByBox) {
dimensionToFilterByBoxes.remove(dimensionToFilterByBox);
VerticalPanel singleDimensionFilterSelectionPanel = singleDimensionFilterSelectionPanelsMappedBySelectionBox.remove(dimensionToFilterByBox);
filterSelectionPanel.remove(singleDimensionFilterSelectionPanel);
selectionTablesMappedBySelectionBox.remove(dimensionToFilterByBox);
}
private void updateAcceptableValues() {
for (ValueListBox<FunctionDTO> dimensionToGroupByBox : dimensionToFilterByBoxes) {
List<FunctionDTO> acceptableValues = new ArrayList<FunctionDTO>(availableDimensions);
acceptableValues.removeAll(getDimensionsToFilterBy());
if (dimensionToGroupByBox.getValue() != null) {
acceptableValues.add(dimensionToGroupByBox.getValue());
}
Collections.sort(acceptableValues);
acceptableValues.add(null);
dimensionToGroupByBox.setAcceptableValues(acceptableValues);
}
}
private Collection<FunctionDTO> getDimensionsToFilterBy() {
Collection<FunctionDTO> dimensionsToFilterBy = new ArrayList<FunctionDTO>();
for (ValueListBox<FunctionDTO> dimensionListBox : dimensionToFilterByBoxes) {
if (dimensionListBox.getValue() != null) {
dimensionsToFilterBy.add(dimensionListBox.getValue());
}
}
return dimensionsToFilterBy;
}
private void clearFilterSelectionComponents() {
singleDimensionFilterSelectionPanelsMappedBySelectionBox.clear();
filterSelectionPanel.clear();
dimensionToFilterByBoxes.clear();
selectionTablesMappedBySelectionBox.clear();
}
public Map<FunctionDTO, Collection<? extends Serializable>> getFilterSelection() {
HashMap<FunctionDTO, Collection<? extends Serializable>> filterSelection = new HashMap<>();
for (SelectionTable<?> selectionTable : selectionTablesMappedBySelectionBox.values()) {
Collection<? extends Serializable> tableSelection = selectionTable.getSelectionAsValues();
if (!tableSelection.isEmpty()) {
filterSelection.put(selectionTable.getDimension(), tableSelection);
}
}
return filterSelection;
}
public void applySelection(Map<FunctionDTO, Collection<? extends Serializable>> filterSelection) {
if (!isDataAvailable()) {
filterSelectionToBeApplied = filterSelection;
} else {
clearFilterSelectionComponents();
ValueListBox<FunctionDTO> firstDimensionToFilterByBox = createDimensionToGroupByBox();
addDimensionToFilterByBox(firstDimensionToFilterByBox);
updateAcceptableValues();
int filterBoxIndex = 0;
for (Entry<FunctionDTO, Collection<? extends Serializable>> singleDimensionFilterSelection : filterSelection.entrySet()) {
ValueListBox<FunctionDTO> dimensionToFilterByBox = dimensionToFilterByBoxes.get(filterBoxIndex);
dimensionToFilterByBox.setValue(singleDimensionFilterSelection.getKey(), true);
selectionTablesMappedBySelectionBox.get(dimensionToFilterByBox).setSelection(singleDimensionFilterSelection.getValue());
}
}
}
private boolean isDataAvailable() {
return !dimensionValuesMappedByDimension.isEmpty();
}
public void clearSelection() {
for (SelectionTable<?> selectionTable : selectionTablesMappedBySelectionBox.values()) {
selectionTable.clearSelection();
}
}
public void addSelectionChangedListener(SelectionChangedListener listener) {
listeners.add(listener);
}
private void notifyListeners() {
for (SelectionChangedListener listener : listeners) {
listener.selectionChanged();
}
}
}
@@ -0,0 +1,8 @@
package com.sap.sailing.gwt.ui.datamining.selection;
interface SizeProvider {
public int getFreeWidthInPX();
public int getFreeHeightInPX();
}
@@ -16,6 +16,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.Test;
@@ -53,9 +55,9 @@ import com.sap.sse.i18n.ResourceBundleStringMessages;
public class TestProcessorQuery {
private final static ResourceBundleStringMessages stringMessages = TestsUtil.getTestStringMessagesWithProductiveMessages();
private final static ProcessorFactory processorFactory = new ProcessorFactory(ConcurrencyTestsUtil.getExecutor());
private static final Logger LOGGER = Logger.getLogger(TestProcessorQuery.class.getSimpleName());
private static final ResourceBundleStringMessages stringMessages = TestsUtil.getTestStringMessagesWithProductiveMessages();
private static final ProcessorFactory processorFactory = new ProcessorFactory(ConcurrencyTestsUtil.getExecutor());
private boolean receivedElementOrFinished;
private boolean receivedAbort;
@@ -200,6 +202,7 @@ public class TestProcessorQuery {
fail("The previous line should throw a timeout exception");
} catch (TimeoutException e) {
// A timeout exception is expected
LOGGER.log(Level.INFO, "The query timed out: ", e);
}
assertThat(query.getState(), is(QueryState.TIMED_OUT));
@@ -321,7 +324,7 @@ public class TestProcessorQuery {
}
@Test
public void testQueryWithSevereFailure() {
public void testQueryWithError() {
Query<Double> query = new ProcessorQuery<Double, Double>(0.0) {
@SuppressWarnings("unchecked")
@Override
@@ -351,10 +354,11 @@ public class TestProcessorQuery {
query.run();
fail("The previous line should throw a runtime exception");
} catch (RuntimeException e) {
// A RuntimeException wiht a RejectedExecitonException is expected
// A RuntimeException with a RejectedExecitonException as cause is expected
if (!(e.getCause() instanceof RejectedExecutionException)) {
throw e;
}
LOGGER.log(Level.INFO, "The query had an error: ", e);
}
assertThat(query.getState(), is(QueryState.ERROR));
}
@@ -190,16 +190,17 @@ public abstract class ProcessorQuery<AggregatedType, DataSourceType> implements
private void logOccuredFailuresAndThrowSevereFailure() {
for (Throwable failure : resultReceiver.getOccuredFailures()) {
LOGGER.log(Level.SEVERE, "An error occured during the processing of an instruction: ", failure);
LOGGER.log(Level.SEVERE, "A failure occured during the processing of an instruction: ", failure);
}
if (state == QueryState.ERROR) {
throw new RuntimeException("A severe failure occured during the processing of an instruction", resultReceiver.getSevereFailure());
throw new RuntimeException("An error occured during the processing of an instruction", resultReceiver.getSevereFailure());
}
}
@Override
public void abort() {
synchronized (monitorObject) {
LOGGER.log(Level.INFO, "Aborting the query processing");
state = QueryState.ABORTED;
monitorObject.notify();
}
@@ -0,0 +1,18 @@
package com.sap.sse.gwt.client.panels;
import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.user.client.ui.FlowPanel;
public class HorizontalFlowPanel extends FlowPanel {
public HorizontalFlowPanel() {
super();
getElement().getStyle().setFloat(Float.LEFT);
}
public HorizontalFlowPanel(String tag) {
super(tag);
getElement().getStyle().setFloat(Float.LEFT);
}
}