From 6e338165601ecf07083fc8f85e502677faccbd2c Mon Sep 17 00:00:00 2001 From: Frederico Palma Date: Fri, 14 Dec 2007 18:14:01 +0000 Subject: [PATCH] git-svn-id: https://svn.coded.pt/svn/SIPRP@601 bb69d46d-e84e-40c8-a05a-06db0d633741 --- .../medicina/processo/mail/MailDialog.java | 537 ++++++++++++++++++ 1 file changed, 537 insertions(+) create mode 100644 trunk/SIPRPSoft/src/siprp/medicina/processo/mail/MailDialog.java diff --git a/trunk/SIPRPSoft/src/siprp/medicina/processo/mail/MailDialog.java b/trunk/SIPRPSoft/src/siprp/medicina/processo/mail/MailDialog.java new file mode 100644 index 00000000..a4c39267 --- /dev/null +++ b/trunk/SIPRPSoft/src/siprp/medicina/processo/mail/MailDialog.java @@ -0,0 +1,537 @@ +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(); + } + } +}