Home | History | Annotate | Download | only in ui
      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 
     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      */
    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 
    127     public void addTabView(TabView tabView) {
    128         tabView.attachToDocument();
    129         tabViews.add(tabView);
    130         tabPanel.add(tabView.getWidget(), tabView.getTitle());
    131     }
    132 
    133     public List<TabView> getTabViews() {
    134         return Collections.unmodifiableList(tabViews);
    135     }
    136 
    137     public TabView getSelectedTabView() {
    138         int selectedTab = tabPanel.getTabBar().getSelectedTab();
    139         if (selectedTab == -1)
    140             return null;
    141         return tabViews.get(selectedTab);
    142     }
    143 
    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 
    155     public TabPanel getTabPanel() {
    156         return tabPanel;
    157     }
    158 
    159     public Panel getOtherWidgetsPanel() {
    160         return otherWidgetsPanel;
    161     }
    162 
    163     public Panel getCommonAreaPanel() {
    164         return commonAreaPanel;
    165     }
    166 
    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
    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
    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