// $Id: AboutBox.java 16923 2009-03-22 21:48:28Z linus $ // Copyright (c) 1996-2009 The Regents of the University of California. All // Rights Reserved. Permission to use, copy, modify, and distribute this // software and its documentation without fee, and without a written // agreement is hereby granted, provided that the above copyright notice // and this paragraph appear in all copies. This software program and // documentation are copyrighted by The Regents of the University of // California. The software program and documentation are supplied "AS // IS", without any accompanying services from The Regents. The Regents // does not warrant that the operation of the program will be // uninterrupted or error-free. The end-user understands that the program // was developed for research purposes and is advised not to rely // exclusively on the program for any reason. IN NO EVENT SHALL THE // UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, // SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, // ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF // THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF // SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE // PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF // CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, // UPDATES, ENHANCEMENTS, OR MODIFICATIONS. package org.argouml.ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Frame; import java.awt.Insets; import java.awt.Toolkit; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; import org.argouml.i18n.Translator; import org.argouml.moduleloader.ModuleLoader2; import org.argouml.profile.ProfileFacade; import org.argouml.util.ArgoDialog; import org.argouml.util.Tools; /** * This is what you see after you activate the "Help->About ArgoUML" menu-item. * <p> * Modules can add extra tabs at will. */ public class AboutBox extends ArgoDialog { /** * Insets in pixels. */ private static final int INSET_PX = 3; private static Map<String, Component> extraTabs = new HashMap<String, Component>(); private JTabbedPane tabs = new JTabbedPane(); /** * Shared splash panel. */ private SplashPanel splashPanel; /** * Class constructor. */ public AboutBox() { this((Frame) null, false); } /** * Class constructor. * * @param owner the frame from which the dialog is displayed */ public AboutBox(Frame owner) { this(owner, false); } /** * @see Translator#localize(String) * * @param str The key to localize. * @return The localized String. */ private static String localize(String str) { return Translator.localize(str); } /** * Creates a JScrollPane from the text. * * @return the JScrollPane * @param text the text to represent */ private JScrollPane createPane(String text) { JTextArea a = new JTextArea(); a.setEditable(false); a.setLineWrap(true); a.setWrapStyleWord(true); a.setMargin(new Insets(INSET_PX, INSET_PX, INSET_PX, INSET_PX)); a.setText(text); a.setCaretPosition(0); return new JScrollPane(a); } /** * Class constructor. * * @param owner the frame from which the dialog is displayed * @param modal true for a modal dialog, false for one that allows * other windows to be active at the same time */ public AboutBox(Frame owner, boolean modal) { super(localize("aboutbox.aboutbox-title"), modal); splashPanel = new SplashPanel("Splash"); int imgWidth = splashPanel.getImage().getIconWidth(); int imgHeight = splashPanel.getImage().getIconHeight(); Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize(); setLocation(scrSize.width / 2 - imgWidth / 2, scrSize.height / 2 - imgHeight / 2); getContentPane().setLayout(new BorderLayout(0, 0)); JPanel myInsetPanel = new JPanel(); /* top, left, bottom, right */ myInsetPanel.setBorder(new EmptyBorder(30, 40, 40, 40)); /* This gives some more space to the row of tabs, so that there will not be 2 rows of tabs See issue 2365, remark 3 from Jeremy. */ imgWidth += 40 + 40; /* It looks better if the height increases, too */ imgHeight += 40 + 40; myInsetPanel.add(splashPanel); tabs.addTab(localize("aboutbox.tab.splash"), myInsetPanel); tabs.addTab(localize("aboutbox.tab.version"), createPane(getVersion())); tabs.addTab(localize("aboutbox.tab.credits"), createPane(getCredits())); tabs.addTab(localize("aboutbox.tab.contacts"), createPane(localize("aboutbox.contacts"))); tabs.addTab(localize("aboutbox.tab.bugreport"), createPane(localize("aboutbox.bugreport"))); tabs.addTab(localize("aboutbox.tab.legal"), createPane(localize("aboutbox.legal"))); for (String key : extraTabs.keySet()) { tabs.addTab(key, extraTabs.get(key)); } getContentPane().setLayout(new BorderLayout(0, 0)); getContentPane().add(tabs, BorderLayout.CENTER); // TODO: 10 and 120 were found by trial and error. Calculate them. setSize(imgWidth + 10, imgHeight + 120); //pack(); } /** * Add an extra tab to the About box. * * @param name the name of the tab as shown on screen * @param tab the tab */ public static void addAboutTab(String name, Component tab) { extraTabs.put(name, tab); } /** * Remove a previously added tab from the About Box. * * @param name the name of the tab as shown on screen */ public static void removeAboutTab(String name) { extraTabs.remove(name); } /** * Get the contents of the version tab.<p> * * This should include all libraries used by ArgoUML.<p> * * <em>Library maintainers! Add and update information here!</em> * * @return The contents. */ private String getVersion() { StringBuffer buf = new StringBuffer(); buf.append(localize("aboutbox.generated-version-header")); buf.append(Tools.getVersionInfo()); buf.append(localize("aboutbox.used-tools-header")); // Not localized: buf.append("* GEF (gef.tigris.org)\n"); buf.append("* Xerces-J 2.6.2\n"); buf.append("* NetBeans MDR (mdr.netbeans.org )\n"); buf.append("* TU-Dresden OCL-Compiler " + "(dresden-ocl.sourceforge.net)\n"); buf.append("* ANTLR 2.7.7 (www.antlr.org) *DEPRECATED*\n"); buf.append("\n"); buf.append(localize("aboutbox.loaded-modules-header")); Iterator<String> iter = ModuleLoader2.allModules().iterator(); while (iter.hasNext()) { String moduleName = iter.next(); buf.append("\nModule: "); buf.append(moduleName); buf.append("\nDescription: "); String desc = ModuleLoader2.getDescription(moduleName); buf.append(desc.replaceAll("\n\n", "\n")); } buf.append("\n\n"); buf.append(localize("aboutbox.thanks")); buf.append("\n"); return buf.toString(); } /** * Get the contents of the Credits tab.<p> * * This should include a list of all persons that have ever contributed * to ArgoUML.<p> * * <em>Commiters, add your contributor here.</em> * * @return The contents. */ private String getCredits() { StringBuffer buf = new StringBuffer(); buf.append(localize("aboutbox.developed-by")); buf.append("\n\n"); buf.append(localize("aboutbox.project-leader")); buf.append("Linus Tolke (linus@tigris.org)"); buf.append("\n\n"); buf.append(localize("aboutbox.module-owners")); buf.append("\n"); buf.append("+ UML Model, Diagrams, GUI, Persistence: Bob Tarling\n"); buf.append("+ MDR Implementation: Tom Morris\n"); buf.append("+ Sequence Diagrams: Christian L�pez Esp�nola\n"); buf.append("+ C++: Luis Sergio Oliveira\n"); buf.append("+ Csharp: Jan Magne Andersen\n"); buf.append("+ PHP 4/5: Kai Schroeder\n"); buf.append("+ SQL: Kai Drahmann\n"); buf.append("+ Code Generation/Reverse Engineering: Thomas Neustupny\n"); buf.append("+ Cognitive support: Markus Klink\n"); buf.append("+ Notation, User Manual: Michiel van der Wulp\n"); buf.append("+ Localization French: Jean-Hugues de Raigniac\n"); buf.append("+ Localization Russian: Alexey Aphanasyev\n"); buf.append("+ Localization German: Harald Braun\n"); buf.append("+ Localization Spanish: Stewart Munoz\n"); buf.append("+ Localization British English: Alex Bagehot\n"); buf.append("+ Localization Norwegian (bokm\u00E5l): " + "Hans Fredrik Nordhaug\n"); buf.append("+ Localization Chinese: Jeff Liu\n"); buf.append("+ Localization Portuguese: Sergio Agostinho\n"); buf.append("\n"); buf.append(Translator.messageFormat( "aboutbox.contrib-developers-for-release", new Object[] { "0.28", })); buf.append("\n"); buf.append("+ Bob Tarling\n"); buf.append("+ Bogdan Szanto\n"); buf.append("+ Bogdan Pistol\n"); buf.append("+ Brian Hudson\n"); buf.append("+ Christian L��pez Esp��nola\n"); buf.append("+ Dave Thompson\n"); buf.append("+ Harald Braun\n"); buf.append("+ Jan Magne Andersen\n"); buf.append("+ Luis Sergio Oliveira\n"); buf.append("+ Linus Tolke\n"); buf.append("+ Lukasz Gromanowski\n"); buf.append("+ Marcos Aurelio\n"); buf.append("+ Michiel van der Wulp\n"); buf.append("+ Thilina Hasantha\n"); buf.append("+ Thomas Neustupny\n"); buf.append("+ Tom Morris\n"); buf.append("\n"); buf.append(Translator.messageFormat( "aboutbox.contrib-developers-for-release", new Object[] { "0.26", })); buf.append("\n"); buf.append("+ Aleksandar\n"); buf.append("+ Alexandre da Silva\n"); buf.append("+ Scott Roberts\n"); buf.append("+ S�rgio Adriano Fernandes Lopes\n"); buf.append("\n"); buf.append(Translator.messageFormat( "aboutbox.contrib-developers-for-release", new Object[] { "0.24", })); buf.append("\n"); buf.append("+ Andrea Nironi\n"); buf.append("+ Hans Fredrik Nordhaug\n"); buf.append("+ Markus Klink\n"); buf.append("+ Sergio Agostinho\n"); buf.append("+ Stewart Munoz\n"); buf.append("\n"); buf.append(Translator.messageFormat( "aboutbox.contrib-developers-for-release", new Object[] { "0.22", })); buf.append("\n"); buf.append("+ Jeff Liu\n"); buf.append("+ Ludovic Maitre\n"); buf.append("\n"); buf.append(Translator.messageFormat( "aboutbox.contrib-developers-for-release", new Object[] { "0.20", })); buf.append("\n"); final String cpbi = ", Polytechnic of Bandung Indonesia" + ", Computer Engineering Departement"; // Alphabetic order! buf.append("+ Decki" + cpbi + "\n"); buf.append("+ Endi" + cpbi + "\n"); buf.append("+ Kai Schroeder\n"); buf.append("+ Michael A. MacDonald\n"); buf.append("+ Yayan" + cpbi + "\n"); buf.append("\n"); buf.append(localize("aboutbox.past-developers")); buf.append("\n"); // Alphabetic order! buf.append("+ Adam Gauthier\n"); buf.append("+ Adam Bonner\n"); buf.append("+ Alex Bagehot\n"); buf.append("+ Alexander Lepekhine\n"); buf.append("+ Alexey Aphanasyev\n"); buf.append("+ Andreas Rueckert (a_rueckert@gmx.net) (Java RE)\n"); buf.append("+ Clemens Eichler\n"); buf.append("+ Curt Arnold\n"); buf.append("+ David Glaser\n"); buf.append("+ David Hilbert\n"); buf.append("+ David Redmiles\n"); buf.append("+ Dennis Daniels (denny_d@hotmail.com)\n"); buf.append("+ Donat Wullschleger\n"); buf.append("+ Edwin Park\n"); buf.append("+ Eric Lefevre\n"); buf.append("+ Eugenio Alvarez\n"); buf.append("+ Frank Finger\n"); buf.append("+ Frank Wienberg\n"); buf.append("+ Grzegorz Prokopski\n"); buf.append("+ Jaap Branderhorst\n"); buf.append("+ Jason Robbins (Project founder, researcher)\n"); buf.append("+ Jean-Hugues de Raigniac\n"); buf.append("+ Jeremy Jones\n"); buf.append("+ Jim Holt\n"); buf.append("+ Luc Maisonobe\n"); buf.append("+ Marcus Andersson\n"); buf.append("+ Marko Boger (GentleWare) (UML Diagrams)\n"); buf.append("+ Michael Stockman\n"); buf.append("+ Nick Santucci\n"); buf.append("+ Phil Sager\n"); buf.append("+ Philippe Vanpeperstraete (User Manual)\n"); buf.append("+ Piotr Kaminski\n"); buf.append("+ Scott Guyer\n"); buf.append("+ Sean Chen\n"); buf.append("+ Steffen Zschaler\n"); buf.append("+ Steve Poole\n"); buf.append("+ Stuart Zakon\n"); buf.append("+ Thierry Lach\n"); buf.append("+ Thomas Schaumburg\n"); buf.append("+ Thorsten Sturm (thorsten.sturm@gentleware.de) (GEF)\n"); buf.append("+ Toby Baier (UML Metamodel, XMI, Project leader)\n"); buf.append("+ Will Howery\n"); buf.append("+ ICS 125 team Spring 1996\n"); buf.append("+ ICS 125 teams Spring 1998\n"); return buf.toString(); } /** * The UID. */ private static final long serialVersionUID = -3647983226617303893L; } /* end class AboutBox */