Makes DiscloserPanelImagesRTL public, to allow apps to include it in bigger bundles.
Makes MenuBar#setItem public, on the road to allow keyboard control.



git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5027 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java
index ae8792f..89497f2 100644
--- a/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java
+++ b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImages.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * 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
@@ -19,39 +19,18 @@
  * An {@link ImageBundle} that provides images for {@link DisclosurePanel}.
  */
 public interface DisclosurePanelImages extends ImageBundle {
-  
+
   /**
    * An image indicating an open disclosure panel.
-   * 
+   *
    * @return a prototype of this image
    */
   AbstractImagePrototype disclosurePanelOpen();
-  
+
   /**
    * An image indicating a closed disclosure panel.
-   * 
+   *
    * @return a prototype of this image
    */
   AbstractImagePrototype disclosurePanelClosed();
 }
-
-/**
- * A bundle containing the RTL versions of the images for DisclosurePanel. Right now, we
- * only need to override the disclosurePanelClosed() method, as the image that we provide
- * for disclosurePanelOpen() is direction-agnostic.
- * 
- * Notice that this interface is package protected. This interface need not be
- * publicly exposed, as it is only used by the DisclosurePanel class to provide RTL
- * versions of the images in the case the the user does not pass in their own
- * bundle. However, we cannot make this class private, because the generated
- * class needs to be able to extend this class.
- */
-interface DisclosurePanelImagesRTL extends DisclosurePanelImages {
-  /**
-   * An image indicating a closed disclosure panel for a RTL context.
-   * 
-   * @return a prototype of this image
-   */
-  @Resource("disclosurePanelClosed_rtl.png")
-  AbstractImagePrototype disclosurePanelClosed();
-}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/user/client/ui/DisclosurePanelImagesRTL.java b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImagesRTL.java
new file mode 100644
index 0000000..05872bc
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/ui/DisclosurePanelImagesRTL.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.gwt.user.client.ui;
+
+/**
+ * A bundle containing the RTL versions of the images for DisclosurePanel. Right now, we
+ * only need to override the disclosurePanelClosed() method, as the image that we provide
+ * for disclosurePanelOpen() is direction-agnostic.
+ */
+public interface DisclosurePanelImagesRTL extends DisclosurePanelImages {
+  /**
+   * An image indicating a closed disclosure panel for a RTL context.
+   *
+   * @return a prototype of this image
+   */
+  @Resource("disclosurePanelClosed_rtl.png")
+  AbstractImagePrototype disclosurePanelClosed();
+}
diff --git a/user/src/com/google/gwt/user/client/ui/MenuBar.java b/user/src/com/google/gwt/user/client/ui/MenuBar.java
index a9fa5b3..3bc10ee 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * 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
@@ -37,11 +37,11 @@
  * A standard menu bar widget. A menu bar can contain any number of menu items,
  * each of which can either fire a {@link com.google.gwt.user.client.Command} or
  * open a cascaded menu bar.
- * 
+ *
  * <p>
  * <img class='gallery' src='MenuBar.png'/>
  * </p>
- * 
+ *
  * <h3>CSS Style Rules</h3>
  * <dl>
  * <dd>.gwt-MenuBar</dd>
@@ -90,12 +90,13 @@
  * <dt>the bottom center cell</dt>
  * <dd>.gwt-MenuBarPopup .menuPopupBottomCenterInner</dd>
  * <dt>the inner element of the cell</dt>
+
  * <dd>.gwt-MenuBarPopup .menuPopupBottomRight</dd>
  * <dt>the bottom right cell</dt>
  * <dd>.gwt-MenuBarPopup .menuPopupBottomRightInner</dd>
  * <dt>the inner element of the cell</dt>
  * </dl>
