/* * #%L * gitools-ui-platform * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.ui.platform.dialog; import org.apache.log4j.Level; import org.apache.log4j.Logger; import javax.swing.*; import java.awt.*; import java.lang.reflect.InvocationTargetException; public class MessageUtils { private static final Logger log = Logger.getLogger(MessageUtils.class); // Somewhat silly class, needed to pass values between threads static class ValueHolder { Object value; } /** * Log the exception and show {@code message} to the user * * @param e * @param message */ public static void showErrorMessage(final Frame parent, String message, Exception e) { log.error(message, e); showMessage(parent, Level.ERROR, message); } public static void showMessage(final Frame parent, String message) { showMessage(parent, Level.INFO, message); } private static synchronized void showMessage(final Frame parent, Level level, String message) { log.log(level, message); // Always use HTML for message displays, but first remove any embedded <html> tags. message = "<html>" + message.replaceAll("<html>", ""); Color background = parent != null ? parent.getBackground() : Color.lightGray; //So users can select text JEditorPane content = new JEditorPane(); content.setContentType("text/html"); content.setText(message); content.setBackground(background); JOptionPane.showMessageDialog(parent, content); } /** * Show a yes/no confirmation dialog. * * @param component * @param message * @return */ public static synchronized boolean confirm(final Component component, final String message) { if (SwingUtilities.isEventDispatchThread()) { int opt = JOptionPane.showConfirmDialog(component, message, "Confirm", JOptionPane.YES_NO_OPTION); return opt == JOptionPane.YES_OPTION; } else { final ValueHolder returnValue = new ValueHolder(); Runnable runnable = new Runnable() { public void run() { int opt = JOptionPane.showConfirmDialog(component, message, "Confirm", JOptionPane.YES_NO_OPTION); returnValue.value = (opt == JOptionPane.YES_OPTION); } }; try { SwingUtilities.invokeAndWait(runnable); } catch (InterruptedException e) { log.error("Error in showMessage", e); throw new RuntimeException(e); } catch (InvocationTargetException e) { log.error("Error in showMessage", e); throw new RuntimeException(e.getCause()); } return (Boolean) (returnValue.value); } } public static String showInputDialog(final Frame parent, final String message) { if (SwingUtilities.isEventDispatchThread()) { String val = JOptionPane.showInputDialog(parent, message); return val; } else { final ValueHolder returnValue = new ValueHolder(); Runnable runnable = new Runnable() { public void run() { String val = JOptionPane.showInputDialog(parent, message); returnValue.value = val; } }; try { SwingUtilities.invokeAndWait(runnable); } catch (InterruptedException e) { log.error("Error in showMessage", e); throw new RuntimeException(e); } catch (InvocationTargetException e) { log.error("Error in showMessage", e); throw new RuntimeException(e.getCause()); } return (String) (returnValue.value); } } }