| XJEditorPane |

    1   package gate.swing;
    2
    3   import javax.swing.*;
    4   import java.io.*;
    5   import java.util.*;
    6   import java.net.URL;
    7   import javax.swing.event.*;
    8   import javax.swing.text.*;
    9   import java.awt.event.*;
    10  import javax.swing.text.html.*;
    11
    12  import gate.util.*;
    13  import gate.event.*;
    14
    15  /**
    16   * An enhanced version of {@link javax.swing.JEditorPane} that is able of
    17   * handling hyperlinks from the HTML document displayed.
    18   */
    19  public class XJEditorPane extends JEditorPane {
    20
    21    public XJEditorPane(){
    22      super();
    23      init();
    24    }
    25
    26    public XJEditorPane(String url) throws IOException{
    27      super(url);
    28      init();
    29    }
    30
    31    public XJEditorPane(URL initialPage)throws IOException{
    32      super(initialPage);
    33      init();
    34    }
    35
    36    protected void init(){
    37      initLocalData();
    38      initListeners();
    39    }//protected void init()
    40
    41    protected void initLocalData(){
    42      backUrls = new LinkedList();
    43      forwardUrls = new LinkedList();
    44      try{
    45        backAction = new BackAction();
    46        forwardAction = new ForwardAction();
    47      }catch(IOException ioe){
    48        Err.prln("Resource mising! Is your classpath OK?");
    49        ioe.printStackTrace(Err.getPrintWriter());
    50      }
    51    }//protected void initLocalData()
    52
    53    protected void initListeners(){
    54      addHyperlinkListener(new HyperlinkListener() {
    55        public void hyperlinkUpdate(HyperlinkEvent e){
    56          if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){
    57            if (e instanceof HTMLFrameHyperlinkEvent) {
    58                HTMLFrameHyperlinkEvent  evt = (HTMLFrameHyperlinkEvent)e;
    59                HTMLDocument doc = (HTMLDocument)getDocument();
    60                doc.processHTMLFrameHyperlinkEvent(evt);
    61            }else{
    62              try {
    63                backUrls.addLast(getPage());
    64                forwardUrls.clear();
    65                setPage(e.getURL());
    66              }catch (Throwable t){
    67                t.printStackTrace(Err.getPrintWriter());
    68              }
    69            }
    70          }else if(e.getEventType() == HyperlinkEvent.EventType.ENTERED){
    71            fireStatusChanged(e.getURL().toExternalForm());
    72          }else if(e.getEventType() == HyperlinkEvent.EventType.EXITED){
    73            fireStatusChanged("");
    74          }
    75        }//public void hyperlinkUpdate(HyperlinkEvent e)
    76      });
    77    }//protected void initListeners()
    78
    79    public Action getForwardAction(){
    80      return forwardAction;
    81    }
    82
    83    public Action getBackAction(){
    84      return backAction;
    85    }
    86
    87    public void setPage(URL page) throws IOException{
    88      try{
    89        super.setPage(page);
    90      }catch(Exception e){
    91        fireStatusChanged(e.toString());
    92        e.printStackTrace(Err.getPrintWriter());
    93      }
    94      updateEnableState();
    95    }
    96
    97    class ForwardAction extends AbstractAction{
    98      private ForwardAction() throws IOException{
    99        super("Forward", new ImageIcon(new URL("gate:/img/forward.gif")));
    100     }
    101
    102     public void actionPerformed(ActionEvent e){
    103       backUrls.addLast(getPage());
    104       try{
    105         setPage((URL)forwardUrls.removeFirst());
    106       }catch(IOException ioe){
    107         ioe.printStackTrace(Err.getPrintWriter());
    108       }
    109     }
    110   }//class ForwardAction extends AbstractAction
    111
    112   class BackAction extends AbstractAction{
    113     private BackAction() throws IOException{
    114       super("Back", new ImageIcon(new URL("gate:/img/back.gif")));
    115     }
    116
    117     public void actionPerformed(ActionEvent e){
    118       forwardUrls.addFirst(getPage());
    119       try{
    120         setPage((URL)backUrls.removeLast());
    121       }catch(IOException ioe){
    122         ioe.printStackTrace(Err.getPrintWriter());
    123       }
    124     }
    125   }//class ForwardAction extends AbstractAction
    126
    127
    128   /**
    129    * Updates the enabled/disabled state for the back/forward actions
    130    */
    131   protected void updateEnableState(){
    132     forwardAction.setEnabled(!forwardUrls.isEmpty());
    133     backAction.setEnabled(!backUrls.isEmpty());
    134   }
    135   public synchronized void removeStatusListener(StatusListener l) {
    136     if (statusListeners != null && statusListeners.contains(l)) {
    137       Vector v = (Vector) statusListeners.clone();
    138       v.removeElement(l);
    139       statusListeners = v;
    140     }
    141   }
    142   public synchronized void addStatusListener(StatusListener l) {
    143     Vector v = statusListeners == null ? new Vector(2) : (Vector) statusListeners.clone();
    144     if (!v.contains(l)) {
    145       v.addElement(l);
    146       statusListeners = v;
    147     }
    148   }
    149
    150   protected LinkedList backUrls;
    151   protected LinkedList forwardUrls;
    152   protected Action backAction;
    153   protected Action forwardAction;
    154   private transient Vector statusListeners;
    155   protected void fireStatusChanged(String e) {
    156     if (statusListeners != null) {
    157       Vector listeners = statusListeners;
    158       int count = listeners.size();
    159       for (int i = 0; i < count; i++) {
    160         ((StatusListener) listeners.elementAt(i)).statusChanged(e);
    161       }
    162     }
    163   }
    164 }//public class XJEditorPane extends JEditorPane
    165

| XJEditorPane |