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 import com.google.gwt.user.client.Event; 21 22 39 public class StackPanel extends ComplexPanel { 40 41 private Element body; 42 private int visibleStack = -1; 43 44 47 public StackPanel() { 48 Element table = DOM.createTable(); 49 setElement(table); 50 51 body = DOM.createTBody(); 52 DOM.appendChild(table, body); 53 DOM.setElementPropertyInt(table, "cellSpacing", 0); 54 DOM.setElementPropertyInt(table, "cellPadding", 0); 55 56 DOM.sinkEvents(table, Event.ONCLICK); 57 setStyleName("gwt-StackPanel"); 58 } 59 60 65 public void add(Widget w) { 66 insert(w, getWidgetCount()); 67 } 68 69 75 public void add(Widget w, String stackText) { 76 add(w, stackText, false); 77 } 78 79 87 public void add(Widget w, String stackText, boolean asHTML) { 88 add(w); 89 setStackText(getWidgetCount() - 1, stackText, asHTML); 90 } 91 92 97 public int getSelectedIndex() { 98 return visibleStack; 99 } 100 101 109 public void insert(Widget w, int beforeIndex) { 110 Element trh = DOM.createTR(); 112 Element tdh = DOM.createTD(); 113 DOM.appendChild(trh, tdh); 114 115 Element trb = DOM.createTR(); 117 Element tdb = DOM.createTD(); 118 DOM.appendChild(trb, tdb); 119 120 beforeIndex = super.insert(w, tdb, beforeIndex); 121 int effectiveIndex = beforeIndex * 2; 123 DOM.insertChild(body, trb, effectiveIndex); 125 DOM.insertChild(body, trh, effectiveIndex); 126 127 setStyleName(tdh, "gwt-StackPanelItem", true); 129 DOM.setElementPropertyInt(tdh, "__owner", hashCode()); 130 DOM.setElementProperty(tdh, "height", "1px"); 131 132 DOM.setElementProperty(tdb, "height", "100%"); 134 DOM.setElementProperty(tdb, "vAlign", "top"); 135 136 updateIndicesFrom(beforeIndex); 138 139 if (visibleStack == -1) { 141 showStack(0); 142 } else { 143 setStackVisible(beforeIndex, false); 144 if (visibleStack >= beforeIndex) { 145 ++visibleStack; 146 } 147 } 148 } 149 150 public void onBrowserEvent(Event event) { 151 if (DOM.eventGetType(event) == Event.ONCLICK) { 152 Element target = DOM.eventGetTarget(event); 153 int index = findDividerIndex(target); 154 if (index != -1) { 155 showStack(index); 156 } 157 } 158 } 159 160 public boolean remove(int index) { 161 return remove(getWidget(index), index); 162 } 163 164 public boolean remove(Widget child) { 165 return remove(child, getWidgetIndex(child)); 166 } 167 168 174 public void setStackText(int index, String text) { 175 setStackText(index, text, false); 176 } 177 178 185 public void setStackText(int index, String text, boolean asHTML) { 186 if (index >= getWidgetCount()) { 187 return; 188 } 189 190 Element td = DOM.getChild(DOM.getChild(body, index * 2), 0); 191 if (asHTML) { 192 DOM.setInnerHTML(td, text); 193 } else { 194 DOM.setInnerText(td, text); 195 } 196 } 197 198 203 public void showStack(int index) { 204 if ((index >= getWidgetCount()) || (index == visibleStack)) { 205 return; 206 } 207 208 if (visibleStack >= 0) { 209 setStackVisible(visibleStack, false); 210 } 211 212 visibleStack = index; 213 setStackVisible(visibleStack, true); 214 } 215 216 private int findDividerIndex(Element elem) { 217 while ((elem != null) && !DOM.compare(elem, getElement())) { 218 String expando = DOM.getElementProperty(elem, "__index"); 219 if (expando != null) { 220 int ownerHash = DOM.getElementPropertyInt(elem, "__owner"); 222 if (ownerHash == hashCode()) { 223 return Integer.parseInt(expando); 225 } else { 226 return -1; 228 } 229 } 230 elem = DOM.getParent(elem); 231 } 232 return -1; 233 } 234 235 private boolean remove(Widget child, int index) { 236 if (child.getParent() != this) { 238 return false; 239 } 240 241 if (visibleStack == index) { 243 visibleStack = -1; 244 } else if (visibleStack > index) { 245 --visibleStack; 246 } 247 248 int rowIndex = 2 * index; 250 Element tr = DOM.getChild(body, rowIndex); 251 DOM.removeChild(body, tr); 252 tr = DOM.getChild(body, rowIndex); 253 DOM.removeChild(body, tr); 254 super.remove(child); 255 256 updateIndicesFrom(rowIndex); 258 259 return true; 260 } 261 262 private void setStackVisible(int index, boolean visible) { 263 Element tr = DOM.getChild(body, (index * 2)); 265 if (tr == null) { 266 return; 267 } 268 269 Element td = DOM.getFirstChild(tr); 271 setStyleName(td, "gwt-StackPanelItem-selected", visible); 272 273 tr = DOM.getChild(body, (index * 2) + 1); 275 UIObject.setVisible(tr, visible); 276 getWidget(index).setVisible(visible); 277 } 278 279 private void updateIndicesFrom(int beforeIndex) { 280 for (int i = beforeIndex, c = getWidgetCount(); i < c; ++i) { 281 Element childTR = DOM.getChild(body, i * 2); 282 Element childTD = DOM.getFirstChild(childTR); 283 DOM.setElementPropertyInt(childTD, "__index", i); 284 } 285 } 286 287 } 288 | Popular Tags |