/* * SleepArchiver - cross-platform data manager for Sleeptracker-series watches. * Copyright (C) 2009-2011 Pavel Fatin <http://pavelfatin.com> * * 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/>. */ package com.pavelfatin.sleeparchiver.gui.error; import com.pavelfatin.sleeparchiver.lang.Utilities; import com.pavelfatin.sleeparchiver.swing.ApplicationDialog; import com.pavelfatin.sleeparchiver.swing.Builder; import org.jdesktop.application.Action; import javax.swing.*; import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.io.PrintWriter; import java.io.StringWriter; public class ErrorDialog extends ApplicationDialog { private JButton _ok; private JButton _details; private Throwable _exception; private String _info; private boolean _detailed; private JPanel _pane; private JTextArea _text; public ErrorDialog(JFrame owner, Throwable exception, String info) { super(owner); setName("dialogError"); _exception = exception; _info = info; setModal(true); setDefaultCloseOperation(DISPOSE_ON_CLOSE); getContentPane().add(createUI()); getResources().injectComponents(this); configureMainActions(getRootPane(), _ok); updateControls(); } private void updateControls() { _details.setIcon(getResources().getIcon(_detailed ? "iconUp" : "iconDown")); _pane.setVisible(_detailed); if (isShowing()) { pack(); } } protected JPanel createUI() { Builder b = new Builder("[250dlu,default]:grow", "default, 6dlu, default, default"); JLabel message = b.createLabel("labelMessage"); message.setIcon(UIManager.getIcon("OptionPane.errorIcon")); _pane = createPane(); b.add(message, 1, 1); b.add(createButtons(), 1, 3); b.add(_pane, 1, 4); b.setDialogBorder(); return b.getPanel(); } private JPanel createButtons() { Builder b = new Builder("50dlu, default:grow, 50dlu", "default"); _ok = b.createButton(getAction("ok")); _details = b.createButton(getAction("details")); _details.setHorizontalTextPosition(SwingConstants.LEADING); b.add(_details, 1, 1); b.add(_ok, 3, 1); return b.getPanel(); } private JPanel createPane() { Builder b = new Builder("default:grow", "6dlu, default, 3dlu, default"); _text = b.createTextArea("labelException"); String message = String.format("%s\r\n\r\n%s", _info, detailsOf(_exception)); _text.setRows(15); _text.setEditable(false); _text.setText(message); _text.setCaretPosition(0); b.add(new JScrollPane(_text), 1, 2); b.add(createDetaisButtons(), 1, 4); return b.getPanel(); } private String detailsOf(Throwable exception) { StringWriter writer = new StringWriter(); exception.printStackTrace(new PrintWriter(writer)); return writer.getBuffer().toString(); } private JPanel createDetaisButtons() { Builder b = new Builder("default, default:grow", "default"); b.add(b.createButton(getAction("copy")), 1, 1); return b.getPanel(); } private void configureMainActions(JRootPane root, JButton buttonOk) { root.setDefaultButton(buttonOk); Utilities.registerAction(root, JRootPane.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, getAction("ok"), "ACTION_OK"); } @Action public void ok() { dispose(); } @Action public void details() { _detailed = !_detailed; updateControls(); } @Action public void copy() { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); StringSelection data = new StringSelection(_text.getText()); clipboard.setContents(data, data); } public void open() { pack(); setLocationRelativeTo(getParent()); setVisible(true); } }