com.google.appinventor.client.widgets.Toolbar.java Source code

Java tutorial

Introduction

Here is the source code for com.google.appinventor.client.widgets.Toolbar.java

Source

// -*- 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);
    }
}