Package org.gwtoolbox.widget.client.button

Source Code of org.gwtoolbox.widget.client.button.SimpleMenuButton$Callback

package org.gwtoolbox.widget.client.button;

import com.google.gwt.dom.client.Document;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.ui.ButtonBase;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RootPanel;
import org.gwtoolbox.commons.ui.client.event.custom.*;
import org.gwtoolbox.widget.client.menu.Menu;
import org.gwtoolbox.widget.client.menu.MenuItemBase;
import org.gwtoolbox.widget.client.menu.MenuPopup;
import org.gwtoolbox.widget.client.popup.Popup;

/**
* @author Uri Boness
*/
public class SimpleMenuButton extends Composite {

    private final ButtonBase button;

    private final MenuPopup popup;

    private Callback callback;

    public SimpleMenuButton(String caption) {
        this(caption, false);
    }

    public SimpleMenuButton(String caption, boolean verticalMenu) {
        this(new SimpleButton(caption), verticalMenu);
    }

    public SimpleMenuButton(final ButtonBase button, boolean verticalMenu) {
        button.setEnabled(false);
        popup = new MenuPopup(verticalMenu);
        popup.getMenu().addAddHandler(new AddHandler<MenuItemBase>() {
            public void onAdd(AddEvent<MenuItemBase> menuItemBaseAddEvent) {
                button.setEnabled(true);
            }
        });
        popup.getMenu().addRemoveHandler(new RemoveHandler<MenuItemBase>() {
            public void onRemove(RemoveEvent<MenuItemBase> menuItemBaseRemoveEvent) {
                button.setEnabled(!SimpleMenuButton.this.popup.getMenu().getItems().isEmpty());
            }
        });
        popup.getMenu().addClearHandler(new ClearHandler() {
            public void onClear(ClearEvent event) {
                button.setEnabled(!SimpleMenuButton.this.popup.getMenu().getItems().isEmpty());
            }
        });

        this.button = button;
        button.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                if (callback != null) {
                    if (!callback.beforeOpen(popup)) {
                        return;
                    }
                }
                popup.setPopupPositionAndShow(new MenuPopup.PositionCallback() {
                    public void setPosition(int offsetWidth, int offsetHeight) {
                        if (LocaleInfo.getCurrentLocale().isRTL()) {
                            setPopupPositionRTL(popup, offsetWidth, offsetHeight);
                        } else {
                            setPopupPosition(popup, offsetWidth, offsetHeight);
                        }
                    }
                });
            }
        });

        initWidget(button);
    }

    public Menu getMenu() {
        return popup.getMenu();
    }

    public boolean isMenuOpen() {
        return popup.isShowing();
    }

    public void setEnabled(boolean enabled) {
        button.setEnabled(enabled);
    }

    public boolean isEnabled() {
        return button.isEnabled();
    }

    public HandlerRegistration addCloseHandler(CloseHandler<Popup> handler) {
        return popup.addCloseHandler(handler);
    }

//    public void addPopupListener(org.gwtoolbox.widget.client.popup.PopupListener listener) {
//        popup.addPopupListener(listener);
//    }
//
//    public void removePopupListener(org.gwtoolbox.widget.client.popup.PopupListener listener) {
//        popup.removePopupListener(listener);
//    }

    public void setCallback(Callback callback) {
        this.callback = callback;
    }

    //================================================ Helper Methods ==================================================

    private void setPopupPosition(MenuPopup popup, int offsetWidth, int offsetHeight) {
        popup.setAnimationType(Popup.AnimationType.ROLL_DOWN);
        int left = button.getAbsoluteLeft();
        if (left + offsetWidth > Document.get().getClientWidth()) {
            left = Document.get().getClientWidth() - offsetWidth;
        }
        int top = button.getAbsoluteTop() + button.getOffsetHeight();
        if (top + offsetHeight > Document.get().getClientHeight()) {
            top = button.getAbsoluteTop() - offsetHeight;
            popup.setAnimationType(Popup.AnimationType.ROLL_UP);
        }
        popup.setPopupPosition(left, top);
    }

    private void setPopupPositionRTL(MenuPopup popup, int offsetWidth, int offsetHeight) {
        popup.setAnimationType(Popup.AnimationType.ROLL_DOWN);
        int left = button.getAbsoluteLeft() + button.getOffsetWidth() - offsetWidth;
        if (left < 0) {
            left = 0;
        }
        int top = button.getAbsoluteTop() + button.getOffsetHeight();
        if (top + offsetHeight > RootPanel.get().getOffsetHeight()) {
            top = RootPanel.get().getOffsetHeight() - button.getOffsetHeight() - offsetHeight;
            popup.setAnimationType(Popup.AnimationType.ROLL_UP);
        }
        popup.setPopupPosition(left, top);
    }

    //================================================= Inner Classes ==================================================

    public interface Callback {

        boolean beforeOpen(MenuPopup menuPopup);

    }

}
TOP

Related Classes of org.gwtoolbox.widget.client.button.SimpleMenuButton$Callback

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.