- * 
+ *
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.MenuBarExample}
@@ -112,7 +113,7 @@
   public interface MenuBarImages extends ImageBundle {
     /**
      * An image indicating a {@link MenuItem} has an associated submenu.
-     * 
+     *
      * @return a prototype of this image
      */
     AbstractImagePrototype menuBarSubMenuIcon();
@@ -120,7 +121,7 @@
 
   /**
    * A bundle containing the RTL versions of the images for MenuBar.
-   * 
+   *
    * Notice that this interface is package protected. This interface need not be
    * publicly exposed, as it is only used by the MenuBar class to provide RTL
    * versions of the images in the case the the user does not pass in their own
@@ -131,7 +132,7 @@
     /**
      * An image indicating a {@link MenuItem} has an associated submenu for a
      * RTL context.
-     * 
+     *
      * @return a prototype of this image
      */
     @Resource("menuBarSubMenuIcon_rtl.gif")
@@ -169,7 +170,7 @@
 
   /**
    * Creates an empty menu bar.
-   * 
+   *
    * @param vertical <code>true</code> to orient the menu bar vertically
    */
   public MenuBar(boolean vertical) {
@@ -184,7 +185,7 @@
   /**
    * Creates an empty menu bar that uses the specified image bundle for menu
    * images.
-   * 
+   *
    * @param vertical <code>true</code> to orient the menu bar vertically
    * @param images a bundle that provides images for this menu
    */
@@ -195,7 +196,7 @@
   /**
    * Creates an empty horizontal menu bar that uses the specified image bundle
    * for menu images.
-   * 
+   *
    * @param images a bundle that provides images for this menu
    */
   public MenuBar(MenuBarImages images) {
@@ -208,7 +209,7 @@
 
   /**
    * Adds a menu item to the bar.
-   * 
+   *
    * @param item the item to be added
    * @return the {@link MenuItem} object
    */
@@ -219,7 +220,7 @@
   /**
    * Adds a menu item to the bar, that will fire the given command when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param asHTML <code>true</code> to treat the specified text as html
    * @param cmd the command to be fired
@@ -232,7 +233,7 @@
   /**
    * Adds a menu item to the bar, that will open the specified menu when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param asHTML <code>true</code> to treat the specified text as html
    * @param popup the menu to be cascaded from it
@@ -245,7 +246,7 @@
   /**
    * Adds a menu item to the bar, that will fire the given command when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param cmd the command to be fired
    * @return the {@link MenuItem} object created
@@ -257,7 +258,7 @@
   /**
    * Adds a menu item to the bar, that will open the specified menu when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param popup the menu to be cascaded from it
    * @return the {@link MenuItem} object created
@@ -269,7 +270,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s.
-   * 
+   *
    * @return the {@link MenuItemSeparator} object created
    */
   public MenuItemSeparator addSeparator() {
@@ -279,7 +280,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s.
-   * 
+   *
    * @param separator the {@link MenuItemSeparator} to be added
    * @return the {@link MenuItemSeparator} object
    */
@@ -315,9 +316,16 @@
   }
 
   /**
+   * Give this MenuBar focus.
+   */
+  public void focus() {
+    FocusPanel.impl.focus(getElement());
+  }
+
+  /**
    * Gets whether this menu bar's child menus will open when the mouse is moved
    * over it.
-   * 
+   *
    * @return <code>true</code> if child menus will auto-open
    */
   public boolean getAutoOpen() {
@@ -326,7 +334,7 @@
 
   /**
    * Get the index of a {@link MenuItem}.
-   * 
+   *
    * @return the index of the item, or -1 if it is not contained by this MenuBar
    */
   public int getItemIndex(MenuItem item) {
@@ -335,7 +343,7 @@
 
   /**
    * Get the index of a {@link MenuItemSeparator}.
-   * 
+   *
    * @return the index of the separator, or -1 if it is not contained by this
    *         MenuBar
    */
@@ -345,7 +353,7 @@
 
   /**
    * Adds a menu item to the bar at a specific index.
-   * 
+   *
    * @param item the item to be inserted
    * @param beforeIndex the index where the item should be inserted
    * @return the {@link MenuItem} object
@@ -380,7 +388,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s at the specified index.
-   * 
+   *
    * @param beforeIndex the index where the seperator should be inserted
    * @return the {@link MenuItemSeparator} object
    * @throws IndexOutOfBoundsException if <code>beforeIndex</code> is out of
@@ -393,7 +401,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s at the specified index.
-   * 
+   *
    * @param separator the {@link MenuItemSeparator} to be inserted
    * @param beforeIndex the index where the seperator should be inserted
    * @return the {@link MenuItemSeparator} object
@@ -499,7 +507,7 @@
 
   /**
    * Closes the menu bar.
-   * 
+   *
    * @deprecated use {@link #addCloseHandler(CloseHandler)} instead.
    */
   @Deprecated
@@ -522,7 +530,7 @@
 
   /**
    * Removes the specified menu item from the bar.
-   * 
+   *
    * @param item the item to be removed
    */
   public void removeItem(MenuItem item) {
@@ -540,7 +548,7 @@
 
   /**
    * Removes the specified {@link MenuItemSeparator} from the bar.
-   * 
+   *
    * @param separator the separator to be removed
    */
   public void removeSeparator(MenuItemSeparator separator) {
@@ -549,6 +557,49 @@
     }
   }
 
+  /**
+   * Select the given MenuItem, which must be a direct child of this MenuBar.
+   * @param item the MenuItem to select, or null to clear selection
+   */
+  public void selectItem(MenuItem item) {
+    assert item == null || item.getParentMenu() == this;
+
+    if (item == selectedItem) {
+      return;
+    }
+
+    if (selectedItem != null) {
+      selectedItem.setSelectionStyle(false);
+      // Set the style of the submenu indicator
+      if (vertical) {
+        Element tr = DOM.getParent(selectedItem.getElement());
+        if (DOM.getChildCount(tr) == 2) {
+          Element td = DOM.getChild(tr, 1);
+          setStyleName(td, "subMenuIcon-selected", false);
+        }
+      }
+    }
+
+    if (item != null) {
+      item.setSelectionStyle(true);
+
+      // Set the style of the submenu indicator
+      if (vertical) {
+        Element tr = DOM.getParent(item.getElement());
+        if (DOM.getChildCount(tr) == 2) {
+          Element td = DOM.getChild(tr, 1);
+          setStyleName(td, "subMenuIcon-selected", true);
+        }
+      }
+
+      Accessibility.setState(getElement(),
+          Accessibility.STATE_ACTIVEDESCENDANT, DOM.getElementAttribute(
+              item.getElement(), "id"));
+    }
+
+    selectedItem = item;
+  }
+
   public void setAnimationEnabled(boolean enable) {
     isAnimationEnabled = enable;
   }
@@ -556,7 +607,7 @@
   /**
    * Sets whether this menu bar's child menus will open when the mouse is moved
    * over it.
-   * 
+   *
    * @param autoOpen <code>true</code> to cause child menus to auto-open
    */
   public void setAutoOpen(boolean autoOpen) {
@@ -567,7 +618,7 @@
    * Returns a list containing the <code>MenuItem</code> objects in the menu
    * bar. If there are no items in the menu bar, then an empty <code>List</code>
    * object will be returned.
-   * 
+   *
    * @return a list containing the <code>MenuItem</code> objects in the menu bar
    */
   protected List<MenuItem> getItems() {
@@ -578,7 +629,7 @@
    * Returns the <code>MenuItem</code> that is currently selected (highlighted)
    * by the user. If none of the items in the menu are currently selected, then
    * <code>null</code> will be returned.
-   * 
+   *
    * @return the <code>MenuItem</code> that is currently selected, or
    *         <code>null</code> if no items are currently selected
    */
@@ -601,7 +652,7 @@
    * <ul>
    * <li>-item# = the {@link MenuItem} at the specified index.</li>
    * </ul>
-   * 
+   *
    * @see UIObject#onEnsureDebugId(String)
    */
   @Override
@@ -626,7 +677,7 @@
    * popup associated with it, the popup will be shown. If it has a command
    * associated with it, and 'fireCommand' is true, then the command will be
    * fired. Popups associated with other items will be hidden.
-   * 
+   *
    * @param item the item whose popup is to be shown. @param fireCommand
    * <code>true</code> if the item's command should be fired, <code>false</code>
    * otherwise.
@@ -702,46 +753,9 @@
     }
   }
 
-  void selectItem(MenuItem item) {
-    if (item == selectedItem) {
-      return;
-    }
-
-    if (selectedItem != null) {
-      selectedItem.setSelectionStyle(false);
-      // Set the style of the submenu indicator
-      if (vertical) {
-        Element tr = DOM.getParent(selectedItem.getElement());
-        if (DOM.getChildCount(tr) == 2) {
-          Element td = DOM.getChild(tr, 1);
-          setStyleName(td, "subMenuIcon-selected", false);
-        }
-      }
-    }
-
-    if (item != null) {
-      item.setSelectionStyle(true);
-
-      // Set the style of the submenu indicator
-      if (vertical) {
-        Element tr = DOM.getParent(item.getElement());
-        if (DOM.getChildCount(tr) == 2) {
-          Element td = DOM.getChild(tr, 1);
-          setStyleName(td, "subMenuIcon-selected", true);
-        }
-      }
-
-      Accessibility.setState(getElement(),
-          Accessibility.STATE_ACTIVEDESCENDANT, DOM.getElementAttribute(
-              item.getElement(), "id"));
-    }
-
-    selectedItem = item;
-  }
-
   /**
    * Set the IDs of the menu items.
-   * 
+   *
    * @param baseID the base ID
    */
   void setMenuItemDebugIds(String baseID) {
@@ -754,7 +768,7 @@
 
   /**
    * Show or hide the icon used for items with a submenu.
-   * 
+   *
    * @param item the item with or without a submenu
    */
   void updateSubmenuIcon(MenuItem item) {
@@ -793,7 +807,7 @@
   /**
    * Physically add the td element of a {@link MenuItem} or
    * {@link MenuItemSeparator} to this {@link MenuBar}.
-   * 
+   *
    * @param beforeIndex the index where the seperator should be inserted
    * @param tdElem the td element to be added
    */
@@ -831,10 +845,6 @@
     return null;
   }
 
-  private void focus() {
-    FocusPanel.impl.focus(getElement());
-  }
-
   private Element getItemContainerElement() {
     if (vertical) {
       return body;
@@ -979,7 +989,7 @@
     // clear the selection; a keyboard user can cursor down to the first item
     selectItem(null);
   }
- 
+
   private void openPopup(final MenuItem item) {
     // Only the last popup to be opened should preview all event
     if (parentMenu != null && parentMenu.popup != null) {
@@ -1069,7 +1079,7 @@
   /**
    * Removes the specified item from the {@link MenuBar} and the physical DOM
    * structure.
-   * 
+   *
    * @param item the item to be removed
    * @return true if the item was removed
    */
@@ -1088,7 +1098,7 @@
   /**
    * Selects the first item in the menu if no items are currently selected. This
    * method assumes that the menu has at least 1 item.
-   * 
+   *
    * @return true if no item was previously selected and the first item in the
    *         list was selected, false otherwise
    */
@@ -1154,7 +1164,7 @@
 
   /**
    * Set the colspan of a {@link MenuItem} or {@link MenuItemSeparator}.
-   * 
+   *
    * @param item the {@link MenuItem} or {@link MenuItemSeparator}
    * @param colspan the colspan
    */
diff --git a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
index 21beb5b..6e8af4a 100644
--- a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * 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
@@ -74,7 +74,7 @@
     bar.removeSeparator(separator0);
     assertEquals(item1, items.get(0));
     assertNull(separator0.getParentMenu());
-    
+
     // Add a bunch of items and clear them all
     MenuItem item2 = bar.addItem("test2", true, blankCommand);
     MenuItemSeparator separator1 = bar.addSeparator();
@@ -182,6 +182,29 @@
     }
   }
 
+  public void testSelectItem() {
+    Command emptyCommand = new Command() {
+      public void execute() {
+      }
+    };
+
+    MenuBar bar = new MenuBar(false);
+    MenuItem item1 = new MenuItem("item1", emptyCommand);
+    MenuItem item2 = new MenuItem("item2", emptyCommand);
+    MenuItem item3 = new MenuItem("item3", emptyCommand);
+    bar.addItem(item1);
+    bar.addItem(item2);
+    bar.addItem(item3);
+    RootPanel.get().add(bar);
+
+    bar.selectItem(item1);
+    assertEquals(item1, bar.getSelectedItem());
+    bar.selectItem(item3);
+    assertEquals(item3, bar.getSelectedItem());
+    bar.selectItem(null);
+    assertNull(bar.getSelectedItem());
+  }
+
   public void testDebugId() {
     Command emptyCommand = new Command() {
       public void execute() {
@@ -202,7 +225,7 @@
     bar.addItem("top1", emptyCommand);
     MenuItem top2 = bar.addItem("top2", subMenu);
     RootPanel.get().add(bar);
-    
+
     // Open the item with a submenu
     bar.itemOver(top2, true);