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