package org.gwtoolbox.sample.widget.client.misc;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.*;
import org.gwtoolbox.ioc.core.client.annotation.Component;
import org.gwtoolbox.sample.widget.client.SamplePanel;
import org.gwtoolbox.widget.client.label.BasicLabel;
import org.gwtoolbox.widget.client.menu.AbstractMenuContext;
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.menu.item.CheckMenuItem;
import org.gwtoolbox.widget.client.menu.item.MenuItemSelectionListener;
import org.gwtoolbox.widget.client.menu.item.RadioMenuItem;
import org.gwtoolbox.widget.client.menu.item.SelectionMenuItem;
import org.gwtoolbox.widget.client.popup.Popup;
/**
* @author Uri Boness
*/
@Component
@MiscSample
public class MenuSample extends Composite implements SamplePanel {
public MenuSample() {
FlowPanel main = new FlowPanel();
Menu menubar = new Menu();
menubar.setWidth("100%");
main.add(menubar);
Menu fileMenu = new Menu(true);
fileMenu.addItem("New", new AlertCommand("'New' was clicked")).setIconStyleName("menu-item-file-new");
fileMenu.addItem("Open...", new AlertCommand("'Open...' was clicked")).setIconStyleName("menu-item-file-open");
fileMenu.addSeparator();
fileMenu.addItem("Save...", new AlertCommand("'Save...' was clicked")).setIconStyleName("menu-item-file-save");
fileMenu.addItem("Save As...", new AlertCommand("'Save As...' was clicked")).setIconStyleName("menu-item-file-save");
fileMenu.addSeparator();
fileMenu.addItem("Exit", new AlertCommand("'Exit' was clicked")).setIconStyleName("menu-item-file-exit");
menubar.addItem("File", fileMenu);
Menu editMenu = new Menu(true);
editMenu.addItem("Undo", new AlertCommand("'Undo' was clicked")).setIconStyleName("menu-item-edit-undo");
editMenu.addItem("Redo", new AlertCommand("'Redo' was clicked")).setIconStyleName("menu-item-edit-redo");
editMenu.addSeparator();
editMenu.addItem("Cut", new AlertCommand("'Cut' was clicked")).setIconStyleName("menu-item-edit-cut");
editMenu.addItem("Copy", new AlertCommand("'Copy' was clicked")).setIconStyleName("menu-item-edit-copy");
editMenu.addItem("Paste", new AlertCommand("'Paste' was clicked")).setIconStyleName("menu-item-edit-paste");
menubar.addItem("Edit", editMenu);
Menu miscMenu = new Menu(true);
menubar.addItem("Misc", miscMenu);
final CheckMenuItem check2 = new CheckMenuItem("Option 2", true);
final CheckMenuItem check1 = new CheckMenuItem("Enable Option 2", true);
check1.setCommand(new Command() {
public void execute() {
check2.setEnabled(check1.isSelected());
}
});
miscMenu.addItem(check1);
check2.setCommand(new Command() {
public void execute() {
Window.alert("'Option 2' is " + (check2.isSelected() ? "checked" : "unchecked"));
}
});
miscMenu.addItem(check2);
miscMenu.addSeparator();
Menu secondary = new Menu(true);
secondary.addItem("Item 1", new AlertCommand("'Item 1' was clicked"));
secondary.addItem("Item 2", new AlertCommand("'Item 2' was clicked")).setEnabled(false);
secondary.addItem("Item 3", new AlertCommand("'Item 3' was clicked"));
miscMenu.addItem("Items", secondary);
miscMenu.addSeparator();
Menu radiosMenu = new Menu(true);
MenuItemSelectionListener listener = new MenuItemSelectionListener() {
public void selectionChanged(SelectionMenuItem item) {
Window.alert("'" + item.getKey() + "' was selected");
}
};
RadioMenuItem radio = new RadioMenuItem("1", "Option 1", false);
radio.addListener(listener);
radio.setGroup("options");
radiosMenu.addItem(radio);
radio = new RadioMenuItem("2", "Option 2", false);
radio.addListener(listener);
radio.setGroup("options");
radiosMenu.addItem(radio);
radio = new RadioMenuItem("3", "Option 3", false);
radio.addListener(listener);
radio.setGroup("options");
radiosMenu.addItem(radio);
miscMenu.addItem("Radios", radiosMenu);
// context menues
final MenuPopup contextMenu = new MenuPopup(true);
contextMenu.addItem("Item 1", new AlertCommand("'Item 1' was clicked"));
contextMenu.addItem("Item 2", new AlertCommand("'Item 2' was clicked"));
contextMenu.addItem("Item 3", new AlertCommand("'Item 3' was clicked"));
Menu subMenu = new Menu(true);
subMenu.addItem("Option 1", new AlertCommand("'Option 1' was clicked"));
subMenu.addItem("option2", "Option 2", new AlertCommand("'Option 2' was clicked"));
subMenu.addItem("Option 3", new AlertCommand("'Option 3' was clicked"));
contextMenu.addSubMenu("Options", subMenu);
BasicLabel label = new BasicLabel("Right-click Here");
label.addContextMenuHandler(new com.google.gwt.event.dom.client.ContextMenuHandler() {
public void onContextMenu(final ContextMenuEvent event) {
contextMenu.setPopupPositionAndShow(new Popup.PositionCallback() {
public void setPosition(int offsetWidth, int offsetHeight) {
int x = event.getNativeEvent().getClientX();
int y = event.getNativeEvent().getClientY();
contextMenu.setPopupPosition(x, y);
}
});
}
});
main.add(label);
label.setWidth("150px");
label.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
DOM.setStyleAttribute(label.getElement(), "cursor", "default");
DOM.setStyleAttribute(label.getElement(), "border", "1px solid gray");
DOM.setStyleAttribute(label.getElement(), "marginTop", "150px");
final CheckBox checkBox = new CheckBox("Disable Option 2");
checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
public void onValueChange(ValueChangeEvent<Boolean> event) {
MenuItemBase item = contextMenu.getMenu().getItem("Options.option2");
item.setEnabled(!event.getValue());
}
});
main.add(checkBox);
initWidget(main);
}
public String getName() {
return "Menus";
}
public Widget getContentWidget() {
return this;
}
public void reset() {
}
//================================================= Inner Classes ==================================================
private static class AlertCommand implements Command {
private final String message;
private AlertCommand(String message) {
this.message = message;
}
public void execute() {
Window.alert(message);
}
}
private class ContextMenuMenuContext extends AbstractMenuContext {
private boolean enabled;
public void update(MenuItemBase item) {
item.setEnabled(!("option2".equals(item.getKey()) && enabled));
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
fireChange();
}
}
}