/*
* Copyright (C) 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.bus.client.util;
import org.jboss.errai.bus.client.framework.ClientMessageBusImpl;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
* The built-in, default error dialog.
*/
public class BusErrorDialog extends DialogBox {
boolean showErrors = !GWT.isProdMode();
Panel contentPanel = new AbsolutePanel();
public BusErrorDialog(final ClientMessageBusImpl clientMessageBus) {
hide();
setModal(false);
final VerticalPanel panel = new VerticalPanel();
final HorizontalPanel titleBar = new HorizontalPanel();
titleBar.getElement().getStyle().setProperty("backgroundColor", "#A9A9A9");
titleBar.getElement().getStyle().setWidth(100, Style.Unit.PCT);
titleBar.getElement().getStyle().setProperty("borderBottom", "1px solid black");
titleBar.getElement().getStyle().setProperty("marginBottom", "5px");
final Label titleBarLabel = new Label("An Error Occurred in the Bus");
titleBarLabel.getElement().getStyle().setFontSize(10, Style.Unit.PT);
titleBarLabel.getElement().getStyle().setFontWeight(Style.FontWeight.BOLDER);
titleBarLabel.getElement().getStyle().setColor("white");
titleBar.add(titleBarLabel);
titleBar.setCellVerticalAlignment(titleBarLabel, HasVerticalAlignment.ALIGN_MIDDLE);
final HorizontalPanel buttonPanel = new HorizontalPanel();
final CheckBox showFurtherErrors = new CheckBox();
showFurtherErrors.setValue(showErrors);
showFurtherErrors.setText("Show further errors");
showFurtherErrors.getElement().getStyle().setFontSize(10, Style.Unit.PT);
showFurtherErrors.getElement().getStyle().setColor("white");
showFurtherErrors.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
@Override
public void onValueChange(final ValueChangeEvent<Boolean> booleanValueChangeEvent) {
showErrors = booleanValueChangeEvent.getValue();
}
});
final Button disconnectFromServer = new Button("Disconnect Bus");
disconnectFromServer.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
if (Window
.confirm("Are you sure you want to disconnect and de-federate the local bus from the server bus? "
+ "This will permanently kill your session. You will need to refresh to reconnect. OK will proceed. Click "
+ "Cancel to abort this operation")) {
clientMessageBus.stop(true);
}
}
});
final Button clearErrors = new Button("Clear Log");
clearErrors.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
contentPanel.clear();
}
});
final Button closeButton = new Button("Dismiss Error");
closeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
BusErrorDialog.this.hide();
}
});
buttonPanel.add(showFurtherErrors);
buttonPanel.add(disconnectFromServer);
buttonPanel.add(clearErrors);
buttonPanel.add(closeButton);
buttonPanel.setCellVerticalAlignment(showFurtherErrors, HasVerticalAlignment.ALIGN_MIDDLE);
titleBar.add(buttonPanel);
titleBar.setCellHorizontalAlignment(buttonPanel, HasHorizontalAlignment.ALIGN_RIGHT);
panel.add(titleBar);
final Style s = panel.getElement().getStyle();
s.setProperty("border", "1px");
s.setProperty("borderStyle", "solid");
s.setProperty("borderColor", "black");
s.setProperty("backgroundColor", "#ede0c3");
resize();
panel.add(contentPanel);
add(panel);
getElement().getStyle().setZIndex(16777271); // WTF? 2^24 + 55?
}
public void addError(final String message, final String additionalDetails, final Throwable e) {
if (!showErrors)
return;
contentPanel.add(new HTML("<strong style='background:red;color:white;'>" + message + "</strong>"));
final StringBuilder buildTrace = new StringBuilder("<tt style=\"font-size:11px;\"><pre>");
if (e != null) {
e.printStackTrace();
buildTrace.append(e.getClass().getName()).append(": ").append(e.getMessage()).append("<br/>");
for (final StackTraceElement ste : e.getStackTrace()) {
buildTrace.append(" ").append(ste.toString()).append("<br/>");
}
}
buildTrace.append("</pre>");
contentPanel.add(new HTML(buildTrace.toString() + "<br/><strong>Additional Details:</strong>" + additionalDetails
+ "</tt>"));
if (!isShowing()) {
resize();
show();
center();
}
}
private void resize() {
contentPanel.setWidth(Window.getClientWidth() * 0.90 + "px");
contentPanel.setHeight(Window.getClientHeight() * 0.90 + "px");
contentPanel.getElement().getStyle().setProperty("overflow", "auto");
}
}