Package com.google.gdt.eclipse.designer.uibinder.model.widgets

Source Code of com.google.gdt.eclipse.designer.uibinder.model.widgets.MenuBarTest

/*******************************************************************************
* Copyright 2011 Google Inc. All Rights Reserved.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package com.google.gdt.eclipse.designer.uibinder.model.widgets;

import com.google.common.collect.ImmutableList;
import com.google.gdt.eclipse.designer.GwtToolkitDescription;
import com.google.gdt.eclipse.designer.uibinder.model.UiBinderModelTest;
import com.google.gdt.eclipse.designer.uibinder.model.widgets.menu.MenuBarInfo;
import com.google.gdt.eclipse.designer.uibinder.model.widgets.menu.MenuItemInfo;
import com.google.gdt.eclipse.designer.uibinder.model.widgets.menu.MenuItemSeparatorInfo;

import org.eclipse.wb.draw2d.geometry.Rectangle;
import org.eclipse.wb.internal.core.model.generation.GenerationSettings;
import org.eclipse.wb.internal.core.model.menu.IMenuInfo;
import org.eclipse.wb.internal.core.model.menu.IMenuItemInfo;
import org.eclipse.wb.internal.core.model.menu.IMenuPolicy;
import org.eclipse.wb.internal.core.model.menu.MenuObjectInfoUtils;
import org.eclipse.wb.internal.core.model.property.Property;
import org.eclipse.wb.internal.core.model.variable.description.FieldInitializerVariableDescription;
import org.eclipse.wb.internal.core.utils.reflect.ReflectionUtils;
import org.eclipse.wb.internal.core.xml.model.clipboard.XmlObjectMemento;

import static org.fest.assertions.Assertions.assertThat;

import java.util.List;

/**
* Test for {@link MenuBarInfo} and {@link MenuItemInfo}.
*
* @author scheglov_ke
*/
public class MenuBarTest extends UiBinderModelTest {
  ////////////////////////////////////////////////////////////////////////////
  //
  // Exit zone :-) XXX
  //
  ////////////////////////////////////////////////////////////////////////////
  public void _test_exit() throws Exception {
    System.exit(0);
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Tests
  //
  ////////////////////////////////////////////////////////////////////////////
  /**
   * Even empty <code>MenuBar</code> has some reasonable size.
   */
  public void test_empty() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'/>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    refresh();
    MenuBarInfo bar = getObjectByName("bar");
    //
    assertThat(bar.getItems()).isEmpty();
    assertThat(bar.getAllItems()).isEmpty();
    assertThat(bar.getBounds().width).isGreaterThan(100);
    assertThat(bar.getBounds().height).isGreaterThan(20);
  }

