// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2009-2011 Google, All Rights reserved // Copyright 2011-2012 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.client.widgets; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.Widget; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * A Toolbar is a horizontal arrangement of buttons (which can be a mixture * of regular and drop-down buttons). There is a left-aligned group of buttons * and a right-aligned group. * */ public class Toolbar extends Composite { /** * A Toolbar item has a widgetName that is unique over all items in * the toolbar, a caption (displayed to the user) * and a command to run when the item is selected. */ public static class ToolbarItem { private final String widgetName; private final String caption; private final Command command; public ToolbarItem(String widgetName, String caption, Command command) { this.widgetName = widgetName; this.caption = caption; this.command = command; } } private static final String DROP_DOWN_TRIANGLE = "\u25BE"; // All mappings are widget name to widget. // Regular button widgets private final Map<String, TextButton> buttonMap; // Drop-down button widgets private final Map<String, DropDownButton> dropDownButtonMap; private final HorizontalPanel leftButtons; private final HorizontalPanel rightButtons; /** * Initializes and assembles all commands into buttons in the toolbar. */ public Toolbar() { buttonMap = new HashMap<String, TextButton>(); dropDownButtonMap = new HashMap<String, DropDownButton>(); leftButtons = new HorizontalPanel(); leftButtons.setSpacing(4); rightButtons = new HorizontalPanel(); rightButtons.setSpacing(4); rightButtons.setHorizontalAlignment(HorizontalPanel.ALIGN_RIGHT); HorizontalPanel toolbar = new HorizontalPanel(); toolbar.add(leftButtons); // this nesting keeps buttons left aligned toolbar.add(rightButtons); toolbar.setCellHorizontalAlignment(rightButtons, HorizontalPanel.ALIGN_RIGHT); toolbar.setWidth("100%"); toolbar.setStylePrimaryName("ya-Toolbar"); initWidget(toolbar); } /** * Sets enabled for button * * @param widgetName name of button * @param enabled enabled status */ public void setButtonEnabled(String widgetName, boolean enabled) { buttonMap.get(widgetName).setEnabled(enabled); } /** * Sets text for button * * @param widgetName name of button * @param text text of button */ public void setButtonText(String widgetName, String text) { buttonMap.get(widgetName).setText(text); } /** * Sets button visibility * * @param widgetName name of button * @param enabled enabled status */ public void setButtonVisible(String widgetName, boolean enabled) { buttonMap.get(widgetName).setVisible(enabled); } /** * Sets enabled for drop down button * * @param widgetName name of button * @param enabled enabled status */ public void setDropDownButtonEnabled(String widgetName, boolean enabled) { dropDownButtonMap.get(widgetName).setEnabled(enabled); } /** * Sets drop down button visibility * * @param widgetName name of button * @param enabled enabled status */ public void setDropDownButtonVisible(String widgetName, boolean enabled) { dropDownButtonMap.get(widgetName).setVisible(enabled); } /** * Sets enabled for drop down item * * @param dropWidgetName name of drop-down widget * @param itemName name of item within dropWidgetName * @param enabled enabled status */ public void setDropItemEnabled(String dropWidgetName, String itemName, boolean enabled) { final DropDownButton button = dropDownButtonMap.get(dropWidgetName); if (button != null) { button.setItemEnabled(itemName, enabled); } } /** * Adds a button to the toolbar * * @param item button to add * @param rightAlign {@code true} if the button should be right-aligned, * {@code false} if left-aligned */ protected void addButton(final ToolbarItem item, boolean rightAlign) { TextButton button = new TextButton(item.caption); button.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { item.command.execute(); } }); if (rightAlign) { rightButtons.add(button); } else { leftButtons.add(button); } buttonMap.put(item.widgetName, button); } /** * * @param item button to add * @param rightAlign true if button is right-aligned, false if left * @param top special styling if the button is on the top. */ protected void addButton(final ToolbarItem item, boolean rightAlign, boolean top) { TextButton button = new TextButton(item.caption); button.setStyleName("ode-TopPanelDropDownButton"); button.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { item.command.execute(); } }); if (rightAlign) { rightButtons.add(button); } else { leftButtons.add(button); } buttonMap.put(item.widgetName, button); } /** * Adds a (left-aligned) button to the toolbar * * @param item the button to add */ protected void addButton(ToolbarItem item) { addButton(item, false); } /** * Adds a drop down button to the toolbar * * @param dropDownName name used for internal map * @param caption name of button * @param items list of items to add to drop down; null items indicate a separator should be * addded * @param rightAlign button should be right aligned in toolbar */ protected void addDropDownButton(String dropDownName, String caption, List<DropDownButton.DropDownItem> items, final boolean rightAlign) { final DropDownButton button = new DropDownButton(dropDownName, caption, items, rightAlign); if (rightAlign) { rightButtons.add(button); } else { leftButtons.add(button); } dropDownButtonMap.put(dropDownName, button); } /** * * @param dropDownName name used for internal map * @param caption name of button * @param items list of items to add to the drop down; null items indicate a separator * @param rightAlign button should be right aligned in toolbar * @param top special style if button is added to the topPanel */ protected void addDropDownButton(String dropDownName, String caption, List<DropDownButton.DropDownItem> items, final boolean rightAlign, final boolean top) { final DropDownButton button = new DropDownButton(dropDownName, caption, items, rightAlign); button.setStyleName("ode-TopPanelDropDownButton"); if (rightAlign) { rightButtons.add(button); } else { leftButtons.add(button); } dropDownButtonMap.put(dropDownName, button); } /** * Adds an item to a drop down button * * @param dropDownName name used for internal map * @param item item to add to drop down */ protected void addDropDownButtonItem(String dropDownName, DropDownButton.DropDownItem item) { final DropDownButton button = dropDownButtonMap.get(dropDownName); if (button != null && item != null) { button.addItem(item); } } /** * Removes an item from a drop down button if it exists. * * @param dropDownName name used for internal map * @param itemName name (text) of item to remove from drop down */ protected void removeDropDownButtonItem(String dropDownName, String itemName) { final DropDownButton button = dropDownButtonMap.get(dropDownName); if (button != null) { button.removeItem(itemName); } } /** * Clear all items from a drop-down button menu * * @param dropDownName the name of the drop-down button whose menu should * be cleared */ protected void clearDropDownMenu(String dropDownName) { dropDownButtonMap.get(dropDownName).clearAllItems(); } /** * Adds a (left-aligned) drop down button to the toolbar * * @param dropDownName name used for internal map * @param caption name of button * @param items list of items to add to drop down */ protected void addDropDownButton(String dropDownName, String caption, List<DropDownButton.DropDownItem> items) { addDropDownButton(dropDownName, caption, items, false); } /** * Changes a button's caption * * @param widgetName name of button * @param caption the new caption */ protected void setButtonCaption(String widgetName, String caption) { buttonMap.get(widgetName).setText(caption); } /** * Changes a drop down button's caption * * @param widgetName name of button * @param caption the new caption */ protected void setDropDownButtonCaption(String widgetName, String caption) { dropDownButtonMap.get(widgetName).setText(caption + " " + DROP_DOWN_TRIANGLE); } }