home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / www / protocol / news / inlinebutton.java < prev    next >
Text File  |  1995-08-11  |  7KB  |  260 lines

  1. /*
  2.  * @(#)InlineButton.java    1.6 95/04/10 James Gosling, Jonathan Payne
  3.  * 
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for NON-COMMERCIAL purposes and without fee is hereby
  8.  * granted provided that this copyright notice appears in all copies. Please
  9.  * refer to the file "copyright.html" for further important copyright and
  10.  * licensing information.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  15.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  16.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  17.  * ITS DERIVATIVES.
  18.  */
  19.  
  20. package net.www.protocol.news;
  21.  
  22. import java.io.*;
  23. import java.util.*;
  24. import net.nntp.*;
  25. import browser.Applet;
  26. import browser.WRWindow;
  27. import browser.DocumentManager;
  28. import net.www.html.URL;
  29. import awt.*;
  30.  
  31.  
  32. /** A simple inline button applet for use by the news reader.  The "label"
  33.     attribute defines the text that will appear in the label, "href" defines
  34.     what to do when the button is clicked.  Normally it is a URL.
  35.     InlineButton acts almost the same as an anchor, except that it looks
  36.     different */
  37. public
  38. class InlineButton extends Applet {
  39.     String label;
  40.     String target;
  41.     static Font labelFont;
  42.     boolean up = true;
  43.     int strX, strY;
  44.  
  45.     public void init() {
  46.     if (labelFont == null)
  47.         labelFont = getFont("Helvetica", Font.BOLD, 11);
  48.     font = labelFont;
  49.     label = getAttribute("label");
  50.     FontMetrics fm = getFontMetrics(labelFont);
  51.     int labelWidth = fm.stringWidth(label);
  52.     target = getAttribute("href");
  53.     int minheight = fm.height + 4;
  54.     try {
  55.         minheight = Integer.parseInt(getAttribute("height"));
  56.     } catch (Exception e) {
  57.     }
  58.     int minwidth = labelWidth + 4;
  59.     minwidth = (minwidth + 15) & ~15;
  60.     try {
  61.         minwidth = Integer.parseInt(getAttribute("width"));
  62.     } catch (Exception e) {
  63.     }
  64.     resize(minwidth, minheight);
  65.     strX = (width - fm.stringWidth(label)) / 2;
  66.     strY = (height - fm.height) / 2 + fm.ascent;
  67.     }
  68.  
  69.     /**
  70.      * Paint the current frame.
  71.      */
  72.     public void paint(Graphics g) {
  73.     g.setForeground(up ? Color.white : Color.darkGray);
  74.     g.drawLine(0, 1, 0, height - 2);    // left
  75.     g.drawLine(1, 0, width - 2, 0);    // top
  76.     g.setForeground(up ? Color.darkGray : Color.white);
  77.     g.drawLine(1, height - 1, width - 2, height - 1);    // bottom
  78.     g.drawLine(width - 1, 1, width - 1, height - 2);    // right
  79.  
  80.     g.setForeground(up ? Color.black : Color.red);
  81.     g.drawString(label, strX, strY);
  82.     }
  83.  
  84.     public void mouseDown(int x, int y) {
  85.     up = false;
  86.     repaint();
  87.     }
  88.  
  89.     private void status(String s) {
  90.     try {
  91.         ((WRWindow) item.parent).status(s);
  92.     } catch(Exception e);
  93.     }
  94.  
  95.     private void gotoURL(URL u) {
  96.     try {
  97.         status("Going to " + u.toExternalForm());
  98.         ((WRWindow) item.parent).pushURL(u);
  99.     } catch(Exception e) {
  100.         status("Error going to " + u.toExternalForm() + "(" + e + ")");
  101.     }
  102.     }
  103.  
  104.     private void gotoArticle(int delta) {
  105.     String an = documentURL.file;
  106.     try {
  107.         int lSlash = an.lastIndexOf('/');
  108.         int articlenum = Integer.parseInt(an.substring(lSlash + 1)) + delta;
  109.         gotoURL(new URL(documentURL, articlenum + ""));
  110.     } catch(Exception e) {
  111.         status("Error going to article");
  112.     }
  113.     }
  114.  
  115.     String groupName() {
  116.     if (!documentURL.protocol.equals("news")) {
  117.         return "";
  118.     }
  119.     String gn = documentURL.file;
  120.     int start = 0;
  121.     while (start < gn.length() && gn.charAt(start) == '/')
  122.         start++;
  123.     int nsl = gn.indexOf('/', start);
  124.     return nsl < 0 ? gn.substring(start) : gn.substring(start, nsl);
  125.     }
  126.  
  127.     int articleNumber() {
  128.     if (!documentURL.protocol.equals("news"))
  129.         return -1;
  130.     String gn = documentURL.file;
  131.     int apos = gn.lastIndexOf('/');
  132.     if (apos > 0) {
  133.         try {
  134.         return Integer.parseInt(gn.substring(apos + 1));
  135.         } catch(Exception e) {
  136.         }
  137.     }
  138.     return -1;
  139.     }
  140.  
  141.     public void mouseUp(int x, int y) {
  142.     if (!up) {
  143.         up = true;
  144.         repaint();
  145.         if ("saverc".equals(target)) {
  146.         status("Saving .newsrc");
  147.         try {
  148.             if (newsFetcher.Newsgroups != null && newsFetcher.newsrcName != null)
  149.             Newsgroup.writeNewsrcFile(newsFetcher.newsrcName, newsFetcher.Newsgroups);
  150.             status("Saved .newsrc");
  151.         } catch(Exception e) {
  152.             status("Error attempting to save .newsrc");
  153.         }
  154.         } else if ("catchup".equals(target)) {
  155.         try {
  156.             String group = groupName();
  157.             Newsgroup ng = newsFetcher.findGroup(group);
  158.             ng.articles = null;
  159.         } catch(Exception e) {
  160.         }
  161.         gotoURL(new URL(null, "news:"));
  162.         } else if ("unsubscribe".equals(target)) {
  163.         try {
  164.             newsFetcher.findGroup(groupName()).subscribed = false;
  165.         } catch(Exception e) {
  166.         }
  167.         gotoURL(new URL(null, "news:"));
  168.         } else if ("subscribe".equals(target)) {
  169.         try {
  170.             newsFetcher.findGroup(groupName()).subscribed = true;
  171.         } catch(Exception e) {
  172.         }
  173.         } else if ("post".equals(target)) {
  174.         String gn = groupName();
  175.         try {
  176.             if (gn.length() <= 0)
  177.             ArticlePoster.PostTo();
  178.             else if (gn.indexOf('@') > 0)
  179.             ArticlePoster.PostTo(newsFetcher.news.getArticle(gn));
  180.             else {
  181.             int an = articleNumber();
  182.             if (an > 0) {
  183.                 newsFetcher.news.setGroup(gn);
  184.                 ArticlePoster.PostTo(newsFetcher.news.getArticle(an));
  185.             } else
  186.                 ArticlePoster.PostTo(gn);
  187.             }
  188.         } catch(Exception e) {
  189.             status("Can't post -- " + e);
  190.         }
  191.         } else if ("mail".equals(target)) {
  192.         String gn = groupName();
  193.         try {
  194.             if (gn.length() <= 0)
  195.             ArticlePoster.MailTo();
  196.             else if (gn.indexOf('@') > 0)
  197.             ArticlePoster.MailTo(newsFetcher.news.getArticle(gn));
  198.             else {
  199.             int an = articleNumber();
  200.             if (an > 0) {
  201.                 newsFetcher.news.setGroup(gn);
  202.                 ArticlePoster.MailTo(newsFetcher.news.getArticle(an));
  203.             } else
  204.                 ArticlePoster.MailTo();
  205.             }
  206.         } catch(Exception e) {
  207.             status("Can't send mail -- " + e);
  208.         }
  209.         } else if ("rescan".equals(target)) {
  210.         boolean AnyChanged = false;
  211.         Newsgroup ns[] = newsFetcher.Newsgroups;
  212.         int limit = ns.length;
  213.         for (int i = 0; i < limit; i++) {
  214.             try {
  215.             Newsgroup p = ns[i];
  216.             if (p == null || !p.subscribed)
  217.                 continue;
  218.             NewsgroupInfo gi = newsFetcher.news.getGroup(p.group.name);
  219.             if (gi.lastArticle > p.group.lastArticle) {
  220.                 p.articles.add(p.group.lastArticle + 1, gi.lastArticle);
  221.                 p.group.lastArticle = gi.lastArticle;
  222.                 AnyChanged = true;
  223.                 DocumentManager.unCacheDocument(new URL(null, "news:///" + p.group.name));
  224.             }
  225.             } catch(Exception e) {
  226.             }
  227.         }
  228.         if (AnyChanged)
  229.             DocumentManager.unCacheDocument(new URL(null, "news:///"));
  230.         gotoURL(documentURL);
  231.         } else if ("catchup".equals(target)) {
  232.         try {
  233.             newsFetcher.findGroup(groupName()).articles = null;
  234.             URL u = new URL(null, "news:");
  235.             DocumentManager.unCacheDocument(u);
  236.             gotoURL(u);
  237.         } catch(Exception e);
  238.         } else if ("regen".equals(target)) {
  239.         try {
  240.             DocumentManager.unCacheDocument(documentURL);
  241.             gotoURL(documentURL);
  242.         } catch(Exception e) {
  243.         }
  244.         } else if ("next".equals(target)) {
  245.         gotoArticle(1);
  246.         } else if ("prev".equals(target)) {
  247.         gotoArticle(-1);
  248.         } else {
  249.         gotoURL(new URL(documentURL, target));
  250.         }
  251.     }
  252.     }
  253.     public void mouseExit() {
  254.     if (!up) {
  255.         up = true;
  256.         repaint();
  257.     }
  258.     }
  259. }
  260.