1package autotest.common.ui;
2
3import com.google.gwt.dom.client.Element;
4import com.google.gwt.dom.client.EventTarget;
5import com.google.gwt.event.dom.client.DoubleClickEvent;
6import com.google.gwt.event.dom.client.DoubleClickHandler;
7import com.google.gwt.event.dom.client.HasClickHandlers;
8import com.google.gwt.event.shared.HandlerManager;
9import com.google.gwt.event.shared.HandlerRegistration;
10import com.google.gwt.user.client.ui.Button;
11import com.google.gwt.user.client.ui.Composite;
12import com.google.gwt.user.client.ui.HorizontalPanel;
13import com.google.gwt.user.client.ui.Panel;
14import com.google.gwt.user.client.ui.VerticalPanel;
15
16public class DoubleListSelector extends Composite
17                                implements MultiListSelectPresenter.DoubleListDisplay,
18                                           DoubleClickHandler {
19    private static final int VISIBLE_ITEMS = 10;
20
21    private Panel container = new HorizontalPanel();
22    private ExtendedListBox availableBox = new ExtendedListBox();
23    private ExtendedListBox selectedBox = new ExtendedListBox();
24    private Button addButton = new Button("Add >"), addAllButton = new Button("Add all >");
25    private Button removeButton = new Button("< Remove"),
26                   removeAllButton = new Button("< Remove all");
27    private Button moveUpButton = new Button("Move up"), moveDownButton = new Button("Move down");
28
29    private HandlerManager availableListHandlerManager = new HandlerManager(availableBox);
30    private HandlerManager selectedListHandlerManager = new HandlerManager(selectedBox);
31
32    public DoubleListSelector() {
33        availableBox.setVisibleItemCount(VISIBLE_ITEMS);
34        selectedBox.setVisibleItemCount(VISIBLE_ITEMS);
35
36        Panel moveButtonPanel = new VerticalPanel();
37        moveButtonPanel.add(addAllButton);
38        moveButtonPanel.add(addButton);
39        moveButtonPanel.add(removeButton);
40        moveButtonPanel.add(removeAllButton);
41
42        Panel reorderButtonPanel = new VerticalPanel();
43        reorderButtonPanel.add(moveUpButton);
44        reorderButtonPanel.add(moveDownButton);
45
46        container.add(availableBox);
47        container.add(moveButtonPanel);
48        container.add(selectedBox);
49        container.add(reorderButtonPanel);
50
51        initWidget(container);
52
53        addDomHandler(this, DoubleClickEvent.getType());
54    }
55
56    public HasClickHandlers getAddAllButton() {
57        return addAllButton;
58    }
59
60    public HasClickHandlers getAddButton() {
61        return addButton;
62    }
63
64    public HasClickHandlers getRemoveButton() {
65        return removeButton;
66    }
67
68    public HasClickHandlers getRemoveAllButton() {
69        return removeAllButton;
70    }
71
72    public HasClickHandlers getMoveUpButton() {
73        return moveUpButton;
74    }
75
76    public HasClickHandlers getMoveDownButton() {
77        return moveDownButton;
78    }
79
80    public SimplifiedList getAvailableList() {
81        return availableBox;
82    }
83
84    public SimplifiedList getSelectedList() {
85        return selectedBox;
86    }
87
88    @Override
89    public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
90        availableListHandlerManager.addHandler(DoubleClickEvent.getType(), handler);
91        selectedListHandlerManager.addHandler(DoubleClickEvent.getType(), handler);
92        // removing handlers is unimplemented for now.  if the need arises, it's easy to implement.
93        return null;
94    }
95
96    @Override
97    public void onDoubleClick(DoubleClickEvent event) {
98        EventTarget target = event.getNativeEvent().getEventTarget();
99        Element targetElement = Element.as(target);
100        if (availableBox.getElement().isOrHasChild(targetElement)) {
101            availableListHandlerManager.fireEvent(event);
102        } else if (selectedBox.getElement().isOrHasChild(targetElement)) {
103            selectedListHandlerManager.fireEvent(event);
104        } else {
105            return;
106        }
107
108        event.stopPropagation();
109    }
110}
111