001/* ========================================================================
002 * JCommon : a free general purpose class library for the Java(tm) platform
003 * ========================================================================
004 *
005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006 * 
007 * Project Info:  http://www.jfree.org/jcommon/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it 
010 * under the terms of the GNU Lesser General Public License as published by 
011 * the Free Software Foundation; either version 2.1 of the License, or 
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but 
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022 * USA.  
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025 * in the United States and other countries.]
026 * 
027 * ---------------
028 * AboutFrame.java
029 * ---------------
030 * (C) Copyright 2001-2004, by Object Refinery Limited.
031 *
032 * Original Author:  David Gilbert (for Object Refinery Limited);
033 * Contributor(s):   -;
034 *
035 * $Id: AboutDialog.java,v 1.2 2006/03/23 19:47:05 taqua Exp $
036 *
037 * Changes (from 26-Nov-2001)
038 * --------------------------
039 * 30-Jan-2006 : Version 1, based on the AboutFrame (TM);
040 *
041 */
042
043package org.jfree.ui.about;
044
045import java.awt.BorderLayout;
046import java.awt.Dialog;
047import java.awt.Dimension;
048import java.awt.Frame;
049import java.awt.Image;
050import java.util.List;
051import java.util.ResourceBundle;
052import javax.swing.BorderFactory;
053import javax.swing.JDialog;
054import javax.swing.JPanel;
055import javax.swing.JScrollPane;
056import javax.swing.JTabbedPane;
057import javax.swing.JTextArea;
058import javax.swing.border.Border;
059
060/**
061 * A dialog that displays information about the demonstration application.
062 *
063 * @author David Gilbert
064 */
065public class AboutDialog extends JDialog {
066
067    /** The preferred size for the frame. */
068    public static final Dimension PREFERRED_SIZE = new Dimension(560, 360);
069
070    /** The default border for the panels in the tabbed pane. */
071    public static final Border STANDARD_BORDER = BorderFactory.createEmptyBorder(5, 5, 5, 5);
072
073    /** Localised resources. */
074    private ResourceBundle resources;
075
076    /** The application name. */
077    private String application;
078
079    /** The application version. */
080    private String version;
081
082    /** The copyright string. */
083    private String copyright;
084
085    /** Other info about the application. */
086    private String info;
087
088    /** The project logo. */
089    private Image logo;
090
091    /** A list of contributors. */
092    private List contributors;
093
094    /** The licence. */
095    private String licence;
096
097    /**
098     * Constructs an about frame.
099     *
100     * @param title  the frame title.
101     * @param project  information about the project.
102     */
103    public AboutDialog(final String title, final ProjectInfo project) {
104
105        init(title,
106             project.getName(),
107             "Version " + project.getVersion(),
108             project.getInfo(),
109             project.getLogo(),
110             project.getCopyright(),
111             project.getLicenceText(),
112             project.getContributors(),
113             project);
114
115    }
116
117  /**
118   * Creates a non-modal dialog without a title with the specifed
119   * <code>Frame</code> as its owner.
120   *
121   * @param owner the <code>Frame</code> from which the dialog is displayed
122   */
123  public AboutDialog(final Frame owner,
124                     final String title,
125                     final ProjectInfo project)
126  {
127    super(owner);
128    init(title,
129         project.getName(),
130         "Version " + project.getVersion(),
131         project.getInfo(),
132         project.getLogo(),
133         project.getCopyright(),
134         project.getLicenceText(),
135         project.getContributors(),
136         project);
137  }
138
139  /**
140   * Creates a non-modal dialog without a title with the specifed
141   * <code>Dialog</code> as its owner.
142   *
143   * @param owner the <code>Dialog</code> from which the dialog is displayed
144   */
145  public AboutDialog(final Dialog owner,
146                     final String title,
147                     final ProjectInfo project)
148  {
149    super(owner);
150    init(title,
151         project.getName(),
152         "Version " + project.getVersion(),
153         project.getInfo(),
154         project.getLogo(),
155         project.getCopyright(),
156         project.getLicenceText(),
157         project.getContributors(),
158         project);
159  }
160
161  /**
162     * Constructs an 'About' frame.
163     *
164     * @param title  the frame title.
165     * @param application  the application name.
166     * @param version  the version.
167     * @param info  other info.
168     * @param logo  an optional logo.
169     * @param copyright  the copyright notice.
170     * @param licence  the licence.
171     * @param contributors  a list of developers/contributors.
172     * @param libraries  a list of libraries.
173     */
174    private void init (final String title,
175                       final String application,
176                       final String version,
177                       final String info,
178                       final Image logo,
179                       final String copyright,
180                       final String licence,
181                       final List contributors,
182                       final ProjectInfo libraries) {
183
184        setTitle(title);
185
186        this.application = application;
187        this.version = version;
188        this.copyright = copyright;
189        this.info = info;
190        this.logo = logo;
191        this.contributors = contributors;
192        this.licence = licence;
193
194        final String baseName = "org.jfree.ui.about.resources.AboutResources";
195        this.resources = ResourceBundle.getBundle(baseName);
196
197        final JPanel content = new JPanel(new BorderLayout());
198        content.setBorder(STANDARD_BORDER);
199
200        final JTabbedPane tabs = createTabs(libraries);
201        content.add(tabs);
202        setContentPane(content);
203
204        pack();
205
206    }
207
208    /**
209     * Returns the preferred size for the about frame.
210     *
211     * @return the preferred size.
212     */
213    public Dimension getPreferredSize() {
214        return PREFERRED_SIZE;
215    }
216
217    /**
218     * Creates a tabbed pane containing an about panel and a system properties panel.
219     *
220     * @return a tabbed pane.
221     */
222    private JTabbedPane createTabs(final ProjectInfo info) {
223
224        final JTabbedPane tabs = new JTabbedPane();
225
226        final JPanel aboutPanel = createAboutPanel(info);
227        aboutPanel.setBorder(AboutDialog.STANDARD_BORDER);
228        final String aboutTab = this.resources.getString("about-frame.tab.about");
229        tabs.add(aboutTab, aboutPanel);
230
231        final JPanel systemPanel = new SystemPropertiesPanel();
232        systemPanel.setBorder(AboutDialog.STANDARD_BORDER);
233        final String systemTab = this.resources.getString("about-frame.tab.system");
234        tabs.add(systemTab, systemPanel);
235
236        return tabs;
237
238    }
239
240    /**
241     * Creates a panel showing information about the application, including the name, version,
242     * copyright notice, URL for further information, and a list of contributors.
243     *
244     * @return a panel.
245     */
246    private JPanel createAboutPanel(final ProjectInfo info) {
247
248        final JPanel about = new JPanel(new BorderLayout());
249
250        final JPanel details = new AboutPanel(this.application, this.version, this.copyright, this.info,
251                                        this.logo);
252
253        boolean includetabs = false;
254        final JTabbedPane tabs = new JTabbedPane();
255
256        if (this.contributors != null) {
257            final JPanel contributorsPanel = new ContributorsPanel(this.contributors);
258            contributorsPanel.setBorder(AboutDialog.STANDARD_BORDER);
259            final String contributorsTab = this.resources.getString("about-frame.tab.contributors");
260            tabs.add(contributorsTab, contributorsPanel);
261            includetabs = true;
262        }
263
264        if (this.licence != null) {
265            final JPanel licencePanel = createLicencePanel();
266            licencePanel.setBorder(STANDARD_BORDER);
267            final String licenceTab = this.resources.getString("about-frame.tab.licence");
268            tabs.add(licenceTab, licencePanel);
269            includetabs = true;
270        }
271
272        if (info != null) {
273            final JPanel librariesPanel = new LibraryPanel(info);
274            librariesPanel.setBorder(AboutDialog.STANDARD_BORDER);
275            final String librariesTab = this.resources.getString("about-frame.tab.libraries");
276            tabs.add(librariesTab, librariesPanel);
277            includetabs = true;
278        }
279
280        about.add(details, BorderLayout.NORTH);
281        if (includetabs) {
282            about.add(tabs);
283        }
284
285        return about;
286
287    }
288
289    /**
290     * Creates a panel showing the licence.
291     *
292     * @return a panel.
293     */
294    private JPanel createLicencePanel() {
295
296        final JPanel licencePanel = new JPanel(new BorderLayout());
297        final JTextArea area = new JTextArea(this.licence);
298        area.setLineWrap(true);
299        area.setWrapStyleWord(true);
300        area.setCaretPosition(0);
301        area.setEditable(false);
302        licencePanel.add(new JScrollPane(area));
303        return licencePanel;
304
305    }
306
307
308}