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

Last change on this file since 1879 was 1879, checked in by Gubaer, 15 years ago

towards a fix for #3142: JOSM applet class no longer functional

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