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);