package com.andreiolar.abms.client.widgets; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import gwt.material.design.client.constants.ButtonType; import gwt.material.design.client.constants.CollapsibleType; import gwt.material.design.client.constants.Color; import gwt.material.design.client.constants.IconPosition; import gwt.material.design.client.constants.IconType; import gwt.material.design.client.constants.ModalType; import gwt.material.design.client.constants.TextAlign; import gwt.material.design.client.constants.WavesType; import gwt.material.design.client.ui.MaterialButton; import gwt.material.design.client.ui.MaterialCollapsible; import gwt.material.design.client.ui.MaterialCollapsibleBody; import gwt.material.design.client.ui.MaterialCollapsibleHeader; import gwt.material.design.client.ui.MaterialCollapsibleItem; import gwt.material.design.client.ui.MaterialLabel; import gwt.material.design.client.ui.MaterialLink; import gwt.material.design.client.ui.MaterialModal; import gwt.material.design.client.ui.MaterialModalContent; import gwt.material.design.client.ui.MaterialModalFooter; import gwt.material.design.client.ui.MaterialTitle; import gwt.material.design.client.ui.html.Br; public final class ModalCreator { public static MaterialModal createModal(Throwable caught) { return createErrorModal("Something went wrong", caught); } public static MaterialModal createErrorModal(String title, Throwable caught) { MaterialModal materialModal = new MaterialModal(); materialModal.setType(ModalType.DEFAULT); materialModal.setDismissible(false); materialModal.setInDuration(500); materialModal.setOutDuration(500); MaterialModalContent materialModalContent = new MaterialModalContent(); MaterialTitle materialTitle = new MaterialTitle(title); materialTitle.setDescription(caught.getMessage()); materialModalContent.add(materialTitle); // Collapsible for extra information MaterialCollapsible materialCollapsible = new MaterialCollapsible(); materialCollapsible.setType(CollapsibleType.POPOUT); materialCollapsible.add(new Br()); MaterialCollapsibleItem materialCollapsibleItem = new MaterialCollapsibleItem(); MaterialCollapsibleHeader materialCollapsibleHeader = new MaterialCollapsibleHeader(); materialCollapsibleHeader.setBackgroundColor(Color.GREY); materialCollapsibleHeader.setWaves(WavesType.DEFAULT); MaterialLink materialLink = new MaterialLink(); materialLink.setText("Show More Details"); materialLink.setIconType(IconType.ADD_CIRCLE_OUTLINE); materialLink.setIconPosition(IconPosition.LEFT); materialLink.setTextColor(Color.WHITE); materialCollapsibleHeader.addClickHandler(h -> { IconType iconType = materialLink.getIcon().getIconType(); if (IconType.ADD_CIRCLE_OUTLINE == iconType) { materialLink.setIconType(IconType.REMOVE_CIRCLE_OUTLINE); } else { materialLink.setIconType(IconType.ADD_CIRCLE_OUTLINE); } }); materialCollapsibleHeader.add(materialLink); MaterialCollapsibleBody materialCollapsibleBody = new MaterialCollapsibleBody(); materialCollapsibleBody.setBackgroundColor(Color.GREY_DARKEN_1); MaterialLabel materialLabel = new MaterialLabel(); materialLabel.setTextColor(Color.WHITE); materialLabel.setText(getMessage(caught)); materialCollapsibleBody.add(materialLabel); materialCollapsibleItem.add(materialCollapsibleHeader); materialCollapsibleItem.add(materialCollapsibleBody); materialCollapsible.add(materialCollapsibleItem); materialModalContent.add(materialCollapsible); MaterialModalFooter materialModalFooter = new MaterialModalFooter(); MaterialButton closeButton = new MaterialButton(); closeButton.setText("Close"); closeButton.setType(ButtonType.FLAT); closeButton.addClickHandler(h -> { materialModal.close(); RootPanel.get().remove(materialModal); }); materialModalFooter.add(closeButton); materialModal.add(materialModalContent); materialModal.add(materialModalFooter); return materialModal; } public static MaterialModal createWidgetModal(String title, Widget widget) { MaterialModal materialModal = new MaterialModal(); materialModal.setType(ModalType.DEFAULT); materialModal.setDismissible(false); materialModal.setInDuration(500); materialModal.setOutDuration(500); MaterialModalContent materialModalContent = new MaterialModalContent(); MaterialTitle materialTitle = new MaterialTitle(title); materialTitle.setTextColor(Color.BLUE); materialTitle.setTextAlign(TextAlign.CENTER); materialModalContent.add(materialTitle); materialModalContent.add(widget); MaterialModalFooter materialModalFooter = new MaterialModalFooter(); MaterialButton closeButton = new MaterialButton(); closeButton.setText("Close"); closeButton.setType(ButtonType.FLAT); closeButton.addClickHandler(h -> { materialModal.close(); RootPanel.get().remove(materialModal); }); materialModalFooter.add(closeButton); materialModal.add(materialModalContent); materialModal.add(materialModalFooter); return materialModal; } private static String getMessage(Throwable throwable) { // StackTraceDeobfuscator stackTraceDeobfuscator = StackTraceDeobfuscator.fromFileSystem("WEB-INF/deploy/abms/symbolMaps/"); // StackTraceElement[] resymbolized = stackTraceDeobfuscator.resymbolize(throwable.getStackTrace(), "871AFA126773584834214DADC2701C92"); StringBuilder sb = new StringBuilder(); for (StackTraceElement stackTraceElement : throwable.getStackTrace()) { sb.append(stackTraceElement + "\n"); } return sb.toString(); } }