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