123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- /*
- @VaadinApache2LicenseForJavaFiles@
- */
- package com.vaadin.terminal.gwt.client.ui.menubar;
-
- import java.util.Iterator;
- import java.util.Stack;
-
- import com.google.gwt.core.client.GWT;
- import com.google.gwt.dom.client.Element;
- import com.google.gwt.user.client.Command;
- import com.vaadin.terminal.gwt.client.ApplicationConnection;
- import com.vaadin.terminal.gwt.client.Paintable;
- import com.vaadin.terminal.gwt.client.TooltipInfo;
- import com.vaadin.terminal.gwt.client.UIDL;
- import com.vaadin.terminal.gwt.client.Util;
- import com.vaadin.terminal.gwt.client.ui.AbstractComponentConnector;
- import com.vaadin.terminal.gwt.client.ui.Connect;
- import com.vaadin.terminal.gwt.client.ui.Connect.LoadStyle;
- import com.vaadin.terminal.gwt.client.ui.Icon;
- import com.vaadin.terminal.gwt.client.ui.SimpleManagedLayout;
- import com.vaadin.terminal.gwt.client.ui.menubar.VMenuBar.CustomMenuItem;
-
- @Connect(value = com.vaadin.ui.MenuBar.class, loadStyle = LoadStyle.LAZY)
- public class MenuBarConnector extends AbstractComponentConnector implements
- Paintable, SimpleManagedLayout {
- /**
- * This method must be implemented to update the client-side component from
- * UIDL data received from server.
- *
- * This method is called when the page is loaded for the first time, and
- * every time UI changes in the component are received from the server.
- */
- public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
- if (!isRealUpdate(uidl)) {
- return;
- }
-
- getWidget().htmlContentAllowed = uidl
- .hasAttribute(VMenuBar.HTML_CONTENT_ALLOWED);
-
- getWidget().openRootOnHover = uidl
- .getBooleanAttribute(VMenuBar.OPEN_ROOT_MENU_ON_HOWER);
-
- getWidget().enabled = isEnabled();
-
- // For future connections
- getWidget().client = client;
- getWidget().uidlId = uidl.getId();
-
- // Empty the menu every time it receives new information
- if (!getWidget().getItems().isEmpty()) {
- getWidget().clearItems();
- }
-
- UIDL options = uidl.getChildUIDL(0);
-
- if (null != getState() && !getState().isUndefinedWidth()) {
- UIDL moreItemUIDL = options.getChildUIDL(0);
- StringBuffer itemHTML = new StringBuffer();
-
- if (moreItemUIDL.hasAttribute("icon")) {
- itemHTML.append("<img src=\""
- + Util.escapeAttribute(client
- .translateVaadinUri(moreItemUIDL
- .getStringAttribute("icon")))
- + "\" class=\"" + Icon.CLASSNAME + "\" alt=\"\" />");
- }
-
- String moreItemText = moreItemUIDL.getStringAttribute("text");
- if ("".equals(moreItemText)) {
- moreItemText = "►";
- }
- itemHTML.append(moreItemText);
-
- getWidget().moreItem = GWT.create(CustomMenuItem.class);
- getWidget().moreItem.setHTML(itemHTML.toString());
- getWidget().moreItem.setCommand(VMenuBar.emptyCommand);
-
- getWidget().collapsedRootItems = new VMenuBar(true, getWidget());
- getWidget().moreItem.setSubMenu(getWidget().collapsedRootItems);
- getWidget().moreItem.addStyleName(VMenuBar.CLASSNAME
- + "-more-menuitem");
- }
-
- UIDL uidlItems = uidl.getChildUIDL(1);
- Iterator<Object> itr = uidlItems.getChildIterator();
- Stack<Iterator<Object>> iteratorStack = new Stack<Iterator<Object>>();
- Stack<VMenuBar> menuStack = new Stack<VMenuBar>();
- VMenuBar currentMenu = getWidget();
-
- while (itr.hasNext()) {
- UIDL item = (UIDL) itr.next();
- CustomMenuItem currentItem = null;
-
- final int itemId = item.getIntAttribute("id");
-
- boolean itemHasCommand = item.hasAttribute("command");
- boolean itemIsCheckable = item
- .hasAttribute(VMenuBar.ATTRIBUTE_CHECKED);
-
- String itemHTML = getWidget().buildItemHTML(item);
-
- Command cmd = null;
- if (!item.hasAttribute("separator")) {
- if (itemHasCommand || itemIsCheckable) {
- // Construct a command that fires onMenuClick(int) with the
- // item's id-number
- cmd = new Command() {
- public void execute() {
- getWidget().hostReference.onMenuClick(itemId);
- }
- };
- }
- }
-
- currentItem = currentMenu.addItem(itemHTML.toString(), cmd);
- currentItem.updateFromUIDL(item, client);
-
- if (item.getChildCount() > 0) {
- menuStack.push(currentMenu);
- iteratorStack.push(itr);
- itr = item.getChildIterator();
- currentMenu = new VMenuBar(true, currentMenu);
- client.getVTooltip().connectHandlersToWidget(currentMenu);
- // this is the top-level style that also propagates to items -
- // any item specific styles are set above in
- // currentItem.updateFromUIDL(item, client)
- if (getState().hasStyles()) {
- for (String style : getState().getStyles()) {
- currentMenu.addStyleDependentName(style);
- }
- }
- currentItem.setSubMenu(currentMenu);
- }
-
- while (!itr.hasNext() && !iteratorStack.empty()) {
- boolean hasCheckableItem = false;
- for (CustomMenuItem menuItem : currentMenu.getItems()) {
- hasCheckableItem = hasCheckableItem
- || menuItem.isCheckable();
- }
- if (hasCheckableItem) {
- currentMenu.addStyleDependentName("check-column");
- } else {
- currentMenu.removeStyleDependentName("check-column");
- }
-
- itr = iteratorStack.pop();
- currentMenu = menuStack.pop();
- }
- }// while
-
- getLayoutManager().setNeedsHorizontalLayout(this);
-
- }// updateFromUIDL
-
- @Override
- public VMenuBar getWidget() {
- return (VMenuBar) super.getWidget();
- }
-
- public void layout() {
- getWidget().iLayout();
- }
-
- @Override
- public TooltipInfo getTooltipInfo(Element element) {
- TooltipInfo info = null;
-
- // Check content of widget to find tooltip for element
- if (element != getWidget().getElement()) {
-
- CustomMenuItem item = getWidget().getMenuItemWithElement(
- (com.google.gwt.user.client.Element) element);
- if (item != null) {
- info = item.getTooltip();
- }
- }
-
- // Use default tooltip if nothing found from DOM three
- if (info == null) {
- info = super.getTooltipInfo(element);
- }
-
- return info;
- }
- }
|