org.jdesktop.swingx.plaf.macosx.MacOSXErrorPaneUI Maven / Gradle / Ivy
Show all versions of swingx-all Show documentation
/*
* $Id: MacOSXErrorPaneUI.java 3475 2009-08-28 08:30:47Z kleopatra $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jdesktop.swingx.plaf.macosx;
import org.jdesktop.swingx.JXEditorPane;
import org.jdesktop.swingx.error.ErrorInfo;
import org.jdesktop.swingx.error.ErrorLevel;
import org.jdesktop.swingx.plaf.UIManagerExt;
import org.jdesktop.swingx.plaf.basic.BasicErrorPaneUI;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Ok, the Title becomes the first line in the error dialog
*
* The text immediately follows. Then come the "Details". This is a
* toggle button with an icon and text but no border and no background. The icon
* looks like a tree toggle (arrow right or down).
*
* There is then more optional text. The best way to support this is to look
* in the client properties of the JXErrorPane for any "sub text". Ideally this
* sub text would be part of the ErrorInfo. Maybe I should just add it there?
*
* Finally come the buttons. If there is no report action and the error < fatal,
* the shown ok button should say "close". Otherwise, if there is no report action
* but the error >= fatal, it should say "Exit Application". If there is a report
* action but error < fatal, it should say "Don't Send" for ok, "Send Report" for
* the report button. If there is a report action and the error >= fatal, then
* one button should say "Exit", and the report button should say
* "Send Report and Exit".
*
* Whenever either button is clicked (ok button or report button), the "close dialog"
* procedure should occur.
*
* @author rbair
*/
public class MacOSXErrorPaneUI extends BasicErrorPaneUI {
private static final Logger LOG = Logger.getLogger(MacOSXErrorPaneUI.class.getName());
private JLabel titleLabel;
private JEditorPane disclaimerText; // this is actually part of the details!!!
//---------------------------------------------------------- constructor
/**
* Creates a new instance of BasicErrorPanelUI
*/
public MacOSXErrorPaneUI() {
}
@Override
protected void configureDetailsButton(boolean expanded) {
if (expanded) {
detailButton.setText(UIManagerExt.getString(CLASS_NAME + ".details_contract_text", detailButton.getLocale()));
detailButton.setIcon(UIManager.getIcon("Tree.expandedIcon"));
} else {
detailButton.setText(UIManagerExt.getString(CLASS_NAME + ".details_expand_text", detailButton.getLocale()));
detailButton.setIcon(UIManager.getIcon("Tree.collapsedIcon"));
}
}
public static ComponentUI createUI(JComponent c) {
return new MacOSXErrorPaneUI();
}
/**
* {@inheritDoc}
*/
@Override
public JFrame getErrorFrame(Component owner) {
JFrame frame = super.getErrorFrame(owner);
frame.setTitle(" ");
return frame;
}
/**
* {@inheritDoc}
*/
@Override
public JDialog getErrorDialog(Component owner) {
JDialog dlg = super.getErrorDialog(owner);
dlg.setTitle(" ");
return dlg;
}
/**
* {@inheritDoc}
*/
@Override
public JInternalFrame getErrorInternalFrame(Component owner) {
JInternalFrame frame = super.getErrorInternalFrame(owner);
frame.setTitle(" ");
return frame;
}
/**
* {@inheritDoc}
*/
@Override
protected LayoutManager createErrorPaneLayout() {
createExtraComponents();
GridBagLayout layout = new GridBagLayout();
try {
layout.addLayoutComponent(iconLabel, new GridBagConstraints(
0, 0, 1, 2, 0.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.NONE, new Insets(0, 0, 0, 17), 0, 0
));
layout.addLayoutComponent(titleLabel, new GridBagConstraints(
1, 0, 2, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 12, 0), 0, 0
));
layout.addLayoutComponent(errorScrollPane, new GridBagConstraints(
1, 1, 2, 1, 1.0, 1.0, GridBagConstraints.NORTH, GridBagConstraints.BOTH, new Insets(0, 0, 10, 0), 0, 0
));
layout.addLayoutComponent(detailButton, new GridBagConstraints(
0, 2, 3, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0, 0, 6, 0), 0, 0
));
layout.addLayoutComponent(detailsPanel, new GridBagConstraints(
0, 3, 3, 1, 1.0, 1.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 6, 0), 0, 0
));
layout.addLayoutComponent(disclaimerText, new GridBagConstraints(
0, 4, 3, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 6, 0), 0, 0
));
layout.addLayoutComponent(closeButton, new GridBagConstraints(
1, 5, 1, 1, 1.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0, 0, 0, 5), 0, 0
));
layout.addLayoutComponent(reportButton, new GridBagConstraints(
2, 5, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0
));
} catch (Exception e) {
LOG.log(Level.WARNING, e.getMessage(), e);
}
return layout;
}
/**
* {@inheritDoc}
*/
@Override
protected LayoutManager createDetailPanelLayout() {
GridBagLayout layout = new GridBagLayout();
layout.addLayoutComponent(detailsScrollPane, new GridBagConstraints(
0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0
));
copyToClipboardButton.setVisible(false);
return layout;
}
/**
* {@inheritDoc}
*/
@Override
protected void reinit() {
super.reinit();
ErrorInfo info = pane == null ? null : pane.getErrorInfo();
titleLabel.setText(info == null ? "Unknown Error" : info.getTitle());
Object finePrint = pane.getClientProperty("fine-print");
String text = finePrint == null ? null : finePrint.toString();
disclaimerText.setText(text);
disclaimerText.setVisible(text != null);
if (info != null && info.getErrorLevel() == ErrorLevel.FATAL) {
closeButton.setText(UIManagerExt.getString(CLASS_NAME + ".fatal_button_text", closeButton.getLocale()));
} else {
closeButton.setText(UIManagerExt.getString(CLASS_NAME + ".ok_button_text", closeButton.getLocale()));
}
}
/**
* {@inheritDoc}
*/
@Override
protected int getDetailsHeight() {
return 150;
}
private void createExtraComponents() {
titleLabel = new JLabel("Unknown Error");
titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD));
pane.add(titleLabel);
Font f = errorMessage.getFont();
if (f != null) {
errorMessage.setFont(f.deriveFont(f.getSize() - 2f));
}
disclaimerText = new JEditorPane();
disclaimerText.setContentType("text/html");
disclaimerText.setVisible(false);
disclaimerText.setEditable(false);
disclaimerText.setOpaque(false);
disclaimerText.putClientProperty(JXEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
if (f != null) {
disclaimerText.setFont(f.deriveFont(f.getSize() - 2f));
}
pane.add(disclaimerText);
detailButton.setBorderPainted(false);
detailButton.setContentAreaFilled(false);
detailButton.setBorder(BorderFactory.createEmptyBorder());
detailButton.setMargin(new Insets(0, 0, 0, 0));
detailButton.setIcon(UIManager.getIcon("Tree.collapsedIcon"));
detailButton.setText(UIManagerExt.getString(CLASS_NAME + ".details_expand_text", detailButton.getLocale()));
closeButton.setText(UIManagerExt.getString(CLASS_NAME + ".ok_button_text", closeButton.getLocale()));
}
}