You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MenuBarConnector.java 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client.ui.menubar;
  5. import java.util.Iterator;
  6. import java.util.Stack;
  7. import com.google.gwt.core.client.GWT;
  8. import com.google.gwt.dom.client.Element;
  9. import com.google.gwt.user.client.Command;
  10. import com.vaadin.terminal.gwt.client.ApplicationConnection;
  11. import com.vaadin.terminal.gwt.client.Paintable;
  12. import com.vaadin.terminal.gwt.client.TooltipInfo;
  13. import com.vaadin.terminal.gwt.client.UIDL;
  14. import com.vaadin.terminal.gwt.client.Util;
  15. import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector;
  16. import com.vaadin.terminal.gwt.client.ui.Connect;
  17. import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle;
  18. import com.vaadin.terminal.gwt.client.ui.Icon;
  19. import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout;
  20. import com.vaadin.terminal.gwt.client.ui.menubar.VMenuBar.CustomMenuItem;
  21. @Connect(value = com.vaadin.ui.MenuBar.class, loadStyle = LoadStyle.LAZY)
  22. public class MenuBarConnector extends AbstractComponentConnector implements
  23. Paintable, SimpleManagedLayout {
  24. /**
  25. * This method must be implemented to update the client-side component from
  26. * UIDL data received from server.
  27. *
  28. * This method is called when the page is loaded for the first time, and
  29. * every time UI changes in the component are received from the server.
  30. */
  31. public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
  32. if (!isRealUpdate(uidl)) {
  33. return;
  34. }
  35. getWidget().htmlContentAllowed = uidl
  36. .hasAttribute(VMenuBar.HTML_CONTENT_ALLOWED);
  37. getWidget().openRootOnHover = uidl
  38. .getBooleanAttribute(VMenuBar.OPEN_ROOT_MENU_ON_HOWER);
  39. getWidget().enabled = isEnabled();
  40. // For future connections
  41. getWidget().client = client;
  42. getWidget().uidlId = uidl.getId();
  43. // Empty the menu every time it receives new information
  44. if (!getWidget().getItems().isEmpty()) {
  45. getWidget().clearItems();
  46. }
  47. UIDL options = uidl.getChildUIDL(0);
  48. if (null != getState() && !getState().isUndefinedWidth()) {
  49. UIDL moreItemUIDL = options.getChildUIDL(0);
  50. StringBuffer itemHTML = new StringBuffer();
  51. if (moreItemUIDL.hasAttribute("icon")) {
  52. itemHTML.append("<img src=\""
  53. + Util.escapeAttribute(client
  54. .translateVaadinUri(moreItemUIDL
  55. .getStringAttribute("icon")))
  56. + "\" class=\"" + Icon.CLASSNAME + "\" alt=\"\" />");
  57. }
  58. String moreItemText = moreItemUIDL.getStringAttribute("text");
  59. if ("".equals(moreItemText)) {
  60. moreItemText = "&#x25BA;";
  61. }
  62. itemHTML.append(moreItemText);
  63. getWidget().moreItem = GWT.create(CustomMenuItem.class);
  64. getWidget().moreItem.setHTML(itemHTML.toString());
  65. getWidget().moreItem.setCommand(VMenuBar.emptyCommand);
  66. getWidget().collapsedRootItems = new VMenuBar(true, getWidget());
  67. getWidget().moreItem.setSubMenu(getWidget().collapsedRootItems);
  68. getWidget().moreItem.addStyleName(VMenuBar.CLASSNAME
  69. + "-more-menuitem");
  70. }
  71. UIDL uidlItems = uidl.getChildUIDL(1);
  72. Iterator<Object> itr = uidlItems.getChildIterator();
  73. Stack<Iterator<Object>> iteratorStack = new Stack<Iterator<Object>>();
  74. Stack<VMenuBar> menuStack = new Stack<VMenuBar>();
  75. VMenuBar currentMenu = getWidget();
  76. while (itr.hasNext()) {
  77. UIDL item = (UIDL) itr.next();
  78. CustomMenuItem currentItem = null;
  79. final int itemId = item.getIntAttribute("id");
  80. boolean itemHasCommand = item.hasAttribute("command");
  81. boolean itemIsCheckable = item
  82. .hasAttribute(VMenuBar.ATTRIBUTE_CHECKED);
  83. String itemHTML = getWidget().buildItemHTML(item);
  84. Command cmd = null;
  85. if (!item.hasAttribute("separator")) {
  86. if (itemHasCommand || itemIsCheckable) {
  87. // Construct a command that fires onMenuClick(int) with the
  88. // item's id-number
  89. cmd = new Command() {
  90. public void execute() {
  91. getWidget().hostReference.onMenuClick(itemId);
  92. }
  93. };
  94. }
  95. }
  96. currentItem = currentMenu.addItem(itemHTML.toString(), cmd);
  97. currentItem.updateFromUIDL(item, client);
  98. if (item.getChildCount() > 0) {
  99. menuStack.push(currentMenu);
  100. iteratorStack.push(itr);
  101. itr = item.getChildIterator();
  102. currentMenu = new VMenuBar(true, currentMenu);
  103. client.getVTooltip().connectHandlersToWidget(currentMenu);
  104. // this is the top-level style that also propagates to items -
  105. // any item specific styles are set above in
  106. // currentItem.updateFromUIDL(item, client)
  107. if (getState().hasStyles()) {
  108. for (String style : getState().getStyles()) {
  109. currentMenu.addStyleDependentName(style);
  110. }
  111. }
  112. currentItem.setSubMenu(currentMenu);
  113. }
  114. while (!itr.hasNext() && !iteratorStack.empty()) {
  115. boolean hasCheckableItem = false;
  116. for (CustomMenuItem menuItem : currentMenu.getItems()) {
  117. hasCheckableItem = hasCheckableItem
  118. || menuItem.isCheckable();
  119. }
  120. if (hasCheckableItem) {
  121. currentMenu.addStyleDependentName("check-column");
  122. } else {
  123. currentMenu.removeStyleDependentName("check-column");
  124. }
  125. itr = iteratorStack.pop();
  126. currentMenu = menuStack.pop();
  127. }
  128. }// while
  129. getLayoutManager().setNeedsHorizontalLayout(this);
  130. }// updateFromUIDL
  131. @Override
  132. public VMenuBar getWidget() {
  133. return (VMenuBar) super.getWidget();
  134. }
  135. public void layout() {
  136. getWidget().iLayout();
  137. }
  138. @Override
  139. public TooltipInfo getTooltipInfo(Element element) {
  140. TooltipInfo info = null;
  141. // Check content of widget to find tooltip for element
  142. if (element != getWidget().getElement()) {
  143. CustomMenuItem item = getWidget().getMenuItemWithElement(
  144. (com.google.gwt.user.client.Element) element);
  145. if (item != null) {
  146. info = item.getTooltip();
  147. }
  148. }
  149. // Use default tooltip if nothing found from DOM three
  150. if (info == null) {
  151. info = super.getTooltipInfo(element);
  152. }
  153. return info;
  154. }
  155. }