xref: /trunk/main/scripting/examples/java/Newsgroup/PostNewsgroup.java (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 import java.awt.*;
2 import java.awt.event.*;
3 import javax.swing.*;
4 import javax.swing.border.*;
5 import java.util.Vector;
6 import com.sun.star.script.framework.runtime.XScriptContext;
7 
8 
9 public class PostNewsgroup extends JFrame
10 {
11 
12     // Post to newsgroup objects
13     private NewsGroup[] subscribedNewsgroups = null;
14     private XScriptContext xscriptcontext = null;
15 
16     private final int FRAMEX = 300;
17     private final int FRAMEY = 300;
18     private final int TEXTBOXWIDTH = 300;
19     private final int TEXTBOXHEIGHT = 24;
20     private final int TEXTAREAHEIGHT = 70;
21     private final int BUTTONWIDTH = 80;
22     private final int BUTTONHEIGHT = 30;
23 
24     private PostNewsgroup window = null;
25     private JComboBox newsgroupComboBox = null;
26     private JTextField hostTextField = null;
27     private JTextField replyTextField = null;
28     private JTextField subjectTextField = null;
29     private JTextArea commentTextArea = null;
30     private JRadioButton officeHtmlButton = null;
31     private JRadioButton officeButton = null;
32     private JRadioButton htmlButton = null;
33     private JButton postButton = null;
34     private JButton cancelButton = null;
35 
36     // JFrame for launch progress dialog
37     private StatusWindow statusWindow = null;
38     private String statusLine = "";
39 
40     // Tool tip text
41     private final String newsgroupText = "Newsgroup name";
42     private final String hostText = "Newsgroup host/server name";
43     private final String replyText = "Email address to reply to";
44     private final String subjectText = "Subject title for the mail";
45     private final String commentText = "Additional comment on mail";
46     private final String officeHtmlText = "Post as both Office and HTML attachments";
47     private final String officeText = "Post as Office attachment only";
48     private final String htmlText = "Post as HTML attachment only";
49     private final String postText = "Post to newsgroup";
50     private final String cancelText = "Cancel post to newsgroup";
51 
52 
53     public void post( XScriptContext xsc )
54     {
55         xscriptcontext = xsc;
56         window = this;
57 
58         // create mailcap and mimetypes files (fix for classloader problem)
59         MimeConfiguration.createFiles( xscriptcontext );
60 
61         this.setTitle( "Post Document To Newsgroup" );
62         this.setLocation( FRAMEX, FRAMEY );
63 
64         this.addFocusListener( new FocusAdapter()
65         {
66             public void focusGained( FocusEvent event )
67             {
68                 System.out.println( "Focus gained" );
69                 window.update( window.getGraphics() );
70             }
71 
72             public void focusLost( FocusEvent event )
73                         {
74                 System.out.println( "Focus lost" );
75                         }
76         });
77 
78         Container container = getContentPane();
79         container.setLayout( new GridBagLayout() );;
80         GridBagConstraints constraints = new GridBagConstraints();
81         constraints.fill = GridBagConstraints.BOTH;
82 
83         JPanel labelPanel = constructLabelPanel();
84         JPanel textPanel = constructTextPanel();
85         JPanel optionPanel = constructOptionPanel();
86         JPanel buttonPanel = constructButtonPanel();
87 
88         constraints.gridx = 0;
89         constraints.gridy = 0;
90         constraints.gridwidth = 1;
91         constraints.gridheight = 3;
92         constraints.insets = new Insets( 15, 15, 5, 5 );
93         container.add( labelPanel, constraints );
94 
95         constraints.gridx = 1;
96         constraints.gridy = 0;
97         constraints.gridwidth = 4;
98         constraints.gridheight = 3;
99         constraints.insets = new Insets( 15, 5, 5, 15 );
100         container.add( textPanel, constraints );
101 
102         constraints.gridx = 0;
103         constraints.gridy = 3;
104         constraints.gridwidth = 5;
105         constraints.gridheight = 1;
106         constraints.insets = new Insets( 5, 15, 5, 15 );
107         container.add( optionPanel, constraints );
108 
109         constraints.gridx = 0;
110         constraints.gridy = 4;
111         constraints.gridwidth = 5;
112         constraints.gridheight = 1;
113         constraints.insets = new Insets( 5, 5, 5, 5 );
114         container.add( buttonPanel, constraints );
115 
116         this.pack();
117         this.setResizable( false );
118         this.setVisible( true );
119     }
120 
121 
122     private JPanel constructLabelPanel()
123     {
124         JLabel newsgroupLabel = new JLabel( "Newsgroup:" );
125         JLabel hostLabel = new JLabel( "Host:" );
126         JLabel replyLabel = new JLabel( "Reply:" );
127         JLabel subjectLabel = new JLabel( "Subject:" );
128         JLabel commentLabel = new JLabel( "Comment:" );
129 
130         newsgroupLabel.setToolTipText( newsgroupText );
131         hostLabel.setToolTipText( hostText );
132         replyLabel.setToolTipText( replyText );
133         subjectLabel.setToolTipText( subjectText );
134         commentLabel.setToolTipText( commentText );
135 
136         JPanel newsgroupPanel = new JPanel();
137         newsgroupPanel.setLayout( new BorderLayout() );
138         newsgroupPanel.add( newsgroupLabel, "West" );
139         JPanel hostPanel = new JPanel();
140         hostPanel.setLayout( new BorderLayout() );
141         hostPanel.add( hostLabel, "West" );
142         JPanel replyPanel = new JPanel();
143         replyPanel.setLayout( new BorderLayout() );
144         replyPanel.add( replyLabel, "West" );
145         JPanel subjectPanel = new JPanel();
146         subjectPanel.setLayout( new BorderLayout() );
147         subjectPanel.add( subjectLabel, "West" );
148         JPanel commentPanel = new JPanel();
149         commentPanel.setLayout( new BorderLayout() );
150         commentPanel.add( commentLabel, "West" );
151         JPanel emptyPanel = new JPanel();
152 
153         final int labelWidth = 80;
154         newsgroupPanel.setPreferredSize( new Dimension( labelWidth, TEXTBOXHEIGHT ) );
155         hostPanel.setPreferredSize( new Dimension( labelWidth, TEXTBOXHEIGHT ) );
156         replyPanel.setPreferredSize( new Dimension( labelWidth, TEXTBOXHEIGHT ) );
157         subjectPanel.setPreferredSize( new Dimension( labelWidth, TEXTBOXHEIGHT ) );
158         commentPanel.setPreferredSize( new Dimension( labelWidth, TEXTBOXHEIGHT ) );
159 
160         JPanel panel = new JPanel();
161         panel.setLayout( new GridBagLayout() );
162         GridBagConstraints constraints = new GridBagConstraints();
163         constraints.fill = GridBagConstraints.BOTH;
164         constraints.insets = new Insets( 5, 5, 5, 5 );
165 
166         constraints.gridx = 0;
167         constraints.gridy = 0;
168         constraints.gridwidth = 1;
169         constraints.gridheight = 1;
170         constraints.weightx = constraints.weighty = 0.0;
171         panel.add( newsgroupPanel, constraints );
172 
173         constraints.gridx = 0;
174         constraints.gridy = 1;
175         constraints.gridwidth = 1;
176         constraints.gridheight = 1;
177         panel.add( hostPanel, constraints );
178 
179         constraints.gridx = 0;
180         constraints.gridy = 2;
181         constraints.gridwidth = 1;
182         constraints.gridheight = 1;
183         panel.add( replyPanel, constraints );
184 
185         constraints.gridx = 0;
186         constraints.gridy = 3;
187         constraints.gridwidth = 1;
188         constraints.gridheight = 1;
189         panel.add( subjectPanel, constraints );
190 
191         constraints.gridx = 0;
192         constraints.gridy = 4;
193         constraints.gridwidth = 1;
194         constraints.gridheight = 1;
195         panel.add( commentPanel, constraints );
196 
197         constraints.gridx = 0;
198         constraints.gridy = 5;
199         constraints.gridwidth = 1;
200         constraints.gridheight = 1;
201         constraints.weightx = constraints.weighty = 1.0;
202         panel.add( emptyPanel, constraints );
203 
204         return panel;
205     }
206 
207 
208     private JPanel constructTextPanel()
209     {
210         hostTextField = new JTextField();
211                 hostTextField.setPreferredSize( new Dimension( TEXTBOXWIDTH, TEXTBOXHEIGHT ) );
212                 hostTextField.setToolTipText( hostText );
213         hostTextField.setBorder( new EtchedBorder() );
214 
215         //optionPanel.setBorder( new TitledBorder( new EtchedBorder(), "Document Format" ) );
216         newsgroupComboBox = getNewsgroupCombo();
217 
218         replyTextField = new JTextField();
219         replyTextField.setPreferredSize( new Dimension( TEXTBOXWIDTH, TEXTBOXHEIGHT ) );
220         replyTextField.setToolTipText( replyText );
221         replyTextField.setBorder( new EtchedBorder() );
222 
223         subjectTextField = new JTextField();
224         subjectTextField.setPreferredSize( new Dimension( TEXTBOXWIDTH, TEXTBOXHEIGHT ) );
225         subjectTextField.setToolTipText( subjectText );
226         subjectTextField.setBorder( new EtchedBorder() );
227 
228         commentTextArea = new JTextArea();
229         commentTextArea.setPreferredSize( new Dimension( TEXTBOXWIDTH, TEXTAREAHEIGHT ) );
230         commentTextArea.setToolTipText( commentText );
231         commentTextArea.setBorder( new EtchedBorder() );
232 
233         JPanel panel = new JPanel();
234         panel.setLayout( new GridBagLayout() );
235         GridBagConstraints constraints = new GridBagConstraints();
236         constraints.fill = GridBagConstraints.BOTH;
237         constraints.insets = new Insets( 5, 5, 5, 5 );
238 
239         constraints.gridx = 0;
240         constraints.gridy = 0;
241         constraints.gridwidth = 1;
242         constraints.gridheight = 1;
243         panel.add( newsgroupComboBox, constraints );
244 
245         constraints.gridx = 0;
246         constraints.gridy = 1;
247         constraints.gridwidth = 1;
248         constraints.gridheight = 1;
249         panel.add( hostTextField, constraints );
250 
251         constraints.gridx = 0;
252         constraints.gridy = 2;
253         constraints.gridwidth = 1;
254         constraints.gridheight = 1;
255         panel.add( replyTextField, constraints );
256 
257         constraints.gridx = 0;
258         constraints.gridy = 3;
259         constraints.gridwidth = 1;
260         constraints.gridheight = 1;
261         panel.add( subjectTextField, constraints );
262 
263         constraints.gridx = 0;
264         constraints.gridy = 4;
265         constraints.gridwidth = 1;
266         constraints.gridheight = 2;
267         panel.add( commentTextArea, constraints );
268 
269         return panel;
270     }
271 
272 
273     private JComboBox getNewsgroupCombo()
274     {
275         newsgroupComboBox = new JComboBox();
276         //newsgroupComboBox.setBorder( new EtchedBorder() );
277 
278         newsgroupComboBox.addActionListener(new ActionListener()
279         {
280                 public void actionPerformed(ActionEvent e)
281                 {
282                 // when newsgroup is selected
283                 if( subscribedNewsgroups != null )
284                 {
285                     int position = newsgroupComboBox.getSelectedIndex();
286                     if( position != -1 )
287                     {
288                         hostTextField.setText( subscribedNewsgroups[ position ].getHostName() );
289                         newsgroupComboBox.setToolTipText( "Newsgroup name: " + subscribedNewsgroups[ position ].getNewsgroupName() + "  (Host name: " + subscribedNewsgroups[ position ].getHostName() + ")" );
290                     }
291                 }
292             }
293         });
294 
295         NewsGroup groupToSend = null;
296         SubscribedNewsgroups newsgroups = new SubscribedNewsgroups();
297         subscribedNewsgroups = newsgroups.getNewsGroups();
298 
299         // Test for no .mozilla or no subscribed newsgroups
300         // subscribedNewsgroups = null;
301 
302         if( subscribedNewsgroups == null )
303         {
304             //System.out.println( "Couldn't find any subscibed newsgroups in .mozilla" );
305             JOptionPane.showMessageDialog( window, "No subscribed newsgroups found in mozilla/netscape profile \nPlease enter newsgroup and host name",
306                             "Newsgroups Information", JOptionPane.INFORMATION_MESSAGE );
307         }
308         else
309         {
310             // Copy all newsgroups into a vector for comparison
311             // Alter entries (to include host name) if duplication is found
312             Vector vector = new Vector( subscribedNewsgroups.length );
313             for(int i=0; i < subscribedNewsgroups.length; i++ )
314             {
315                 vector.add( subscribedNewsgroups[i].getNewsgroupName() );
316             }
317             // Compare and alter
318             for(int i=0; i < subscribedNewsgroups.length; i++ )
319             {
320                 // check if combo box already has a newsgroup with same name
321                 // then add host name to differentiate
322                 for(int j=0; j < subscribedNewsgroups.length; j++ )
323                 {
324                     if( j != i && subscribedNewsgroups[j].getNewsgroupName().equalsIgnoreCase( subscribedNewsgroups[i].getNewsgroupName() ) )
325                     {
326                         vector.set( j, subscribedNewsgroups[j].getNewsgroupName() + "  (" + subscribedNewsgroups[j].getHostName() + ")" );
327                         vector.set( i, subscribedNewsgroups[i].getNewsgroupName() + "  (" + subscribedNewsgroups[i].getHostName() + ")" );
328                     }
329                 }
330             }
331             // Copy converted newsgroups from vector to combo box
332             for(int i=0; i < subscribedNewsgroups.length; i++ )
333             {
334                 newsgroupComboBox.addItem( vector.elementAt(i) );
335             }
336         }// else
337 
338         newsgroupComboBox.setPreferredSize( new Dimension( TEXTBOXWIDTH, TEXTBOXHEIGHT ) );
339         newsgroupComboBox.setEditable( true );
340 
341         return newsgroupComboBox;
342     }
343 
344 
345 
346     private JPanel constructOptionPanel()
347     {
348         officeHtmlButton = new JRadioButton( "Office and HTML", true );
349         officeHtmlButton.setToolTipText( officeHtmlText );
350 
351         officeButton = new JRadioButton( "Office" );
352         officeButton.setToolTipText( officeText );
353 
354         htmlButton = new JRadioButton( "HTML" );
355         htmlButton.setToolTipText( htmlText );
356 
357         JRadioButton[] rbuttons = { officeHtmlButton, officeButton, htmlButton };
358         ButtonGroup radioButtonGroup = new ButtonGroup();
359         for( int i=0; i < rbuttons.length; i++ )
360         {
361             radioButtonGroup.add( rbuttons[i] );
362         }
363 
364         JPanel optionPanel = new JPanel();
365         //optionPanel.setLayout( new GridLayout( 1, 3, 20, 0 ) );
366         optionPanel.setBorder( new TitledBorder( new EtchedBorder(), "Document Format" ) );
367         optionPanel.setLayout( new GridBagLayout() );
368         GridBagConstraints constraints = new GridBagConstraints();
369         constraints.fill = GridBagConstraints.BOTH;
370 
371         constraints.gridx = 0;
372                 constraints.gridy = 0;
373                 constraints.gridwidth = 1;
374                 constraints.gridheight = 1;
375         constraints.insets = new Insets( 5, 5, 5, 30 );
376                 optionPanel.add( officeHtmlButton, constraints );
377 
378         constraints.gridx = 1;
379                 constraints.gridy = 0;
380                 constraints.gridwidth = 1;
381                 constraints.gridheight = 1;
382         constraints.insets = new Insets( 5, 20, 5, 30 );
383                 optionPanel.add( officeButton, constraints );
384 
385         constraints.gridx = 2;
386                 constraints.gridy = 0;
387                 constraints.gridwidth = 1;
388                 constraints.gridheight = 1;
389         constraints.insets = new Insets( 5, 20, 5, 5 );
390                 optionPanel.add( htmlButton, constraints );
391 
392                 return optionPanel;
393     }
394 
395 
396 
397     public boolean sendingActions()
398     {
399             // posting actions
400             // Validate the data
401             if( isValidData() )
402             {
403                 // Create status window
404                 StatusWindow statusWindow = new StatusWindow( window,  "Posting to Newsgroup", FRAMEX, FRAMEY );
405 
406                 statusWindow.setVisible( true );
407                 //statusWindow.requestFocusInWindow();
408                 statusLine = "Ready to send...";
409                 statusWindow.setStatus( 0, statusLine );
410 
411                 // Get the boolean values for HTML/Office document
412                 // params: ( XScriptContext, StatusWindow, html document, office document )
413 
414                 boolean html = false;
415                 boolean office = false;
416                 if( officeHtmlButton.isSelected() ) { html = true; office = true; }
417                 if( officeButton.isSelected() ) { office = true; html = false; }
418                 if( htmlButton.isSelected() ) { html = true; office = false; }
419 
420                 OfficeAttachment officeAttach = new OfficeAttachment( xscriptcontext, statusWindow, html, office );
421 
422                 statusLine = "Getting user input";
423                 statusWindow.setStatus( 2, statusLine );
424                 // Get replyto, subject, comment from textboxes
425                 String replyto = replyTextField.getText();
426                 String subject = subjectTextField.getText();
427                 String comment = commentTextArea.getText();
428 
429                 // Get newsgroup from combo box (corresponding position)
430                 String host = "";
431                 String group = "";
432                 int position = newsgroupComboBox.getSelectedIndex();
433                 if( subscribedNewsgroups == null || position == -1 )
434                 {
435                     host = hostTextField.getText();
436                     group = newsgroupComboBox.getSelectedItem().toString();
437                 }
438                 else
439                 {
440                     //int position = newsgroupComboBox.getSelectedIndex();
441                     host = subscribedNewsgroups[ position ].getHostName();
442                     group = subscribedNewsgroups[ position ].getNewsgroupName();
443                 }
444 
445                 statusLine = "Creating sender object";
446                 statusWindow.setStatus( 3, statusLine );
447                 Sender sender = new Sender( statusWindow, officeAttach, replyto, subject, comment, host, group );
448                 if( !sender.sendMail() )
449                 {
450                     //System.out.println( "Should end here (?)" );
451                     statusWindow.enableCancelButton( true );
452                     officeAttach.cleanUpOnError();
453                     return false;
454                 }
455 
456                 statusLine = "Send is complete";
457                 statusWindow.setStatus( 14, statusLine );
458             }
459             else
460             {
461                 //System.out.println( "Non valid data" );
462                 return false;
463             }
464             return true;
465     }
466 
467 
468     private JPanel constructButtonPanel()
469     {
470         Action postAction = new AbstractAction() {
471             public void actionPerformed( ActionEvent event ) {
472                 // posting actions
473                 sendingActions();
474             }// actionPerformed
475         };
476 
477         Action cancelAction = new AbstractAction() {
478                         public void actionPerformed( ActionEvent event ) {
479                                 // cancelling actions
480                 window.dispose();
481                         }
482                 };
483 
484         postButton = new JButton();
485         postButton.setAction( postAction );
486         postButton.setToolTipText( postText );
487         postButton.setText( "Post" );
488         postButton.setPreferredSize( new Dimension( BUTTONWIDTH + 20, BUTTONHEIGHT ) );
489 
490         cancelButton = new JButton();
491         cancelButton.setAction( cancelAction );
492         cancelButton.setToolTipText( cancelText );
493         cancelButton.setText( "Cancel" );
494         cancelButton.setPreferredSize( new Dimension( BUTTONWIDTH + 20, BUTTONHEIGHT ) );
495 
496         JSeparator sep = new JSeparator( SwingConstants.HORIZONTAL );
497 
498         JPanel buttonPanel = new JPanel();
499         buttonPanel.setLayout( new GridBagLayout() );
500         GridBagConstraints constraints = new GridBagConstraints();
501         constraints.fill = GridBagConstraints.BOTH;
502         constraints.insets = new Insets( 5, 5, 5, 5 );
503 
504         JPanel emptyPanel1 = new JPanel();
505         emptyPanel1.setPreferredSize( new Dimension( BUTTONWIDTH, BUTTONHEIGHT ) );
506 
507         JPanel emptyPanel2 = new JPanel();
508         emptyPanel2.setPreferredSize( new Dimension( BUTTONWIDTH, BUTTONHEIGHT ) );
509 
510         constraints.gridx = 0;
511                 constraints.gridy = 0;
512                 constraints.gridwidth = 4;
513                 constraints.gridheight = 1;
514                 buttonPanel.add( sep, constraints );
515 
516         constraints.gridx = 0;
517                 constraints.gridy = 1;
518                 constraints.gridwidth = 1;
519                 constraints.gridheight = 1;
520                 buttonPanel.add( emptyPanel1, constraints );
521 
522                 constraints.gridx = 1;
523                 constraints.gridy = 1;
524                 constraints.gridwidth = 1;
525                 constraints.gridheight = 1;
526                 buttonPanel.add( emptyPanel2, constraints );
527 
528         constraints.gridx = 2;
529         constraints.gridy = 1;
530         constraints.gridwidth = 1;
531         constraints.gridheight = 1;
532         buttonPanel.add( postButton, constraints );
533 
534         constraints.gridx = 3;
535         constraints.gridy = 1;
536         constraints.gridwidth = 1;
537         constraints.gridheight = 1;
538         constraints.insets = new Insets( 5, 5, 5, 0 );
539         buttonPanel.add( cancelButton, constraints );
540 
541                 return buttonPanel;
542     }
543 
544 
545     public void enableButtons( boolean enable )
546     {
547         if( enable )
548         {
549             postButton.setEnabled( true );
550             cancelButton.setEnabled( true );
551         }
552         else
553         {
554             postButton.setEnabled( false );
555             cancelButton.setEnabled( false );
556         }
557     }
558 
559 
560     private boolean isValidData()
561     {
562         // newsgroupComboBox must not be blank (format? dots and whitespace)
563         String newsgroupString = "";
564         int position = newsgroupComboBox.getSelectedIndex();
565         if( subscribedNewsgroups == null || position == -1 )
566         {
567             newsgroupString = newsgroupComboBox.getSelectedItem().toString();
568         }
569         else
570         {
571             //int position = newsgroupComboBox.getSelectedIndex();
572             newsgroupString = subscribedNewsgroups[ position ].getNewsgroupName();
573         }
574         if( newsgroupString.length() == 0 )
575         {
576             //System.out.println( "Please enter a newsgroup name" );
577             newsgroupComboBox.requestFocus();
578             JOptionPane.showMessageDialog( window, "Please enter a newsgroup name", "Input Error", JOptionPane.ERROR_MESSAGE );
579             return false;
580         }
581 
582 
583         // hostTextField must not be blank (format?)
584         String  hostString = hostTextField.getText();
585                 if( hostString.length() == 0 )
586                 {
587             //System.out.println( "Please enter a hostname" );
588             hostTextField.requestFocus();
589             JOptionPane.showMessageDialog( window, "Please enter a hostname", "Input Error", JOptionPane.ERROR_MESSAGE );
590                         return false;
591                 }
592 
593 
594         // replyTextField must have <string>@<string>.<string>
595         // (string at least 2 chars long)
596         // consider <s>.<s>@<s>.<s>.<s> format? (array of dot positons?)
597         String replyString = replyTextField.getText();
598         int atPos = replyString.indexOf( "@" );
599         int dotPos = replyString.lastIndexOf( "." );
600         int length = replyString.length();
601         //System.out.println( "length: " + length + "\n atPos: " + atPos + "\n dotPos: " + dotPos );
602         if( length == 0 || atPos == -1 || dotPos == -1 || atPos < 2 || dotPos < atPos || dotPos + 2 == length || atPos + 2 == dotPos || atPos != replyString.lastIndexOf( "@" ) || replyString.indexOf(" ") != -1 )
603         {
604             //System.out.println( "Please enter a valid reply to email address" );
605             replyTextField.requestFocus();
606             JOptionPane.showMessageDialog( window, "Please enter a valid reply to email address", "Input Error", JOptionPane.ERROR_MESSAGE );
607             return false;
608         }
609 
610 
611         // subjectTextField must not be blank?
612         String subjectString = subjectTextField.getText();
613         if( subjectString.length() == 0 )
614         {
615             //System.out.println( "Please enter subject title" );
616             subjectTextField.requestFocus();
617             JOptionPane.showMessageDialog( window, "Please enter subject title", "Input Error", JOptionPane.ERROR_MESSAGE );
618             return false;
619         }
620 
621         // details are valid
622         return true;
623     }
624 
625 }
626