• Main Page
  • Related Pages
  • Classes
  • Files
  • File List

GetMailApp.java

Go to the documentation of this file.
00001 
00002 import java.awt.Color;
00003 import java.awt.Dimension;
00004 import java.awt.Font;
00005 import java.awt.Toolkit;
00006 import java.awt.event.ActionEvent;
00007 import java.awt.event.ActionListener;
00008 import java.awt.event.WindowEvent;
00009 
00010 import javax.swing.GroupLayout;
00011 import javax.swing.JButton;
00012 import javax.swing.JCheckBox;
00013 import javax.swing.JFrame;
00014 import javax.swing.JLabel;
00015 import javax.swing.JPanel;
00016 import javax.swing.JScrollPane;
00017 import javax.swing.JEditorPane;
00018 import javax.swing.JTextField;
00019 import javax.swing.LayoutStyle;
00020 import javax.swing.SwingUtilities;
00021 import javax.swing.WindowConstants;
00022 import javax.swing.GroupLayout.Alignment;
00023 import javax.swing.plaf.metal.MetalBorders;
00024 
00025 /**
00026  *  Simple POP3 get mail application that demonstrates usage of the MessageStore class
00027  *  (based on Javamail package), which instances are used to retrieve e-mail messages 
00028  *  from the pop3 store in background.
00029  *  
00030  *  @author Mikica B Kocic
00031  */
00032 public class GetMailApp extends JFrame 
00033     implements ActionListener
00034 {
00035     /**
00036      *  Implements java.io.Serializable interface
00037      */
00038     private static final long serialVersionUID = -5231008427555021088L;
00039 
00040     /**
00041      *  Common application title prefix.
00042      */
00043     private final static String appTitle = "IP1-6.2: POP3 Get Mail";
00044     
00045     /**
00046      *  GUI components
00047      */
00048     private JButton     buttonReceive;
00049     private JLabel      labelServer;
00050     private JTextField  fieldServer;
00051     private JLabel      labelUsername;
00052     private JTextField  fieldUsername;
00053     private JLabel      labelPassword;
00054     private JTextField  fieldPassword;
00055     private JScrollPane messageScrollPane;
00056     private JEditorPane messageContents;
00057     private JCheckBox   showContents;
00058     
00059     /**
00060      *  Creates an instance of the get mail application GUI.
00061      */
00062     public GetMailApp ()
00063     {
00064         super( appTitle );
00065             
00066         setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
00067         
00068         /////////////////////////////////////////////////////// GUI COMPONENTS ///////////
00069         
00070         addWindowListener( new java.awt.event.WindowAdapter () {
00071             public void windowClosing( java.awt.event.WindowEvent evt ) {
00072                 formWindowClosing( evt );
00073             }
00074         });
00075 
00076         buttonReceive  = new JButton ();
00077         labelServer    = new JLabel( "POP3 Server:" );
00078         fieldServer    = new JTextField ();
00079         labelUsername  = new JLabel( "Username:" );
00080         fieldUsername  = new JTextField ();
00081         labelPassword  = new JLabel( "Password:" );
00082         fieldPassword  = new JTextField ();
00083         showContents   = new JCheckBox( "Contents" );
00084 
00085         messageContents = new JEditorPane ();
00086         messageContents.setEditable( false );
00087 
00088         messageScrollPane = new JScrollPane ();
00089         messageScrollPane.setViewportView( messageContents );
00090 
00091         buttonReceive.setText( "Receive" );
00092         buttonReceive.addActionListener( this );
00093         
00094         showContents.setSelected( false );
00095 
00096         /////////////////////////////////////////////////////// FONTS ////////////////////
00097 
00098         Font btnFont  = new Font( Font.SANS_SERIF, Font.BOLD,  12 );
00099         Font textFont = new Font( Font.SANS_SERIF, Font.PLAIN, 12 );
00100         Font monoFont = new Font( Font.MONOSPACED, Font.PLAIN, 14 );
00101         
00102         buttonReceive.setFont( btnFont );
00103         labelServer.setFont( textFont );
00104         labelUsername.setFont( textFont );
00105         labelPassword.setFont( textFont );
00106         fieldServer.setFont( textFont );
00107         fieldUsername.setFont( textFont );
00108         fieldPassword.setFont( textFont );
00109         messageContents.setFont( monoFont );
00110         messageContents.setBackground( new Color( 255, 255, 240 ) );
00111 
00112         /////////////////////////////////////////////////////// COMPONENTS LAYOUT ////////
00113 
00114         JPanel authenticationPane = new JPanel (); 
00115         authenticationPane.setBorder( new MetalBorders.Flush3DBorder() );
00116         
00117         //////////////////////////////////////////////////////////////////////////////////
00118         
00119         /* Layout (self explained?): 
00120          *     Upper: fieldServer, fieldUsername, fieldPassword, buttonReceive,
00121          *            showContents checkbox
00122          *     Lower: messageContents scroll pane
00123          */
00124         GroupLayout layout = new GroupLayout( getContentPane () );
00125         getContentPane().setLayout( layout );
00126         layout.setAutoCreateContainerGaps( true );
00127         layout.setAutoCreateGaps( true );
00128 
00129         layout.setHorizontalGroup
00130         (
00131             layout
00132             .createParallelGroup( Alignment.LEADING )
00133             .addGroup
00134             ( 
00135                 layout
00136                 .createSequentialGroup ()
00137                 .addGroup
00138                 ( 
00139                     layout
00140                     .createParallelGroup( Alignment.LEADING )
00141                     .addGroup
00142                     (
00143                         Alignment.TRAILING, 
00144                         layout
00145                         .createSequentialGroup ()
00146                         .addComponent( labelServer )
00147                         .addGap( 5 )
00148                         .addComponent( fieldServer, 120, 120, 2000  )
00149                         .addPreferredGap( LayoutStyle.ComponentPlacement.RELATED )
00150                         .addComponent( labelUsername )
00151                         .addGap( 5 )
00152                         .addComponent( fieldUsername )
00153                         .addPreferredGap( LayoutStyle.ComponentPlacement.RELATED )
00154                         .addComponent( labelPassword )
00155                         .addGap( 5 )
00156                         .addComponent( fieldPassword )
00157                         .addGap( 25 )
00158                         .addComponent( buttonReceive )
00159                         .addGap( 5 )
00160                         .addComponent( showContents )
00161                     )
00162                     .addComponent( messageScrollPane )
00163                 )
00164             )
00165         );
00166         
00167         layout.setVerticalGroup
00168         (
00169             layout
00170             .createParallelGroup( Alignment.LEADING )
00171             .addGroup
00172             (
00173                 layout
00174                 .createSequentialGroup ()
00175                 .addGroup
00176                 (
00177                     layout
00178                     .createParallelGroup( Alignment.CENTER )
00179                     .addComponent( labelServer )
00180                     .addComponent( fieldServer, Alignment.CENTER, 25, 25, 25 )
00181                     .addComponent( labelUsername )
00182                     .addComponent( fieldUsername, Alignment.CENTER, 25, 25, 25 )
00183                     .addComponent( labelPassword )
00184                     .addComponent( fieldPassword, Alignment.CENTER, 25, 25, 25 )
00185                     .addComponent( buttonReceive, Alignment.CENTER, 25, 25, 25 )
00186                     .addComponent( showContents )
00187                 )
00188                 .addPreferredGap( LayoutStyle.ComponentPlacement.UNRELATED )
00189                 .addComponent( messageScrollPane )
00190             )
00191         );
00192         
00193         pack();
00194         
00195         /////////////////////////////////////////////////////// WINDOW PLACEMENT /////////
00196         
00197         /* Adjust window dimensions not to exceed screen dimensions ...
00198          */
00199         Dimension win = new Dimension( 1024, 600 );
00200         Dimension scsz = Toolkit.getDefaultToolkit().getScreenSize();
00201         win.width  = Math.min( win.width, scsz.width );
00202         win.height = Math.min( win.height, scsz.height - 40 );
00203         setSize( win );
00204         setMinimumSize( new Dimension( 700, 500 ) );
00205         
00206         /* ... then center window on the screen.
00207          */
00208         setLocation( ( scsz.width - win.width )/2, ( scsz.height - 40 - win.height )/2 );
00209         
00210         /* Show usage...
00211          */
00212         messageContents.setForeground( Color.BLUE );
00213         messageContents.setText( "\n"
00214                 + "  To get messages from POP3 server:\n\n"
00215                 + "    1) Enter server's hostname or IP address\n" 
00216                 + "    2) Enter your credentials\n"
00217                 + "    3) Click 'Receive'.\n\n"
00218                 + "  By default, messages' contents is not displayed.\n"
00219                 + "  To display the contents, turn on the 'Contents' check-box.\n"
00220                 );
00221 
00222         /* Ready for user to type in...
00223          */
00224         fieldServer.requestFocus ();
00225     }
00226 
00227     /**
00228      *  Closes application
00229      * 
00230      *  @param evt
00231      */
00232     private void formWindowClosing( WindowEvent evt )
00233     {
00234         System.exit( 0 );
00235     }
00236 
00237     /**
00238      *  Handles buttonReceive events
00239      */
00240     public void actionPerformed( ActionEvent evt )
00241     {
00242         if ( fieldServer.getText().isEmpty () || fieldUsername.getText().isEmpty () ) {
00243             return;
00244         }
00245 
00246         messageContents.setContentType( "text/html" );
00247         messageContents.setText( 
00248                 "<html><head></head><body><h3>Receiving...</h3></body></html>" );
00249         buttonReceive.setEnabled( false );
00250 
00251         new MessageStore (
00252                 this,
00253                 fieldServer.getText (),
00254                 fieldUsername.getText (),
00255                 fieldPassword.getText (),
00256                 showContents.isSelected ()
00257                 );
00258     }
00259 
00260     /**
00261      *  Call-back from the MessageStore instance. Displays HTML formatted contents of the
00262      *  MessageStore (that might have error messages).
00263      */
00264     public void onGetMessagesCompleted( StringBuffer outs )
00265     {
00266         final String str = outs.toString ();
00267 
00268         SwingUtilities.invokeLater( new Runnable () {
00269             public void run () {
00270                 messageContents.setContentType( "text/html" );
00271                 messageContents.setText( str );
00272                 buttonReceive.setEnabled( true );
00273             }
00274         } );
00275     }
00276 
00277     /**
00278      *  Main entry point. Creates instance of <code>GetMailApp</code> application.
00279      *  
00280      *  @param args the command line arguments
00281      */
00282     public static void main( String args[] ) 
00283     {
00284         java.awt.EventQueue.invokeLater( 
00285                 new Runnable() {
00286                     public void run() {
00287                         new GetMailApp ().setVisible( true );
00288                     }
00289                 }
00290             );
00291     }
00292 }
00293 
00294 /*! 
00295  *  \mainpage Simple POP3 Client
00296  *
00297  *  \section s_intro Introduction
00298  *  
00299  *  The package implements solution to \ref p_task as a part of 
00300  *  the <a href="http://dsv.su.se/utbildning/distans/ip1" target="_blank"><b>SU/IP1 
00301  *  course</b></a>.
00302  *  
00303  *  \image html getMailApp.png
00304  *  
00305  *  \section s_desc Description
00306  *
00307  *  The get mail application demonstrates usage of the MessageStore class,
00308  *  which is built on the top of 
00309  *  <a href="http://www.oracle.com/technetwork/java/index-jsp-139225.html" target="_blank">
00310  *  <b>Javamail</b></a> extension to JDK.
00311  *  
00312  *  The instances of the MessageStore are used to retrieve e-mail messages 
00313  *  from the pop3 store in background. Messages are formatted in HTML and displayed
00314  *  in the scrollable <code>JEditorPane</code> of the GetMailApp class, which implements
00315  *  the GUI for the application.
00316  *  
00317  *  User may choose not to display contents of the retrieved messages by turning off 
00318  *  'Contents' check-box.
00319  *  
00320  *  \section s_jar Executable
00321  *  
00322  *  The jar file of the package can be found 
00323  *  <a href="../getMail.jar"><b>here</b></a>.
00324  *  
00325  *  The jar also includes repacked <code>mail.jar</code> retrieved from 
00326  *  <a href="http://www.oracle.com/technetwork/java/index-138643.html" target="_blank">
00327  *  JavaMail 1.4.3</a>.
00328  *  
00329  *  \section s_src Sources
00330  *  
00331  *  Source files:
00332  *   - \ref MessageStore.java
00333  *   - \ref GetMailApp.java
00334  *
00335  */
00336 /*! \page p_task IP1-6.2 Uppgift
00337  *  
00338  *  Gör ett fristående program med ett grafiskt användargränssnitt som med hjälp av 
00339  *  JDK-extensionen Javamail kan mottaga e-post. Användaren ska kunna skriva in 
00340  *  följande:
00341  *  
00342  *   - Mail-server
00343  *   - Användare
00344  *   - Password 
00345  */

Generated on Thu Dec 16 2010 12:29:31 for Get Mail Client by  doxygen 1.7.2