blob: e04d4d606e3000796440cb6d7bdcf5a21e9161c2 [file] [log] [blame]
package autotest.common.ui;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.Widget;
/**
* A singleton class to manage popup notifications, including error messages and
* the "loading..." box.
*/
public class NotifyManager {
private static final String SPINNER_IMAGE = "spinner.gif";
// singleton
public static final NotifyManager theInstance = new NotifyManager();
static class NotifyBox {
private PopupPanel outerPanel;
private Panel innerPanel = new HorizontalPanel();
private Label message = new Label();
public NotifyBox(boolean autoHide) {
outerPanel = new PopupPanel(autoHide);
outerPanel.setStyleName("notify");
innerPanel.setStyleName("notify-inner");
outerPanel.add(innerPanel);
}
public void addStyle(String style) {
innerPanel.addStyleName(style);
}
public void hide() {
outerPanel.hide();
}
public void show() {
outerPanel.show();
outerPanel.getElement().getStyle().setProperty("position", "fixed");
}
public void showMessage(String messageString) {
message.setText(messageString);
showWidget(message);
}
public void showWidget(Widget widget) {
innerPanel.clear();
innerPanel.add(widget);
show();
}
}
static class ErrorLog extends Composite {
protected DisclosurePanel disclosurePanel =
new DisclosurePanel("Error log");
protected TextArea errorTextArea = new TextArea();
public ErrorLog() {
errorTextArea.setCharacterWidth(120);
errorTextArea.setVisibleLines(30);
errorTextArea.setReadOnly(true);
disclosurePanel.add(errorTextArea);
initWidget(disclosurePanel);
}
public void logError(String error) {
String errorText = errorTextArea.getText();
if (!errorText.equals(""))
errorText += "\n------------------------------\n";
errorText += error;
errorTextArea.setText(errorText);
}
}
protected NotifyBox errorNotify = new NotifyBox(true);
protected NotifyBox messageNotify = new NotifyBox(true);
protected NotifyBox loadingNotify = new NotifyBox(false);
private HorizontalPanel loadingPanel = new HorizontalPanel();
protected ErrorLog errorLog = new ErrorLog();
private int loadingCount = 0;
private NotifyManager() {
errorNotify.addStyle("error");
}
/**
* Should be called a page loading time.
*/
public void initialize() {
errorNotify.hide();
messageNotify.hide();
loadingPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
loadingPanel.setSpacing(3);
loadingPanel.add(new Image(SPINNER_IMAGE));
loadingPanel.add(new Label("Loading..."));
loadingPanel.add(new Image(SPINNER_IMAGE));
RootPanel.get("error_log").add(errorLog);
errorLog.setVisible(false);
}
public static NotifyManager getInstance() {
return theInstance;
}
/**
* Show an error message.
*/
public void showError(String error, String logMessage) {
String errorLogText = error;
if (logMessage != null)
errorLogText += "\n" + logMessage;
errorNotify.showMessage(error);
log(errorLogText);
}
public void showError(String error) {
showError(error, null);
}
/**
* Log a message to the error log without showing any popup.
*/
public void log(String message) {
errorLog.logError(message);
errorLog.setVisible(true);
}
/**
* Show a notification message.
*/
public void showMessage(String message) {
messageNotify.showMessage(message);
}
/**
* Set whether the loading box is displayed or not.
*/
public void setLoading(boolean visible) {
if (visible) {
if (loadingCount == 0) {
loadingNotify.showWidget(loadingPanel);
}
loadingCount++;
} else {
loadingCount--;
if (loadingCount == 0) {
loadingNotify.hide();
}
}
}
}