introduction of a new interface "IsEmbeddableComponent" to enable UI components to render either as standalone view or as an embedded view (e.g. toolbar is rendered inside an external panel)

This commit is contained in:
fmittag committed 2012-01-25 11:19:01 +01:00
1 parent 8d8207443d
commit 670cf133be
8 files changed
+99 -78

No files matched your search

@@ -200,6 +200,11 @@ input.magnifier {
.collapsablePanel-closed {
}
.collapsablePanel-header-toolbar {
align: right;
padding: 3px;
}
.raceBoardPanelHeader {
}
@@ -58,6 +58,7 @@ import com.sap.sailing.gwt.ui.shared.LeaderboardRowDTO;
import com.sap.sailing.gwt.ui.shared.LegEntryDTO;
import com.sap.sailing.gwt.ui.shared.RaceInLeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.components.Component;
import com.sap.sailing.gwt.ui.shared.components.IsEmbeddableComponent;
import com.sap.sailing.gwt.ui.shared.components.SettingsDialog;
import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
@@ -68,7 +69,7 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
*
*/
public class LeaderboardPanel extends FormPanel implements TimeListener, PlayStateListener,
Component<LeaderboardSettings>, CompetitorSelectionChangeListener {
Component<LeaderboardSettings>, IsEmbeddableComponent, CompetitorSelectionChangeListener {
private static final int RANK_COLUMN_INDEX = 0;
private static final int SAIL_ID_COLUMN_INDEX = 1;
@@ -157,6 +158,12 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
*/
private final RaceIdentifier preSelectedRace;
private final VerticalPanel contentPanel;
private final DockPanel headerPanel;
private final HorizontalPanel refreshAndSettingsPanel;
private boolean isEmbedded = false;
private class SettingsClickHandler implements ClickHandler {
private final StringMessages stringConstants;
@@ -175,6 +182,26 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
return this;
}
@Override
public Widget getHeaderWidget() {
return headerPanel;
}
@Override
public Widget getContentWidget() {
return contentPanel;
}
@Override
public Widget getToolbarWidget() {
return refreshAndSettingsPanel;
}
@Override
public boolean isEmbedded() {
return isEmbedded;
}
public void updateSettings(LeaderboardSettings newSettings) {
List<ExpandableSortableColumn<?>> columnsToExpandAgain = new ArrayList<ExpandableSortableColumn<?>>();
for (int i = 0; i < getLeaderboardTable().getColumnCount(); i++) {
@@ -769,16 +796,16 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
getLeaderboardTable().addColumnSortHandler(listHandler);
loadCompleteLeaderboard(getLeaderboardDisplayDate());
VerticalPanel vp = new VerticalPanel();
DockPanel dockPanel = new DockPanel();
DockPanel dockPanel02 = new DockPanel();
dockPanel.setWidth("100%");
dockPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
dockPanel02.setWidth("100%");
dockPanel02.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
contentPanel = new VerticalPanel();
headerPanel = new DockPanel();
DockPanel toolbarPanel = new DockPanel();
headerPanel.setWidth("100%");
headerPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
toolbarPanel.setWidth("100%");
toolbarPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
Label leaderboardLabel = new Label(stringConstants.leaderboard() + " " + leaderboardName.toUpperCase());
leaderboardLabel.addStyleName("leaderboardLabel boldLabel");
dockPanel.add(leaderboardLabel, DockPanel.WEST);
headerPanel.add(leaderboardLabel, DockPanel.WEST);
ClickHandler playPauseHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
@@ -790,15 +817,15 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
}
}
};
HorizontalPanel refreshAndSettingsPanel = new HorizontalPanel();
refreshAndSettingsPanel = new HorizontalPanel();
refreshAndSettingsPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
HorizontalPanel refreshPanel = new HorizontalPanel();
refreshPanel.setSpacing(5);
refreshPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
refreshPanel.addStyleName("refreshPanel");
dockPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
dockPanel02.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
dockPanel02.addStyleName("refreshAndSettings");
headerPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
toolbarPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
toolbarPanel.addStyleName("refreshAndSettings");
playPause = new Anchor(getPlayPauseImgHtml(timer.isPlaying()));
playPause.addClickHandler(playPauseHandler);
playStateChanged(timer.isPlaying());
@@ -819,11 +846,15 @@ public class LeaderboardPanel extends FormPanel implements TimeListener, PlaySta
refreshAndSettingsPanel.add(chartsAnchor);
refreshAndSettingsPanel.add(refreshPanel);
refreshAndSettingsPanel.add(settingsAnchor);
dockPanel02.add(refreshAndSettingsPanel, DockPanel.EAST);
vp.add(dockPanel);
vp.add(dockPanel02);
vp.add(getLeaderboardTable());
setWidget(vp);
toolbarPanel.add(refreshAndSettingsPanel, DockPanel.EAST);
if(preSelectedRace == null) {
contentPanel.add(headerPanel);
contentPanel.add(toolbarPanel);
} else {
isEmbedded = true;
}
contentPanel.add(getLeaderboardTable());
setWidget(contentPanel);
}
private SafeHtml getPlayPauseImgHtml(boolean playing) {
@@ -8,6 +8,7 @@ import com.sap.sailing.gwt.ui.shared.components.Component;
import com.sap.sailing.gwt.ui.shared.components.ComponentGroup;
import com.sap.sailing.gwt.ui.shared.components.ComponentToolbar;
import com.sap.sailing.gwt.ui.shared.components.ComponentViewer;
import com.sap.sailing.gwt.ui.shared.components.IsEmbeddableComponent;
/**
* A GWT component that visualizes a {@link ComponentGroup} or a {@link Component} including menus to scroll quickly to the embedded view
@@ -24,7 +25,7 @@ public class CollapsableComponentViewer<SettingsType> implements ComponentViewer
private final StringMessages stringMessages;
private boolean hasHeaderToolbar = false;
private boolean hasHeaderToolbar = true;
public CollapsableComponentViewer(Component<SettingsType> component, String defaultWidth, String defaultHeight, StringMessages stringMessages) {
this.component = component;
@@ -53,9 +54,15 @@ public class CollapsableComponentViewer<SettingsType> implements ComponentViewer
collapsablePanel.setOpen(true);
if(hasHeaderToolbar) {
ComponentToolbar<SettingsType> toolbar = new ComponentToolbar<SettingsType>(component, stringMessages);
toolbar.addSettingsButton();
collapsablePanel.setHeaderToolbar(toolbar);
if(component instanceof IsEmbeddableComponent) {
IsEmbeddableComponent embeddableComponent = (IsEmbeddableComponent) component;
if(embeddableComponent.getToolbarWidget() != null)
collapsablePanel.setHeaderToolbar(embeddableComponent.getToolbarWidget());
} else {
ComponentToolbar<SettingsType> toolbar = new ComponentToolbar<SettingsType>(component, stringMessages);
toolbar.addSettingsButton();
collapsablePanel.setHeaderToolbar(toolbar);
}
}
contentPanel.setSize(defaultContentWidth, defaultContentHeight);
@@ -33,9 +33,7 @@ import com.sap.sailing.gwt.ui.leaderboard.LeaderboardSettings;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.RaceDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.components.Component;
import com.sap.sailing.gwt.ui.shared.components.ComponentViewer;
import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
/**
* A panel showing a list of components visualizing a race from the events announced by calls to {@link #fillEvents(List)}.
@@ -46,7 +44,7 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
* @author Frank Mittag, Axel Uhl (d043530)
*
*/
public class RaceBoardPanel extends FormPanel implements Component<RaceBoardSettings>, EventDisplayer, RaceSelectionChangeListener {
public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSelectionChangeListener {
private final SailingServiceAsync sailingService;
private final ErrorReporter errorReporter;
private String raceBoardName;
@@ -160,15 +158,6 @@ public class RaceBoardPanel extends FormPanel implements Component<RaceBoardSett
return timePanel;
}
@Override
public Widget getEntryWidget() {
return this;
}
public void updateSettings(RaceBoardSettings result) {
}
protected SailingServiceAsync getSailingService() {
return sailingService;
}
@@ -185,21 +174,6 @@ public class RaceBoardPanel extends FormPanel implements Component<RaceBoardSett
return errorReporter;
}
@Override
public String getLocalizedShortName() {
return null;
}
@Override
public boolean hasSettings() {
return true;
}
@Override
public SettingsDialogComponent<RaceBoardSettings> getSettingsDialogComponent() {
return null;
}
@Override
public void fillEvents(List<EventDTO> events) {
racesByIdentifier.clear();
@@ -1,5 +0,0 @@
package com.sap.sailing.gwt.ui.raceboard;
public class RaceBoardSettings {
}
@@ -57,6 +57,4 @@ public class SimpleComponentGroup<SettingsType> implements ComponentGroup<Settin
public Iterable<Component<?>> getComponents() {
return components;
}
}
@@ -16,13 +16,10 @@ import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasAnimation;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.SimplePanel;
@@ -173,6 +170,8 @@ public final class CollapsablePanel extends Composite implements HasWidgets.ForI
private static final String STYLENAME_HEADER = "collapsablePanel-header";
private static final String STYLENAME_HEADER_TOOLBAR = "collapsablePanel-header-toolbar";
private static final String STYLENAME_CONTENT = "collapsablePanel-content";
/**
@@ -192,12 +191,12 @@ public final class CollapsablePanel extends Composite implements HasWidgets.ForI
private final SimplePanel contentWrapper = new SimplePanel();
/**
* holds the header widget.
* The wrapper around the header widget.
*/
// private final DockPanel header = new DockPanel();
private final Grid header = new Grid(1,2);
private final SimplePanel headerWrapper = new SimplePanel();
private final FlowPanel embeddedHeader = new FlowPanel();
private final ClickableHeader clickableHeader = new ClickableHeader();
private boolean isAnimationEnabled = false;
@@ -210,14 +209,7 @@ public final class CollapsablePanel extends Composite implements HasWidgets.ForI
private CollapsablePanel() {
initWidget(mainPanel);
header.setWidth("100%");
// header.getCellFormatter().setWidth(0, 0, "50%");
// header.getCellFormatter().setWidth(0, 1, "50%");
header.getCellFormatter().setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);
header.getCellFormatter().setAlignment(0, 1, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
//header.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
mainPanel.add(header);
mainPanel.add(headerWrapper);
mainPanel.add(contentWrapper);
DOM.setStyleAttribute(contentWrapper.getElement(), "padding", "0px");
DOM.setStyleAttribute(contentWrapper.getElement(), "overflow", "hidden");
@@ -252,12 +244,17 @@ public final class CollapsablePanel extends Composite implements HasWidgets.ForI
}
private void setClickableHeader(Widget widget) {
clickableHeader.add(widget);
header.setWidget(0, 0, clickableHeader);
embeddedHeader.add(clickableHeader);
headerWrapper.setWidget(embeddedHeader);
}
public void setHeaderToolbar(HorizontalPanel toolbar) {
header.setWidget(0, 1, toolbar);
public void setHeaderToolbar(Widget toolbar) {
if (toolbar != null) {
embeddedHeader.add(toolbar);
}
}
public void add(Widget w) {
@@ -304,7 +301,7 @@ public final class CollapsablePanel extends Composite implements HasWidgets.ForI
* @return the widget currently being used as a header
*/
public Widget getHeader() {
return header.asWidget();
return headerWrapper.getWidget();
}
/**
@@ -314,7 +311,7 @@ public final class CollapsablePanel extends Composite implements HasWidgets.ForI
* @return a reference to the header widget if it implements {@link HasText}, <code>null</code> otherwise
*/
public HasText getHeaderTextAccessor() {
Widget widget = header.asWidget();
Widget widget = headerWrapper.getWidget();
return (widget instanceof HasText) ? (HasText) widget : null;
}
@@ -408,7 +405,7 @@ public final class CollapsablePanel extends Composite implements HasWidgets.ForI
@Override
protected void onEnsureDebugId(String baseID) {
super.onEnsureDebugId(baseID);
header.ensureDebugId(baseID + "-header");
headerWrapper.ensureDebugId(baseID + "-header");
}
private void fireEvent() {
@@ -0,0 +1,14 @@
package com.sap.sailing.gwt.ui.shared.components;
import com.google.gwt.user.client.ui.Widget;
public interface IsEmbeddableComponent {
Widget getHeaderWidget();
Widget getContentWidget();
Widget getToolbarWidget();
boolean isEmbedded();
}