1package autotest.common.ui;
2
3import com.google.gwt.event.logical.shared.CloseHandler;
4import com.google.gwt.user.client.Command;
5import com.google.gwt.user.client.Window;
6import com.google.gwt.user.client.ui.MenuBar;
7import com.google.gwt.user.client.ui.MenuItem;
8import com.google.gwt.user.client.ui.PopupPanel;
9
10
11
12public class ContextMenu {
13    private  PopupPanel popup = new PopupPanel(true);
14    private AutoHideMenu menu = new AutoHideMenu();
15    private boolean enabled = true;
16
17    private class CommandWrapper implements Command {
18        private Command command;
19
20        CommandWrapper(Command command) {
21            this.command = command;
22        }
23
24        public void execute() {
25            popup.hide();
26            command.execute();
27        }
28    }
29
30    private class AutoHideMenu extends MenuBar {
31        public AutoHideMenu() {
32            super(true);
33        }
34
35        public MenuItem addItem(String text, Command cmd) {
36            return super.addItem(text, new CommandWrapper(cmd));
37        }
38
39        public void setEnabled(boolean enabled) {
40            for (MenuItem menuItem : getItems()) {
41                menuItem.setEnabled(enabled);
42            }
43        }
44    }
45
46    public ContextMenu() {
47        menu.setAutoOpen(true);
48        setUseHandCursor(true);
49        popup.add(menu);
50    }
51
52    protected void setUseHandCursor(boolean enabled) {
53        if (enabled)
54            menu.addStyleName("menubar-hand-cursor");
55        else
56            menu.removeStyleName("menubar-hand-cursor");
57    }
58
59    public void addItem(String text, Command cmd) {
60        menu.addItem(text, new CommandWrapper(cmd));
61    }
62
63    public MenuBar addSubMenuItem(String text) {
64        MenuBar subMenu = new AutoHideMenu();
65        menu.addItem(text, subMenu);
66        return subMenu;
67    }
68
69    public void showAt(int left, int top) {
70        popup.setPopupPosition(left, top);
71        popup.show();
72    }
73
74    public void showAtWindow(int left, int top) {
75        showAt(left + Window.getScrollLeft(), top + Window.getScrollTop());
76    }
77
78    public void addCloseHandler(CloseHandler<PopupPanel> closeHandler) {
79        popup.addCloseHandler(closeHandler);
80    }
81
82    public boolean isEnabled() {
83        return enabled;
84    }
85
86    public void setEnabled(boolean enabled) {
87        this.enabled = enabled;
88        menu.setEnabled(enabled);
89        setUseHandCursor(enabled);
90    }
91}
92