package com.gwt.ui.client; import java.util.ArrayList; import java.util.List; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DeckPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class OutlookStackPanel extends Composite { private VerticalPanel container = new VerticalPanel(); private DeckPanel content = new DeckPanel(); private DeckPanel header = new DeckPanel(); private VerticalPanel footer = new VerticalPanel(); private List<Widget> buttons = new ArrayList<Widget>(); private List<Widget> headers = new ArrayList<Widget>(); private String DEFAULT_STYLE = "OutlookStack"; private String DEFAULT_HEADER_STYLE = "OutlookStackHeader"; private String DEFAULT_HEADER_INNER_STYLE = "OutlookStackHeaderInner"; private String DEFAULT_CONTENT_STYLE = "OutlookStackContent"; private String DEFAULT_HEADER_HIGHT = "31px"; private String DEFAULT_BUTTON_HIGHT = "31px"; private String DEFAULT_WIDTH = "100%"; /** * Creates an empty stack panel. */ public OutlookStackPanel() { content.setAnimationEnabled(true); content.setWidth(DEFAULT_WIDTH); container.setStyleName(DEFAULT_STYLE); header.setSize(DEFAULT_WIDTH, DEFAULT_HEADER_HIGHT); footer.setSize(DEFAULT_WIDTH, ""); ScrollPanel scroller = new ScrollPanel(); scroller.setAlwaysShowScrollBars(false); scroller.add(content); container.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP); container.add(header); container.add(scroller); container.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); container.add(footer); content.setAnimationEnabled(true); header.setStyleName(DEFAULT_HEADER_STYLE); initWidget(container); sinkEvents(Event.ONCLICK); sinkEvents(Event.ONMOUSEOVER); sinkEvents(Event.ONMOUSEOUT); } @Override public void setHeight(String height) { content.setHeight(height); } /* * Those methods may be better to put as abstract */ public Widget createHeader(String buttonName) { return new HTML("  " + buttonName); } public Widget createButton(String iconUrl, String buttonName) { return new HTML(( iconUrl != null ? "<img src=\""+iconUrl+"\"/> " + "  " : ("")) + buttonName); } /* * Main outlook stack panel methods */ public void add(Widget stackContent, String iconUrl, String buttonName) { insert(stackContent,iconUrl, buttonName, 0); // getWidgetCount() } public int getWidgetCount() { return buttons.size(); } public int getSelectedIndex() { return content.getVisibleWidget(); } public Widget getSelectedWidget() { if (content.getVisibleWidget() >= 0) { return content.getWidget(content.getVisibleWidget()); } else { return null; } } /* * OutlookStackPanel main implementation methods */ private void insert(Widget stackContent, String iconUrl, String buttonName, int beforeIndex) { Widget headerElem = createHeader(buttonName); Widget buttonElem = createButton(iconUrl, buttonName); headers.add(headerElem); buttons.add(buttonElem); header.add(headerElem); footer.add(buttonElem); content.add(stackContent); stackContent.getElement().removeAttribute("style"); if (headerElem != null) { headerElem.setStyleName(DEFAULT_HEADER_INNER_STYLE); headerElem.setHeight(DEFAULT_HEADER_HIGHT); } if (buttonElem != null) { buttonElem.setStyleName(DEFAULT_HEADER_STYLE); buttonElem.setHeight(DEFAULT_BUTTON_HIGHT); buttonElem.setWidth(DEFAULT_WIDTH); } if (stackContent.getStyleName() == null || ("").equals(stackContent.getStyleName().trim())) { stackContent.setStyleName(DEFAULT_CONTENT_STYLE); } content.showWidget(0); header.showWidget(0); } @Override public void onBrowserEvent(Event event) { Element target = Element.as(((NativeEvent)event).getEventTarget()); if (DOM.eventGetType(event) == Event.ONCLICK) { for (Widget widget : buttons) { if (widget.getElement() == target) { buttons.get(header.getVisibleWidget()).removeStyleDependentName("selected"); widget.addStyleDependentName("selected"); int index = buttons.indexOf(widget); if (index >= 0) { header.showWidget(index); content.showWidget(index); } } } } else if (DOM.eventGetType(event) == Event.ONMOUSEOVER) { for (Widget widget : buttons) { if (widget.getElement() == target) { widget.addStyleDependentName("over"); } } } else if (DOM.eventGetType(event) == Event.ONMOUSEOUT) { for (Widget widget : buttons) { if (widget.getElement() == target) { widget.removeStyleDependentName("over"); } } } super.onBrowserEvent(event); } }