/* * org.openmicroscopy.shoola.util.ui.DetailedNotificationDialog * *------------------------------------------------------------------------------ * Copyright (C) 2006 University of Dundee. All rights reserved. * * * 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 2 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, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.util.ui; //Java imports import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSeparator; //Third-party libraries //Application-internal dependencies /** * A general-purpose modal dialog to display a notification message and * show a more detailed message on request. * This class builds on the capabilities of {@link NotificationDialog} by * adding a <i>details</i> button which shows/hides a given textual * explanation. * * @see org.openmicroscopy.shoola.util.ui.NotificationDialog * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author <br>Andrea Falconi      * <a href="mailto:a.falconi@dundee.ac.uk"> * a.falconi@dundee.ac.uk</a> * @version 2.2 * <small> * (<b>Internal version:</b> $Revision$ $Date$) * </small> * @since OME2.2 */ public class DetailedNotificationDialog extends NotificationDialog { /** Used as text of the {@link #detailsButton}. */ private static final String SHOW_DETAILS = "Details >>"; /** Used as text of the {@link #detailsButton}. */ private static final String HIDE_DETAILS = "<< Details"; /** Used as text of the {@link #sendButton}. */ private static final String SEND = "Send"; /** Used as tooltip of the {@link #sendButton}. */ private static final String SEND_DESCRIPTION = "Send the error to "+ "the development team."; /** * The preferred size of the scroll pane containing the explanation of * the notification message. */ private static final Dimension SCROLL_PANE_SIZE = new Dimension(300, 150); /** * A reduced size for the invisible components used to separate widgets * vertically. */ private static final Dimension SMALL_V_SPACER_SIZE = new Dimension(1, 6); /** Button to send a notification to the OME team. */ private JButton sendButton; /** Shows/hides the explanation message. */ private JButton detailsButton; /** Contains the textual explanation of the notification message. */ private JPanel explanationPanel; /** Tells whether the {@link #explanationPanel} is showing. */ private boolean isExplanationShowing; /** Creates the various UI components that make up the dialog. */ private void createComponents() { detailsButton = new JButton(SHOW_DETAILS); sendButton = new JButton(SEND); sendButton.setToolTipText(SEND_DESCRIPTION); explanationPanel = new JPanel(); } /** * Builds and lays out the {@link #explanationPanel}. * * @param expl A detailed explanation of the notification message. */ private void buildExplanationPanel(String expl) { MultilineLabel explanation = new MultilineLabel(expl); explanation.setLineWrap(false); buildExplanationPanel(explanation); } /** * Builds and lays out the explanation string * * @param component The component to go in the explanation panel. */ private void buildExplanationPanel(Component component) { JScrollPane scrollPane = new JScrollPane(component); scrollPane.setPreferredSize(SCROLL_PANE_SIZE); explanationPanel.setLayout( new BoxLayout(explanationPanel, BoxLayout.Y_AXIS)); explanationPanel.setBorder( BorderFactory.createEmptyBorder(0, 10, 0, 10)); explanationPanel.add(Box.createRigidArea(V_SPACER_SIZE)); explanationPanel.add(new JSeparator()); explanationPanel.add(Box.createRigidArea(SMALL_V_SPACER_SIZE)); explanationPanel.add(scrollPane); } /** * Binds the {@link #handleClick() handleClick} action to the event * generated when the {@link #detailsButton} is pressed and binds * the {@link #handleClick() handleClick} action to the event * generated when the {@link #sendButton} is pressed */ private void attachListeners() { detailsButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleClick(); } }); sendButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { handleSend(); } }); } /** * Handles mouse clicks on the {@link #detailsButton}. * The {@link #explanationPanel} is shown/hidden depending on the current * value of {@link #isExplanationShowing}, which is then modified to * reflect the new state. Also the {@link #detailsButton} text is changed * accordingly. */ private void handleClick() { if (isExplanationShowing) { detailsButton.setText(SHOW_DETAILS); contentPanel.remove(explanationPanel); } else { detailsButton.setText(HIDE_DETAILS); contentPanel.add(explanationPanel); } isExplanationShowing = !isExplanationShowing; pack(); } /** * Handles mouse clicks on the {@link #sendButton}. * A message is then sent to the development team. */ private void handleSend() { } /** * Hooks up the {@link #detailsButton} and the {@link #explanationPanel} to * the parent's GUI. * * @param explanation A detailed explanation of the notification message. */ private void buildGUI(String explanation) { controlsPanel.add(detailsButton); //buttonPanel.add(sendButton); controlsPanel.add(Box.createRigidArea(H_SPACER_SIZE)); buildExplanationPanel(explanation); } /** * Hooks up the {@link #detailsButton} and the {@link #explanationPanel} to * the parent's GUI. * * @param component A component containing the description of the * notification. */ private void buildGUI(Component component) { controlsPanel.add(detailsButton); controlsPanel.add(Box.createRigidArea(H_SPACER_SIZE)); buildExplanationPanel(component); } /** * Creates a new dialog. * You have to call {@link #setVisible(boolean)} to actually display it * on screen. * * @param owner The parent window. * @param title The title to display on the title bar. * @param message The notification message. * @param messageIcon An optional icon to display by the message. * @param explanation A detailed explanation of the notification message. */ public DetailedNotificationDialog(JFrame owner, String title, String message, Icon messageIcon, String explanation) { super(owner, title, message, messageIcon); createComponents(); attachListeners(); buildGUI(explanation); isExplanationShowing = false; } /** * Creates a new dialog. * You have to call {@link #setVisible(boolean)} to actually display it * on screen. * * @param owner The parent window. * @param title The title to display on the title bar. * @param message The notification message. * @param messageIcon An optional icon to display by the message. * @param component A component holding the details */ public DetailedNotificationDialog(JFrame owner, String title, String message, Icon messageIcon, Component component) { super(owner, title, message, messageIcon); createComponents(); attachListeners(); buildGUI(component); isExplanationShowing = false; } }