Ignore:
Timestamp:
2009-10-06T00:07:00+02:00 (16 years ago)
Author:
Gubaer
Message:

Refactored JOSM help system, slightly extended
Fixed problem with new internal representation of nodes as array (in Way)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/HelpAction.java

    r2250 r2252  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.awt.BorderLayout;
    76import java.awt.Component;
    87import java.awt.Point;
    98import java.awt.event.ActionEvent;
    10 import java.awt.event.KeyEvent;
    11 import java.awt.event.WindowAdapter;
    12 import java.awt.event.WindowEvent;
    13 import java.io.IOException;
    149
    1510import javax.swing.AbstractAction;
    1611import javax.swing.AbstractButton;
    1712import javax.swing.Action;
    18 import javax.swing.JButton;
    1913import javax.swing.JComponent;
    20 import javax.swing.JEditorPane;
    21 import javax.swing.JFrame;
    2214import javax.swing.JMenu;
    23 import javax.swing.JOptionPane;
    24 import javax.swing.JPanel;
    25 import javax.swing.JScrollPane;
    26 import javax.swing.KeyStroke;
    2715import javax.swing.SwingUtilities;
    28 import javax.swing.event.HyperlinkEvent;
    29 import javax.swing.event.HyperlinkListener;
    3016
    3117import org.openstreetmap.josm.Main;
     18import org.openstreetmap.josm.gui.help.HelpBrowser;
     19import org.openstreetmap.josm.gui.help.Helpful;
    3220import org.openstreetmap.josm.tools.ImageProvider;
    33 import org.openstreetmap.josm.tools.LanguageInfo;
    34 import org.openstreetmap.josm.tools.OpenBrowser;
    35 import org.openstreetmap.josm.tools.WikiReader;
    3621
    3722/**
     
    4227public class HelpAction extends AbstractAction {
    4328
    44     public interface Helpful {
    45         String helpTopic();
    46     }
     29    private HelpBrowser helpBrowser;
    4730
    48     private String languageCode = LanguageInfo.getLanguageCodeWiki();
    49     private JFrame helpBrowser = new JFrame(tr("JOSM Online Help"));
    50     private String baseurl = Main.pref.get("help.baseurl", "http://josm.openstreetmap.de");
    51     private String pathbase = Main.pref.get("help.pathbase", "/wiki/");
    5231    private String pathhelp = Main.pref.get("help.pathhelp", "Help/");
    5332    private String pathmenu = Main.pref.get("help.pathmenu", "Menu/");
    54     private JEditorPane help = new JEditorPane();
    55     private WikiReader reader = new WikiReader(baseurl);
    56     private String url;
    5733
    5834    public HelpAction() {
    5935        super(tr("Help"), ImageProvider.get("help"));
    60         help.setEditable(false);
    61         help.addHyperlinkListener(new HyperlinkListener(){
    62             public void hyperlinkUpdate(HyperlinkEvent e) {
    63                 if (e.getEventType() != HyperlinkEvent.EventType.ACTIVATED)
    64                     return;
    65                 if (e.getURL() == null) {
    66                     help.setText("<html>404 not found</html>");
    67                 } else if (e.getURL().toString().endsWith("action=edit")) {
    68                     OpenBrowser.displayUrl(e.getURL().toString());
    69                 } else {
    70                     setHelpUrl(e.getURL().toString());
    71                 }
    72             }
    73         });
    74         help.setContentType("text/html");
    75 
    76         JPanel p = new JPanel(new BorderLayout());
    77         helpBrowser.setContentPane(p);
    78 
    79         p.add(new JScrollPane(help), BorderLayout.CENTER);
    80         String[] bounds = Main.pref.get("help.window.bounds", "0,0,800,600").split(",");
    81         helpBrowser.setBounds(
    82                 Integer.parseInt(bounds[0]),
    83                 Integer.parseInt(bounds[1]),
    84                 Integer.parseInt(bounds[2]),
    85                 Integer.parseInt(bounds[3]));
    86 
    87         JPanel buttons = new JPanel();
    88         p.add(buttons, BorderLayout.SOUTH);
    89         createButton(buttons, tr("Open in Browser"));
    90         createButton(buttons, tr("Edit"));
    91         createButton(buttons, tr("Reload"));
    92 
    93         helpBrowser.addWindowListener(new WindowAdapter(){
    94             @Override public void windowClosing(WindowEvent e) {
    95                 closeHelp();
    96             }
    97         });
    98 
    99         help.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "Close");
    100         help.getActionMap().put("Close", new AbstractAction(){
    101             public void actionPerformed(ActionEvent e) {
    102                 closeHelp();
    103             }
    104         });
     36        this.helpBrowser = new HelpBrowser();
    10537    }
    10638
    10739    public void actionPerformed(ActionEvent e) {
    108         if (tr("Open in Browser").equals(e.getActionCommand())) {
    109             OpenBrowser.displayUrl(url);
    110         } else if (tr("Edit").equals(e.getActionCommand())) {
    111             if (!url.startsWith(baseurl)) {
    112                 JOptionPane.showMessageDialog(
    113                         Main.parent,
    114                         tr("Can only edit help pages from JOSM Online Help"),
    115                         tr("Warning"),
    116                         JOptionPane.WARNING_MESSAGE
    117                 );
    118                 return;
    119             }
    120             OpenBrowser.displayUrl(url+"?action=edit");
    121         } else if (tr("Reload").equals(e.getActionCommand())) {
    122             setHelpUrl(url);
    123         } else if (e.getActionCommand() == null) {
     40        if (e.getActionCommand() == null) {
    12441            String topic = null;
    12542            if (e.getSource() instanceof Component) {
     
    13451            if (topic == null) {
    13552                helpBrowser.setVisible(false);
    136                 setHelpUrl(baseurl+pathbase+"Help");
     53                helpBrowser.setUrlForHelpTopic("Help");
    13754            } else {
    13855                help(topic);
     
    14057        } else {
    14158            helpBrowser.setVisible(false);
    142             setHelpUrl(baseurl+pathbase+"Help");
     59            helpBrowser.setUrlForHelpTopic("Help");
    14360        }
    14461    }
     
    17996    public void help(String topic) {
    18097        helpBrowser.setVisible(false);
    181         setHelpUrl(baseurl+pathbase+pathhelp+topic);
    182     }
    183 
    184     /**
    185      * Set the content of the help window to a specific text (in html format)
    186      * @param url The url this content is the representation of
    187      */
    188     public void setHelpUrl(String url) {
    189         String langurl = url;
    190         if(url.startsWith(baseurl+pathbase))
    191         {
    192             int i = pathbase.length()+baseurl.length();
    193             String title = url.substring(i);
    194             if(languageCode.length() != 0 && !title.startsWith(languageCode)) {
    195                 title = languageCode + title;
    196             }
    197             langurl = url.substring(0, i) + title;
    198         }
    199         boolean loaded = false;
    200         if(!langurl.equals(this.url) && !langurl.equals(url))
    201         {
    202             loaded = loadHelpUrl(url, langurl, true);
    203         }
    204         if(!loaded) {
    205             loaded = loadHelpUrl(url, langurl, false);
    206         }
    207         if(!loaded) {
    208             help.setText(tr("Error while loading page {0}",url));
    209         }
    210         helpBrowser.setVisible(true);
    211     }
    212 
    213     private boolean loadHelpUrl(String url, String langurl, boolean lang)
    214     {
    215         this.url = lang ? langurl : url;
    216         boolean loaded = false;
    217         try {
    218             String txt = reader.read(this.url);
    219             if(txt.length() == 0)
    220             {
    221                 if(lang)
    222                     throw new IOException();
    223                 else
    224                 {
    225                     if(url.equals(langurl))
    226                     {
    227                         txt = ("<HTML>"+tr("Help page missing. Create it in <A HREF=\"{0}\">English</A>.",
    228                                 url+"?action=edit")+"</HTML>");
    229                     }
    230                     else
    231                     {
    232                         txt = ("<HTML>"+tr("Help page missing. Create it in <A HREF=\"{0}\">English</A> or <A HREF=\"{1}\">your language</A>.",
    233                                 url+"?action=edit", langurl+"?action=edit")+"</HTML>");
    234                     }
    235                 }
    236             }
    237             help.setText(txt);
    238             help.setCaretPosition(0);
    239             loaded = true;
    240         } catch (IOException ex) {
    241         }
    242         return loaded;
    243     }
    244 
    245     /**
    246      * Closes the help window
    247      */
    248     public void closeHelp() {
    249         String bounds = helpBrowser.getX()+","+helpBrowser.getY()+","+helpBrowser.getWidth()+","+helpBrowser.getHeight();
    250         Main.pref.put("help.window.bounds", bounds);
    251         helpBrowser.setVisible(false);
    252     }
    253 
    254     private void createButton(JPanel buttons, String name) {
    255         JButton b = new JButton(tr(name));
    256         b.setActionCommand(name);
    257         b.addActionListener(this);
    258         buttons.add(b);
     98        helpBrowser.setUrlForHelpTopic(pathhelp + topic);
    25999    }
    260100}
Note: See TracChangeset for help on using the changeset viewer.