source: josm/trunk/src/org/openstreetmap/josm/gui/GettingStarted.java @ 1370

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

close #2138 and #2128. patch by xeen

  • Property svn:eol-style set to native
File size: 8.3 KB
Line 
1// License: GPL. See LICENSE file for details.
2
3package org.openstreetmap.josm.gui;
4
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.io.IOException;
8import java.util.ArrayList;
9import java.util.concurrent.Executors;
10import java.util.concurrent.ExecutorService;
11import java.util.concurrent.Callable;
12import java.util.concurrent.Future;
13import java.util.regex.Matcher;
14import java.util.regex.Pattern;
15
16import java.awt.BorderLayout;
17import java.awt.Component;
18import java.awt.EventQueue;
19
20import javax.swing.JScrollPane;
21import javax.swing.JEditorPane;
22import javax.swing.JPanel;
23import javax.swing.event.HyperlinkEvent;
24import javax.swing.event.HyperlinkListener;
25import javax.swing.border.EmptyBorder;
26
27import org.openstreetmap.josm.Main;
28import org.openstreetmap.josm.tools.OpenBrowser;
29import org.openstreetmap.josm.tools.WikiReader;
30import org.openstreetmap.josm.actions.AboutAction;
31
32public class GettingStarted extends JPanel {
33
34    static private String content = "";
35    static private String styles = "<style type=\"text/css\">\n"+
36            "body { font-family: sans-serif; font-weight: bold; }\n"+
37            "h1 {text-align: center;}\n"+
38            "</style>\n";
39
40    public class LinkGeneral extends JEditorPane implements HyperlinkListener {
41        public LinkGeneral(String text) {
42            setContentType("text/html");
43            setText(text);
44            setEditable(false);
45            setOpaque(false);
46            addHyperlinkListener(this);
47        }
48        public void hyperlinkUpdate(HyperlinkEvent e) {
49            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
50                OpenBrowser.displayUrl(e.getDescription());
51            }
52        }
53    }
54
55    public class readMOTD implements Callable<String> {
56        private boolean isLocalized;
57        private boolean isHelp;
58        private String urlLoc;
59        private String urlIntl;
60        private String urlBase;
61
62        readMOTD(boolean isLocalized, String urlBase, String urlLoc, String urlIntl, boolean isHelp) {
63          this.isLocalized = isLocalized;
64          this.urlBase = urlBase;
65          this.urlLoc = urlLoc;
66          this.urlIntl = urlIntl;
67          this.isHelp = isHelp;
68        }
69
70        public String call() {
71            WikiReader wr = new WikiReader(urlBase);
72            String content = "";
73            try {
74                // If we hit a non-localized link here, we already know there's no translated version available
75                String message = isLocalized ? wr.read(urlLoc) : "";
76                // Look for non-localized version
77                if (message.equals(""))
78                    message = wr.read(urlIntl);
79
80                if (!message.equals(""))
81                    if(isHelp)
82                        content += message;
83                    else
84                        content += "<ul><li>"+ message.substring(8).replaceAll("\n *\\* +","</li><li>")+"</li></ul>";
85            } catch (IOException ioe) {
86                try {
87                    if(isHelp)
88                        content += wr.read(urlIntl);
89                    else
90                        content += "<ul><li>"+wr.read(urlIntl).substring(8).replaceAll("\n *\\* +","</li><li>")+"</li></ul>";
91                } catch (IOException ioe2) {
92                }
93            }
94
95            return content;
96        }
97    }
98
99    private void assignContent() {
100        if (content.length() > 0 && Main.pref.getBoolean("help.displaymotd", true)) return;
101
102        String baseurl = Main.pref.get("help.baseurl", "http://josm.openstreetmap.de");
103        WikiReader wr = new WikiReader(baseurl);
104        String motdcontent = "";
105        try {
106            motdcontent = wr.read(baseurl + "/wiki/MessageOfTheDay?format=txt");
107        } catch (IOException ioe) {
108            motdcontent = "<html>" + styles + "<body><h1>" +
109                "JOSM - " + tr("Java OpenStreetMap Editor") +
110                "</h1>\n<h2 align=\"center\">(" +
111                tr ("Message of the day not available") +
112                ")</h2>";
113        }
114
115        int myVersion = AboutAction.getVersionNumber();
116        String languageCode = Main.getLanguageCodeU();
117
118        // Finds wiki links like (underscores inserted for readability): [wiki:LANGCODE:messageoftheday_CONDITON_REVISION LANGCODE]
119        // Langcode usually consists of two letters describing the language and may be omitted
120        // Condition may be one of the following: >  <  <=  =>
121        // Revision is the JOSM version
122        Pattern versionPattern = Pattern.compile("\\[wiki:(?:[A-Z]+:)?MessageOfTheDay(\\>\\=|\\<\\=|\\<|\\>)([0-9]+)\\s*([A-Z]*)\\]", Pattern.CASE_INSENSITIVE);
123        // 1=condition, 2=targetVersion, 3=lang
124        Matcher matcher = versionPattern.matcher(motdcontent);
125        matcher.reset();
126
127        ArrayList<String[]> links = new ArrayList<String[]>();
128        String linksList="";
129        while (matcher.find()) {
130            // Discards all but the selected locale and non-localized links
131            if(!(matcher.group(3)+":").equals(languageCode) && !matcher.group(3).equals(""))
132                continue;
133
134            links.add(new String[] {matcher.group(1), matcher.group(2), matcher.group(3)});
135            linksList += matcher.group(1)+matcher.group(2)+matcher.group(3)+": ";
136        }
137
138        // We cannot use Main.worker here because it's single-threaded and
139        // setting it to multi-threading will cause problems elsewhere
140        ExecutorService slave = Executors.newCachedThreadPool();
141
142        ArrayList<Future<String>> linkContent = new ArrayList<Future<String>>();
143        for(int i=0; i < links.size(); i++) {
144            String[] obj = (String[])links.get(i);
145            int targetVersion = Integer.parseInt(obj[1]);
146            String condition = obj[0];
147            Boolean isLocalized = !obj[2].equals("");
148
149            // Prefer localized over non-localized links, if they're otherwise the same
150            if(!isLocalized && linksList.indexOf(condition + obj[1] + languageCode + " ") >= 0)
151                continue;
152
153            boolean included = false;
154
155            if(myVersion == 0)
156              included = true;
157            else if(condition.equals(">="))
158              included=myVersion >= targetVersion;
159            else if(condition.equals(">"))
160              included = myVersion > targetVersion;
161            else if(condition.equals("<"))
162              included=myVersion < targetVersion;
163            else
164              included = myVersion <= targetVersion;
165
166            if(!included) continue;
167
168            boolean isHelp = targetVersion == 1;
169            String urlStart = baseurl + "/wiki/";
170            String urlEnd = "MessageOfTheDay" + condition + targetVersion + (isHelp ? "" : "?format=txt");
171            String urlLoc = urlStart + languageCode + urlEnd;
172            String urlIntl = urlStart + urlEnd;
173
174            // This adds all links to the worker which will download them concurrently
175            linkContent.add(slave.submit(new readMOTD(isLocalized, baseurl, urlLoc, urlIntl, isHelp)));
176        }
177
178        for(int i=0; i < linkContent.size(); i++) {
179            try {
180                content += linkContent.get(i).get();
181            } catch (Exception e) {}
182        }
183
184        content = "<html>\n"+
185            styles +
186            "<h1>JOSM - " + tr("Java OpenStreetMap Editor") + "</h1>\n"+
187            content+"\n"+
188            "</html>";
189    }
190
191    public GettingStarted() {
192        super(new BorderLayout());
193        final LinkGeneral lg = new LinkGeneral(
194            "<html>" +
195            styles +
196            "<h1>" +
197            "JOSM - " +
198            tr("Java OpenStreetMap Editor") +
199            "</h1><h2 align=\"center\">" +
200            tr("Downloading \"Message of the day\"") +
201            "</h2>");
202        JScrollPane scroller = new JScrollPane(lg);
203        scroller.setViewportBorder(new EmptyBorder(10,100,10,100));
204        add(scroller, BorderLayout.CENTER);
205
206        // Asynchronously get MOTD to speed-up JOSM startup
207        Thread t = new Thread(new Runnable() {
208            public void run() {
209                assignContent();
210                EventQueue.invokeLater(new Runnable() {
211                    public void run() {
212                       lg.setText(content);
213                       //lg.moveCaretPosition(0);
214                    }
215                });
216            }
217        }, "MOTD-Loader");
218        t.setDaemon(true);
219        t.start();
220
221        new FileDrop(scroller);
222    }
223}
Note: See TracBrowser for help on using the repository browser.