package siprp.medicina.processo.mail; import info.clearthought.layout.TableLayout; import info.clearthought.layout.TableLayoutConstraints; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FileDialog; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; import java.util.Vector; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.text.AttributeSet; import javax.swing.text.DefaultEditorKit; import javax.swing.text.StyleConstants; import javax.swing.text.StyledEditorKit; import javax.swing.text.html.HTMLEditorKit; import com.evolute.utils.images.ImageIconLoader; import com.evolute.utils.tables.BaseTable; import com.evolute.utils.tables.VectorTableModel; import com.evolute.utils.ui.CustomJDialog; import com.evolute.utils.ui.DialogException; public class MailDialog extends CustomJDialog { /** * */ private static final long serialVersionUID = 1L; protected StyledEditorKit.FontSizeAction FONT_SIZE_ACTIONS[]; protected int FONT_SIZES[]; protected JFrame owner; protected JTextField toText; protected JTextField bccText; protected JTextField subjectText; protected BaseTable attachmentsTable; protected VectorTableModel attachmentsModel; protected JTextPane bodyPane; protected Action removeAttachmentAction; public static void main( String args[] ) throws Exception { MailDialog mailDialog = new MailDialog( null ); mailDialog.setTo( "fredPalma@netcabo.pt" ); mailDialog.setBcc( "fpalma@evolute.pt" ); mailDialog.setSubject( "SIPRP - Marca\u00E7\u00E3o de consulta de 'Frederico Palma'" ); mailDialog.setMessage( "

" + "Vimos pelo presente informar que 'Frederico Palma' deverá comparecer " + "nas nossas instalações para a realização da consulta de Medicina " + "do Trabalho, no dia '10-01-2008', pelas 08H30. " + "

" + "

" + "Solicitamos, também, que o colaborador seja portador do Boletim de Vacinas e " + "dos últimos exames complementares realizados." + "

" + "

" + "Caso não seja possível a comparência deste colaborador na data " + "indicada, contacte-nos, por favor, através do telefone 21 350 45 40 " + "ou respondendo ao remetente desta mensagem." + "

" + "

" + "Cumprimentos," + "

" + "

" + "SIPRP" // color=\"#497895\" + "

" + "

" + "ATRIUM SALDANHA" + "

" + "

" + "Praça Duque de Saldanha, 1 - 9ºG" + "

" + "

" + "1050-094 Lisboa" + "

" ); mailDialog.setSize( 1024, 768 ); mailDialog.setVisible( true ); System.exit( 0 ); } public MailDialog( JFrame owner ) throws Exception { super( owner, true ); this.owner = owner; setupComponents(); if( owner != null ) { centerSuper(); } else { center(); } } private void setupComponents() throws Exception { setLayout( new BorderLayout() ); JPanel headerPanel = new JPanel(); setupHeaderComponents( headerPanel ); add( headerPanel, BorderLayout.NORTH ); JPanel htmlPanel = new JPanel(); setupHTMLComponents( htmlPanel ); add( htmlPanel, BorderLayout.CENTER ); } private void setupHeaderComponents( JPanel headerPanel ) throws Exception { Action sendAction = new AbstractAction( "send" ){ /** * */ private static final long serialVersionUID = 1L; public void actionPerformed( ActionEvent e ) { send(); } }; sendAction.putValue( Action.SHORT_DESCRIPTION, "Enviar" ); JButton sendButton = createButton( sendAction, "siprp/medicina/processo/mail/icons/mail2.png" ); Action attachAction = new AbstractAction( "attach" ){ /** * */ private static final long serialVersionUID = 1L; public void actionPerformed( ActionEvent e ) { FileDialog fd = new FileDialog( owner, "Escolha um ficheiro", FileDialog.LOAD ); fd.setDirectory( System.getProperty( "user.home" ) ); fd.setVisible( true ); //String filename = "c:\\test.xls"; String filename = fd.getFile(); if( filename != null ) { String dir = fd.getDirectory(); String full = filename + " (" + dir + ")"; Vector values = attachmentsModel.getValues(); values.add( full ); attachmentsModel.setValues( values ); } } }; attachAction.putValue( Action.SHORT_DESCRIPTION, "Acrescentar anexo" ); JButton attachButton = createButton( attachAction, "siprp/medicina/processo/mail/icons/mail_attachment.png" ); removeAttachmentAction = new AbstractAction( "remove-attachment" ){ /** * */ private static final long serialVersionUID = 1L; public void actionPerformed( ActionEvent e ) { int selected = attachmentsTable.getSelectedRow(); if( selected > -1 && selected < attachmentsTable.getRowCount() ) { attachmentsModel.removeRowAt( selected ); } } }; removeAttachmentAction.putValue( Action.SHORT_DESCRIPTION, "Remover anexo" ); JButton removeAttachmentButton = createButton( removeAttachmentAction, "siprp/medicina/processo/mail/icons/delete2.png" ); removeAttachmentAction.setEnabled( false ); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout( new GridLayout( 1, 2 ) ); JPanel leftButtonPanel = new JPanel(); buttonPanel.add( leftButtonPanel ); JPanel rightButtonPanel = new JPanel(); buttonPanel.add( rightButtonPanel ); leftButtonPanel.setLayout( new FlowLayout( FlowLayout.LEFT ) ); leftButtonPanel.add( sendButton ); rightButtonPanel.setLayout( new FlowLayout( FlowLayout.RIGHT ) ); rightButtonPanel.add( attachButton ); rightButtonPanel.add( removeAttachmentButton ); JLabel toLabel = new JLabel( "Para:" ); toText = new JTextField(); toText.setEditable( false ); JLabel bccLabel = new JLabel( "C\u00f3pia:" ); bccText = new JTextField(); bccText.setEditable( false ); JLabel assuntoLabel = new JLabel( "Assunto:" ); subjectText = new JTextField(); attachmentsModel = new VectorTableModel( new String[]{ "" } ); attachmentsTable = new BaseTable( attachmentsModel ); JScrollPane attachmentsScroll = new JScrollPane( attachmentsTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED ); attachmentsTable.getSelectionModel().addListSelectionListener( new ListSelectionListener(){ @Override public void valueChanged(ListSelectionEvent e) { removeAttachmentAction.setEnabled( attachmentsTable.getSelectedRow() != -1 ); } } ); TableLayout layout = new TableLayout( new double[]{ TableLayoutConstraints.MINIMUM, TableLayoutConstraints.FILL, TableLayoutConstraints.FILL }, new double[]{ TableLayoutConstraints.PREFERRED, TableLayoutConstraints.MINIMUM, TableLayoutConstraints.MINIMUM, TableLayoutConstraints.MINIMUM } ); layout.setHGap( 2 ); layout.setVGap( 2 ); headerPanel.setLayout( layout ); headerPanel.add( buttonPanel, new TableLayoutConstraints( 0, 0, 2, 0 ) ); headerPanel.add( toLabel, new TableLayoutConstraints( 0, 1 ) ); headerPanel.add( toText, new TableLayoutConstraints( 1, 1 ) ); headerPanel.add( attachmentsScroll, new TableLayoutConstraints( 2, 1, 2, 3 ) ); headerPanel.add( bccLabel, new TableLayoutConstraints( 0, 2 ) ); headerPanel.add( bccText, new TableLayoutConstraints( 1, 2 ) ); headerPanel.add( assuntoLabel, new TableLayoutConstraints( 0, 3 ) ); headerPanel.add( subjectText, new TableLayoutConstraints( 1, 3 ) ); } private void setupHTMLComponents( JPanel htmlPanel ) throws Exception { HTMLEditorKit kit = new HTMLEditorKit(); Action actions[] = kit.getActions(); Vector fontSizeActions = new Vector(); for( int n = 0; n < actions.length; n++ ) { String str = actions[ n ].getValue( Action.NAME ).toString(); if( str.toLowerCase().indexOf( "font-size" ) != -1 ) { int size = Integer.parseInt( str.split( "-" )[ 2 ] ); if( size == 16 ) { continue; } fontSizeActions.add( ( StyledEditorKit.FontSizeAction ) actions[ n ] ); } } FONT_SIZE_ACTIONS = fontSizeActions.toArray( new StyledEditorKit.FontSizeAction[ fontSizeActions.size() ] ); Arrays.sort( FONT_SIZE_ACTIONS, new Comparator(){ public int compare( StyledEditorKit.FontSizeAction fsa1, StyledEditorKit.FontSizeAction fsa2 ) { String str1 = fsa1.getValue( Action.NAME ).toString(); String str2 = fsa2.getValue( Action.NAME ).toString(); int size1 = Integer.parseInt( str1.split( "-" )[ 2 ] ); int size2 = Integer.parseInt( str2.split( "-" )[ 2 ] ); return size1 > size2 ? 1 : -1; } } ); FONT_SIZES = new int[ FONT_SIZE_ACTIONS.length ]; for( int n = 0; n < FONT_SIZES.length; n++ ) { FONT_SIZES[ n ] = Integer.parseInt( FONT_SIZE_ACTIONS[ n ].getValue( Action.NAME ).toString().split( "-" )[ 2 ] ); } bodyPane = new JTextPane(); bodyPane.setEditorKit( kit ); ActionMap actionMap = bodyPane.getActionMap(); Action cutAction = actionMap.get( DefaultEditorKit.cutAction ); cutAction.putValue( Action.SHORT_DESCRIPTION, "Cortar" ); Action copyAction = actionMap.get( DefaultEditorKit.copyAction ); copyAction.putValue( Action.SHORT_DESCRIPTION, "Copiar" ); Action pasteAction = actionMap.get( DefaultEditorKit.pasteAction ); pasteAction.putValue( Action.SHORT_DESCRIPTION, "Colar" ); Action boldAction = actionMap.get( "font-bold" ); boldAction.putValue( Action.SHORT_DESCRIPTION, "Bold" ); Action italicAction = actionMap.get( "font-italic" ); italicAction.putValue( Action.SHORT_DESCRIPTION, "It\u00e1lico" ); Action underlineAction = actionMap.get( "font-underline" ); underlineAction.putValue( Action.SHORT_DESCRIPTION, "Sublinhado" ); Action fontBiggerAction = new StyledEditorKit.FontSizeAction( "font-bigger", 30 ){ /** * */ private static final long serialVersionUID = 1L; public void actionPerformed( ActionEvent e ) { int start = bodyPane.getSelectionStart(); AttributeSet set = bodyPane.getStyledDocument().getCharacterElement( start ).getAttributes(); int size = StyleConstants.getFontSize( set ); for( int n = 0; n < FONT_SIZES.length; n++ ) { if( size < FONT_SIZES[ n ] ) { FONT_SIZE_ACTIONS[ n ].actionPerformed( e ); break; } } bodyPane.requestFocusInWindow(); } }; fontBiggerAction.putValue( Action.SHORT_DESCRIPTION, "Fonte maior" ); Action fontSmallerAction = new StyledEditorKit.FontSizeAction( "font-smaller", 5 ){ /** * */ private static final long serialVersionUID = 1L; public void actionPerformed( ActionEvent e ) { int start = bodyPane.getSelectionStart(); AttributeSet set = bodyPane.getStyledDocument().getCharacterElement( start ).getAttributes(); int size = StyleConstants.getFontSize( set ); for( int n = FONT_SIZES.length - 1; n >= 0; n-- ) { if( size > FONT_SIZES[ n ] ) { FONT_SIZE_ACTIONS[ n ].actionPerformed( e ); break; } } bodyPane.requestFocusInWindow(); } }; fontSmallerAction.putValue( Action.SHORT_DESCRIPTION, "Fonte menor" ); Action colorAction = new StyledEditorKit.ForegroundAction( "color", Color.black ){ /** * */ private static final long serialVersionUID = 1L; public void actionPerformed( ActionEvent e ) { ColorChooserDialog dialog = new ColorChooserDialog( owner, Color.black ); dialog.setVisible( true ); Color color = dialog.getColor(); if( color != null ) { bodyPane.requestFocusInWindow(); Action colorTempAction = new StyledEditorKit.ForegroundAction( "color-temp", color ); bodyPane.getActionMap().put( "color-temp", colorTempAction ); colorTempAction.actionPerformed( e ); } bodyPane.requestFocusInWindow(); } }; colorAction.putValue( Action.SHORT_DESCRIPTION, "C\u00f4r" ); String fontFamilies[] = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); JComboBox fontCombo = new JComboBox(); for( int n = 0; n < fontFamilies.length; n++ ) { fontCombo.addItem( fontFamilies[ n ] ); } fontCombo.addItemListener( new ItemListener(){ @Override public void itemStateChanged(ItemEvent e) { String selected = ( String ) e.getItem(); Action fontFamilyAction = new StyledEditorKit.FontFamilyAction( "font-family-action" , selected ); bodyPane.getActionMap().put( "font-family-action", fontFamilyAction ); fontFamilyAction.actionPerformed( new ActionEvent( e.getSource(), e.getID(), "" ) ); bodyPane.requestFocusInWindow(); } } ); Action alignLeftAction = actionMap.get( "left-justify" ); alignLeftAction.putValue( Action.SHORT_DESCRIPTION, "Alinhado \u00e0 esquerda" ); Action alignCenterAction = actionMap.get( "center-justify" ); alignCenterAction.putValue( Action.SHORT_DESCRIPTION, "Centrado" ); Action alignRightAction = actionMap.get( "right-justify" ); alignRightAction.putValue( Action.SHORT_DESCRIPTION, "Alinhado \u00e0 direita" ); Action alignJustifyAction = new StyledEditorKit.AlignmentAction( "justify", javax.swing.text.StyleConstants.ALIGN_JUSTIFIED ); actionMap.put( "justify", alignJustifyAction ); alignJustifyAction.putValue( Action.SHORT_DESCRIPTION, "Justificado" ); JButton exportButton = new JButton( "X" ); exportButton.addActionListener( new ActionListener(){ public void actionPerformed( ActionEvent e ) { System.out.println( bodyPane.getText() ); } } ); JPanel upperPanel = new JPanel(); upperPanel.setLayout( new FlowLayout( FlowLayout.LEFT ) ); upperPanel.add( exportButton ); upperPanel.add( createButton( cutAction, "siprp/medicina/processo/mail/icons/cut.png" ) ); upperPanel.add( createButton( copyAction, "siprp/medicina/processo/mail/icons/copy.png" ) ); upperPanel.add( createButton( pasteAction, "siprp/medicina/processo/mail/icons/paste.png" ) ); upperPanel.add( new JLabel( " " ) ); upperPanel.add( createButton( boldAction, "siprp/medicina/processo/mail/icons/text_bold.png" ) ); upperPanel.add( createButton( italicAction, "siprp/medicina/processo/mail/icons/text_italics.png" ) ); upperPanel.add( createButton( underlineAction, "siprp/medicina/processo/mail/icons/text_underlined.png" ) ); upperPanel.add( createButton( fontBiggerAction, "siprp/medicina/processo/mail/icons/font_bigger.png" ) ); upperPanel.add( createButton( fontSmallerAction, "siprp/medicina/processo/mail/icons/font_smaller.png" ) ); upperPanel.add( createButton( colorAction, "siprp/medicina/processo/mail/icons/colorwheel.png" ) ); upperPanel.add( fontCombo ); upperPanel.add( new JLabel( " " ) ); upperPanel.add( createButton( alignLeftAction, "siprp/medicina/processo/mail/icons/text_align_left.png" ) ); upperPanel.add( createButton( alignCenterAction, "siprp/medicina/processo/mail/icons/text_align_center.png" ) ); upperPanel.add( createButton( alignRightAction, "siprp/medicina/processo/mail/icons/text_align_right.png" ) ); upperPanel.add( createButton( alignJustifyAction, "siprp/medicina/processo/mail/icons/text_align_justified.png" ) ); htmlPanel.setLayout( new BorderLayout() ); htmlPanel.add( upperPanel, BorderLayout.NORTH ); htmlPanel.add( new JScrollPane( bodyPane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER ), BorderLayout.CENTER ); } private JButton createButton( Action action, String iconPath ) throws Exception { action.putValue( Action.SMALL_ICON, ImageIconLoader.loadImageIcon( getClass(), iconPath ) ); JButton button = new JButton( action ); button.setText( null ); return button; } public void setTo( String to ) { toText.setText( to ); } public void setBcc( String bcc ) { bccText.setText( bcc ); } public void setSubject( String subject ) { subjectText.setText( subject ); } public void setMessage( String message ) { bodyPane.setText( message ); } public void send() { String to = toText.getText(); String bcc = bccText.getText(); String subject = subjectText.getText(); String body = bodyPane.getText(); String attachmentList[] = new String[ attachmentsTable.getRowCount() ]; byte attachments[][] = new byte[ attachmentsTable.getRowCount() ][]; Vector values = attachmentsModel.getValues(); for( int n = 0; n < attachmentList.length; n++ ) { String str = ( String ) values.elementAt( n ); String name = str.substring( 0, str.indexOf( "(") - 1 ); String path = str.substring( str.indexOf( "(") + 1, str.indexOf( ")") ); try { FileInputStream fis = new FileInputStream( path + name ); Vector bytes = new Vector(); int available = 0; int total = 0; while( ( available = fis.available() ) > 0 ) { byte b[] = new byte[ available ]; fis.read( b ); bytes.add( b ); total += available; } attachments[ n ] = new byte[ total ]; int pos = 0; for( byte[] chunk : bytes ) { System.arraycopy( chunk, 0, attachments[ n ], pos, chunk.length ); pos += chunk.length; } } catch( FileNotFoundException fnfex ) { JOptionPane.showMessageDialog( owner, "O ficheiro " + path + name + " n\u00e3o existe.", "Ficheiro inexistente", JOptionPane.ERROR_MESSAGE ); return; } catch( IOException ioex ) { DialogException.showExceptionMessage( ioex, "Erro a ler ficheiro " + path + name, true ); return; } } MailSender sender = new MailSender(); try { sender.send( to, bcc, subject, body, attachmentList, attachments ); } catch( Exception ex ) { ex.printStackTrace(); } } }