001/* ========================================================================
002 * JCommon : a free general purpose class library for the Java(tm) platform
003 * ========================================================================
004 *
005 * (C) Copyright 2000-2008, 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-2008, by Object Refinery Limited.
031 *
032 * Original Author:  David Gilbert (for Object Refinery Limited);
033 * Contributor(s):   -;
034 *
035 * $Id: AboutFrame.java,v 1.8 2008/12/18 09:57:32 mungady Exp $
036 *
037 * Changes (from 26-Nov-2001)
038 * --------------------------
039 * 26-Nov-2001 : Version 1, based on code from JFreeChart demo application (DG);
040 * 27-Nov-2001 : Added getPreferredSize() method (DG);
041 * 08-Feb-2002 : List of developers is now optional (DG);
042 * 15-Mar-2002 : Modified to use a ResourceBundle for elements that require
043 *               localisation (DG);
044 * 25-Mar-2002 : Added new constructor (DG);
045 * 26-Jun-2002 : Removed redundant code (DG);
046 * 08-Oct-2002 : Fixed errors reported by Checkstyle (DG);
047 * 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by
048 *               Jess Thrysoee (DG);
049 *
050 */
051
052package org.jfree.ui.about;
053
054import java.awt.BorderLayout;
055import java.awt.Dimension;
056import java.awt.Image;
057import java.util.List;
058import java.util.ResourceBundle;
059
060import javax.swing.BorderFactory;
061import javax.swing.JFrame;
062import javax.swing.JPanel;
063import javax.swing.JScrollPane;
064import javax.swing.JTabbedPane;
065import javax.swing.JTextArea;
066import javax.swing.border.Border;
067
068import org.jfree.util.ResourceBundleWrapper;
069
070/**
071 * A frame that displays information about the demonstration application.
072 *
073 * @author David Gilbert
074 */
075public class AboutFrame extends JFrame {
076
077    /** The preferred size for the frame. */
078    public static final Dimension PREFERRED_SIZE = new Dimension(560, 360);
079
080    /** The default border for the panels in the tabbed pane. */
081    public static final Border STANDARD_BORDER
082            = BorderFactory.createEmptyBorder(5, 5, 5, 5);
083
084    /** Localised resources. */
085    private ResourceBundle resources;
086
087    /** The application name. */
088    private String application;
089
090    /** The application version. */
091    private String version;
092
093    /** The copyright string. */
094    private String copyright;
095
096    /** Other info about the application. */
097    private String info;
098
099    /** The project logo. */
100    private Image logo;
101
102    /** A list of contributors. */
103    private List contributors;
104
105    /** The licence. */
106    private String licence;
107
108    /**
109     * Constructs an about frame.
110     *
111     * @param title  the frame title.
112     * @param project  information about the project.
113     */
114    public AboutFrame(final String title, final ProjectInfo project) {
115
116        this(title,
117             project.getName(),
118             "Version " + project.getVersion(),
119             project.getInfo(),
120             project.getLogo(),
121             project.getCopyright(),
122             project.getLicenceText(),
123             project.getContributors(),
124             project);
125
126    }
127
128    /**
129     * Constructs an 'About' frame.
130     *
131     * @param title  the frame title.
132     * @param application  the application name.
133     * @param version  the version.
134     * @param info  other info.
135     * @param logo  an optional logo.
136     * @param copyright  the copyright notice.
137     * @param licence  the licence.
138     * @param contributors  a list of developers/contributors.
139     * @param project  info about the project.
140     */
141    public AboutFrame(final String title,
142                      final String application, final String version,
143                      final String info,
144                      final Image logo,
145                      final String copyright, final String licence,
146                      final List contributors,
147                      final ProjectInfo project) {
148
149        super(title);
150
151        this.application = application;
152        this.version = version;
153        this.copyright = copyright;
154        this.info = info;
155        this.logo = logo;
156        this.contributors = contributors;
157        this.licence = licence;
158
159        final String baseName = "org.jfree.ui.about.resources.AboutResources";
160        this.resources = ResourceBundleWrapper.getBundle(baseName);
161
162        final JPanel content = new JPanel(new BorderLayout());
163        content.setBorder(STANDARD_BORDER);
164
165        final JTabbedPane tabs = createTabs(project);
166        content.add(tabs);
167        setContentPane(content);
168
169        pack();
170
171    }
172
173    /**
174     * Returns the preferred size for the about frame.
175     *
176     * @return the preferred size.
177     */
178    public Dimension getPreferredSize() {
179        return PREFERRED_SIZE;
180    }
181
182    /**
183     * Creates a tabbed pane containing an about panel and a system properties
184     * panel.
185     *
186     * @return a tabbed pane.
187     * @param project
188     */
189    private JTabbedPane createTabs(final ProjectInfo project) {
190
191        final JTabbedPane tabs = new JTabbedPane();
192
193        final JPanel aboutPanel = createAboutPanel(project);
194        aboutPanel.setBorder(AboutFrame.STANDARD_BORDER);
195        final String aboutTab = this.resources.getString(
196                "about-frame.tab.about");
197        tabs.add(aboutTab, aboutPanel);
198
199        final JPanel systemPanel = new SystemPropertiesPanel();
200        systemPanel.setBorder(AboutFrame.STANDARD_BORDER);
201        final String systemTab = this.resources.getString(
202                "about-frame.tab.system");
203        tabs.add(systemTab, systemPanel);
204
205        return tabs;
206
207    }
208
209    /**
210     * Creates a panel showing information about the application, including the
211     * name, version, copyright notice, URL for further information, and a list
212     * of contributors.
213
214     * @param project
215     *
216     * @return a panel.
217     */
218    private JPanel createAboutPanel(final ProjectInfo project) {
219
220        final JPanel about = new JPanel(new BorderLayout());
221
222        final JPanel details = new AboutPanel(this.application, this.version,
223                this.copyright, this.info, this.logo);
224
225        boolean includetabs = false;
226        final JTabbedPane tabs = new JTabbedPane();
227
228        if (this.contributors != null) {
229            final JPanel contributorsPanel = new ContributorsPanel(
230                    this.contributors);
231            contributorsPanel.setBorder(AboutFrame.STANDARD_BORDER);
232            final String contributorsTab = this.resources.getString(
233                    "about-frame.tab.contributors");
234            tabs.add(contributorsTab, contributorsPanel);
235            includetabs = true;
236        }
237
238        if (this.licence != null) {
239            final JPanel licencePanel = createLicencePanel();
240            licencePanel.setBorder(STANDARD_BORDER);
241            final String licenceTab = this.resources.getString(
242                    "about-frame.tab.licence");
243            tabs.add(licenceTab, licencePanel);
244            includetabs = true;
245        }
246
247        if (project != null) {
248            final JPanel librariesPanel = new LibraryPanel(project);
249            librariesPanel.setBorder(AboutFrame.STANDARD_BORDER);
250            final String librariesTab = this.resources.getString(
251                    "about-frame.tab.libraries");
252            tabs.add(librariesTab, librariesPanel);
253            includetabs = true;
254        }
255
256        about.add(details, BorderLayout.NORTH);
257        if (includetabs) {
258            about.add(tabs);
259        }
260
261        return about;
262
263    }
264
265    /**
266     * Creates a panel showing the licence.
267     *
268     * @return a panel.
269     */
270    private JPanel createLicencePanel() {
271
272        final JPanel licencePanel = new JPanel(new BorderLayout());
273        final JTextArea area = new JTextArea(this.licence);
274        area.setLineWrap(true);
275        area.setWrapStyleWord(true);
276        area.setCaretPosition(0);
277        area.setEditable(false);
278        licencePanel.add(new JScrollPane(area));
279        return licencePanel;
280
281    }
282
283
284}