/*
* Copyright 2011 JBoss Inc
*
* 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.jbpm.formbuilder.client.notification;
import java.util.Collection;
import org.jbpm.formapi.client.CommonGlobals;
import org.jbpm.formbuilder.client.FormBuilderGlobals;
import org.jbpm.formbuilder.client.bus.ui.NotificationsVisibleEvent;
import org.jbpm.formbuilder.client.messages.I18NConstants;
import org.jbpm.formbuilder.client.resources.FormBuilderResources;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.UmbrellaException;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
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.Image;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
public class CompactNotificationsViewImpl extends SimplePanel implements NotificationsView {
private final I18NConstants i18n = FormBuilderGlobals.getInstance().getI18n();
private final EventBus bus = CommonGlobals.getInstance().getEventBus();
private final VerticalPanel panel = new VerticalPanel();
private final ScrollPanel scroll = new ScrollPanel(panel);
private final Image arrowImage = new Image();
public CompactNotificationsViewImpl() {
Button show = new Button();
DOM.setStyleAttribute(show.getElement(), "align", "left");
DOM.setStyleAttribute(show.getElement(), "textAlign", "left");
show.setWidth("100%");
show.setStylePrimaryName("fbStackPanel");
show.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
scroll.setVisible(!scroll.isVisible());
ImageResource down = FormBuilderResources.INSTANCE.arrowDown();
ImageResource up = FormBuilderResources.INSTANCE.arrowUp();
arrowImage.setResource(scroll.isVisible() ? down : up);
bus.fireEvent(new NotificationsVisibleEvent(scroll.isVisible()));
}
});
panel.setVerticalAlignment(HasVerticalAlignment.ALIGN_TOP);
scroll.addStyleName("notificationsView");
scroll.setSize("100%", "200px");
arrowImage.setResource(FormBuilderResources.INSTANCE.arrowDown());
VerticalPanel vPanel = new VerticalPanel();
vPanel.setWidth("100%");
Grid table = getButtonText();
show.setHTML(new SafeHtmlBuilder().appendHtmlConstant(table.toString()).toSafeHtml());
scroll.setVisible(false);
vPanel.add(show);
vPanel.add(scroll);
setWidget(vPanel);
new NotificationsPresenter(this);
}
private Grid getButtonText() {
Grid buttonText = new Grid(1, 2);
buttonText.getCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT);
buttonText.getCellFormatter().setHorizontalAlignment(0, 1, HasHorizontalAlignment.ALIGN_RIGHT);
buttonText.setWidget(0, 0, new HTML("<strong>" + i18n.Notifications() + "</strong>"));
buttonText.setWidth("100%");
buttonText.setBorderWidth(0);
buttonText.setCellPadding(0);
buttonText.setCellSpacing(0);
buttonText.setWidget(0, 1, arrowImage);
return buttonText;
}
@Override
public String getColorCss(String name) {
String colorCss = "greenNotification";
if ("WARN".equals(name)) {
colorCss = "orangeNotification";
} else if ("ERROR".equals(name)) {
colorCss = "redNotification";
}
return colorCss;
}
@Override
public void append(String colorCss, String message, Throwable error) {
HTML html = new HTML();
if (colorCss != null) {
html.setStyleName(colorCss);
}
StringBuilder msg = new StringBuilder(message).append("<br/>");
while (error != null) {
msg.append(stringStackTrace(error));
if (error instanceof UmbrellaException) {
Collection<Throwable> causes = ((UmbrellaException) error).getCauses();
if (causes != null) {
for (Throwable cause : causes) {
msg.append(stringStackTrace(cause));
}
}
}
if (error.getCause() != null && !error.equals(error.getCause())) {
error = error.getCause();
msg.append(i18n.CausedBy());
} else {
error = null;
}
}
html.setHTML(msg.toString());
panel.add(html);
if (!scroll.isVisible()) {
scroll.setVisible(true);
}
}
private String stringStackTrace(Throwable error) {
StringBuilder msg = new StringBuilder();
msg.append(error.getClass().getName()).append(": ").append(error.getLocalizedMessage()).append("<br/>");
StackTraceElement[] trace = error.getStackTrace();
for (int index = 0; trace != null && index < trace.length; index++) {
msg.append(i18n.StackTraceLine(trace[index].getClassName(),
trace[index].getMethodName(),
trace[index].getFileName(),
String.valueOf(trace[index].getLineNumber()))).
append("<br/>");
}
return msg.toString();
}
}