mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-16 17:21:00 +00:00
Merge branch 'master' of ssh://sapsailing.com/home/trac/git
This commit is contained in:
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="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-servlet.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-user.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
</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 "${project_loc:com.sap.sailing.dashboards.gwt}" -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" path="1" type="4"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.gwt.ui/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/java" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.dashboards.gwt/src/main/resources" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.server/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="com.sap.sailing.dashboards.gwt"/> </runtimeClasspathEntry> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-servlet.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.google.gwt.osgi/lib/gwt-user.jar" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sailing.domain.common/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.moxieapps.gwt.highcharts/src" path="3" type="2"/> "/>
|
||||
<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/com.sap.sse.gwt.adminconsole/src" path="3" type="2"/> "/>
|
||||
</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 "${project_loc:com.sap.sailing.dashboards.gwt}" -startupUrl /dashboards/RibDashboard.html -noserver -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -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>
|
||||
@@ -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;
|
||||
}
|
||||
+2
@@ -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();
|
||||
}
|
||||
+4
-2
@@ -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
|
||||
+4
-2
@@ -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
|
||||
+4
-2
@@ -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
|
||||
+13
-25
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+7
@@ -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> {
|
||||
|
||||
}
|
||||
+2
-2
@@ -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);
|
||||
|
||||
-2
@@ -13,6 +13,4 @@ public interface QueryDefinitionProvider extends Component<Object> {
|
||||
public void addQueryDefinitionChangedListener(QueryDefinitionChangedListener listener);
|
||||
public void removeQueryDefinitionChangedListener(QueryDefinitionChangedListener listener);
|
||||
|
||||
public abstract SelectionProvider<?> getSelectionProvider();
|
||||
|
||||
}
|
||||
+180
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
+6
-5
@@ -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() {
|
||||
|
||||
+24
-37
@@ -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();
|
||||
|
||||
+180
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+61
-80
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+304
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
+9
-5
@@ -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;
|
||||
|
||||
|
||||
+249
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
-215
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
-317
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package com.sap.sailing.gwt.ui.datamining.selection;
|
||||
|
||||
interface SizeProvider {
|
||||
|
||||
public int getFreeWidthInPX();
|
||||
public int getFreeHeightInPX();
|
||||
|
||||
}
|
||||
+9
-5
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user