001 /*
002 * $Id: MacOSXErrorPaneUI.java 3100 2008-10-14 22:33:10Z rah003 $
003 *
004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005 * Santa Clara, California 95054, U.S.A. All rights reserved.
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020 */
021
022 package org.jdesktop.swingx.plaf.macosx;
023
024 import java.awt.Component;
025 import java.awt.Dimension;
026 import java.awt.Font;
027 import java.awt.GridBagConstraints;
028 import java.awt.GridBagLayout;
029 import java.awt.Insets;
030 import java.awt.LayoutManager;
031
032 import javax.swing.BorderFactory;
033 import javax.swing.JComponent;
034 import javax.swing.JDialog;
035 import javax.swing.JEditorPane;
036 import javax.swing.JFrame;
037 import javax.swing.JInternalFrame;
038 import javax.swing.JLabel;
039 import javax.swing.UIManager;
040 import javax.swing.plaf.ComponentUI;
041
042 import org.jdesktop.swingx.JXEditorPane;
043 import org.jdesktop.swingx.action.AbstractActionExt;
044 import org.jdesktop.swingx.error.ErrorInfo;
045 import org.jdesktop.swingx.error.ErrorLevel;
046 import org.jdesktop.swingx.plaf.UIManagerExt;
047 import org.jdesktop.swingx.plaf.basic.BasicErrorPaneUI;
048
049 /**
050 *
051 * Ok, the Title becomes the first line in the error dialog
052 *
053 * The text immediately follows. Then come the "Details". This is a
054 * toggle button with an icon and text but no border and no background. The icon
055 * looks like a tree toggle (arrow right or down).
056 *
057 * There is then more optional text. The best way to support this is to look
058 * in the client properties of the JXErrorPane for any "sub text". Ideally this
059 * sub text would be part of the ErrorInfo. Maybe I should just add it there?
060 *
061 * Finally come the buttons. If there is no report action and the error < fatal,
062 * the shown ok button should say "close". Otherwise, if there is no report action
063 * but the error >= fatal, it should say "Exit Application". If there is a report
064 * action but error < fatal, it should say "Don't Send" for ok, "Send Report" for
065 * the report button. If there is a report action and the error >= fatal, then
066 * one button should say "Exit", and the report button should say
067 * "Send Report and Exit".
068 *
069 * Whenever either button is clicked (ok button or report button), the "close dialog"
070 * procedure should occur.
071 *
072 * @author rbair
073 */
074 public class MacOSXErrorPaneUI extends BasicErrorPaneUI {
075 private JLabel titleLabel;
076 private JEditorPane disclaimerText; // this is actually part of the details!!!
077
078 //---------------------------------------------------------- constructor
079 /** Creates a new instance of BasicErrorPanelUI */
080 public MacOSXErrorPaneUI() {
081 super();
082 }
083
084 protected void configureDetailsButton(boolean expanded) {
085 if (expanded) {
086 detailButton.setText(UIManagerExt.getString(CLASS_NAME + ".details_contract_text", detailButton.getLocale()));
087 detailButton.setIcon(UIManager.getIcon("Tree.expandedIcon"));
088 } else {
089 detailButton.setText(UIManagerExt.getString(CLASS_NAME + ".details_expand_text", detailButton.getLocale()));
090 detailButton.setIcon(UIManager.getIcon("Tree.collapsedIcon"));
091 }
092 }
093
094 protected void configureReportAction(AbstractActionExt reportAction) {
095 reportAction.setName(UIManagerExt.getString(CLASS_NAME + ".report_button_text", pane.getLocale()));
096 // reportButton.setText("Send Report To Apple");
097 // reportButton.setPreferredSize(new Dimension(100, 30));
098 // reportButton.setMinimumSize(new Dimension(100, 30));
099 }
100
101 public static ComponentUI createUI(JComponent c) {
102 return new MacOSXErrorPaneUI();
103 }
104
105 /**
106 * {@inheritDoc}
107 */
108 @Override
109 public JFrame getErrorFrame(Component owner) {
110 JFrame frame = super.getErrorFrame(owner);
111 frame.setTitle(" ");
112 return frame;
113 }
114
115 /**
116 * {@inheritDoc}
117 */
118 @Override
119 public JDialog getErrorDialog(Component owner) {
120 JDialog dlg = super.getErrorDialog(owner);
121 dlg.setTitle(" ");
122 return dlg;
123 }
124
125 /**
126 * {@inheritDoc}
127 */
128 @Override
129 public JInternalFrame getErrorInternalFrame(Component owner) {
130 JInternalFrame frame = super.getErrorInternalFrame(owner);
131 frame.setTitle(" ");
132 return frame;
133 }
134
135 /**
136 * {@inheritDoc}
137 */
138 @Override
139 protected LayoutManager createErrorPaneLayout() {
140 createExtraComponents();
141 GridBagLayout layout = new GridBagLayout();
142 try {
143 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));
144 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));
145 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));
146 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));
147 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));
148 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));
149 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));
150 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));
151 } catch (Exception e) {
152 e.printStackTrace();
153 }
154 return layout;
155 }
156
157 /**
158 * {@inheritDoc}
159 */
160 protected LayoutManager createDetailPanelLayout() {
161 GridBagLayout layout = new GridBagLayout();
162 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));
163 copyToClipboardButton.setVisible(false);
164 return layout;
165 }
166
167 /**
168 * {@inheritDoc}
169 */
170 protected void reinit() {
171 super.reinit();
172 ErrorInfo info = pane == null ? null : pane.getErrorInfo();
173 titleLabel.setText(info == null ? "Unknown Error" : info.getTitle());
174
175 Object finePrint = pane.getClientProperty("fine-print");
176 String text = finePrint == null ? null : finePrint.toString();
177 disclaimerText.setText(text);
178 disclaimerText.setVisible(text != null);
179
180 if (info != null && info.getErrorLevel() == ErrorLevel.FATAL) {
181 closeButton.setText(UIManagerExt.getString(CLASS_NAME + ".fatal_button_text", closeButton.getLocale()));
182 } else {
183 closeButton.setText(UIManagerExt.getString(CLASS_NAME + ".ok_button_text", closeButton.getLocale()));
184 }
185 }
186
187 /**
188 * {@inheritDoc}
189 */
190 protected int getDetailsHeight() {
191 return 150;
192 }
193
194 private void createExtraComponents() {
195 titleLabel = new JLabel("Unknown Error");
196 titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD));
197 pane.add(titleLabel);
198
199 Font f = errorMessage.getFont();
200 if (f != null) {
201 errorMessage.setFont(f.deriveFont(f.getSize() - 2f));
202 }
203
204 disclaimerText = new JEditorPane();
205 disclaimerText.setContentType("text/html");
206 disclaimerText.setVisible(false);
207 disclaimerText.setEditable(false);
208 disclaimerText.setOpaque(false);
209 disclaimerText.putClientProperty(JXEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
210 if (f != null) {
211 disclaimerText.setFont(f.deriveFont(f.getSize() - 2f));
212 }
213 pane.add(disclaimerText);
214
215 detailButton.setBorderPainted(false);
216 detailButton.setContentAreaFilled(false);
217 detailButton.setBorder(BorderFactory.createEmptyBorder());
218 detailButton.setMargin(new Insets(0, 0, 0 ,0));
219 detailButton.setIcon(UIManager.getIcon("Tree.collapsedIcon"));
220 detailButton.setText(UIManagerExt.getString(CLASS_NAME + ".details_expand_text", detailButton.getLocale()));
221
222 closeButton.setText(UIManagerExt.getString(CLASS_NAME + ".ok_button_text", closeButton.getLocale()));
223 }
224 }