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