1e3f6868dac3b4c4714637d12b93d97823011a35cshowardpackage autotest.common.ui;
2e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
305fb6997f37ad8f62142be3092fc10ddb36433fbshowardimport com.google.gwt.user.client.ui.Composite;
405fb6997f37ad8f62142be3092fc10ddb36433fbshowardimport com.google.gwt.user.client.ui.DisclosurePanel;
5fb0762ed9e6e20c987d0613ffdf4859d14bd720ashowardimport com.google.gwt.user.client.ui.HorizontalPanel;
6fb0762ed9e6e20c987d0613ffdf4859d14bd720ashowardimport com.google.gwt.user.client.ui.Image;
7e8819cdf80ca0e0602d22551a50f970aa68e108dmblighimport com.google.gwt.user.client.ui.Label;
8f77862cb4c75fb91ec06db14f9fe68aac5368e4bshowardimport com.google.gwt.user.client.ui.Panel;
9e8819cdf80ca0e0602d22551a50f970aa68e108dmblighimport com.google.gwt.user.client.ui.PopupPanel;
1005fb6997f37ad8f62142be3092fc10ddb36433fbshowardimport com.google.gwt.user.client.ui.RootPanel;
1105fb6997f37ad8f62142be3092fc10ddb36433fbshowardimport com.google.gwt.user.client.ui.TextArea;
12fb0762ed9e6e20c987d0613ffdf4859d14bd720ashowardimport com.google.gwt.user.client.ui.Widget;
13e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
14e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh/**
15e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh * A singleton class to manage popup notifications, including error messages and
16e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh * the "loading..." box.
17e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh */
18e8819cdf80ca0e0602d22551a50f970aa68e108dmblighpublic class NotifyManager {
1901d6329ddd2b854a2531d432d6083a59c85f9358mbligh    private static final String SPINNER_IMAGE = "spinner.gif";
20fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward
21e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    // singleton
22e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    public static final NotifyManager theInstance = new NotifyManager();
23e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
246bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    static class NotifyBox {
25f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward        private PopupPanel outerPanel;
26f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward        private Panel innerPanel = new HorizontalPanel();
27fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        private Label message = new Label();
28e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
29e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        public NotifyBox(boolean autoHide) {
30f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            outerPanel = new PopupPanel(autoHide);
31f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            outerPanel.setStyleName("notify");
32f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward
33f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            innerPanel.setStyleName("notify-inner");
34f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            outerPanel.add(innerPanel);
35e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        }
36e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
37e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        public void addStyle(String style) {
38f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            innerPanel.addStyleName(style);
39e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        }
40e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
41e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        public void hide() {
42f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            outerPanel.hide();
43e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        }
44e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
45e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        public void show() {
46f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            outerPanel.show();
47f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            outerPanel.getElement().getStyle().setProperty("position", "fixed");
48e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        }
49e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
50e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        public void showMessage(String messageString) {
51e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh            message.setText(messageString);
52fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward            showWidget(message);
53fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        }
54fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward
55fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        public void showWidget(Widget widget) {
56f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            innerPanel.clear();
57f77862cb4c75fb91ec06db14f9fe68aac5368e4bshoward            innerPanel.add(widget);
58e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh            show();
59e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        }
60e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    }
61e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
626bc47015cce0ebc2fc255d3950bfeaf4851f36fdshoward    static class ErrorLog extends Composite {
6305fb6997f37ad8f62142be3092fc10ddb36433fbshoward        protected DisclosurePanel disclosurePanel =
6405fb6997f37ad8f62142be3092fc10ddb36433fbshoward            new DisclosurePanel("Error log");
6505fb6997f37ad8f62142be3092fc10ddb36433fbshoward        protected TextArea errorTextArea = new TextArea();
6605fb6997f37ad8f62142be3092fc10ddb36433fbshoward
6705fb6997f37ad8f62142be3092fc10ddb36433fbshoward        public ErrorLog() {
6805fb6997f37ad8f62142be3092fc10ddb36433fbshoward            errorTextArea.setCharacterWidth(120);
6905fb6997f37ad8f62142be3092fc10ddb36433fbshoward            errorTextArea.setVisibleLines(30);
7005fb6997f37ad8f62142be3092fc10ddb36433fbshoward            errorTextArea.setReadOnly(true);
7105fb6997f37ad8f62142be3092fc10ddb36433fbshoward            disclosurePanel.add(errorTextArea);
7205fb6997f37ad8f62142be3092fc10ddb36433fbshoward            initWidget(disclosurePanel);
7305fb6997f37ad8f62142be3092fc10ddb36433fbshoward        }
7405fb6997f37ad8f62142be3092fc10ddb36433fbshoward
7505fb6997f37ad8f62142be3092fc10ddb36433fbshoward        public void logError(String error) {
7605fb6997f37ad8f62142be3092fc10ddb36433fbshoward            String errorText = errorTextArea.getText();
7705fb6997f37ad8f62142be3092fc10ddb36433fbshoward            if (!errorText.equals(""))
7805fb6997f37ad8f62142be3092fc10ddb36433fbshoward                errorText += "\n------------------------------\n";
7905fb6997f37ad8f62142be3092fc10ddb36433fbshoward            errorText += error;
8005fb6997f37ad8f62142be3092fc10ddb36433fbshoward            errorTextArea.setText(errorText);
8105fb6997f37ad8f62142be3092fc10ddb36433fbshoward        }
8205fb6997f37ad8f62142be3092fc10ddb36433fbshoward    }
8305fb6997f37ad8f62142be3092fc10ddb36433fbshoward
84e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    protected NotifyBox errorNotify = new NotifyBox(true);
85e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    protected NotifyBox messageNotify = new NotifyBox(true);
86e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    protected NotifyBox loadingNotify = new NotifyBox(false);
87fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward    private HorizontalPanel loadingPanel = new HorizontalPanel();
8805fb6997f37ad8f62142be3092fc10ddb36433fbshoward    protected ErrorLog errorLog = new ErrorLog();
89a62866be14da66b1d3f061837617eeea8a192aa7showard    private int loadingCount = 0;
90e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
91e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    private NotifyManager() {
92e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        errorNotify.addStyle("error");
93e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    }
94e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
95e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    /**
96e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     * Should be called a page loading time.
97e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     */
98e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    public void initialize() {
99e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        errorNotify.hide();
100e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        messageNotify.hide();
10105fb6997f37ad8f62142be3092fc10ddb36433fbshoward
102fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        loadingPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
103fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        loadingPanel.setSpacing(3);
104fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        loadingPanel.add(new Image(SPINNER_IMAGE));
105fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        loadingPanel.add(new Label("Loading..."));
106fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        loadingPanel.add(new Image(SPINNER_IMAGE));
107fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward
10805fb6997f37ad8f62142be3092fc10ddb36433fbshoward        RootPanel.get("error_log").add(errorLog);
10905fb6997f37ad8f62142be3092fc10ddb36433fbshoward        errorLog.setVisible(false);
110e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    }
111e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
112e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    public static NotifyManager getInstance() {
113e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        return theInstance;
114e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    }
115e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
116e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    /**
117e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     * Show an error message.
118e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     */
11905fb6997f37ad8f62142be3092fc10ddb36433fbshoward    public void showError(String error, String logMessage) {
12005fb6997f37ad8f62142be3092fc10ddb36433fbshoward        String errorLogText = error;
12105fb6997f37ad8f62142be3092fc10ddb36433fbshoward        if (logMessage != null)
12205fb6997f37ad8f62142be3092fc10ddb36433fbshoward            errorLogText += "\n" + logMessage;
123e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        errorNotify.showMessage(error);
124fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward        log(errorLogText);
12505fb6997f37ad8f62142be3092fc10ddb36433fbshoward    }
12605fb6997f37ad8f62142be3092fc10ddb36433fbshoward
12705fb6997f37ad8f62142be3092fc10ddb36433fbshoward    public void showError(String error) {
12805fb6997f37ad8f62142be3092fc10ddb36433fbshoward        showError(error, null);
129e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    }
1305e2c70db8586bcd4c47fe6e5173357539c84cc57showard
1315e2c70db8586bcd4c47fe6e5173357539c84cc57showard    /**
1325e2c70db8586bcd4c47fe6e5173357539c84cc57showard     * Log a message to the error log without showing any popup.
1335e2c70db8586bcd4c47fe6e5173357539c84cc57showard     */
1345e2c70db8586bcd4c47fe6e5173357539c84cc57showard    public void log(String message) {
1355e2c70db8586bcd4c47fe6e5173357539c84cc57showard        errorLog.logError(message);
1365e2c70db8586bcd4c47fe6e5173357539c84cc57showard        errorLog.setVisible(true);
1375e2c70db8586bcd4c47fe6e5173357539c84cc57showard    }
138e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
139e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    /**
140e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     * Show a notification message.
141e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     */
142e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    public void showMessage(String message) {
143e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh        messageNotify.showMessage(message);
144e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    }
145e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh
146e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    /**
147e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     * Set whether the loading box is displayed or not.
148e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh     */
149e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    public void setLoading(boolean visible) {
150a62866be14da66b1d3f061837617eeea8a192aa7showard        if (visible) {
151a62866be14da66b1d3f061837617eeea8a192aa7showard            if (loadingCount == 0) {
152fb0762ed9e6e20c987d0613ffdf4859d14bd720ashoward                loadingNotify.showWidget(loadingPanel);
153a62866be14da66b1d3f061837617eeea8a192aa7showard            }
154a62866be14da66b1d3f061837617eeea8a192aa7showard            loadingCount++;
155a62866be14da66b1d3f061837617eeea8a192aa7showard        } else {
156a62866be14da66b1d3f061837617eeea8a192aa7showard            loadingCount--;
157a62866be14da66b1d3f061837617eeea8a192aa7showard            if (loadingCount == 0) {
158a62866be14da66b1d3f061837617eeea8a192aa7showard                loadingNotify.hide();
159a62866be14da66b1d3f061837617eeea8a192aa7showard            }
160a62866be14da66b1d3f061837617eeea8a192aa7showard        }
161e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh    }
162e8819cdf80ca0e0602d22551a50f970aa68e108dmbligh}
163