1 16 package com.google.gwt.user.client.ui; 17 18 import com.google.gwt.core.client.GWT; 19 import com.google.gwt.user.client.DOM; 20 import com.google.gwt.user.client.Element; 21 import com.google.gwt.user.client.Event; 22 23 import java.util.ArrayList ; 24 import java.util.Iterator ; 25 26 48 public final class DisclosurePanel extends Composite implements 49 FiresDisclosureEvents, HasWidgets { 50 51 56 private final class ClickableHeader extends SimplePanel { 57 58 private ClickableHeader() { 59 super(DOM.createAnchor()); 61 Element elem = getElement(); 62 DOM.setElementProperty(elem, "href", "javascript:void(0);"); 63 DOM.setStyleAttribute(elem, "display", "block"); 65 sinkEvents(Event.ONCLICK); 66 setStyleName(STYLENAME_HEADER); 67 } 68 69 public final void onBrowserEvent(Event event) { 70 switch (DOM.eventGetType(event)) { 72 case Event.ONCLICK: 73 DOM.eventPreventDefault(event); 75 setOpen(!isOpen); 76 } 77 } 78 } 79 80 83 private class DefaultHeader extends Widget implements HasText, 84 DisclosureHandler { 85 86 90 private final Element labelTD; 91 92 private final Image iconImage; 93 private final DisclosurePanelImages images; 94 95 private DefaultHeader(DisclosurePanelImages images, String text) { 96 this.images = images; 97 98 iconImage = isOpen ? images.disclosurePanelOpen().createImage() 99 : images.disclosurePanelClosed().createImage(); 100 101 Element root = DOM.createTable(); 103 Element tbody = DOM.createTBody(); 104 Element tr = DOM.createTR(); 105 final Element imageTD = DOM.createTD(); 106 labelTD = DOM.createTD(); 107 108 setElement(root); 109 110 DOM.appendChild(root, tbody); 111 DOM.appendChild(tbody, tr); 112 DOM.appendChild(tr, imageTD); 113 DOM.appendChild(tr, labelTD); 114 115 DOM.setElementProperty(imageTD, "align", "center"); 117 DOM.setElementProperty(imageTD, "valign", "middle"); 118 DOM.setStyleAttribute(imageTD, "width", iconImage.getWidth() + "px"); 119 120 DOM.appendChild(imageTD, iconImage.getElement()); 121 122 setText(text); 123 124 addEventHandler(this); 125 setStyle(); 126 } 127 128 public final String getText() { 129 return DOM.getInnerText(labelTD); 130 } 131 132 public final void onClose(DisclosureEvent event) { 133 setStyle(); 134 } 135 136 public final void onOpen(DisclosureEvent event) { 137 setStyle(); 138 } 139 140 public final void setText(String text) { 141 DOM.setInnerText(labelTD, text); 142 } 143 144 private void setStyle() { 145 if (isOpen) { 146 images.disclosurePanelOpen().applyTo(iconImage); 147 } else { 148 images.disclosurePanelClosed().applyTo(iconImage); 149 } 150 } 151 } 152 153 private static final String STYLENAME_DEFAULT = "gwt-DisclosurePanel"; 155 156 private static final String STYLENAME_SUFFIX_OPEN = "-open"; 157 158 private static final String STYLENAME_SUFFIX_CLOSED = "-closed"; 159 160 private static final String STYLENAME_HEADER = "header"; 161 162 private static final String STYLENAME_CONTENT = "content"; 163 164 private static DisclosurePanelImages createDefaultImages() { 165 return (DisclosurePanelImages) GWT.create(DisclosurePanelImages.class); 166 } 167 168 173 private final VerticalPanel mainPanel = new VerticalPanel(); 174 175 178 private final ClickableHeader header = new ClickableHeader(); 179 180 183 private Widget content; 184 185 private boolean isOpen = false; 186 187 191 private ArrayList handlers; 192 193 196 public DisclosurePanel() { 197 init(false); 198 } 199 200 209 public DisclosurePanel(DisclosurePanelImages images, String headerText, 210 boolean isOpen) { 211 init(isOpen); 212 setHeader(new DefaultHeader(images, headerText)); 213 } 214 215 221 public DisclosurePanel(String headerText) { 222 this(createDefaultImages(), headerText, false); 223 } 224 225 232 public DisclosurePanel(String headerText, boolean isOpen) { 233 this(createDefaultImages(), headerText, isOpen); 234 } 235 236 242 public DisclosurePanel(Widget header) { 243 this(header, false); 244 } 245 246 253 public DisclosurePanel(Widget header, boolean isOpen) { 254 init(isOpen); 255 setHeader(header); 256 } 257 258 public void add(Widget w) { 259 if (this.getContent() == null) { 260 setContent(w); 261 } else { 262 throw new IllegalStateException ( 263 "A DisclosurePanel can only contain two Widgets."); 264 } 265 } 266 267 273 public final void addEventHandler(DisclosureHandler handler) { 274 if (handlers == null) { 275 handlers = new ArrayList (); 276 } 277 handlers.add(handler); 278 } 279 280 public void clear() { 281 setContent(null); 282 } 283 284 289 public final Widget getContent() { 290 return content; 291 } 292 293 298 public final Widget getHeader() { 299 return header.getWidget(); 300 } 301 302 309 public final HasText getHeaderTextAccessor() { 310 Widget widget = header.getWidget(); 311 return (widget instanceof HasText) ? (HasText) widget : null; 312 } 313 314 319 public final boolean isOpen() { 320 return isOpen; 321 } 322 323 public Iterator iterator() { 324 return WidgetIterators.createWidgetIterator(this, 325 new Widget[] {getContent()}); 326 } 327 328 public boolean remove(Widget w) { 329 if (w == getContent()) { 330 setContent(null); 331 return true; 332 } 333 return false; 334 } 335 336 341 public final void removeEventHandler(DisclosureHandler handler) { 342 if (handlers == null) { 343 return; 344 } 345 handlers.remove(handler); 346 } 347 348 354 public final void setContent(Widget content) { 355 final Widget currentContent = this.content; 356 357 if (currentContent != null) { 359 mainPanel.remove(currentContent); 360 currentContent.removeStyleName(STYLENAME_CONTENT); 361 } 362 363 this.content = content; 365 if (content != null) { 366 mainPanel.add(content); 367 content.addStyleName(STYLENAME_CONTENT); 368 setContentDisplay(); 369 } 370 } 371 372 377 public final void setHeader(Widget headerWidget) { 378 header.setWidget(headerWidget); 379 } 380 381 387 public final void setOpen(boolean isOpen) { 388 if (this.isOpen != isOpen) { 389 this.isOpen = isOpen; 390 setContentDisplay(); 391 fireEvent(); 392 } 393 } 394 395 private void fireEvent() { 396 if (handlers == null) { 397 return; 398 } 399 400 DisclosureEvent event = new DisclosureEvent(this); 401 for (Iterator it = handlers.iterator(); it.hasNext();) { 402 DisclosureHandler handler = (DisclosureHandler) it.next(); 403 if (isOpen) { 404 handler.onOpen(event); 405 } else { 406 handler.onClose(event); 407 } 408 } 409 } 410 411 private void init(boolean isOpen) { 412 initWidget(mainPanel); 413 mainPanel.add(header); 414 this.isOpen = isOpen; 415 setStyleName(STYLENAME_DEFAULT); 416 setContentDisplay(); 417 } 418 419 private void setContentDisplay() { 420 String primaryStyleName = getStyleName(); 422 if (isOpen) { 423 removeStyleName(primaryStyleName + STYLENAME_SUFFIX_CLOSED); 424 addStyleName(primaryStyleName + STYLENAME_SUFFIX_OPEN); 425 } else { 426 removeStyleName(primaryStyleName + STYLENAME_SUFFIX_OPEN); 427 addStyleName(primaryStyleName + STYLENAME_SUFFIX_CLOSED); 428 } 429 430 if (content != null) { 431 content.setVisible(isOpen); 432 } 433 } 434 } 435 | Popular Tags |