source: josm/trunk/src/org/openstreetmap/josm/actions/AboutAction.java @ 1480

Last change on this file since 1480 was 1480, checked in by stoecker, 10 years ago

added user agent

  • Property svn:eol-style set to native
File size: 7.9 KB
Line 
1//License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Dimension;
7import java.awt.Font;
8import java.awt.GridBagLayout;
9import java.awt.event.ActionEvent;
10import java.awt.event.KeyEvent;
11import java.io.BufferedReader;
12import java.io.IOException;
13import java.io.InputStream;
14import java.io.InputStreamReader;
15import java.net.MalformedURLException;
16import java.net.URL;
17import java.util.regex.Matcher;
18import java.util.regex.Pattern;
19import java.util.Properties;
20
21import javax.swing.BorderFactory;
22import javax.swing.JLabel;
23import javax.swing.JOptionPane;
24import javax.swing.JPanel;
25import javax.swing.JScrollPane;
26import javax.swing.JTabbedPane;
27import javax.swing.JTextArea;
28
29import org.openstreetmap.josm.Main;
30import org.openstreetmap.josm.plugins.PluginHandler;
31import org.openstreetmap.josm.tools.GBC;
32import org.openstreetmap.josm.tools.ImageProvider;
33import org.openstreetmap.josm.tools.UrlLabel;
34import org.openstreetmap.josm.tools.Shortcut;
35
36/**
37 * Nice about screen. I guess every application need one these days.. *sigh*
38 *
39 * The REVISION resource is read and if present, it shows the revision
40 * information of the jar-file.
41 *
42 * @author imi
43 */
44/**
45 * @author Stephan
46 *
47 */
48public class AboutAction extends JosmAction {
49
50    private static final String version;
51
52    private final static JTextArea revision;
53    private static String time;
54
55    static {
56        URL u = Main.class.getResource("/REVISION");
57        if(u == null) {
58            try {
59                u = new URL("jar:" + Main.class.getProtectionDomain().getCodeSource().getLocation().toString()
60                        + "!/META-INF/MANIFEST.MF");
61            } catch (MalformedURLException e) {
62                e.printStackTrace();
63            }
64        }
65        revision = loadFile(u);
66
67        Pattern versionPattern = Pattern.compile(".*?(?:Revision|Main-Version): ([0-9]*(?: SVN)?).*", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
68        Matcher match = versionPattern.matcher(revision.getText());
69        version = match.matches() ? match.group(1) : tr("UNKNOWN");
70
71        Pattern timePattern = Pattern.compile(".*?(?:Last Changed Date|Main-Date): ([^\n]*).*", Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
72        match = timePattern.matcher(revision.getText());
73        time = match.matches() ? match.group(1) : tr("UNKNOWN");
74    }
75
76    /**
77     * Return string describing version.
78     * Note that the strinc contains the version number plus an optional suffix of " SVN" to indicate an unofficial development build.
79     * @return version string
80     */
81    static public String getVersionString() {
82        return version;
83    }
84
85    static public String getTextBlock() {
86        return revision.getText();
87    }
88
89    static public void setUserAgent() {
90        Properties sysProp = System.getProperties();
91        sysProp.put("http.agent", "JOSM/1.5 ("+version+")");
92        System.setProperties(sysProp);
93    }
94
95    /**
96     * Return the number part of the version string.
97     * @return integer part of version number or Integer.MAX_VALUE if not available
98     */
99    public static int getVersionNumber() {
100        int myVersion=Integer.MAX_VALUE;
101        try {
102            myVersion = Integer.parseInt(version.split(" ")[0]);
103        } catch (NumberFormatException e) {
104            e.printStackTrace();
105        }
106        return myVersion;
107    }
108
109    /**
110     * check whether the version is a development build out of SVN.
111     * @return true if it is a SVN unofficial build
112     */
113    public static boolean isDevelopmentVersion() {
114        return version.endsWith(" SVN") || version.equals(tr("UNKNOWN"));
115    }
116
117    public AboutAction() {
118        super(tr("About"), "about", tr("Display the about screen."), Shortcut.registerShortcut("system:about", tr("About"), KeyEvent.VK_F1, Shortcut.GROUP_DIRECT, Shortcut.SHIFT_DEFAULT), true);
119    }
120
121    public void actionPerformed(ActionEvent e) {
122        JTabbedPane about = new JTabbedPane();
123
124        JTextArea readme = loadFile(Main.class.getResource("/README"));
125        JTextArea contribution = loadFile(Main.class.getResource("/CONTRIBUTION"));
126
127        JPanel info = new JPanel(new GridBagLayout());
128        JLabel caption = new JLabel("JOSM - " + tr("Java OpenStreetMap Editor"));
129        caption.setFont(new Font("Helvetica", Font.BOLD, 20));
130        info.add(caption, GBC.eol().fill(GBC.HORIZONTAL).insets(10,0,0,0));
131        info.add(GBC.glue(0,10), GBC.eol());
132        info.add(new JLabel(tr("Version {0}",version)), GBC.eol().fill(GBC.HORIZONTAL).insets(10,0,0,0));
133        info.add(GBC.glue(0,5), GBC.eol());
134        info.add(new JLabel(tr("Last change at {0}",time)), GBC.eol().fill(GBC.HORIZONTAL).insets(10,0,0,0));
135        info.add(GBC.glue(0,5), GBC.eol());
136        info.add(new JLabel(tr("Java Version {0}",System.getProperty("java.version"))), GBC.eol().fill(GBC.HORIZONTAL).insets(10,0,0,0));
137        info.add(GBC.glue(0,10), GBC.eol());
138        info.add(new JLabel(tr("Homepage")), GBC.std().insets(10,0,10,0));
139        info.add(new UrlLabel("http://josm.openstreetmap.de"), GBC.eol().fill(GBC.HORIZONTAL));
140        info.add(new JLabel(tr("Bug Reports")), GBC.std().insets(10,0,10,0));
141        info.add(new UrlLabel("http://josm.openstreetmap.de/newticket"), GBC.eol().fill(GBC.HORIZONTAL));
142        info.add(new JLabel(tr("News about JOSM")), GBC.std().insets(10,0,10,0));
143        info.add(new UrlLabel("http://www.opengeodata.org/?cat=17"), GBC.eol().fill(GBC.HORIZONTAL));
144
145        about.addTab(tr("Info"), info);
146        about.addTab(tr("Readme"), createScrollPane(readme));
147        about.addTab(tr("Revision"), createScrollPane(revision));
148        about.addTab(tr("Contribution"), createScrollPane(contribution));
149        about.addTab(tr("Plugins"), new JScrollPane(PluginHandler.getInfoPanel()));
150
151        about.setPreferredSize(new Dimension(500,300));
152
153        JOptionPane.showMessageDialog(Main.parent, about, tr("About JOSM..."),
154        JOptionPane.INFORMATION_MESSAGE, ImageProvider.get("logo"));
155    }
156
157    private JScrollPane createScrollPane(JTextArea area) {
158        area.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
159        area.setOpaque(false);
160        JScrollPane sp = new JScrollPane(area);
161        sp.setBorder(null);
162        sp.setOpaque(false);
163        return sp;
164    }
165
166    /**
167     * Retrieve the latest JOSM version from the JOSM homepage.
168     * @return An string with the latest version or "UNKNOWN" in case
169     *      of problems (e.g. no internet connection).
170     */
171    public static String checkLatestVersion() {
172        String latest;
173        try {
174            InputStream s = new URL("http://josm.openstreetmap.de/current").openStream();
175            latest = new BufferedReader(new InputStreamReader(s)).readLine();
176            s.close();
177        } catch (IOException x) {
178            x.printStackTrace();
179            return tr("UNKNOWN");
180        }
181        return latest;
182    }
183
184    /**
185     * Load the specified resource into an TextArea and return it.
186     * @param resource The resource url to load
187     * @return  An read-only text area with the content of "resource"
188     */
189    private static JTextArea loadFile(URL resource) {
190        JTextArea area = new JTextArea(tr("File could not be found."));
191        area.setEditable(false);
192        Font font = Font.getFont("monospaced");
193        if (font != null)
194            area.setFont(font);
195        if (resource == null)
196            return area;
197        BufferedReader in;
198        try {
199            in = new BufferedReader(new InputStreamReader(resource.openStream()));
200            StringBuilder sb = new StringBuilder();
201            for (String line = in.readLine(); line != null; line = in.readLine()) {
202                sb.append(line);
203                sb.append('\n');
204            }
205            area.setText(sb.toString());
206            area.setCaretPosition(0);
207        } catch (IOException e) {
208            e.printStackTrace();
209        }
210        return area;
211    }
212}
Note: See TracBrowser for help on using the repository browser.