• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package autotest.common.ui;
2 
3 import autotest.common.CustomHistory;
4 import autotest.common.CustomHistory.CustomHistoryListener;
5 
6 import com.google.gwt.event.dom.client.ClickEvent;
7 import com.google.gwt.event.dom.client.ClickHandler;
8 import com.google.gwt.event.logical.shared.BeforeSelectionEvent;
9 import com.google.gwt.event.logical.shared.BeforeSelectionHandler;
10 import com.google.gwt.event.logical.shared.SelectionEvent;
11 import com.google.gwt.event.logical.shared.SelectionHandler;
12 import com.google.gwt.event.logical.shared.ValueChangeEvent;
13 import com.google.gwt.event.logical.shared.ValueChangeHandler;
14 import com.google.gwt.user.client.Timer;
15 import com.google.gwt.user.client.ui.Button;
16 import com.google.gwt.user.client.ui.CheckBox;
17 import com.google.gwt.user.client.ui.Composite;
18 import com.google.gwt.user.client.ui.DeckPanel;
19 import com.google.gwt.user.client.ui.HorizontalPanel;
20 import com.google.gwt.user.client.ui.Panel;
21 import com.google.gwt.user.client.ui.TabPanel;
22 import com.google.gwt.user.client.ui.VerticalPanel;
23 
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.List;
27 import java.util.Map;
28 
29 public class CustomTabPanel extends Composite implements CustomHistoryListener,
30                                                          BeforeSelectionHandler<Integer>,
31                                                          SelectionHandler<Integer> {
32     private static final int AUTOREFRESH_INTERVAL = 5000; // millisecond
33 
34     protected TabPanel tabPanel = new TabPanel();
35     protected Panel otherWidgetsPanel = new HorizontalPanel();
36     private Panel commonAreaPanel = new VerticalPanel();
37     protected Button refreshButton = new Button("Refresh");
38     protected boolean autorefreshEnabled = false;
39     protected CheckBox autorefreshCheckbox = new CheckBox("Auto Refresh");
40     protected int topBarHeight = 0;
41     protected List<TabView> tabViews = new ArrayList<TabView>();
42     private boolean doUpdateHistory = true;
43     private Timer autorefreshTimer;
44 
CustomTabPanel()45     public CustomTabPanel() {
46       this(false);
47     }
48 
CustomTabPanel(boolean enableAutorefresh)49     public CustomTabPanel(boolean enableAutorefresh) {
50         VerticalPanel container = new VerticalPanel();
51         HorizontalPanel top = new HorizontalPanel();
52         VerticalPanel bottom = new VerticalPanel();
53         container.add(top);
54         container.add(bottom);
55 
56         // put the TabBar at the top left
57         top.add(tabPanel.getTabBar());
58         top.setCellHeight(tabPanel.getTabBar(), "100%");
59         tabPanel.getTabBar().setHeight("100%");
60 
61         // make a place for other widgets next to the tab bar
62         top.add(otherWidgetsPanel);
63 
64         // put a common area above the tab deck
65         commonAreaPanel.setWidth("100%");
66         bottom.add(commonAreaPanel);
67 
68         // put the TabPanel's DeckPanel below
69         DeckPanel tabDeck = tabPanel.getDeckPanel();
70         bottom.add(tabDeck);
71         bottom.setCellHeight(tabDeck, "100%");
72 
73         tabPanel.addBeforeSelectionHandler(this);
74         tabPanel.addSelectionHandler(this);
75 
76         // transfer the DeckPanel's class to the entire bottom panel
77         String tabDeckClass = tabDeck.getStyleName();
78         tabDeck.setStyleName("");
79         bottom.setStyleName(tabDeckClass);
80         bottom.setWidth("100%");
81 
82         refreshButton.addClickHandler(new ClickHandler() {
83             public void onClick(ClickEvent event) {
84                 getSelectedTabView().refresh();
85             }
86         });
87         otherWidgetsPanel.add(refreshButton);
88 
89         this.autorefreshEnabled = enableAutorefresh;
90         if (enableAutorefresh) {
91             autorefreshCheckbox.addValueChangeHandler(new ValueChangeHandler() {
92               public void onValueChange(ValueChangeEvent event) {
93                   // Ensure Initialization.
94                   if (autorefreshTimer == null)
95                       initialize();
96 
97                   Boolean value = autorefreshCheckbox.getValue();
98                   TabView selectedTabView = tabViews.get(
99                           tabPanel.getTabBar().getSelectedTab());
100                   if (selectedTabView != null)
101                       selectedTabView.setAutorefresh(value);
102                   if (value) {
103                       autorefreshTimer.scheduleRepeating(AUTOREFRESH_INTERVAL);
104                   } else {
105                       autorefreshTimer.cancel();
106                   }
107               }
108           });
109           otherWidgetsPanel.add(autorefreshCheckbox);
110         }
111 
112         CustomHistory.addHistoryListener(this);
113 
114         top.setStyleName("custom-tab-top");
115         container.setStyleName("custom-tab-panel");
116         initWidget(container);
117     }
118 
119     /**
120      * This must be called after this widget has been added to the page.
121      */
initialize()122     public void initialize() {
123         // if the history token didn't provide a selected tab, default to the
124         // first tab
125         if (getSelectedTabView() == null)
126             tabPanel.selectTab(0);
127         autorefreshTimer = new Timer() {
128             @Override
129             public void run() {
130                 getSelectedTabView().refresh();
131             }
132         };
133     }
134 
addTabView(TabView tabView)135     public void addTabView(TabView tabView) {
136         tabView.attachToDocument();
137         tabViews.add(tabView);
138         tabPanel.add(tabView.getWidget(), tabView.getTitle());
139     }
140 
getTabViews()141     public List<TabView> getTabViews() {
142         return Collections.unmodifiableList(tabViews);
143     }
144 
getSelectedTabView()145     public TabView getSelectedTabView() {
146         int selectedTab = tabPanel.getTabBar().getSelectedTab();
147         if (selectedTab == -1)
148             return null;
149         return tabViews.get(selectedTab);
150     }
151 
selectTabView(TabView tabView)152     public void selectTabView(TabView tabView) {
153         for (int i = 0; i < tabViews.size(); i++) {
154             if (tabViews.get(i) == tabView) {
155                 tabPanel.selectTab(i);
156                 return;
157             }
158         }
159 
160         throw new IllegalArgumentException("Tab not found");
161     }
162 
getTabPanel()163     public TabPanel getTabPanel() {
164         return tabPanel;
165     }
166 
getOtherWidgetsPanel()167     public Panel getOtherWidgetsPanel() {
168         return otherWidgetsPanel;
169     }
170 
getCommonAreaPanel()171     public Panel getCommonAreaPanel() {
172         return commonAreaPanel;
173     }
174 
onHistoryChanged(Map<String, String> arguments)175     public void onHistoryChanged(Map<String, String> arguments) {
176         String tabId = arguments.get("tab_id");
177         if (tabId == null) {
178             return;
179         }
180 
181         for (TabView tabView : tabViews) {
182             if (tabId.equals(tabView.getElementId())) {
183                 tabView.ensureInitialized();
184                 if (arguments.size() > 1) {
185                     // only pass along arguments if there's more than just tab_id
186                     tabView.handleHistoryArguments(arguments);
187                 }
188 
189                 if (getSelectedTabView() != tabView) {
190                     doUpdateHistory = false;
191                     selectTabView(tabView);
192                     doUpdateHistory = true;
193                 } else {
194                     tabView.display();
195                 }
196 
197                 return;
198             }
199         }
200     }
201 
202     @Override
onBeforeSelection(BeforeSelectionEvent<Integer> event)203     public void onBeforeSelection(BeforeSelectionEvent<Integer> event) {
204         // do nothing if the user clicks the selected tab
205         if (tabPanel.getTabBar().getSelectedTab() == event.getItem())
206             event.cancel();
207         TabView selectedTabView = getSelectedTabView();
208         if (selectedTabView != null) {
209             selectedTabView.hide();
210         }
211         tabViews.get(event.getItem()).ensureInitialized();
212         tabViews.get(event.getItem()).display();
213     }
214 
215     @Override
onSelection(SelectionEvent<Integer> event)216     public void onSelection(SelectionEvent<Integer> event) {
217         TabView selectedTabView = tabViews.get(event.getSelectedItem());
218         if (doUpdateHistory)
219             selectedTabView.updateHistory();
220         // The second parameter is to fire a valueChange event if value changed.
221         if (autorefreshEnabled) {
222           autorefreshCheckbox.setValue(selectedTabView.isAutorefreshOn(),
223              true);
224         }
225     }
226 }
227