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 / articleposter.java next >
Text File  |  1995-08-11  |  8KB  |  266 lines

  1. /*
  2.  * @(#)ArticlePoster.java    1.14 95/05/21 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 net.smtp.SmtpClient;
  26. import net.www.html.MessageHeader;
  27. import awt.*;
  28. import browser.hotjava;
  29.  
  30. /*
  31.  * This needs to be changed so that the unMap()ed fields don't mess up the
  32.  * layout.  This probably means creating new Frames for each popup. This
  33.  * wasn't originally done, because there was no way to get rid of Frames
  34.  */
  35.  
  36. /** Post an article to either a newsgroup or email */
  37. public class ArticlePoster extends Frame implements Runnable {
  38.     InputStream is;
  39.     String reference;
  40.     String wwwEncodedBody;
  41.     TextArea t;
  42.     TextField from;
  43.     TextField subject;
  44.     TextField group;
  45.     TextField cc;
  46.     Label cclb;
  47.     Label grouplb;
  48.     Label statuslb;
  49.     Toggle htmlToggle;
  50.     boolean mailing;
  51.     static String usersMailAddress;
  52.  
  53.  
  54.     private ArticlePoster (String Subject, String Title,
  55.                String Destination,
  56.                String wwwEncodedBody,
  57.                boolean ml) {
  58. //    super(true, 600, 575, Color.lightGray);
  59.     super(true,
  60.           wwwEncodedBody == null ? 600 : 400,
  61.           wwwEncodedBody == null ? 400 : 240,
  62.           Color.lightGray);
  63.     Font defaultFont = wServer.fonts.getFont("TimesRoman", Font.PLAIN, 12);
  64.     setDefaultFont(defaultFont);
  65.     Window w = new Window(this, "Center", background, 700, 200);
  66.     w.setLayout(new ColumnLayout(true));
  67.     if (wwwEncodedBody == null) {
  68.         t = new TextArea(w, "Center", defaultFont, 80, 24);
  69.         t.setHFill(true);
  70.         t.setVFill(true);
  71.     }
  72.     w = new Window(this, "North", background, 700, 150);
  73.     RowColLayout r = new RowColLayout(0, 2, true);
  74.     w.setLayout(r);
  75.     r.setGaps(-2, -2, 0, 0);
  76.     String user = usersMailAddress;
  77.     if (user == null) {
  78.         if (hotjava.props != null)
  79.         user = (String) hotjava.props.get("usersMailAddress");
  80.         if (user == null || user.length() <= 0) {
  81.         user = System.getenv("USER");
  82.         if (user == null) {
  83.             user = System.getenv("LOGNAME");
  84.             if (user == null)
  85.             user = "";
  86.         }
  87.         }
  88.     }
  89.     usersMailAddress = user;
  90.     new Label("From:", null, w, defaultFont);
  91.     from = new TextField(user, null, w, true);
  92.     new Label("Subject:", null, w, defaultFont);
  93.     subject = new TextField(null, null, w, true);
  94.     grouplb = new Label("Destination:", null, w, defaultFont);
  95.     group = new TextField(null, null, w, true);
  96.     if (ml) {
  97.         cclb = new Label("Cc:", null, w, defaultFont);
  98.         cc = new TextField(null, null, w, true);
  99.     }
  100.     w = new Window(this, "South", background, 700, 30);
  101.     w.setLayout(new ColumnLayout(true));
  102.     Row row = new Row(w, null, true);
  103.     new PostMessageButton(row, this);
  104.     new DismissButton(row, this);
  105.     if (wwwEncodedBody == null)
  106.         htmlToggle = new Toggle("Formatted in HTML", null, row, false);
  107.     statuslb = new Label("", null, w);
  108.     statuslb.setHFill(true);
  109.  
  110.     this.wwwEncodedBody = wwwEncodedBody;
  111.     mailing = ml;
  112.     status(null);
  113.     subject.setText(Subject);
  114.     group.setText(Destination);
  115.     setTitle(Title);
  116.     grouplb.setText(mailing ? "To:" : "Newsgroup:");
  117.     map();
  118.     resize();
  119.     }
  120.  
  121.     void status(String s) {
  122.     statuslb.setText(s != null ? s : "");
  123.     }
  124.  
  125.     private static void StartSTComposition(String Subject, String Title,
  126.                             String Destination,
  127.                             String wwwEncodedBody,
  128.                             boolean ml) {
  129.     new ArticlePoster (Subject, Title, Destination,
  130.                    wwwEncodedBody, ml);
  131.     }
  132.  
  133.     private static void StartSTComposition(String Title,
  134.                             boolean ml,
  135.                             InputStream is) {
  136.     ArticlePoster ap = new ArticlePoster ("", Title, "", null, ml);
  137.     ap.is = is;
  138.     new Thread(ap).start();
  139.     }
  140.  
  141.     /** Pop up a dialog box to post a message to a newsgroup.
  142.     The input stream should contain an article that the one
  143.     being posted is in reply to. */
  144.     static public void PostTo(InputStream is) {
  145.     StartSTComposition("Composing News Article", false, is);
  146.     }
  147.  
  148.     /** Pop up a dialog box to post a message to a newsgroup.
  149.     Initializes the group name to gn. */
  150.     static public void PostTo(String gn) {
  151.     StartSTComposition("", "Composing article for " + gn,
  152.                gn, null, false);
  153.     }
  154.  
  155.     /** Pop up a dialog box to post a message to a newsgroup.
  156.     No default group */
  157.     static public void PostTo() {
  158.     StartSTComposition("", "Composing News Article",
  159.                "", null, false);
  160.     }
  161.  
  162.     /** Pop up a dialog box to mail a message.  The subject
  163.     and destiniation will start out being blank. */
  164.     static public void MailTo() {
  165.     StartSTComposition("", "Composing Mail Message",
  166.                "", null, true);
  167.     }
  168.  
  169.     /** Pop up a dialog box to mail a message.  The subject
  170.     and destiniation will be initialized from the parameters. */
  171.     static public void MailTo(String to, String subject) {
  172.     StartSTComposition(to, "Composing Mail Message",
  173.                subject, null, true);
  174.     }
  175.  
  176.     /** Pop up a dialog box to mail a message.  The subject
  177.     and destiniation will be initialized from the parameters. */
  178.     static public void MailTo(String to, String subject, String wwwEncodedBody) {
  179.     StartSTComposition(to, "Composing Mail Message",
  180.                subject, wwwEncodedBody, true);
  181.     }
  182.  
  183.     /** Pop up a dialog box to mail a message.  The subject
  184.     and destiniation will be initialized from the message being
  185.     replied to which should appear on the input stream. */
  186.     static public void MailTo(InputStream is) {
  187.     StartSTComposition("Composing Mail Message", true, is);
  188.     }
  189.  
  190.     public void run() {
  191.     MessageHeader mh = new MessageHeader(is);
  192.     String s;
  193.     String messageID = mh.findValue("message-id");
  194.     s = mh.findValue("references");
  195.     if (s == null)
  196.         s = messageID;
  197.     if (s != null)
  198.         reference = mh.canonicalID(s);
  199.     if (mailing) {
  200.         if ((s = mh.findValue("from")) != null)
  201.         group.setText(s);
  202.     } else if ((s = mh.findValue("newsgroups")) != null)
  203.         group.setText(s);
  204.     s = mh.findValue("subject");
  205.     if (s != null) {
  206.         if (s.startsWith("Re:"))
  207.         subject.setText(s);
  208.         else
  209.         subject.setText("Re: " + s);
  210.     }
  211.     if (!mailing) {
  212.         if (messageID != null)
  213.         t.insertText("In news:" + mh.canonicalID(messageID) + " ", t.endPos());
  214.         s = mh.findValue("from");
  215.         if (s != null)
  216.         t.insertText(s + " says:\n", t.endPos());
  217.     }
  218.     if (t.endPos() > 1)
  219.         t.insertText("\n", t.endPos());
  220.     if (is != null) {
  221.         char cb[] = new char[200];
  222.         int cbl = 0;
  223.         int c;
  224.         int col = 0;
  225.         int limit = cb.length - 3;
  226.         while ((c = is.read()) >= 0) {
  227.         if (cbl >= limit) {
  228.             t.insertText(new String(cb, 0, cbl), t.endPos());
  229.             cbl = 0;
  230.         }
  231.         if (c == '\n')
  232.             col = 0;
  233.         else if (col == 0) {
  234.             cb[cbl++] = '>';
  235.             cb[cbl++] = ' ';
  236.             col++;
  237.         }
  238.         cb[cbl++] = (char) c;
  239.         }
  240.         if (cbl > 0)
  241.         t.insertText(new String(cb, 0, cbl), t.endPos());
  242.         is.close();
  243.     }
  244.     }
  245. }
  246.  
  247. class DismissButton extends Button {
  248.  
  249.     public DismissButton (Container w, Frame f) {
  250.     this(w, f, "Cancel");
  251.     }
  252.  
  253.     public DismissButton (Container w, Frame f, String label) {
  254.     super(label, null, w);
  255.  
  256.     frame = f;
  257.     }
  258.  
  259.     public void selected(Component c, int pos) {
  260.     frame.unMap();
  261.     frame.dispose();
  262.     }
  263.  
  264.     Frame frame;
  265. }
  266.