Implemented the ComponentLifecycle interface for perspectives

This commit is contained in:
fmittag committed 2016-01-18 18:00:52 +01:00
1 parent 0fad13cbec
commit 7e75ef90a9
43 files changed
+1166 -428

No files matched your search

@@ -0,0 +1,32 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.settings.Settings;
public class ComponentConstructionParameters<C extends Component<SettingsType>, SettingsType extends Settings, SDC extends SettingsDialogComponent<SettingsType>, CCA extends ComponentConstructorArgs<C, SettingsType>> {
private final ComponentLifecycle<C, SettingsType, SDC, CCA> componentLifecycle;
private final CCA componentConstructorArgs;
private final SettingsType settings;
public ComponentConstructionParameters(ComponentLifecycle<C, SettingsType, SDC, CCA> componentLifecycle,
CCA componentConstructorArgs, SettingsType settings) {
this.componentLifecycle = componentLifecycle;
this.componentConstructorArgs = componentConstructorArgs;
this.settings = settings;
}
public ComponentLifecycle<C, SettingsType, SDC, CCA> getComponentLifecycle() {
return componentLifecycle;
}
public SettingsType getSettings() {
return settings;
}
public ComponentConstructorArgs<C, SettingsType> getComponentConstructorArgs() {
return componentConstructorArgs;
}
public C createComponent() {
return componentLifecycle.createComponent(componentConstructorArgs, settings);
}
}
@@ -3,4 +3,5 @@ package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.settings.Settings;
public interface ComponentConstructorArgs<C extends Component<S>, S extends Settings> {
C createComponent(S settings);
}
@@ -7,18 +7,18 @@ import com.sap.sse.common.settings.Settings;
*
* @param <C> the component type
* @param <S> the settings type
* @param <W> the settings dialog component type
* @param <SDC> the settings dialog component type
*/
public interface ComponentLifecycle<C extends Component<S>, S extends Settings, SDC extends SettingsDialogComponent<S>> {
public interface ComponentLifecycle<C extends Component<S>, S extends Settings, SDC extends SettingsDialogComponent<S>, CCA extends ComponentConstructorArgs<C, S>> {
SDC getSettingsDialogComponent(S settings);
C getComponent();
S createDefaultSettings();
S cloneSettings(S settings);
C createComponent(CCA ComponentConstructorArgs, S settings);
/**
* @return the display name of the component
*/
@@ -0,0 +1,27 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.settings.Settings;
public class ComponentLifecycleAndSettings<SettingsType extends Settings> {
private final ComponentLifecycle<?, SettingsType, ?,?> componentLifecycle;
private SettingsType settings;
public ComponentLifecycleAndSettings(ComponentLifecycle<?, SettingsType, ?,?> componentLifecycle,
SettingsType settings) {
super();
this.componentLifecycle = componentLifecycle;
this.settings = settings;
}
public ComponentLifecycle<?, SettingsType, ?,?> getComponentLifecycle() {
return componentLifecycle;
}
public SettingsType getSettings() {
return settings;
}
public void setSettings(SettingsType settings) {
this.settings = settings;
}
}
@@ -0,0 +1,42 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.settings.Settings;
public class CompositeLifecycle {
public static class ComponentConstructionParameters<C extends Component<SettingsType>, SettingsType extends Settings> {
private final ComponentLifecycle<C, SettingsType, ?,?> componentLifecycle;
private final ComponentConstructorArgs<C, SettingsType> componentConstructorArgs;
private final SettingsType settings;
public ComponentConstructionParameters(ComponentLifecycle<C, SettingsType, ?,?> componentLifecycle,
ComponentConstructorArgs<C, SettingsType> componentConstructorArgs,
SettingsType settings) {
this.componentLifecycle = componentLifecycle;
this.componentConstructorArgs = componentConstructorArgs;
this.settings = settings;
}
public ComponentLifecycle<?, SettingsType, ?,?> getComponentLifecycle() {
return componentLifecycle;
}
public SettingsType getSettings() {
return settings;
}
public ComponentConstructorArgs<C, SettingsType> getComponentConstructorArgs() {
return componentConstructorArgs;
}
}
private final Iterable<ComponentConstructionParameters<?,?>> componentLifecycles;
public CompositeLifecycle(Iterable<ComponentConstructionParameters<?, ?>> componentLifecycles) {
this.componentLifecycles = componentLifecycles;
}
public Iterable<ComponentConstructionParameters<?, ?>> getComponentLifecycles() {
return componentLifecycles;
}
}
@@ -0,0 +1,15 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.common.settings.AbstractSettings;
public class CompositeLifecycleSettings extends AbstractSettings {
private final Iterable<ComponentLifecycleAndSettings<?>> settingsPerComponentLifecycle;
public CompositeLifecycleSettings(Iterable<ComponentLifecycleAndSettings<?>> settingsPerComponent) {
this.settingsPerComponentLifecycle = settingsPerComponent;
}
public Iterable<ComponentLifecycleAndSettings<?>> getSettingsPerComponentLifecycle() {
return settingsPerComponentLifecycle;
}
}
@@ -0,0 +1,94 @@
package com.sap.sse.gwt.client.shared.components;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
/**
* A component, that contains a collection of settings components in a tabbed panel.
*
* @author Frank (c5163874)
*/
public class CompositeLifecycleTabbedSettingsComponent implements Component<CompositeLifecycleSettings> {
private final Iterable<ComponentLifecycle<?,?,?,?>> componentLifecycles;
private final String title;
public CompositeLifecycleTabbedSettingsComponent(Iterable<ComponentLifecycle<?,?,?,?>> componentLifecycles) {
this(componentLifecycles, null);
}
public CompositeLifecycleTabbedSettingsComponent(Iterable<ComponentLifecycle<?,?,?,?>> componentLifecycles, String title) {
this.componentLifecycles = componentLifecycles;
this.title = title;
}
@Override
public boolean hasSettings() {
for (ComponentLifecycle<?,?,?,?> component : componentLifecycles) {
if (component.hasSettings()) {
return true;
}
}
return false;
}
@Override
public SettingsDialogComponent<CompositeLifecycleSettings> getSettingsDialogComponent() {
return new CompositeLifecycleTabbedSettingsDialogComponent(componentLifecycles);
}
@Override
public CompositeLifecycleSettings getSettings() {
return null;
}
@Override
public void updateSettings(CompositeLifecycleSettings newSettings) {
for (ComponentLifecycleAndSettings<?> componentAndSettings : newSettings.getSettingsPerComponentLifecycle()) {
updateSettings(componentAndSettings);
}
}
private <SettingsType extends Settings> void updateSettings(ComponentLifecycleAndSettings<SettingsType> componentLifecycleAndSettings) {
// componentLifecycleAndSettings.getA().updateSettings(componentLifecycleAndSettings.getB());
}
@Override
public String getLocalizedShortName() {
if (title != null && !title.isEmpty()) {
return title;
} else {
StringBuilder result = new StringBuilder();
boolean first = true;
for (ComponentLifecycle<?,?,?,?> component : componentLifecycles) {
if (first) {
first = false;
} else {
result.append(" / ");
}
result.append(component.getLocalizedShortName());
}
return result.toString();
}
}
@Override
public Widget getEntryWidget() {
throw new RuntimeException("Virtual composite component doesn't have a widget of its own");
}
@Override
public boolean isVisible() {
return false;
}
@Override
public void setVisible(boolean visibility) {
throw new RuntimeException("Virtual composite component doesn't know how to make itself visible");
}
@Override
public String getDependentCssClassName() {
return null;
}
}
@@ -0,0 +1,21 @@
package com.sap.sse.gwt.client.shared.components;
import com.sap.sse.gwt.client.StringMessages;
/**
* A composite settings dialog that combines the settings of several {@link Component}s, providing a tab
* for each component.
*
* @author Axel Uhl (d043530)
*
*/
public class CompositeLifecycleTabbedSettingsDialog extends SettingsDialog<CompositeLifecycleSettings> {
public CompositeLifecycleTabbedSettingsDialog(StringMessages stringConstants, final Iterable<ComponentLifecycle<?,?,?,?>> components, final String title) {
super(new CompositeLifecycleTabbedSettingsComponent(components, title), stringConstants);
}
public CompositeLifecycleTabbedSettingsDialog(StringMessages stringConstants, final Iterable<ComponentLifecycle<?,?,?,?>> components, final String title, DialogCallback<CompositeLifecycleSettings> callback) {
super(new CompositeLifecycleTabbedSettingsComponent(components, title), stringConstants, callback);
}
}
@@ -0,0 +1,80 @@
package com.sap.sse.gwt.client.shared.components;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.Util;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
public class CompositeLifecycleTabbedSettingsDialogComponent implements SettingsDialogComponent<CompositeLifecycleSettings> {
public class ComponentLifecycleAndDialogComponent<SettingsType extends Settings> extends Util.Pair<ComponentLifecycle<?, SettingsType, ?, ?>, SettingsDialogComponent<SettingsType>> {
private static final long serialVersionUID = -4342002423677523158L;
public ComponentLifecycleAndDialogComponent(ComponentLifecycle<?, SettingsType, ?, ?> a, SettingsDialogComponent<SettingsType> b) {
super(a, b);
}
}
private final Collection<ComponentLifecycleAndDialogComponent<?>> componentLifecycleAndDialogComponents;
public CompositeLifecycleTabbedSettingsDialogComponent(Iterable<ComponentLifecycle<?,?,?,?>> componentLifecycles) {
this.componentLifecycleAndDialogComponents = new ArrayList<>();
for (ComponentLifecycle<?,?,?,?> componentLifecycle : componentLifecycles) {
if (componentLifecycle.hasSettings()) {
this.componentLifecycleAndDialogComponents.add(createComponentLifecycleAndDialogComponent(componentLifecycle));
}
}
}
private <SettingsType extends Settings> ComponentLifecycleAndDialogComponent<SettingsType> createComponentLifecycleAndDialogComponent(ComponentLifecycle<?, SettingsType, ?, ?> componentLifecycle) {
SettingsType settings = componentLifecycle.createDefaultSettings();
return new ComponentLifecycleAndDialogComponent<SettingsType>(componentLifecycle, componentLifecycle.getSettingsDialogComponent(settings));
}
@Override
public Widget getAdditionalWidget(DataEntryDialog<?> dialog) {
TabPanel result = new TabPanel();
for (ComponentLifecycleAndDialogComponent<?> component : componentLifecycleAndDialogComponents) {
Widget w = component.getB().getAdditionalWidget((DataEntryDialog<?>) dialog);
result.add(w, component.getA().getLocalizedShortName());
}
result.selectTab(0);
return result;
}
@Override
public CompositeLifecycleSettings getResult() {
Collection<ComponentLifecycleAndSettings<?>> settings = new HashSet<>();
for (ComponentLifecycleAndDialogComponent<?> component : componentLifecycleAndDialogComponents) {
settings.add(getComponentAndSettings(component));
}
return new CompositeLifecycleSettings(settings);
}
private <SettingsType extends Settings> ComponentLifecycleAndSettings<SettingsType> getComponentAndSettings(ComponentLifecycleAndDialogComponent<SettingsType> component) {
return new ComponentLifecycleAndSettings<SettingsType>(component.getA(), component.getB().getResult());
}
@Override
public Validator<CompositeLifecycleSettings> getValidator() {
return new CompositeLifecycleValidator(componentLifecycleAndDialogComponents);
}
@Override
public FocusWidget getFocusWidget() {
for (ComponentLifecycleAndDialogComponent<?> component : componentLifecycleAndDialogComponents) {
FocusWidget fw = component.getB().getFocusWidget();
if (fw != null) {
return fw;
}
}
return null;
}
}
@@ -0,0 +1,46 @@
package com.sap.sse.gwt.client.shared.components;
import java.util.HashMap;
import java.util.Map;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.shared.components.CompositeLifecycleTabbedSettingsDialogComponent.ComponentLifecycleAndDialogComponent;
public class CompositeLifecycleValidator implements Validator<CompositeLifecycleSettings> {
private final Map<ComponentLifecycle<?,?,?,?>, Validator<?>> validatorsMappedByComponentLifecycle;
public CompositeLifecycleValidator(Iterable<ComponentLifecycleAndDialogComponent<?>> componentLifecycleAndDialogComponents) {
validatorsMappedByComponentLifecycle = new HashMap<>();
for (ComponentLifecycleAndDialogComponent<?> component : componentLifecycleAndDialogComponents) {
validatorsMappedByComponentLifecycle.put(component.getA(), component.getB().getValidator());
}
}
@Override
public String getErrorMessage(CompositeLifecycleSettings valueToValidate) {
StringBuilder result = new StringBuilder();
for (ComponentLifecycleAndSettings<?> componentAndSettings : valueToValidate.getSettingsPerComponentLifecycle()) {
final String errorMessage = getErrorMessage(componentAndSettings);
if (errorMessage != null && !errorMessage.isEmpty()) {
result.append(errorMessage);
}
}
return result.toString();
}
private <SettingsType extends Settings> String getErrorMessage(ComponentLifecycleAndSettings<SettingsType> componentLifecycleAndSettings) {
String errorMessage = null;
@SuppressWarnings("unchecked")
Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponentLifecycle.get(componentLifecycleAndSettings.getComponentLifecycle());
if (validator != null) {
errorMessage = validator.getErrorMessage(componentLifecycleAndSettings.getSettings());
if (errorMessage != null && !errorMessage.isEmpty() && !getClass().equals(validator.getClass())) {
errorMessage += "; ";
}
}
return errorMessage;
}
}
@@ -5,7 +5,6 @@ import com.sap.sse.common.settings.AbstractSettings;
import com.sap.sse.common.settings.Settings;
public class CompositeSettings extends AbstractSettings {
// TODO: Remove after lifecycle fix of datamining
public static class ComponentAndSettingsPair<SettingsType extends Settings> extends Util.Pair<Component<SettingsType>, SettingsType> {
private static final long serialVersionUID = -569811233041583043L;
@@ -14,57 +13,14 @@ public class CompositeSettings extends AbstractSettings {
}
}
public static class ComponentLifecycleAndSettingsPair<SettingsType extends Settings> {
private final ComponentLifecycle<?, SettingsType, ?> componentLifecycle;
private final SettingsType settings;
public ComponentLifecycleAndSettingsPair(ComponentLifecycle<?, SettingsType, ?> componentLifecycle,
SettingsType settings) {
super();
this.componentLifecycle = componentLifecycle;
this.settings = settings;
}
public ComponentLifecycle<?, SettingsType, ?> getComponentLifecycle() {
return componentLifecycle;
}
public SettingsType getSettings() {
return settings;
}
}
private final Iterable<ComponentLifecycleAndSettingsPair<?>> settingsPerComponentLifecycle;
private final Iterable<ComponentAndSettingsPair<?>> settingsPerComponent;
// TODO: Remove after lifecycle fix of datamining
public CompositeSettings(Iterable<ComponentAndSettingsPair<?>> settingsPerComponent, String x) {
this.settingsPerComponentLifecycle = null;
public CompositeSettings(Iterable<ComponentAndSettingsPair<?>> settingsPerComponent) {
this.settingsPerComponent = settingsPerComponent;
}
public CompositeSettings(Iterable<ComponentLifecycleAndSettingsPair<?>> settingsPerComponent) {
this.settingsPerComponentLifecycle = settingsPerComponent;
this.settingsPerComponent = null;
}
public Iterable<ComponentAndSettingsPair<?>> getSettingsPerComponent() {
return settingsPerComponent;
}
public Iterable<ComponentLifecycleAndSettingsPair<?>> getSettingsPerComponentLifecycle() {
return settingsPerComponentLifecycle;
}
@SuppressWarnings("unchecked")
public <SettingsType extends Settings> SettingsType getSettingsForType(Class<SettingsType> settingsType) {
SettingsType result = null;
for(ComponentLifecycleAndSettingsPair<?> componentAndSettings: settingsPerComponentLifecycle) {
if(componentAndSettings.getSettings().getClass().getName().equals(settingsType.getName())) {
result = (SettingsType) componentAndSettings.getSettings();
break;
}
}
return result;
}
}
@@ -2,7 +2,7 @@ package com.sap.sse.gwt.client.shared.components;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifecycleAndSettingsPair;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
/**
* A component, that contains a collection of settings components in a tabbed panel.
@@ -11,21 +11,21 @@ import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifec
*/
public class CompositeTabbedSettingsComponent implements Component<CompositeSettings> {
private final Iterable<ComponentLifecycle<?,?,?>> components;
private final Iterable<Component<?>> components;
private final String title;
public CompositeTabbedSettingsComponent(Iterable<ComponentLifecycle<?,?,?>> components) {
public CompositeTabbedSettingsComponent(Iterable<Component<?>> components) {
this(components, null);
}
public CompositeTabbedSettingsComponent(Iterable<ComponentLifecycle<?,?,?>> components, String title) {
public CompositeTabbedSettingsComponent(Iterable<Component<?>> components, String title) {
this.components = components;
this.title = title;
}
@Override
public boolean hasSettings() {
for (ComponentLifecycle<?,?,?> component : components) {
for (Component<?> component : components) {
if (component.hasSettings()) {
return true;
}
@@ -45,18 +45,13 @@ public class CompositeTabbedSettingsComponent implements Component<CompositeSett
@Override
public void updateSettings(CompositeSettings newSettings) {
for (CompositeSettings.ComponentLifecycleAndSettingsPair<?> componentAndSettings : newSettings.getSettingsPerComponentLifecycle()) {
for (CompositeSettings.ComponentAndSettingsPair<?> componentAndSettings : newSettings.getSettingsPerComponent()) {
updateSettings(componentAndSettings);
}
}
private <SettingsType extends Settings> void updateSettings(ComponentLifecycleAndSettingsPair<SettingsType> componentLifecycleAndSettings) {
ComponentLifecycle<?, SettingsType, ?> componentLifecycle = componentLifecycleAndSettings.getComponentLifecycle();
if(componentLifecycle.getComponent() != null) {
componentLifecycle.getComponent().updateSettings(componentLifecycleAndSettings.getSettings());
} else {
// ??? store in lifecycle
}
private <SettingsType extends Settings> void updateSettings(ComponentAndSettingsPair<SettingsType> componentAndSettings) {
componentAndSettings.getA().updateSettings(componentAndSettings.getB());
}
@Override
@@ -66,7 +61,7 @@ public class CompositeTabbedSettingsComponent implements Component<CompositeSett
} else {
StringBuilder result = new StringBuilder();
boolean first = true;
for (ComponentLifecycle<?,?,?> component : components) {
for (Component<?> component : components) {
if (first) {
first = false;
} else {
@@ -97,4 +92,4 @@ public class CompositeTabbedSettingsComponent implements Component<CompositeSett
public String getDependentCssClassName() {
return null;
}
}
}
@@ -10,12 +10,13 @@ import com.sap.sse.gwt.client.StringMessages;
*
*/
public class CompositeTabbedSettingsDialog extends SettingsDialog<CompositeSettings> {
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<Component<?>> components) {
this(stringConstants, components, null);
}
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<ComponentLifecycle<?,?,?>> components, final String title) {
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<Component<?>> components, final String title) {
super(new CompositeTabbedSettingsComponent(components, title), stringConstants);
}
public CompositeTabbedSettingsDialog(StringMessages stringConstants, final Iterable<ComponentLifecycle<?,?,?>> components, final String title, DialogCallback<CompositeSettings> callback) {
super(new CompositeTabbedSettingsComponent(components, title), stringConstants, callback);
}
}
@@ -11,43 +11,38 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifecycleAndSettingsPair;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
public class CompositeTabbedSettingsDialogComponent implements SettingsDialogComponent<CompositeSettings> {
public class ComponentLifecycleAndDialogComponent<SettingsType extends Settings> extends Util.Pair<ComponentLifecycle<?, SettingsType, ?>, SettingsDialogComponent<SettingsType>> {
public class ComponentAndDialogComponent<SettingsType extends Settings> extends Util.Pair<Component<SettingsType>, SettingsDialogComponent<SettingsType>> {
private static final long serialVersionUID = -4342002423677523158L;
public ComponentLifecycleAndDialogComponent(ComponentLifecycle<?, SettingsType, ?> a, SettingsDialogComponent<SettingsType> b) {
public ComponentAndDialogComponent(Component<SettingsType> a, SettingsDialogComponent<SettingsType> b) {
super(a, b);
}
}
private final Collection<ComponentLifecycleAndDialogComponent<?>> components;
private final Collection<ComponentAndDialogComponent<?>> components;
// TODO: Remove after lifecycle fix of datamining
public CompositeTabbedSettingsDialogComponent(Iterable<Component<?>> components, String todo) {
public CompositeTabbedSettingsDialogComponent(Iterable<Component<?>> components) {
this.components = new ArrayList<>();
}
public CompositeTabbedSettingsDialogComponent(Iterable<ComponentLifecycle<?,?,?>> components) {
this.components = new ArrayList<>();
for (ComponentLifecycle<?,?,?> componentLifecycle : components) {
if (componentLifecycle.hasSettings()) {
this.components.add(createComponentLifecycleAndDialogComponent(componentLifecycle));
for (Component<?> component : components) {
if (component.hasSettings()) {
this.components.add(createComponentAndDialogComponent(component));
}
}
}
private <SettingsType extends Settings> ComponentLifecycleAndDialogComponent<SettingsType> createComponentLifecycleAndDialogComponent(ComponentLifecycle<?, SettingsType, ?> componentLifecycle) {
SettingsType settings = componentLifecycle.getComponent() != null ? componentLifecycle.getComponent().getSettings() : componentLifecycle.createDefaultSettings();
return new ComponentLifecycleAndDialogComponent<SettingsType>(componentLifecycle, componentLifecycle.getSettingsDialogComponent(settings));
private <SettingsType extends Settings> ComponentAndDialogComponent<SettingsType> createComponentAndDialogComponent(Component<SettingsType> component) {
return new ComponentAndDialogComponent<SettingsType>(component, component.getSettingsDialogComponent());
}
@Override
public Widget getAdditionalWidget(DataEntryDialog<?> dialog) {
TabPanel result = new TabPanel();
for (ComponentLifecycleAndDialogComponent<?> component : components) {
for (ComponentAndDialogComponent<?> component : components) {
Widget w = component.getB().getAdditionalWidget((DataEntryDialog<?>) dialog);
result.add(w, component.getA().getLocalizedShortName());
}
@@ -57,15 +52,15 @@ public class CompositeTabbedSettingsDialogComponent implements SettingsDialogCom
@Override
public CompositeSettings getResult() {
Collection<ComponentLifecycleAndSettingsPair<?>> settings = new HashSet<>();
for (ComponentLifecycleAndDialogComponent<?> component : components) {
Collection<ComponentAndSettingsPair<?>> settings = new HashSet<>();
for (ComponentAndDialogComponent<?> component : components) {
settings.add(getComponentAndSettings(component));
}
return new CompositeSettings(settings);
}
private <SettingsType extends Settings> ComponentLifecycleAndSettingsPair<SettingsType> getComponentAndSettings(ComponentLifecycleAndDialogComponent<SettingsType> component) {
return new ComponentLifecycleAndSettingsPair<SettingsType>(component.getA(), component.getB().getResult());
private <SettingsType extends Settings> ComponentAndSettingsPair<SettingsType> getComponentAndSettings(ComponentAndDialogComponent<SettingsType> component) {
return new ComponentAndSettingsPair<SettingsType>(component.getA(), component.getB().getResult());
}
@Override
@@ -75,7 +70,7 @@ public class CompositeTabbedSettingsDialogComponent implements SettingsDialogCom
@Override
public FocusWidget getFocusWidget() {
for (ComponentLifecycleAndDialogComponent<?> component : components) {
for (ComponentAndDialogComponent<?> component : components) {
FocusWidget fw = component.getB().getFocusWidget();
if (fw != null) {
return fw;
@@ -5,16 +5,16 @@ import java.util.Map;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifecycleAndSettingsPair;
import com.sap.sse.gwt.client.shared.components.CompositeTabbedSettingsDialogComponent.ComponentLifecycleAndDialogComponent;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
import com.sap.sse.gwt.client.shared.components.CompositeTabbedSettingsDialogComponent.ComponentAndDialogComponent;
public class CompositeValidator implements Validator<CompositeSettings> {
private final Map<ComponentLifecycle<?,?,?>, Validator<?>> validatorsMappedByComponent;
private final Map<Component<?>, Validator<?>> validatorsMappedByComponent;
public CompositeValidator(Iterable<ComponentLifecycleAndDialogComponent<?>> componentsAndDialogComponents) {
public CompositeValidator(Iterable<ComponentAndDialogComponent<?>> componentsAndDialogComponents) {
validatorsMappedByComponent = new HashMap<>();
for (ComponentLifecycleAndDialogComponent<?> component : componentsAndDialogComponents) {
for (ComponentAndDialogComponent<?> component : componentsAndDialogComponents) {
validatorsMappedByComponent.put(component.getA(), component.getB().getValidator());
}
}
@@ -22,7 +22,7 @@ public class CompositeValidator implements Validator<CompositeSettings> {
@Override
public String getErrorMessage(CompositeSettings valueToValidate) {
StringBuilder result = new StringBuilder();
for (ComponentLifecycleAndSettingsPair<?> componentAndSettings : valueToValidate.getSettingsPerComponentLifecycle()) {
for (ComponentAndSettingsPair<?> componentAndSettings : valueToValidate.getSettingsPerComponent()) {
final String errorMessage = getErrorMessage(componentAndSettings);
if (errorMessage != null && !errorMessage.isEmpty()) {
result.append(errorMessage);
@@ -31,12 +31,12 @@ public class CompositeValidator implements Validator<CompositeSettings> {
return result.toString();
}
private <SettingsType extends Settings> String getErrorMessage(ComponentLifecycleAndSettingsPair<SettingsType> componentAndSettings) {
private <SettingsType extends Settings> String getErrorMessage(ComponentAndSettingsPair<SettingsType> componentAndSettings) {
String errorMessage = null;
@SuppressWarnings("unchecked")
Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentAndSettings.getComponentLifecycle());
Validator<SettingsType> validator = (Validator<SettingsType>) validatorsMappedByComponent.get(componentAndSettings.getA());
if (validator != null) {
errorMessage = validator.getErrorMessage(componentAndSettings.getSettings());
errorMessage = validator.getErrorMessage(componentAndSettings.getB());
if (errorMessage != null && !errorMessage.isEmpty() && !getClass().equals(validator.getClass())) {
errorMessage += "; ";
}
@@ -0,0 +1,65 @@
package com.sap.sse.gwt.client.shared.components;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.StringMessages;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class LifecycleSettingsDialog<SettingsType extends Settings> extends DataEntryDialog<SettingsType> {
private final SettingsDialogComponent<SettingsType> settingsDialogComponent;
public LifecycleSettingsDialog(final ComponentLifecycle<? ,SettingsType, ?, ?> componentLifecycle, SettingsDialogComponent<SettingsType> dialogComponent,
StringMessages stringMessages, DialogCallback<SettingsType> callback) {
this(componentLifecycle, dialogComponent, stringMessages, /* animationEnabled */ true, callback);
}
/**
* This auxiliary constructor is required to avoid duplicate calls to {@link ComponentLifecycle#getSettingsDialogComponent()}
* which may choose to create a new instance each call. Such duplicate instances would cause the validator to
* operate on a different instance as the one used for displaying, hence not allowing the validator to use the UI
* elements, neither for update nor read.
*/
private LifecycleSettingsDialog(final ComponentLifecycle<?, SettingsType, ?, ?> componentLifecycle,
SettingsDialogComponent<SettingsType> dialogComponent, StringMessages stringMessages,
boolean animationEnabled, final DialogCallback<SettingsType> callback) {
super(stringMessages.settingsForComponent(componentLifecycle.getLocalizedShortName()), null, stringMessages.ok(),
stringMessages.cancel(), dialogComponent.getValidator(), animationEnabled,
new DialogCallback<SettingsType>() {
@Override
public void cancel() {
if(callback != null) {
callback.cancel();
}
}
@Override
public void ok(SettingsType newSettings) {
if(callback != null) {
callback.ok(newSettings);
}
}
});
this.settingsDialogComponent = dialogComponent;
}
@Override
protected Widget getAdditionalWidget() {
return settingsDialogComponent.getAdditionalWidget(this);
}
@Override
protected SettingsType getResult() {
return settingsDialogComponent.getResult();
}
@Override
public void show() {
super.show();
FocusWidget focusWidget = settingsDialogComponent.getFocusWidget();
if (focusWidget != null) {
focusWidget.setFocus(true);
}
}
}
@@ -6,9 +6,9 @@ import java.util.HashSet;
import java.util.List;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifecycleAndSettingsPair;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
/**
* An abstract base class for perspectives.
@@ -17,51 +17,41 @@ import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifec
*/
public abstract class AbstractPerspective<SettingsType extends Settings> implements Perspective<SettingsType> {
protected final List<ComponentLifecycle<?,?,?>> componentLifecycles;
protected final List<Component<?>> components;
public AbstractPerspective() {
componentLifecycles = new ArrayList<ComponentLifecycle<?,?,?>>();
public AbstractPerspective(Collection<Component<?>> components) {
this.components = new ArrayList<>(components);
}
@Override
public CompositeSettings getSettingsOfComponents() {
Collection<ComponentLifecycleAndSettingsPair<?>> settings = new HashSet<>();
for (ComponentLifecycle<?,?,?> component : componentLifecycles) {
ComponentLifecycleAndSettingsPair<?> componentLifecycleAndSettings = getComponentLifecycleAndSettings(component);
if (componentLifecycleAndSettings != null) {
settings.add(componentLifecycleAndSettings);
Collection<ComponentAndSettingsPair<?>> settings = new HashSet<>();
for (Component<?> component : components) {
ComponentAndSettingsPair<?> componentAndSettings = getComponentAndSettings(component);
if (componentAndSettings != null) {
settings.add(componentAndSettings);
}
}
return new CompositeSettings(settings);
}
private <ComponentSettingsType extends Settings> ComponentLifecycleAndSettingsPair<ComponentSettingsType> getComponentLifecycleAndSettings(ComponentLifecycle<?, ComponentSettingsType, ?> componentLifecycle) {
ComponentLifecycleAndSettingsPair<ComponentSettingsType> result = null;
if(componentLifecycle.hasSettings()) {
ComponentSettingsType settings = componentLifecycle.getComponent() != null ? componentLifecycle.getComponent().getSettings() : componentLifecycle.createDefaultSettings();
result = new ComponentLifecycleAndSettingsPair<ComponentSettingsType>(componentLifecycle, settings);
private <ComponentSettingsType extends Settings> ComponentAndSettingsPair<ComponentSettingsType> getComponentAndSettings(Component<ComponentSettingsType> component) {
ComponentAndSettingsPair<ComponentSettingsType> result = null;
if(component.hasSettings()) {
result = new ComponentAndSettingsPair<ComponentSettingsType>(component, component.getSettings());
}
return result;
}
@Override
public void updateSettingsOfComponents(CompositeSettings newSettings) {
for (CompositeSettings.ComponentLifecycleAndSettingsPair<?> componentLifecycleAndSettings : newSettings.getSettingsPerComponentLifecycle()) {
updateSettings(componentLifecycleAndSettings);
for (CompositeSettings.ComponentAndSettingsPair<?> componentAndSettings : newSettings.getSettingsPerComponent()) {
updateSettings(componentAndSettings);
}
}
private <ComponentSettingsType extends Settings> void updateSettings(ComponentLifecycleAndSettingsPair<ComponentSettingsType> componentLifecycleAndSettings) {
ComponentLifecycle<?, ComponentSettingsType, ?> componentLifecycle = componentLifecycleAndSettings.getComponentLifecycle();
if(componentLifecycle.getComponent() != null) {
componentLifecycle.getComponent().updateSettings(componentLifecycleAndSettings.getSettings());
} else {
// ??? store in lifecycle
}
}
@Override
public Iterable<ComponentLifecycle<?,?,?>> getComponentLifecycles() {
return componentLifecycles;
private <ComponentSettingsType extends Settings> void updateSettings(ComponentAndSettingsPair<ComponentSettingsType> componentAndSettings) {
Component<ComponentSettingsType> component = componentAndSettings.getA();
component.updateSettings(componentAndSettings.getB());
}
}
@@ -8,9 +8,9 @@ import java.util.List;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifecycleAndSettingsPair;
import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentAndSettingsPair;
/**
* An abstract base class for perspectives with a widget.
@@ -19,17 +19,17 @@ import com.sap.sse.gwt.client.shared.components.CompositeSettings.ComponentLifec
*/
public abstract class AbstractPerspectiveComposite<SettingsType extends Settings> extends Composite implements Perspective<SettingsType> {
protected final List<ComponentLifecycle<?,?,?>> componentLifecycles;
protected final List<Component<?>> components;
public AbstractPerspectiveComposite() {
componentLifecycles = new ArrayList<ComponentLifecycle<?,?,?>>();
this.components = new ArrayList<>();
}
@Override
public CompositeSettings getSettingsOfComponents() {
Collection<ComponentLifecycleAndSettingsPair<?>> settings = new HashSet<>();
for (ComponentLifecycle<?,?,?> componentLifecycle : componentLifecycles) {
ComponentLifecycleAndSettingsPair<?> componentAndSettings = getComponentLifecycleAndSettings(componentLifecycle);
Collection<ComponentAndSettingsPair<?>> settings = new HashSet<>();
for (Component<?> component : components) {
ComponentAndSettingsPair<?> componentAndSettings = getComponentAndSettings(component);
if (componentAndSettings != null) {
settings.add(componentAndSettings);
}
@@ -37,34 +37,24 @@ public abstract class AbstractPerspectiveComposite<SettingsType extends Settings
return new CompositeSettings(settings);
}
private <ComponentSettingsType extends Settings> ComponentLifecycleAndSettingsPair<ComponentSettingsType> getComponentLifecycleAndSettings(ComponentLifecycle<?, ComponentSettingsType, ?> componentLifecycle) {
ComponentLifecycleAndSettingsPair<ComponentSettingsType> result = null;
if(componentLifecycle.hasSettings()) {
ComponentSettingsType settings = componentLifecycle.getComponent() != null ? componentLifecycle.getComponent().getSettings() : componentLifecycle.createDefaultSettings();
result = new ComponentLifecycleAndSettingsPair<ComponentSettingsType>(componentLifecycle, settings);
private <ComponentSettingsType extends Settings> ComponentAndSettingsPair<ComponentSettingsType> getComponentAndSettings(Component<ComponentSettingsType> component) {
ComponentAndSettingsPair<ComponentSettingsType> result = null;
if(component.hasSettings()) {
result = new ComponentAndSettingsPair<ComponentSettingsType>(component, component.getSettings());
}
return result;
}
@Override
public void updateSettingsOfComponents(CompositeSettings newSettings) {
for (CompositeSettings.ComponentLifecycleAndSettingsPair<?> componentAndSettings : newSettings.getSettingsPerComponentLifecycle()) {
for (CompositeSettings.ComponentAndSettingsPair<?> componentAndSettings : newSettings.getSettingsPerComponent()) {
updateSettings(componentAndSettings);
}
}
private <ComponentSettingsType extends Settings> void updateSettings(ComponentLifecycleAndSettingsPair<ComponentSettingsType> componentLifecycleAndSettings) {
ComponentLifecycle<?, ComponentSettingsType, ?> componentLifecycle = componentLifecycleAndSettings.getComponentLifecycle();
if(componentLifecycle.getComponent() != null) {
componentLifecycle.getComponent().updateSettings(componentLifecycleAndSettings.getSettings());
} else {
// ??? store in lifecycle
}
}
@Override
public Iterable<ComponentLifecycle<?,?,?>> getComponentLifecycles() {
return componentLifecycles;
private <ComponentSettingsType extends Settings> void updateSettings(ComponentAndSettingsPair<ComponentSettingsType> componentAndSettings) {
Component<ComponentSettingsType> component = componentAndSettings.getA();
component.updateSettings(componentAndSettings.getB());
}
@Override
@@ -0,0 +1,33 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.util.ArrayList;
import java.util.List;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* An abstract base class for perspective lifecycles.
* @author Frank
*
*/
public abstract class AbstractPerspectiveLifecycle<P extends Perspective<S>, S extends Settings, SDP extends SettingsDialogComponent<S>, PCA extends PerspectiveConstructorArgs<P, S>>
implements PerspectiveLifecycle<P, S, SDP, PCA> {
protected final List<ComponentLifecycle<?,?,?,?>> componentLifecycles;
public AbstractPerspectiveLifecycle() {
componentLifecycles = new ArrayList<>();
}
@Override
public Iterable<ComponentLifecycle<?,?,?,?>> getComponentLifecycles() {
return componentLifecycles;
}
@Override
public String getPerspectiveName() {
return getLocalizedShortName();
}
}
@@ -1,10 +1,17 @@
package com.sap.sse.gwt.client.shared.perspective;
import java.util.Collection;
import com.sap.sse.common.settings.AbstractSettings;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
public abstract class AbstractPerspectiveWithoutSettings extends AbstractPerspective<AbstractSettings> {
public AbstractPerspectiveWithoutSettings(Collection<Component<?>> components) {
super(components);
}
@Override
public boolean hasSettings() {
return false;
@@ -2,7 +2,6 @@ package com.sap.sse.gwt.client.shared.perspective;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.Component;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.CompositeSettings;
/**
@@ -12,13 +11,10 @@ import com.sap.sse.gwt.client.shared.components.CompositeSettings;
*
*/
public interface Perspective<SettingsType extends Settings> extends Component<SettingsType> {
Iterable<ComponentLifecycle<?,?,?>> getComponentLifecycles();
CompositeSettings getSettingsOfComponents();
void updateSettingsOfComponents(CompositeSettings settingsOfComponents);
void setSettingsOfComponents(CompositeSettings settingsOfComponents);
String getPerspectiveName();
}
@@ -0,0 +1,7 @@
package com.sap.sse.gwt.client.shared.perspective;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentConstructorArgs;
public interface PerspectiveConstructorArgs<P extends Perspective<S>, S extends Settings> extends ComponentConstructorArgs<P, S> {
}
@@ -0,0 +1,22 @@
package com.sap.sse.gwt.client.shared.perspective;
import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* A lifecycle interface for perspectives
* @author Frank
*
* @param <P> the perspective type
* @param <S> the settings type
* @param <SDP> the settings dialog component type
*/
public interface PerspectiveLifecycle<P extends Perspective<S>, S extends Settings, SDP extends SettingsDialogComponent<S>,
PCA extends PerspectiveConstructorArgs<P, S>> extends ComponentLifecycle<P, S, SDP, PCA> {
Iterable<ComponentLifecycle<?,?,?,?>> getComponentLifecycles();
P createComponent(PCA PerspectiveConstructorArgs, S settings);
String getPerspectiveName();
}