  /**
   * Animation for <code>MenuBar</code> looks nice, but does not allow us to get screen shots of
   * items. So, we should disable it.
   */
  public void test_disableAnimation() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar' animationEnabled='true'/>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    refresh();
    MenuBarInfo bar = getObjectByName("bar");
    //
    assertEquals(false, ReflectionUtils.invokeMethod(bar.getObject(), "isAnimationEnabled()"));
  }

  public void test_parse_MenuItem() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='A'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='item' text='A'>");
    refresh();
    MenuBarInfo bar = getObjectByName("bar");
    MenuItemInfo item = getObjectByName("item");
    // only item in "bar"
    assertThat(bar.getAllItems()).containsOnly(item);
    // check "text" property
    Property textProperty = item.getPropertyByTitle("text");
    assertEquals("A", textProperty.getValue());
    textProperty.setValue("B");
    assertXML(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='B'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
  }

  public void test_parse_MenuItem_subMenu() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='Sub'>",
        "        <g:MenuBar wbp:name='subMenu'/>",
        "      </g:MenuItem>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='item' text='Sub'>",
        "      <g:MenuBar wbp:name='subMenu'>");
    refresh();
    MenuItemInfo item = getObjectByName("item");
    MenuBarInfo subMenu = getObjectByName("subMenu");
    assertSame(subMenu, item.getSubMenu());
  }

  public void test_parse_addSeparator_usingConstructor() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItemSeparator wbp:name='separator'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItemSeparator wbp:name='separator'>");
    refresh();
    MenuBarInfo bar = getObjectByName("bar");
    MenuItemSeparatorInfo separator = getObjectByName("separator");
    // only separator in "bar"
    assertThat(bar.getAllItems()).containsOnly(separator);
    // IMenuItemInfo
    {
      IMenuItemInfo separatorObject;
      {
        IMenuInfo barObject = MenuObjectInfoUtils.getMenuInfo(bar);
        List<IMenuItemInfo> items = barObject.getItems();
        assertThat(items).hasSize(1);
        separatorObject = items.get(0);
      }
      // ask IMenuItemInfo directly
      assertNull(separator.getAdapter(List.class));
      assertSame(separatorObject, MenuObjectInfoUtils.getMenuItemInfo(separator));
      // model
      assertSame(separator, separatorObject.getModel());
      assertSame(separator, separatorObject.getToolkitModel());
      // presentation
      assertNull(separatorObject.getImage());
      assertNotNull(separatorObject.getBounds());
      // access
      assertNull(separatorObject.getMenu());
      assertSame(IMenuPolicy.NOOP, separatorObject.getPolicy());
    }
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Sub menu
  //
  ////////////////////////////////////////////////////////////////////////////
  public void test_IMenuInfo_IMenuItemInfo() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem text='Sub'>",
        "        <g:MenuBar vertical='true'>",
        "          <g:MenuItem text='Sub item 1'/>",
        "          <g:MenuItem text='Sub item 2'/>",
        "        </g:MenuBar>",
        "      </g:MenuItem>",
        "      <g:MenuItem text='Separate item'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem text='Sub'>",
        "      <g:MenuBar vertical='true'>",
        "        <g:MenuItem text='Sub item 1'>",
        "        <g:MenuItem text='Sub item 2'>",
        "    <g:MenuItem text='Separate item'>");
    refresh();
    MenuBarInfo menu = getObjectByName("bar");
    MenuItemInfo item_1 = menu.getItems().get(0);
    MenuItemInfo item_2 = menu.getItems().get(1);
    MenuBarInfo subMenu = item_1.getSubMenu();
    MenuItemInfo subMenuItem_1 = subMenu.getItems().get(0);
    MenuItemInfo subMenuItem_2 = subMenu.getItems().get(1);
    // bad adapters
    {
      assertNull(menu.getAdapter(List.class));
      assertNull(item_1.getAdapter(List.class));
    }
    // IMenuInfo
    {
      IMenuInfo menuObject = MenuObjectInfoUtils.getMenuInfo(menu);
      assertSame(menu, menuObject.getModel());
      // presentation
      {
        // no need for image, because this MenuBar is visible on usual screen shot
        assertNull(menuObject.getImage());
        // some reasonable bounds
        {
          Rectangle bounds = menuObject.getBounds();
          assertThat(bounds.x).isEqualTo(0);
          assertThat(bounds.y).isEqualTo(0);
          assertThat(bounds.width).isGreaterThan(30);
          assertThat(bounds.height).isGreaterThan(20);
        }
      }
      // access
      assertTrue(menuObject.isHorizontal());
      {
        List<IMenuItemInfo> itemObjects = menuObject.getItems();
        assertThat(itemObjects).hasSize(2);
        // "Sub" item
        {
          IMenuItemInfo itemObject = itemObjects.get(0);
          assertSame(item_1, itemObject.getModel());
          // presentation
          {
            // items don't have screen shot, we show them on menu shots
            assertNull(itemObject.getImage());
            // reasonable bounds
            {
              Rectangle bounds = itemObject.getBounds();
              assertThat(bounds.x).isEqualTo(2);
              assertThat(bounds.y).isEqualTo(2);
              assertThat(bounds.width).isGreaterThan(30);
              assertThat(bounds.height).isGreaterThan(20);
            }
          }
          // sub-menu
          {
            IMenuInfo subMenuObject = itemObject.getMenu();
            assertSame(subMenu, subMenuObject.getModel());
            // access
            assertFalse(subMenuObject.isHorizontal());
            {
              List<IMenuItemInfo> subMenuItemObjects = subMenuObject.getItems();
              assertThat(subMenuItemObjects).hasSize(2);
              assertSame(subMenuItem_1, subMenuItemObjects.get(0).getModel());
              assertSame(subMenuItem_2, subMenuItemObjects.get(1).getModel());
            }
            // presentation
            assertNotNull(subMenuObject.getImage());
            {
              Rectangle bounds = subMenuObject.getBounds();
              assertThat(bounds.width).isGreaterThan(85);
              assertThat(bounds.height).isGreaterThan(45);
            }
          }
        }
        // "Separate item"
        {
          IMenuItemInfo itemObject = itemObjects.get(1);
          assertSame(item_2, itemObject.getModel());
          // no sub-menu
          assertNull(itemObject.getMenu());
          // no policy
          assertSame(IMenuPolicy.NOOP, itemObject.getPolicy());
        }
      }
    }
  }

  public void test_delete_subMenu() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='Sub'>",
        "        <g:MenuBar wbp:name='subMenu'/>",
        "      </g:MenuItem>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='item' text='Sub'>",
        "      <g:MenuBar wbp:name='subMenu'>");
    refresh();
    MenuBarInfo subMenu = getObjectByName("subMenu");
    // delete "subMenu", fortunately "item" can exists without it, so keep it
    subMenu.delete();
    assertXML(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='Sub'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='item' text='Sub'>");
  }

  /**
   * Delete menu bar with sub menu.
   */
  public void test_delete_withSubMenu() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='Sub'>",
        "        <g:MenuBar wbp:name='subMenu'/>",
        "      </g:MenuItem>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    MenuBarInfo bar = getObjectByName("bar");
    // delete "bar" fully
    bar.delete();
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel/>",
        "</ui:UiBinder>");
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // IMenuPolicy: separator
  //
  ////////////////////////////////////////////////////////////////////////////
  /**
   * Adds new <code>MenuItemSeparator</code>.
   */
  public void test_IMenuPolicy_CREATE_MenuItemSeparator() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'/>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    MenuBarInfo bar = getObjectByName("bar");
    IMenuInfo barObject = MenuObjectInfoUtils.getMenuInfo(bar);
    IMenuPolicy barPolicy = barObject.getPolicy();
    // don't accept something other than MenuItem or MenuItemSeparator
    assertFalse(barPolicy.validateCreate(new Object()));
    // create new MenuItemSeparator
    MenuItemSeparatorInfo newSeparator =
        createObject("com.google.gwt.user.client.ui.MenuItemSeparator");
    assertTrue(barPolicy.validateCreate(newSeparator));
    barPolicy.commandCreate(newSeparator, null);
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItemSeparator/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
  }

  public void test_IMenuPolicy_MOVE_MenuItemSeparator() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItemSeparator wbp:name='separator'/>",
        "      <g:MenuItem/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    MenuBarInfo bar = getObjectByName("bar");
    MenuItemSeparatorInfo separator = getObjectByName("separator");
    IMenuInfo barObject = MenuObjectInfoUtils.getMenuInfo(bar);
    IMenuPolicy barPolicy = barObject.getPolicy();
    // don't accept something other than MenuItem or MenuItemSeparator
    assertFalse(barPolicy.validateMove(new Object()));
    assertTrue(barPolicy.validateMove(separator));
    barPolicy.commandMove(separator, null);
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem/>",
        "      <g:MenuItemSeparator wbp:name='separator'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // IMenuPolicy: item
  //
  ////////////////////////////////////////////////////////////////////////////
  /**
   * Adds new <code>MenuItem</code>.
   */
  public void test_IMenuPolicy_CREATE_MenuItem() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'/>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    MenuBarInfo bar = getObjectByName("bar");
    IMenuInfo barObject = MenuObjectInfoUtils.getMenuInfo(bar);
    IMenuPolicy policy = barObject.getPolicy();
    // don't accept something other than MenuItem
    assertFalse(policy.validateCreate(new Object()));
    // create new MenuItem
    MenuItemInfo newItem = createObject("com.google.gwt.user.client.ui.MenuItem");
    assertTrue(policy.validateCreate(newItem));
    policy.commandCreate(newItem, null);
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem text='New item'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
  }

  /**
   * Adds new <code>MenuItem</code> with sub-menu.
   */
  public void test_IMenuPolicy_CREATE_MenuItem_subMenu() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'/>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    MenuBarInfo bar = getObjectByName("bar");
    IMenuPolicy policy = MenuObjectInfoUtils.getMenuInfo(bar).getPolicy();
    // use "field initializer"
    {
      GenerationSettings generationSettings =
          GwtToolkitDescription.INSTANCE.getGenerationSettings();
      generationSettings.setVariable(FieldInitializerVariableDescription.INSTANCE);
    }
    // create new MenuItem
    MenuItemInfo newItem = createObject("com.google.gwt.user.client.ui.MenuItem", "withSubMenu");
    assertTrue(policy.validateCreate(newItem));
    policy.commandCreate(newItem, null);
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem text='New menu'>",
        "        <g:MenuBar vertical='true'/>",
        "      </g:MenuItem>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem text='New menu'>",
        "      <g:MenuBar vertical='true'>");
  }

  ////////////////////////////////////////////////////////////////////////////
  //
  // Paste
  //
  ////////////////////////////////////////////////////////////////////////////
  public void test_IMenuPolicy_PASTE_validateBad() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'/>",
        "    <g:Button wbp:name='button'/>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    refresh();
    MenuBarInfo bar = getObjectByName("bar");
    WidgetInfo button = getObjectByName("button");
    // validate
    IMenuPolicy policy = MenuObjectInfoUtils.getMenuInfo(bar).getPolicy();
    // Object can not be pasted (not list of memento at all)
    assertFalse(policy.validatePaste(new Object()));
    // RootPanel can not be pasted (even it memento)
    {
      XmlObjectMemento memento = XmlObjectMemento.createMemento(button);
      List<XmlObjectMemento> mementos = ImmutableList.of(memento);
      assertFalse(policy.validatePaste(mementos));
    }
  }

  public void test_IMenuPolicy_PASTE() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='My item'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    refresh();
    MenuBarInfo bar = getObjectByName("bar");
    // prepare memento
    List<XmlObjectMemento> mementos;
    {
      MenuItemInfo existingItem = getObjectByName("item");
      XmlObjectMemento memento = XmlObjectMemento.createMemento(existingItem);
      mementos = ImmutableList.of(memento);
    }
    // paste new "Item"
    {
      IMenuPolicy policy = MenuObjectInfoUtils.getMenuInfo(bar).getPolicy();
      // validate
      assertTrue(policy.validatePaste(mementos));
      // do paste
      List<?> pastedObjects = policy.commandPaste(mementos, null);
      assertThat(pastedObjects).hasSize(1);
      assertThat(pastedObjects.get(0)).isInstanceOf(MenuItemInfo.class);
    }
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item' text='My item'/>",
        "      <g:MenuItem text='My item'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
  }

  public void test_IMenuPolicy_MOVE() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item_1' text='A'>",
        "        <g:MenuBar wbp:name='subMenu_1'/>",
        "      </g:MenuItem>",
        "      <g:MenuItem wbp:name='item_2' text='B'>",
        "        <g:MenuBar wbp:name='subMenu_2'/>",
        "      </g:MenuItem>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='item_1' text='A'>",
        "      <g:MenuBar wbp:name='subMenu_1'>",
        "    <g:MenuItem wbp:name='item_2' text='B'>",
        "      <g:MenuBar wbp:name='subMenu_2'>");
    MenuBarInfo bar = getObjectByName("bar");
    MenuItemInfo item_1 = getObjectByName("item_1");
    MenuItemInfo item_2 = getObjectByName("item_2");
    // can not move "bar" on "subMenu_1"
    {
      MenuBarInfo subMenu_1 = item_1.getSubMenu();
      IMenuInfo subMenuObject_1 = MenuObjectInfoUtils.getMenuInfo(subMenu_1);
      assertFalse(subMenuObject_1.getPolicy().validateMove(bar));
    }
    // move "item_2" before "item_1"
    {
      IMenuPolicy policy = MenuObjectInfoUtils.getMenuInfo(bar).getPolicy();
      // validate
      {
        assertFalse(policy.validateMove(new Object()));
        assertTrue(policy.validateMove(item_2));
      }
      // do move
      policy.commandMove(item_2, item_1);
    }
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='item_2' text='B'>",
        "        <g:MenuBar wbp:name='subMenu_2'/>",
        "      </g:MenuItem>",
        "      <g:MenuItem wbp:name='item_1' text='A'>",
        "        <g:MenuBar wbp:name='subMenu_1'/>",
        "      </g:MenuItem>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='item_2' text='B'>",
        "      <g:MenuBar wbp:name='subMenu_2'>",
        "    <g:MenuItem wbp:name='item_1' text='A'>",
        "      <g:MenuBar wbp:name='subMenu_1'>");
  }

  public void test_IMenuPolicy_ADD() throws Exception {
    parse(
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='subMenuItem' text='A'>",
        "        <g:MenuBar wbp:name='subMenu'/>",
        "      </g:MenuItem>",
        "      <g:MenuItem wbp:name='separateItem' text='B'/>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='subMenuItem' text='A'>",
        "      <g:MenuBar wbp:name='subMenu'>",
        "    <g:MenuItem wbp:name='separateItem' text='B'>");
    MenuBarInfo subMenu = getObjectByName("subMenu");
    MenuItemInfo separateItem = getObjectByName("separateItem");
    // can reparent "separateItem" to "subMenu"
    IMenuInfo subMenuObject = MenuObjectInfoUtils.getMenuInfo(subMenu);
    assertTrue(subMenuObject.getPolicy().validateMove(separateItem));
    subMenuObject.getPolicy().commandMove(separateItem, null);
    assertXML(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<ui:UiBinder>",
        "  <g:FlowPanel>",
        "    <g:MenuBar wbp:name='bar'>",
        "      <g:MenuItem wbp:name='subMenuItem' text='A'>",
        "        <g:MenuBar wbp:name='subMenu'>",
        "          <g:MenuItem wbp:name='separateItem' text='B'/>",
        "        </g:MenuBar>",
        "      </g:MenuItem>",
        "    </g:MenuBar>",
        "  </g:FlowPanel>",
        "</ui:UiBinder>");
    assertHierarchy(
        "// filler filler filler filler filler",
        "// filler filler filler filler filler",
        "<g:FlowPanel>",
        "  <g:MenuBar wbp:name='bar'>",
        "    <g:MenuItem wbp:name='subMenuItem' text='A'>",
        "      <g:MenuBar wbp:name='subMenu'>",
        "        <g:MenuItem wbp:name='separateItem' text='B'>");
  }
}
TOP

Related Classes of com.google.gdt.eclipse.designer.uibinder.model.widgets.MenuBarTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.