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        @Override
36        public MenuItem addItem(String text, Command cmd) {
37            return super.addItem(text, new CommandWrapper(cmd));
38        }
39
40        public void setEnabled(boolean enabled) {
41            for (MenuItem menuItem : getItems()) {
42                menuItem.setEnabled(enabled);
43            }
44        }
45    }
46
47    public ContextMenu() {
48        menu.setAutoOpen(true);
49        setUseHandCursor(true);
50        popup.add(menu);
51    }
52
53    protected void setUseHandCursor(boolean enabled) {
54        if (enabled)
55            menu.addStyleName("menubar-hand-cursor");
56        else
57            menu.removeStyleName("menubar-hand-cursor");
58    }
59
60    public void addItem(String text, Command cmd) {
61        menu.addItem(text, new CommandWrapper(cmd));
62    }
63
64    public MenuBar addSubMenuItem(String text) {
65        MenuBar subMenu = new AutoHideMenu();
66        menu.addItem(text, subMenu);
67        return subMenu;
68    }
69
70    public void showAt(int left, int top) {
71        popup.setPopupPosition(left, top);
72        popup.show();
73    }
74
75    public void showAtWindow(int left, int top) {
76        showAt(left + Window.getScrollLeft(), top + Window.getScrollTop());
77    }
78
79    public void addCloseHandler(CloseHandler<PopupPanel> closeHandler) {
80        popup.addCloseHandler(closeHandler);
81    }
82
83    public boolean isEnabled() {
84        return enabled;
85    }
86
87    public void setEnabled(boolean enabled) {
88        this.enabled = enabled;
89        menu.setEnabled(enabled);
90        setUseHandCursor(enabled);
91    }
92}
93