1 package autotest.common.ui; 2 3 import autotest.common.CustomHistory; 4 import autotest.common.Utils; 5 import autotest.common.CustomHistory.HistoryToken; 6 7 import com.google.gwt.dom.client.Document; 8 import com.google.gwt.dom.client.Element; 9 import com.google.gwt.http.client.URL; 10 import com.google.gwt.user.client.Event; 11 import com.google.gwt.user.client.History; 12 import com.google.gwt.user.client.Window; 13 import com.google.gwt.user.client.ui.HTMLPanel; 14 import com.google.gwt.user.client.ui.Widget; 15 16 import java.util.Map; 17 18 /** 19 * A widget to facilitate building a tab panel from elements present in the 20 * static HTML document. Each <code>TabView</code> grabs a certain HTML 21 * element, removes it from the document, and wraps it. It can then be added 22 * to a TabPanel. The <code>getTitle()</code> method retrieves a title for the 23 * tab from the "title" attribute of the HTML element. This class also supports 24 * lazy initialization of the tab by waiting until the tab is first displayed. 25 */ 26 public abstract class TabView implements HasTabVisible { 27 private boolean initialized = false; 28 private HTMLPanel htmlPanel; 29 private String title; 30 protected boolean visible; 31 private Map<String, String> savedState; 32 protected boolean autorefresh = false; 33 getWidget()34 public Widget getWidget() { 35 return htmlPanel; 36 } 37 attachToDocument()38 public void attachToDocument() { 39 title = Document.get().getElementById(getElementId()).getAttribute("title"); 40 htmlPanel = Utils.divToPanel(getElementId()); 41 } 42 addWidget(Widget widget, String subElementId)43 public void addWidget(Widget widget, String subElementId) { 44 htmlPanel.add(widget, subElementId); 45 } 46 getElementById(String subElementId)47 public Element getElementById(String subElementId) { 48 return htmlPanel.getElementById(subElementId); 49 } 50 51 // for subclasses to override initialize()52 public void initialize() {} 53 ensureInitialized()54 public void ensureInitialized() { 55 if (!initialized) { 56 initialize(); 57 initialized = true; 58 } 59 } 60 61 // for subclasses to override refresh()62 public void refresh() {} 63 display()64 public void display() { 65 ensureInitialized(); 66 refresh(); 67 visible = true; 68 } 69 hide()70 public void hide() { 71 visible = false; 72 } 73 isTabVisible()74 public boolean isTabVisible() { 75 return visible; 76 } 77 getTitle()78 public String getTitle() { 79 return title; 80 } 81 updateHistory()82 public void updateHistory() { 83 CustomHistory.newItem(getHistoryArguments()); 84 } 85 86 /** 87 * Subclasses should override this to store any additional history information. 88 */ getHistoryArguments()89 public HistoryToken getHistoryArguments() { 90 HistoryToken arguments = new HistoryToken(); 91 arguments.put("tab_id", getElementId()); 92 return arguments; 93 } 94 95 /** 96 * Subclasses should override this to actually handle the tokens. 97 * Should *not* trigger a refresh. refresh() will be called separately. 98 * 99 * @param arguments the parsed history arguments to use 100 */ handleHistoryArguments(Map<String, String> arguments)101 public void handleHistoryArguments(Map<String, String> arguments) {} 102 getElementId()103 public abstract String getElementId(); 104 saveHistoryState()105 protected void saveHistoryState() { 106 savedState = getHistoryArguments(); 107 } 108 restoreHistoryState()109 protected void restoreHistoryState() { 110 handleHistoryArguments(savedState); 111 } 112 openHistoryToken(HistoryToken historyToken)113 protected void openHistoryToken(HistoryToken historyToken) { 114 if (isOpenInNewWindowEvent()) { 115 String newUrl = Window.Location.getPath() + "#" + historyToken; 116 Utils.openUrlInNewWindow(URL.encode(newUrl)); 117 } else { 118 History.newItem(historyToken.toString()); 119 } 120 } 121 isOpenInNewWindowEvent()122 private static boolean isOpenInNewWindowEvent() { 123 Event event = Event.getCurrentEvent(); 124 boolean middleMouseButton = (event.getButton() & Event.BUTTON_MIDDLE) != 0; 125 // allow control-click on windows or command-click on macs (control-click is overridden 126 // on macs to take the place of right-click) 127 return event.getCtrlKey() || event.getMetaKey() || middleMouseButton; 128 } 129 isAutorefreshOn()130 public boolean isAutorefreshOn() { 131 return autorefresh; 132 } 133 setAutorefresh(boolean autorefresh)134 public void setAutorefresh(boolean autorefresh) { 135 this.autorefresh = autorefresh; 136 } 137 } 138