1 16 package com.google.gwt.user.client.ui; 17 18 import com.google.gwt.user.client.DOM; 19 import com.google.gwt.user.client.Element; 20 21 import java.util.ArrayList ; 22 import java.util.List ; 23 24 32 public class TreeItem extends UIObject implements HasHTML { 33 34 38 class ContentPanel extends SimplePanel { 39 private ContentPanel(Element e) { 40 super(e); 41 } 42 43 49 TreeItem getTreeItem() { 50 return TreeItem.this; 51 } 52 53 58 void setParent(Widget widget) { 59 throw new UnsupportedOperationException ( 60 "Cannot directly setParent on a WidgetTreeItem's ContentPanel"); 61 } 62 63 void treeSetParent(Widget widget) { 64 super.setParent(widget); 65 } 66 } 67 68 private ArrayList children = new ArrayList (); 69 private ContentPanel contentPanel; 70 private Element itemTable, contentElem, childSpanElem; 71 private final Image statusImage = new Image(); 72 private boolean open; 73 private TreeItem parent; 74 private boolean selected; 75 private Object userObject; 76 private Tree tree; 77 78 81 public TreeItem() { 82 setElement(DOM.createDiv()); 83 itemTable = DOM.createTable(); 84 contentElem = DOM.createSpan(); 85 childSpanElem = DOM.createSpan(); 86 87 98 Element tbody = DOM.createTBody(), tr = DOM.createTR(); 99 Element tdImg = DOM.createTD(), tdContent = DOM.createTD(); 100 DOM.appendChild(itemTable, tbody); 101 DOM.appendChild(tbody, tr); 102 DOM.appendChild(tr, tdImg); 103 DOM.appendChild(tr, tdContent); 104 DOM.setStyleAttribute(tdImg, "verticalAlign", "middle"); 105 DOM.setStyleAttribute(tdContent, "verticalAlign", "middle"); 106 107 DOM.appendChild(getElement(), itemTable); 108 DOM.appendChild(getElement(), childSpanElem); 109 DOM.appendChild(tdImg, statusImage.getElement()); 110 DOM.appendChild(tdContent, contentElem); 111 112 DOM.setStyleAttribute(contentElem, "display", "inline"); 113 DOM.setStyleAttribute(getElement(), "whiteSpace", "nowrap"); 114 DOM.setStyleAttribute(childSpanElem, "whiteSpace", "nowrap"); 115 setStyleName(contentElem, "gwt-TreeItem", true); 116 } 117 118 123 public TreeItem(String html) { 124 this(); 125 setHTML(html); 126 } 127 128 133 public TreeItem(Widget widget) { 134 this(); 135 setWidget(widget); 136 } 137 138 144 public TreeItem addItem(String itemText) { 145 TreeItem ret = new TreeItem(itemText); 146 addItem(ret); 147 return ret; 148 } 149 150 155 156 public void addItem(TreeItem item) { 157 if ((item.getParentItem() != null) || (item.getTree() != null)) { 160 item.remove(); 161 } 162 item.setTree(tree); 163 item.setParentItem(this); 164 children.add(item); 165 DOM.setStyleAttribute(item.getElement(), "marginLeft", "16px"); 166 DOM.appendChild(childSpanElem, item.getElement()); 167 if (children.size() == 1) { 168 updateState(); 169 } 170 } 171 172 178 public TreeItem addItem(Widget widget) { 179 TreeItem ret = new TreeItem(widget); 180 addItem(ret); 181 return ret; 182 } 183 184 190 191 public TreeItem getChild(int index) { 192 if ((index < 0) || (index >= children.size())) { 193 return null; 194 } 195 196 return (TreeItem) children.get(index); 197 } 198 199 204 205 public int getChildCount() { 206 return children.size(); 207 } 208 209 215 216 public int getChildIndex(TreeItem child) { 217 return children.indexOf(child); 218 } 219 220 public String getHTML() { 221 return DOM.getInnerHTML(contentElem); 222 } 223 224 229 public TreeItem getParentItem() { 230 return parent; 231 } 232 233 238 public boolean getState() { 239 return open; 240 } 241 242 public String getText() { 243 return DOM.getInnerText(contentElem); 244 } 245 246 251 public final Tree getTree() { 252 return tree; 253 } 254 255 260 public Object getUserObject() { 261 return userObject; 262 } 263 264 269 public Widget getWidget() { 270 if (contentPanel == null) { 271 return null; 272 } 273 return contentPanel.getWidget(); 274 } 275 276 281 public boolean isSelected() { 282 return selected; 283 } 284 285 288 public void remove() { 289 if (parent != null) { 290 parent.removeItem(this); 292 } else if (tree != null) { 293 tree.removeItem(this); 296 } 297 } 298 299 304 305 public void removeItem(TreeItem item) { 306 if (!children.contains(item)) { 307 return; 308 } 309 item.setTree(null); 311 item.setParentItem(null); 312 313 children.remove(item); 314 DOM.removeChild(childSpanElem, item.getElement()); 315 316 if (children.size() == 0) { 317 updateState(); 318 } 319 } 320 321 324 public void removeItems() { 325 while (getChildCount() > 0) { 326 removeItem(getChild(0)); 327 } 328 } 329 330 public void setHTML(String html) { 331 clearContentPanel(); 332 DOM.setInnerHTML(contentElem, html); 333 } 334 335 341 public void setSelected(boolean selected) { 342 if (this.selected == selected) { 343 return; 344 } 345 this.selected = selected; 346 setStyleName(contentElem, "gwt-TreeItem-selected", selected); 347 } 348 349 354 public void setState(boolean open) { 355 setState(open, true); 356 } 357 358 365 public void setState(boolean open, boolean fireEvents) { 366 if (open && children.size() == 0) { 367 return; 368 } 369 370 this.open = open; 371 updateState(); 372 373 if (fireEvents && tree != null) { 374 tree.fireStateChanged(this); 375 } 376 } 377 378 public void setText(String text) { 379 clearContentPanel(); 380 DOM.setInnerText(contentElem, text); 381 } 382 383 388 public void setUserObject(Object userObj) { 389 userObject = userObj; 390 } 391 392 396 public void setWidget(Widget widget) { 397 ensureContentPanel(); 398 contentPanel.setWidget(widget); 399 } 400 401 407 protected HasFocus getFocusableWidget() { 408 Widget widget = getWidget(); 409 if (widget instanceof HasFocus) { 410 return (HasFocus) widget; 411 } else { 412 return null; 413 } 414 } 415 416 void addTreeItems(List accum) { 417 for (int i = 0; i < children.size(); i++) { 418 TreeItem item = (TreeItem) children.get(i); 419 accum.add(item); 420 item.addTreeItems(accum); 421 } 422 } 423 424 ArrayList getChildren() { 425 return children; 426 } 427 428 Element getContentElem() { 429 return contentElem; 430 } 431 432 int getContentHeight() { 433 return DOM.getElementPropertyInt(itemTable, "offsetHeight"); 434 } 435 436 Element getImageElement() { 437 return statusImage.getElement(); 438 } 439 440 int getTreeTop() { 441 TreeItem item = this; 442 int ret = 0; 443 444 while (item != null) { 445 ret += DOM.getElementPropertyInt(item.getElement(), "offsetTop"); 446 item = item.getParentItem(); 447 } 448 449 return ret; 450 } 451 452 void setParentItem(TreeItem parent) { 453 this.parent = parent; 454 } 455 456 void setTree(Tree tree) { 457 if (this.tree == tree) { 458 return; 459 } 460 461 if (this.tree != null) { 462 if (this.tree.getSelectedItem() == this) { 463 this.tree.setSelectedItem(null); 464 } 465 466 if (contentPanel != null) { 468 this.tree.disown(contentPanel); 469 } 470 } 471 this.tree = tree; 472 for (int i = 0, n = children.size(); i < n; ++i) { 473 ((TreeItem) children.get(i)).setTree(tree); 474 } 475 updateState(); 476 if (tree != null) { 477 if (contentPanel != null) { 478 tree.adopt(contentPanel); 479 } 480 } 481 } 482 483 void updateState() { 484 if (tree == null) { 486 return; 487 } 488 489 TreeImages images = tree.getImages(); 490 491 if (children.size() == 0) { 492 UIObject.setVisible(childSpanElem, false); 493 images.treeLeaf().applyTo(statusImage); 494 return; 495 } 496 497 if (open) { 500 UIObject.setVisible(childSpanElem, true); 501 images.treeOpen().applyTo(statusImage); 502 } else { 503 UIObject.setVisible(childSpanElem, false); 504 images.treeClosed().applyTo(statusImage); 505 } 506 } 507 508 void updateStateRecursive() { 509 updateState(); 510 for (int i = 0, n = children.size(); i < n; ++i) { 511 ((TreeItem) children.get(i)).updateStateRecursive(); 512 } 513 } 514 515 private void clearContentPanel() { 516 if (contentPanel != null) { 517 Widget child = contentPanel.getWidget(); 519 if (contentPanel.getWidget() != null) { 520 contentPanel.remove(child); 521 } 522 523 if (tree != null) { 525 tree.disown(contentPanel); 526 contentPanel = null; 527 } 528 } 529 } 530 531 private void ensureContentPanel() { 532 if (contentPanel == null) { 533 DOM.setInnerHTML(contentElem, ""); 535 contentPanel = new ContentPanel(contentElem); 536 if (tree != null) { 537 tree.adopt(contentPanel); 538 } 539 } 540 } 541 542 } 543 | Popular Tags |