1 16 package com.google.gwt.user.client.ui; 17 18 import com.google.gwt.user.client.Command; 19 import com.google.gwt.user.client.DOM; 20 import com.google.gwt.user.client.DeferredCommand; 21 import com.google.gwt.user.client.Element; 22 import com.google.gwt.user.client.Event; 23 24 import java.util.ArrayList ; 25 26 47 public class MenuBar extends Widget implements PopupListener { 48 49 private Element body; 50 private ArrayList items = new ArrayList (); 51 private MenuBar parentMenu; 52 private PopupPanel popup; 53 private MenuItem selectedItem; 54 private MenuBar shownChildMenu; 55 private boolean vertical, autoOpen; 56 57 60 public MenuBar() { 61 this(false); 62 } 63 64 69 public MenuBar(boolean vertical) { 70 super(); 71 72 Element table = DOM.createTable(); 73 body = DOM.createTBody(); 74 DOM.appendChild(table, body); 75 76 if (!vertical) { 77 Element tr = DOM.createTR(); 78 DOM.appendChild(body, tr); 79 } 80 81 this.vertical = vertical; 82 83 Element outer = DOM.createDiv(); 84 DOM.appendChild(outer, table); 85 setElement(outer); 86 87 sinkEvents(Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT); 88 setStyleName("gwt-MenuBar"); 89 } 90 91 96 public void addItem(MenuItem item) { 97 Element tr; 98 if (vertical) { 99 tr = DOM.createTR(); 100 DOM.appendChild(body, tr); 101 } else { 102 tr = DOM.getChild(body, 0); 103 } 104 105 DOM.appendChild(tr, item.getElement()); 106 107 item.setParentMenu(this); 108 item.setSelectionStyle(false); 109 items.add(item); 110 } 111 112 121 public MenuItem addItem(String text, boolean asHTML, Command cmd) { 122 MenuItem item = new MenuItem(text, asHTML, cmd); 123 addItem(item); 124 return item; 125 } 126 127 136 public MenuItem addItem(String text, boolean asHTML, MenuBar popup) { 137 MenuItem item = new MenuItem(text, asHTML, popup); 138 addItem(item); 139 return item; 140 } 141 142 150 public MenuItem addItem(String text, Command cmd) { 151 MenuItem item = new MenuItem(text, cmd); 152 addItem(item); 153 return item; 154 } 155 156 164 public MenuItem addItem(String text, MenuBar popup) { 165 MenuItem item = new MenuItem(text, popup); 166 addItem(item); 167 return item; 168 } 169 170 173 public void clearItems() { 174 Element container = getItemContainerElement(); 175 while (DOM.getChildCount(container) > 0) { 176 DOM.removeChild(container, DOM.getChild(container, 0)); 177 } 178 items.clear(); 179 } 180 181 187 public boolean getAutoOpen() { 188 return autoOpen; 189 } 190 191 public void onBrowserEvent(Event event) { 192 super.onBrowserEvent(event); 193 194 MenuItem item = findItem(DOM.eventGetTarget(event)); 195 switch (DOM.eventGetType(event)) { 196 case Event.ONCLICK: { 197 if (item != null) { 199 doItemAction(item, true); 200 } 201 break; 202 } 203 204 case Event.ONMOUSEOVER: { 205 if (item != null) { 206 itemOver(item); 207 } 208 break; 209 } 210 211 case Event.ONMOUSEOUT: { 212 if (item != null) { 213 itemOver(null); 214 } 215 break; 216 } 217 } 218 } 219 220 public void onPopupClosed(PopupPanel sender, boolean autoClosed) { 221 if (autoClosed) { 223 closeAllParents(); 224 } 225 226 onHide(); 229 shownChildMenu = null; 230 popup = null; 231 } 232 233 238 public void removeItem(MenuItem item) { 239 int idx = items.indexOf(item); 240 if (idx == -1) { 241 return; 242 } 243 244 Element container = getItemContainerElement(); 245 DOM.removeChild(container, DOM.getChild(container, idx)); 246 items.remove(idx); 247 } 248 249 255 public void setAutoOpen(boolean autoOpen) { 256 this.autoOpen = autoOpen; 257 } 258 259 protected void onDetach() { 260 if (popup != null) { 262 popup.hide(); 263 } 264 265 super.onDetach(); 266 } 267 268 271 void closeAllParents() { 272 MenuBar curMenu = this; 273 while (curMenu != null) { 274 curMenu.close(); 275 276 if ((curMenu.parentMenu == null) && (curMenu.selectedItem != null)) { 277 curMenu.selectedItem.setSelectionStyle(false); 278 curMenu.selectedItem = null; 279 } 280 281 curMenu = curMenu.parentMenu; 282 } 283 } 284 285 294 void doItemAction(final MenuItem item, boolean fireCommand) { 295 if ((shownChildMenu != null) && (item.getSubMenu() == shownChildMenu)) { 297 return; 298 } 299 300 if (shownChildMenu != null) { 302 shownChildMenu.onHide(); 303 popup.hide(); 304 } 305 306 if (item.getSubMenu() == null) { 308 if (fireCommand) { 309 closeAllParents(); 311 312 Command cmd = item.getCommand(); 314 if (cmd != null) { 315 DeferredCommand.addCommand(cmd); 316 } 317 } 318 return; 319 } 320 321 selectItem(item); 323 324 popup = new PopupPanel(true) { 328 { 329 setWidget(item.getSubMenu()); 330 item.getSubMenu().onShow(); 331 } 332 333 public boolean onEventPreview(Event event) { 334 switch (DOM.eventGetType(event)) { 337 case Event.ONCLICK: 338 Element target = DOM.eventGetTarget(event); 341 Element parentMenuElement = item.getParentMenu().getElement(); 342 if (DOM.isOrHasChild(parentMenuElement, target)) { 343 return false; 344 } 345 break; 346 } 347 348 return super.onEventPreview(event); 349 } 350 }; 351 popup.addPopupListener(this); 352 353 if (vertical) { 354 popup.setPopupPosition(item.getAbsoluteLeft() + item.getOffsetWidth(), 355 item.getAbsoluteTop()); 356 } else { 357 popup.setPopupPosition(item.getAbsoluteLeft(), item.getAbsoluteTop() 358 + item.getOffsetHeight()); 359 } 360 361 shownChildMenu = item.getSubMenu(); 362 item.getSubMenu().parentMenu = this; 363 364 popup.show(); 367 } 368 369 void itemOver(MenuItem item) { 370 if (item == null) { 371 if ((selectedItem != null) 373 && (shownChildMenu == selectedItem.getSubMenu())) { 374 return; 375 } 376 } 377 378 selectItem(item); 380 381 if (item != null) { 385 if ((shownChildMenu != null) || (parentMenu != null) || autoOpen) { 386 doItemAction(item, false); 387 } 388 } 389 } 390 391 394 private void close() { 395 if (parentMenu != null) { 396 parentMenu.popup.hide(); 397 } 398 } 399 400 private MenuItem findItem(Element hItem) { 401 for (int i = 0; i < items.size(); ++i) { 402 MenuItem item = (MenuItem) items.get(i); 403 if (DOM.isOrHasChild(item.getElement(), hItem)) { 404 return item; 405 } 406 } 407 408 return null; 409 } 410 411 private Element getItemContainerElement() { 412 if (vertical) { 413 return body; 414 } else { 415 return DOM.getChild(body, 0); 416 } 417 } 418 419 423 private void onHide() { 424 if (shownChildMenu != null) { 425 shownChildMenu.onHide(); 426 popup.hide(); 427 } 428 } 429 430 433 private void onShow() { 434 if (items.size() > 0) { 436 selectItem((MenuItem) items.get(0)); 437 } 438 } 439 440 private void selectItem(MenuItem item) { 441 if (item == selectedItem) { 442 return; 443 } 444 445 if (selectedItem != null) { 446 selectedItem.setSelectionStyle(false); 447 } 448 449 if (item != null) { 450 item.setSelectionStyle(true); 451 } 452 453 selectedItem = item; 454 } 455 } 456 | Popular Tags |