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