/* * $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.hdesktop.swingx.plaf.macosx; 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 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 org.hdesktop.swingx.JXEditorPane; import org.hdesktop.swingx.action.AbstractActionExt; import org.hdesktop.swingx.error.ErrorInfo; import org.hdesktop.swingx.error.ErrorLevel; import org.hdesktop.swingx.plaf.UIManagerExt; import org.hdesktop.swingx.plaf.basic.BasicErrorPaneUI; /** * * 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 JLabel titleLabel; private JEditorPane disclaimerText; // this is actually part of the details!!! //---------------------------------------------------------- constructor /** Creates a new instance of BasicErrorPanelUI */ public MacOSXErrorPaneUI() { super(); } @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")); } } @Override protected void configureReportAction(AbstractActionExt reportAction) { reportAction.setName(UIManagerExt.getString(CLASS_NAME + ".report_button_text", pane.getLocale())); // reportButton.setText("Send Report To Apple"); // reportButton.setPreferredSize(new Dimension(100, 30)); // reportButton.setMinimumSize(new Dimension(100, 30)); } 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) { e.printStackTrace(); } 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())); } }