package com.gwt.ui.client.groupboxpanel; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; public class AdvancedGroupBoxPanel extends FieldSetPanel { private boolean expended; private final InlineHTML caption; private final Image collapseButton; private final Tooltip collapseButtonTooltip; private Widget container; private LegendPanel legend; public AdvancedGroupBoxPanel(boolean collapsible) { super(); legend = new LegendPanel(); super.add(legend); this.caption = new InlineHTML(); Style captionStyle = caption.getElement().getStyle(); Style borderStyle = this.getElement().getStyle(); if (collapsible) { collapseButton = new Image(); collapseButtonTooltip = Tooltip.tooltip(collapseButton, tooltipText()); Element collapseButtonElement = collapseButton.getElement(); collapseButtonElement.getStyle().setProperty("cursor", "pointer"); collapseButtonElement.getStyle().setProperty("cursor", "hand"); collapseButtonElement.getStyle().setProperty("verticalAlign", "bottom"); captionStyle.setProperty("cursor", "hand"); legend.add(collapseButton); ClickHandler expandClickHandler = new ClickHandler() { public void onClick(ClickEvent event) { setExpanded(!isExpended()); } }; collapseButton.addClickHandler(expandClickHandler); caption.addClickHandler(expandClickHandler); setExpanded(true); } else { collapseButton = null; collapseButtonTooltip = null; borderStyle.setProperty("border", "1px solid"); } legend.add(caption); captionStyle.setProperty("padding", "5px 2px 2px 2px"); captionStyle.setProperty("verticalAlign", "top"); borderStyle.setProperty("margin", "3px"); } public void setTitleColor(String value) { legend.getElement().getStyle().setProperty("color", value); } public void setCaption(String text) { caption.setText(text); } public String getCaption() { return caption.getText(); } public <T extends Widget & HasWidgets> void setContainer(T c) { container = c; super.add(c); } @Override public void add(Widget w) { if (container == null) { super.add(container = new VerticalPanel()); } ((HasWidgets)container).add(w); } public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) { return addDomHandler(handler, KeyUpEvent.getType()); } private String tooltipText() { return isExpended() ? "Collapse" : "Expand"; } public boolean isExpended() { return expended; } public void setExpanded(boolean expended) { this.expended = expended; if (container != null) { container.setVisible(expended); } Style borderStyle = this.getElement().getStyle(); if (expended) { borderStyle.setProperty("border", "1px solid"); } else { borderStyle.setProperty("border", "none"); borderStyle.setProperty("borderTop", "1px solid"); } if (expended) { collapseButton.setUrl(GWT.getModuleBaseURL() + "images/groupBoxOpen.png"); } else { collapseButton.setUrl(GWT.getModuleBaseURL() + "images/groupBoxClose.png"); } collapseButtonTooltip.setTooltipText(tooltipText()); } }