1e3f6868dac3b4c4714637d12b93d97823011a35cshowardpackage autotest.common.ui; 2e3f6868dac3b4c4714637d12b93d97823011a35cshoward 3e3f6868dac3b4c4714637d12b93d97823011a35cshowardimport autotest.common.CustomHistory; 4c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showardimport autotest.common.Utils; 5c674d3ea684f75f3e05f5834b598050eb1c8856dshowardimport autotest.common.CustomHistory.HistoryToken; 6e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh 79e494cc00c53f9dd0fabec3ef675cb874a9130adshowardimport com.google.gwt.dom.client.Document; 89e494cc00c53f9dd0fabec3ef675cb874a9130adshowardimport com.google.gwt.dom.client.Element; 9c674d3ea684f75f3e05f5834b598050eb1c8856dshowardimport com.google.gwt.http.client.URL; 10c674d3ea684f75f3e05f5834b598050eb1c8856dshowardimport com.google.gwt.user.client.Event; 11c674d3ea684f75f3e05f5834b598050eb1c8856dshowardimport com.google.gwt.user.client.History; 12c674d3ea684f75f3e05f5834b598050eb1c8856dshowardimport com.google.gwt.user.client.Window; 139e494cc00c53f9dd0fabec3ef675cb874a9130adshowardimport com.google.gwt.user.client.ui.HTMLPanel; 149f4500a294eea35dce003cee41c558fcde3eb09fshowardimport com.google.gwt.user.client.ui.Widget; 15e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh 16ca67229c5d9d3d6d5a94164338cedb1db6fc49cashowardimport java.util.Map; 17ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward 18e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh/** 195d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet * A widget to facilitate building a tab panel from elements present in the 20e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh * static HTML document. Each <code>TabView</code> grabs a certain HTML 21e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh * element, removes it from the document, and wraps it. It can then be added 22e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh * to a TabPanel. The <code>getTitle()</code> method retrieves a title for the 23e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh * tab from the "title" attribute of the HTML element. This class also supports 24e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh * lazy initialization of the tab by waiting until the tab is first displayed. 25e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh */ 26e5dd765d4900a6a826356075906ed552c59d6427jamesrenpublic abstract class TabView implements HasTabVisible { 279f4500a294eea35dce003cee41c558fcde3eb09fshoward private boolean initialized = false; 289e494cc00c53f9dd0fabec3ef675cb874a9130adshoward private HTMLPanel htmlPanel; 299f4500a294eea35dce003cee41c558fcde3eb09fshoward private String title; 300c31bc5ef2ecdf8edf19468e1a373520110f5bc6showard protected boolean visible; 31c674d3ea684f75f3e05f5834b598050eb1c8856dshoward private Map<String, String> savedState; 32920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang protected boolean autorefresh = false; 339f4500a294eea35dce003cee41c558fcde3eb09fshoward 349f4500a294eea35dce003cee41c558fcde3eb09fshoward public Widget getWidget() { 359e494cc00c53f9dd0fabec3ef675cb874a9130adshoward return htmlPanel; 36e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh } 379f4500a294eea35dce003cee41c558fcde3eb09fshoward 389f4500a294eea35dce003cee41c558fcde3eb09fshoward public void attachToDocument() { 399e494cc00c53f9dd0fabec3ef675cb874a9130adshoward title = Document.get().getElementById(getElementId()).getAttribute("title"); 409e494cc00c53f9dd0fabec3ef675cb874a9130adshoward htmlPanel = Utils.divToPanel(getElementId()); 419e494cc00c53f9dd0fabec3ef675cb874a9130adshoward } 425d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 439e494cc00c53f9dd0fabec3ef675cb874a9130adshoward public void addWidget(Widget widget, String subElementId) { 449e494cc00c53f9dd0fabec3ef675cb874a9130adshoward htmlPanel.add(widget, subElementId); 459e494cc00c53f9dd0fabec3ef675cb874a9130adshoward } 465d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 479e494cc00c53f9dd0fabec3ef675cb874a9130adshoward public Element getElementById(String subElementId) { 489e494cc00c53f9dd0fabec3ef675cb874a9130adshoward return htmlPanel.getElementById(subElementId); 499f4500a294eea35dce003cee41c558fcde3eb09fshoward } 509f4500a294eea35dce003cee41c558fcde3eb09fshoward 519f4500a294eea35dce003cee41c558fcde3eb09fshoward // for subclasses to override 529f4500a294eea35dce003cee41c558fcde3eb09fshoward public void initialize() {} 539f4500a294eea35dce003cee41c558fcde3eb09fshoward 54e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh public void ensureInitialized() { 55e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh if (!initialized) { 56e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh initialize(); 57e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh initialized = true; 58e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh } 59e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh } 605d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 619f4500a294eea35dce003cee41c558fcde3eb09fshoward // for subclasses to override 621c8c2215e525de8813c375e796354f8ffb811a08showard public void refresh() {} 635d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 64e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh public void display() { 65e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh ensureInitialized(); 661c8c2215e525de8813c375e796354f8ffb811a08showard refresh(); 670c31bc5ef2ecdf8edf19468e1a373520110f5bc6showard visible = true; 680c31bc5ef2ecdf8edf19468e1a373520110f5bc6showard } 695d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 700c31bc5ef2ecdf8edf19468e1a373520110f5bc6showard public void hide() { 710c31bc5ef2ecdf8edf19468e1a373520110f5bc6showard visible = false; 720c31bc5ef2ecdf8edf19468e1a373520110f5bc6showard } 735d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 74e5dd765d4900a6a826356075906ed552c59d6427jamesren public boolean isTabVisible() { 750c31bc5ef2ecdf8edf19468e1a373520110f5bc6showard return visible; 76e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh } 779f4500a294eea35dce003cee41c558fcde3eb09fshoward 78e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh public String getTitle() { 79e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh return title; 80e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh } 815d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 82e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh public void updateHistory() { 83c674d3ea684f75f3e05f5834b598050eb1c8856dshoward CustomHistory.newItem(getHistoryArguments()); 84ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward } 855d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 86ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward /** 87ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward * Subclasses should override this to store any additional history information. 88ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward */ 89c674d3ea684f75f3e05f5834b598050eb1c8856dshoward public HistoryToken getHistoryArguments() { 90c674d3ea684f75f3e05f5834b598050eb1c8856dshoward HistoryToken arguments = new HistoryToken(); 91ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward arguments.put("tab_id", getElementId()); 92ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward return arguments; 93e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh } 945d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet 959b53349896f215b44ee0d39e9002da0a4c260554showard /** 96ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward * Subclasses should override this to actually handle the tokens. 979b53349896f215b44ee0d39e9002da0a4c260554showard * Should *not* trigger a refresh. refresh() will be called separately. 985d84dc7f52f71992f4ac2719bc099d55f815c37fAviv Keshet * 993af93f9e93f65dad8d8e5b808d67320c2da958d5showard * @param arguments the parsed history arguments to use 1009b53349896f215b44ee0d39e9002da0a4c260554showard */ 101ca67229c5d9d3d6d5a94164338cedb1db6fc49cashoward public void handleHistoryArguments(Map<String, String> arguments) {} 1029f4500a294eea35dce003cee41c558fcde3eb09fshoward 103e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh public abstract String getElementId(); 104c674d3ea684f75f3e05f5834b598050eb1c8856dshoward 105c674d3ea684f75f3e05f5834b598050eb1c8856dshoward protected void saveHistoryState() { 106c674d3ea684f75f3e05f5834b598050eb1c8856dshoward savedState = getHistoryArguments(); 107c674d3ea684f75f3e05f5834b598050eb1c8856dshoward } 108c674d3ea684f75f3e05f5834b598050eb1c8856dshoward 109c674d3ea684f75f3e05f5834b598050eb1c8856dshoward protected void restoreHistoryState() { 110c674d3ea684f75f3e05f5834b598050eb1c8856dshoward handleHistoryArguments(savedState); 111c674d3ea684f75f3e05f5834b598050eb1c8856dshoward } 112c674d3ea684f75f3e05f5834b598050eb1c8856dshoward 113c674d3ea684f75f3e05f5834b598050eb1c8856dshoward protected void openHistoryToken(HistoryToken historyToken) { 114c674d3ea684f75f3e05f5834b598050eb1c8856dshoward if (isOpenInNewWindowEvent()) { 115c674d3ea684f75f3e05f5834b598050eb1c8856dshoward String newUrl = Window.Location.getPath() + "#" + historyToken; 116c0ac3a79cceec87873257a8b6d41d19c9fb02ec6showard Utils.openUrlInNewWindow(URL.encode(newUrl)); 117c674d3ea684f75f3e05f5834b598050eb1c8856dshoward } else { 118c674d3ea684f75f3e05f5834b598050eb1c8856dshoward History.newItem(historyToken.toString()); 119c674d3ea684f75f3e05f5834b598050eb1c8856dshoward } 120c674d3ea684f75f3e05f5834b598050eb1c8856dshoward } 121c674d3ea684f75f3e05f5834b598050eb1c8856dshoward 122c674d3ea684f75f3e05f5834b598050eb1c8856dshoward private static boolean isOpenInNewWindowEvent() { 123c674d3ea684f75f3e05f5834b598050eb1c8856dshoward Event event = Event.getCurrentEvent(); 124c674d3ea684f75f3e05f5834b598050eb1c8856dshoward boolean middleMouseButton = (event.getButton() & Event.BUTTON_MIDDLE) != 0; 1256315df674f86f719e816ea5689768ef0944e9f51showard // allow control-click on windows or command-click on macs (control-click is overridden 1266315df674f86f719e816ea5689768ef0944e9f51showard // on macs to take the place of right-click) 1276315df674f86f719e816ea5689768ef0944e9f51showard return event.getCtrlKey() || event.getMetaKey() || middleMouseButton; 128c674d3ea684f75f3e05f5834b598050eb1c8856dshoward } 129920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang 130920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang public boolean isAutorefreshOn() { 131920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang return autorefresh; 132920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang } 133920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang 134920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang public void setAutorefresh(boolean autorefresh) { 135920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang this.autorefresh = autorefresh; 136920a2d1fb62a56abdfd58f90df1d7d457abbc55cMichael Tang } 137e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh} 138