/* ** $Id: MessagePanel.java,v 1.9 2001/05/07 12:37:22 kunugi Exp $ ** ** Copyright (c) 2000-2001 Jeff Gay ** on behalf of ICEMail.org ** Copyright (c) 1998-2000 by Timothy Gerard Endres ** ** This program is free software. ** ** You may redistribute it and/or modify it under the terms of the GNU ** General Public License as published by the Free Software Foundation. ** Version 2 of the license should be included with this distribution in ** the file LICENSE, as well as License.html. If the license is not ** included with this distribution, you may find a copy at the FSF web ** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the ** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. ** ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR ** REDISTRIBUTION OF THIS SOFTWARE. */ package org.icemail.mail; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FileDialog; import java.awt.Frame; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.io.FileOutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; import java.util.Vector; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.JViewport; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import org.icemail.Package; import org.icemail.util.AWTUtilities; import org.icemail.util.ComponentFactory; import org.icemail.util.UserProperties; /** * Class MessagePanel */ public class MessagePanel extends JPanel implements ActionDistributor { static private final int Debug_ = Package.DEBUG ? Package.getLevel( "MessagePanel" ) : 0; static private Color NewMsgColor_ = Color.red; static private Color OldMsgColor_ = Color.black; /** * This is the index of the currently displayed message. * This prevents us from re-displaying the current message * which wastes bandwidth. */ private int currentIndex_ = -1; private QuickViewer viewer_ = new QuickViewer(); private JTable messageTable_ = null; private JScrollPane msgScroller = null; private JScrollPane tblScroller = null; private StatusBar statusBar_; private JSplitPane splitPane = null; private FolderTableModel model_ = null; private Folder folder_ = null; private String[] colFields_; private int[] colWidths_; private IActionListener listener_ = new IActionListener(); public MessagePanel( StatusBar statusbar ) { super(); statusBar_ = statusbar; loadTableColumns(); establishContents(); } public void loadLayoutProperties() { int loc = Configuration.getDividerLocation( Configuration.P_MSG_PANEL_DIVIDER, 75 ); this.splitPane.setDividerLocation( loc ); viewer_.loadLayoutProperties(); } public void saveLayoutProperties() { saveTableColumns(); Configuration.saveDividerLocation( Configuration.P_MSG_PANEL_DIVIDER, this.splitPane.getDividerLocation() ); viewer_.saveLayoutProperties(); } public Action getSignedAction() { return viewer_.getSignedAction(); } public Action getEnvelopedAction() { return viewer_.getEnvelopedAction(); } public void setFolder( Folder folder ) { if ( folder_ == folder ) { return; } try { // close the previous folder if necessary if ( folder_ != null ) { MailUtilities.setStoreConnected( folder_.getStore() ); synchronized ( folder_ ) { if ( folder_.isOpen() ) { folder_.close( false ); } } } folder_ = folder; currentIndex_ = -1; if ( folder_ == null ) { model_.setFolder( folder_ ); viewer_.setMessage( null ); messageTable_.getSelectionModel().clearSelection(); statusBar_.showStatusMessage( "" ); statusBar_.setCurrentMessageNum( 0 ); statusBar_.setNumFolderMessages( 0 ); statusBar_.setCurrentFolderName( "" ); } else { MailUtilities.setFolderOpenAndReady( folder_, Folder.READ_WRITE ); model_.setFolder( folder_ ); messageTable_.getSelectionModel().clearSelection(); viewer_.setMessage( null ); Object[] xargs = new Object[1]; xargs[0] = folder_.getName(); statusBar_.showStatusMessage( ICEMail.getBundle().getFormatString( "MessagePanel.FolderOpen", xargs ) ); statusBar_.setCurrentMessageNum( 1 ); statusBar_.setNumFolderMessages( folder_.getMessageCount() ); statusBar_.setCurrentFolderName( folder_.getName() ); showTableRow( 0 ); if ( messageTable_.getRowCount() > 0 ) { messageTable_.setRowSelectionInterval( 0, 0 ); } } } catch ( MessagingException ex ) { folder_ = null; //ex.printStackTrace( System.err ); //statusBar_.showStatusMessage // ( "Error opening folder '" + folder_.getName() + "', " // + ex.getMessage() ); Object[] xargs = new Object[2]; xargs[0] = folder_.getName(); xargs[1] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.OpenError", 0, JOptionPane.ERROR_MESSAGE, xargs ); } } /** * Distribute events from other sources to action listeners and distributors. *

* Implements ActionDistributor.distribute() * * @param event the event to distribute */ public void distribute( ActionEvent event ) { if ( Package.DEBUG && Package.isTraceable( "MessagePanel" ) ) { System.out.println( "MessagePanel.distribute(ae): " + event ); } listener_.actionPerformed( event ); } //............................................................ private void expungeDeletedMessages() { if ( folder_ == null ) return; Object[] xargs = new Object[1]; xargs[0] = folder_.getName(); String msg = ICEMail.getBundle().getFormatString( "MessagePanel.Expunging", xargs ); String title = ICEMail.getBundle().getString( "MessagePanel.Expunging.title" ); DialogRunner runner = new DialogRunner( new IExpungeRunner( folder_ ), (Frame)getTopLevelAncestor(), title, msg ); runner.start(); } private void showTableRow( int row ) { Dimension sz = messageTable_.getSize(); Dimension is = messageTable_.getIntercellSpacing(); JViewport port = (JViewport) messageTable_.getParent(); Rectangle portRect = port.getViewRect(); int height = messageTable_.getScrollableUnitIncrement( portRect, SwingConstants.VERTICAL, 1 ); int top = height * row; Rectangle aRect = new Rectangle( 0, top, sz.width, height ); messageTable_.scrollRectToVisible( aRect ); } private void deleteSelectedMessages() { if ( folder_ == null ) return; synchronized( model_ ) { MainFrame.getInstance().setWaitCursor(); ListSelectionModel selModel = messageTable_.getSelectionModel(); int iMin = selModel.getMinSelectionIndex(); int iMax = selModel.getMaxSelectionIndex(); int[] rows = messageTable_.getSelectedRows(); if ( rows.length < 1 ) return; Message[] msgs = new Message[ rows.length ]; for ( int idx = 0 ; idx < rows.length ; ++idx ) { msgs[ idx ] = model_.getMessage( rows[ idx ] ); } try { MailUtilities.setFolderOpenAndReady( folder_, Folder.READ_WRITE ); for ( int fi = 0 ; fi < msgs.length ; ++fi ) { msgs[fi].setFlag( Flags.Flag.DELETED, ! msgs[fi].isSet( Flags.Flag.DELETED ) ); } model_.flushCache( rows ); model_.fireRowsUpdated( rows ); } catch ( MessagingException ex ) { Object[] xargs = new Object[1]; xargs[0] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.MarkingError", 0, JOptionPane.ERROR_MESSAGE, xargs ); } MainFrame.getInstance().resetCursor(); if ( rows.length == 1 ) { int newSelRow = rows[0] + 1; int numRows = messageTable_.getRowCount(); if ( newSelRow >= numRows ) newSelRow = numRows - 1; messageTable_.setRowSelectionInterval( newSelRow, newSelRow ); showTableRow( newSelRow ); } } } private void moveSelectedMessage( int incr ) { if ( incr == 0 ) return; synchronized( model_ ) { MainFrame.getInstance().setWaitCursor(); ListSelectionModel selModel = messageTable_.getSelectionModel(); int[] rows = null; int newSelRow = -1; int numRows = messageTable_.getRowCount(); if ( numRows == 0 ) { newSelRow = -1; } else if ( numRows == 1 ) { newSelRow = 0; } else { rows = messageTable_.getSelectedRows(); if ( rows.length < 1 ) { newSelRow = 0; } else if ( incr < 0 ) { newSelRow = rows[0] + incr; } else { newSelRow = rows[ rows.length-1 ] + incr; } if ( newSelRow >= numRows ) { newSelRow = numRows - 1; } else if ( newSelRow < 0 ) { newSelRow = 0; } } MainFrame.getInstance().resetCursor(); if ( newSelRow != -1 ) { messageTable_.setRowSelectionInterval( newSelRow, newSelRow ); showTableRow( newSelRow ); } } } private int[] getSelectedRows() { int[] rows = messageTable_.getSelectedRows(); return rows; } private Message[] getSelectedMessages() { int[] rows = getSelectedRows(); if ( rows.length < 1 ) return new Message[0]; Message[] msgs = new Message[ rows.length ]; for ( int idx = 0 ; idx < rows.length ; ++idx ) { msgs[ idx ] = model_.getMessage( rows[ idx ] ); } return msgs; } // used by FolderTreePanel.java public void copySelectedMessages( Folder destFolder, boolean deleteMsgs ) { boolean closeDest = false; if ( folder_ == null || destFolder == null ) return; synchronized( model_ ) { MainFrame.getInstance().setWaitCursor(); Message[] msgs = getSelectedMessages(); if ( msgs.length < 1 ) return; Object[] xargs = new Object[1]; xargs[0] = destFolder.getName(); if ( deleteMsgs ) { statusBar_.showStatusMessage( ICEMail.getBundle().getFormatString( "MessagePanel.Moving", xargs ) ); } else { statusBar_.showStatusMessage( ICEMail.getBundle().getFormatString ( "MessagePanel.Copying", xargs ) ); } try { MailUtilities.setFolderOpenAndReady( folder_, Folder.READ_WRITE ); folder_.copyMessages( msgs, destFolder ); } catch ( MessagingException ex ) { xargs[0] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.CopyingError", 0, JOptionPane.ERROR_MESSAGE, xargs ); deleteMsgs = false; } MainFrame.getInstance().resetCursor(); try { if ( deleteMsgs ) { folder_.setFlags( msgs, new Flags(Flags.Flag.DELETED), true ); int[] rows = getSelectedRows(); model_.flushCache( rows ); model_.fireRowsUpdated( rows ); if ( rows.length == 1 ) { int newSelRow = rows[0] + 1; int numRows = messageTable_.getRowCount(); if ( newSelRow >= numRows ) newSelRow = numRows - 1; messageTable_.setRowSelectionInterval( newSelRow, newSelRow ); showTableRow( newSelRow ); } } } catch ( MessagingException ex ) { xargs[0] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.MarkingError", 0, JOptionPane.ERROR_MESSAGE, xargs ); } xargs[0] = destFolder.getName(); if ( deleteMsgs ) { statusBar_.showStatusMessage( ICEMail.getBundle().getFormatString ( "MessagePanel.Moved", xargs ) ); } else { statusBar_.showStatusMessage( ICEMail.getBundle().getFormatString ( "MessagePanel.Copied", xargs ) ); } } } private void printSelectedMessages() { if ( folder_ == null ) return; MainFrame.getInstance().setWaitCursor(); Message[] msgs = getSelectedMessages(); if ( msgs.length < 1 ) { return; } PrintMessageThread pThread = new PrintMessageThread( (Frame)getTopLevelAncestor(), msgs ); pThread.start(); MainFrame.getInstance().resetCursor(); } private void dumpSelectedMessages() { if ( folder_ == null ) return; MainFrame.getInstance().setWaitCursor(); Message[] msgs = getSelectedMessages(); if ( msgs.length < 1 ) return; MainFrame.getInstance().resetCursor(); int skipCount = 0; for ( int i = 0 ; i < msgs.length ; ++i ) { String title = ICEMail.getBundle().getString( "MessagePanel.Exporting.title" ); FileDialog dlg = new FileDialog( (Frame)getTopLevelAncestor(), title, FileDialog.SAVE ); dlg.show(); String filename = dlg.getFile(); String dirname = dlg.getDirectory(); if ( filename == null || dirname == null ) { break; } try { Message msg = msgs[i]; if ( msg instanceof MimeMessage ) { MimeMessage mimeMsg = (MimeMessage) msg; FileOutputStream out = new FileOutputStream( dirname + ( dirname.endsWith(File.separator) ? "" : File.separator ) + filename ); mimeMsg.writeTo( out ); out.close(); } else { ++skipCount; } } catch ( Exception ex ) { Object[] xargs = new Object[1]; xargs[0] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.ExportError", 0, JOptionPane.ERROR_MESSAGE, xargs ); } } if ( skipCount > 0 ) { Object[] xargs = new Object[1]; xargs[0] = String.valueOf( skipCount ); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.SkippedMsg", 0, JOptionPane.INFORMATION_MESSAGE, xargs ); } } private void showMessageProperties() { if ( folder_ == null ) return; MainFrame.getInstance().setWaitCursor(); Message[] msgs = getSelectedMessages(); if ( msgs.length < 1 ) return; MainFrame.getInstance().resetCursor(); try { JDialog dlg = new PropertiesDialog( null, msgs[0], true ); dlg.show(); } catch ( Exception ex ) { Object[] xargs = new Object[1]; xargs[0] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.PropError", 0, JOptionPane.ERROR_MESSAGE, xargs ); } } private void establishContents() { // create our folder model model_ = new FolderTableModel( colFields_ ); // TableSorter sorter = new TableSorter( model_ ); // setup our container and components setLayout( new BorderLayout() ); messageTable_ = new JTable( model_ ); JTableHeader tblHdr = messageTable_.getTableHeader(); tblHdr.addMouseListener( new IMouseAdapter() ); configureMessageTable( messageTable_ ); // find out what is pressed messageTable_.getSelectionModel().addListSelectionListener( new IListSelectionListener() ); messageTable_.setDefaultRenderer( Date.class, new ITableCellRenderer() ); messageTable_.setDefaultRenderer( String.class, new ITableCellRenderer() ); messageTable_.setDefaultRenderer( JLabel.class, new ITableCellRenderer() ); this.tblScroller = new JScrollPane( messageTable_ ); this.tblScroller.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED ); this.tblScroller.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED ); this.tblScroller.setMinimumSize( new Dimension(50, 50) ); this.tblScroller.setPreferredSize( new Dimension(600, 125) ); this.splitPane = new JSplitPane( JSplitPane.VERTICAL_SPLIT, this.tblScroller, viewer_ ); this.splitPane.setContinuousLayout( true ); this.splitPane.setDividerSize( 3 ); add( this.splitPane, BorderLayout.CENTER ); } private void configureMessageTable( JTable table ) { String resizePolicy = UserProperties.getProperty( "msgTbl.resizePolicy", "OFF" ); if ( resizePolicy.equalsIgnoreCase( "OFF" ) ) { table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); } else if ( resizePolicy.equalsIgnoreCase( "ALL" ) ) { table.setAutoResizeMode( JTable.AUTO_RESIZE_ALL_COLUMNS ); } else if ( resizePolicy.equalsIgnoreCase( "LAST" ) ) { table.setAutoResizeMode( JTable.AUTO_RESIZE_LAST_COLUMN ); } boolean showGrid = UserProperties.getProperty( "msgTbl.showGrid", false ); table.setShowGrid( showGrid ); boolean showHGrid = UserProperties.getProperty( "msgTbl.showHorizGrid", false ); table.setShowHorizontalLines( showHGrid ); boolean showVGrid = UserProperties.getProperty( "msgTbl.showVertGrid", false ); table.setShowVerticalLines( showVGrid ); table.setColumnSelectionAllowed( false ); table.setRowSelectionAllowed( true ); Enumeration xenum = table.getColumnModel().getColumns(); int xindex = 0; while ( xenum.hasMoreElements() ) { TableColumn tblColumn = (TableColumn)xenum.nextElement(); tblColumn.setMinWidth(5); tblColumn.setMaxWidth(2048); tblColumn.setPreferredWidth( colWidths_[xindex] ); tblColumn.setIdentifier( colFields_[xindex] ); xindex++; } } private void loadTableColumns() { Vector fields = new Vector(); for ( int i = 1 ; ; ++i ) { String field = UserProperties.getProperty( "msgTbl.column." + i, null ); if ( field == null ) break; fields.addElement( field ); } colFields_ = new String[ fields.size() ]; colWidths_ = new int[ fields.size() ]; for ( int i = 0, c = 1 ; i < fields.size() ; ++i, ++c ) { colFields_[i] = (String) fields.elementAt(i); colWidths_[i] = UserProperties.getProperty( "msgTbl.column." + c + ".width", 50 ); } } private void saveTableColumns() { Configuration config = Configuration.getInstance(); Enumeration xenum = messageTable_.getColumnModel().getColumns(); int xindex = 1; while ( xenum.hasMoreElements() ) { TableColumn xcolumn = (TableColumn)xenum.nextElement(); // save column fields config.setProperty( "msgTbl.column." + xindex, xcolumn.getIdentifier().toString() ); // save column widths config.setProperty( "msgTbl.column." + xindex + ".width", xcolumn.getWidth() ); xindex++; } } /** * Get new mail for the selected folder. */ private void getNewMail() { if ( folder_ != null ) { MainFrame.getInstance().setWaitCursor(); MailEventThread.getInstance().notifyIncomingMail( folder_, false ); Object[] xargs = new Object[1]; xargs[0] = folder_.getName(); String msg = ICEMail.getBundle().getFormatString( "MessagePanel.Retrieving", xargs ); DialogRunner runner = new DialogRunner( new INewMailRunner(), (Frame)getTopLevelAncestor(), ICEMail.getBundle().getString( "MessagePanel.Retrieving.title" ), msg ); runner.start(); MainFrame.getInstance().resetCursor(); } } private void composeMessage( String command ) { MainFrame.getInstance().setWaitCursor(); ListSelectionModel lm = messageTable_.getSelectionModel(); int idx = lm.getMaxSelectionIndex(); if ( command.startsWith( "COMPOSE" ) || ( idx != -1 && idx < messageTable_.getRowCount() && messageTable_.isRowSelected( idx ) ) ) { int xstate = ComposeFrame.CREATING; if ( command.startsWith( "REPLY" ) ) { if ( command.endsWith( "ALL" ) ) { xstate = ComposeFrame.REPLYINGTOALL; } else { xstate = ComposeFrame.REPLYING; } } else if ( command.startsWith( "FORWARD" ) ) { xstate = ComposeFrame.FORWARDING; } else if ( command.startsWith( "EDIT" ) ) { xstate = ComposeFrame.EDITING; } Message msg = ( (xstate == ComposeFrame.CREATING) ? null : model_.getMessage( idx ) ); String xselection = viewer_.getTextSelection(); if ( xselection != null && xselection.length() == 0 ) { xselection = null; } ComposeFrame xcomposeframe = ComposeMgr.getInstance().getComposeFrame(); xcomposeframe.editMessage( xstate, msg, xselection ); } MainFrame.getInstance().resetCursor(); } //............................................................ private class IActionListener implements ActionListener { /** * Invoked when an action occurs. *

* Implementation of java.awt.event.ActionListener.actionPerformed() * * @param event the action event that occured */ public void actionPerformed( ActionEvent event ) { String command = event.getActionCommand(); if ( command.equals( "CUT" ) || command.equals( "COPY" ) || command.equals( "PASTE" ) || command.equals( "UNDO" ) ) { viewer_.distribute( event ); } else if ( command.equals( "EXPUNGE" ) ) { expungeDeletedMessages(); } else if ( command.equals( "DELETEMSG" ) ) { deleteSelectedMessages(); } else if ( command.equals( "NEXTHTML" ) || command.equals( "PREVHTML" ) || command.equals( "STOPHTML" ) ) { viewer_.distribute( event ); } else if ( command.equals( "GETNEWMAIL" ) ) { getNewMail(); } else if ( command.equals( "NEXTMSG" ) ) { moveSelectedMessage( 1 ); } else if ( command.equals( "PREVMSG" ) ) { moveSelectedMessage( -1 ); } else if ( command.equals( "PRINTMSG" ) ) { printSelectedMessages(); } else if ( command.equals( "BROWSESEL" ) ) { String selStr = viewer_.getTextSelection(); if ( selStr != null && selStr.length() > 0 ) { HotJavaMailBrowser.setBrowserDocumentString( selStr ); } } else if ( command.startsWith( "REPLY" ) || command.startsWith( "FORWARD" ) || command.startsWith( "COMPOSE" ) || command.startsWith( "EDIT" ) ) { composeMessage( command ); } else if ( command.equals( "PROPS" ) ) { showMessageProperties(); } else if ( command.equals( "DUMPTOFILE" ) ) { dumpSelectedMessages(); } else if ( command.equals( "TOGGLEHDRS" ) ) { JCheckBoxMenuItem xmenuitem = (JCheckBoxMenuItem)event.getSource(); viewer_.setFullHeaders( xmenuitem.getState() ); } else if ( command.equals( "TOGGLESMIME" ) ) { JCheckBoxMenuItem xmenuitem = (JCheckBoxMenuItem)event.getSource(); viewer_.setParseSMimeMessages( xmenuitem.getState() ); } else { // distribute to the sub-panels } } } //............................................................ private class ITableCellRenderer extends DefaultTableCellRenderer { private DateFormat dateFmt; public ITableCellRenderer() { super(); if ( Package.DEBUG && Package.isTraceable( "MessagePanel" ) ) { System.err.println( "MessagePanel.ITableCellRenderer()" ); } dateFmt = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.MEDIUM, ICEMail.getLocale() ); // String dateFmtProp = // UserProperties.getProperty // ( "folder.dateFormat", // "E yyMMdd hh:mm:ss a" ); // // this.dateFmt = // new SimpleDateFormat( dateFmtProp, ICEMail.getLocale() ); // // this.dateFmt.setTimeZone( TimeZone.getDefault() ); } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) { Component result = super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column ); Flags f = model_.getMessageFlags( row ); if ( f.contains( Flags.Flag.SEEN ) ) { setForeground( MessagePanel.OldMsgColor_ ); } else { setForeground( MessagePanel.NewMsgColor_ ); } if ( value instanceof Date ) { String dateStr = this.dateFmt.format( (Date) value ); setText( dateStr ); setIcon( null ); } else if ( value instanceof String ) { setText( (String)value ); setIcon( null ); } else if ( value instanceof JLabel ) { setText( ((JLabel)value).getText() ); setIcon( ((JLabel)value).getIcon() ); } return this; } } //............................................................ private class IListSelectionListener implements ListSelectionListener { public void valueChanged( ListSelectionEvent event ) { if ( model_ != null && ! event.getValueIsAdjusting() ) { ListSelectionModel lm = (ListSelectionModel) event.getSource(); int idx = lm.getMinSelectionIndex(); if ( idx != -1 && idx < messageTable_.getRowCount() && messageTable_.isRowSelected( idx ) ) { if ( idx != currentIndex_ ) { MainFrame.getInstance().setWaitCursor(); statusBar_.setCurrentMessageNum( idx + 1 ); model_.setMessageSeen( idx ); Message msg = model_.getMessage( idx ); viewer_.setMessage( msg ); currentIndex_ = idx; MainFrame.getInstance().resetCursor(); } } } } } //............................................................ private class IExpungeRunner implements DialogRunnable { private Folder exFolder; public IExpungeRunner( Folder folder ) { this.exFolder = folder; } public void run( JDialog dialog, JProgressBar progress ) { dialog.show(); progress.setValue( 33 ); try { MailEventThread.getInstance().notifyIncomingMail( this.exFolder, false ); // close the folder, expunging deleted messages MailUtilities.setStoreConnected( exFolder.getStore() ); synchronized ( exFolder ) { if ( exFolder.isOpen() ) { exFolder.close( true ); } } progress.setValue( 66 ); folder_ = null; setFolder( exFolder ); progress.setValue( 95 ); System.gc(); progress.setValue( 100 ); } catch ( MessagingException ex ) { Object[] xargs = new Object[1]; xargs[0] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.ExpungeError", 0, JOptionPane.ERROR_MESSAGE, xargs ); } dialog.dispose(); } } //............................................................ private class INewMailRunner implements DialogRunnable { public INewMailRunner() { } public void run( JDialog dialog, JProgressBar progress ) { dialog.show(); progress.setValue( 25 ); try { MailUtilities.setFolderOpenAndReady( folder_, Folder.READ_WRITE ); if ( folder_.hasNewMessages() ) { Folder f = folder_; progress.setValue( 50 ); // close the folder MailUtilities.setStoreConnected( f.getStore() ); synchronized ( f ) { if ( f.isOpen() ) { f.close( false ); } } progress.setValue( 75 ); // reset and get the folder contents again folder_ = null; setFolder( f ); progress.setValue( 95 ); System.gc(); progress.setValue( 100 ); } else { progress.setValue( 100 ); int delay = UserProperties.getProperty( "retrieveDelayMillis", 500 ); try { Thread.currentThread().sleep( delay ); } catch ( InterruptedException ex ) { } } } catch ( MessagingException ex ) { Object[] xargs = new Object[1]; xargs[0] = ex.getMessage(); ComponentFactory.showDialog( ICEMail.getBundle(), "MessagePanel.RetrieveError", 0, JOptionPane.ERROR_MESSAGE, xargs ); } dialog.dispose(); } } //............................................................ private class IMouseAdapter extends MouseAdapter { int previousColumn_ = -1; boolean previousAscending_ = false; // UNDONE This needs to be 'invokeLater'-ed. public void mouseClicked( MouseEvent evt ) { if ( Package.DEBUG && Package.isTraceable( "MessagePanel" ) ) { System.err.println( "MessagePanel.mouseClicked(): " + evt ); } if ( evt.getClickCount() == 1 ) { boolean xascending = ( (evt.getModifiers() & InputEvent.SHIFT_MASK) == 0 ); TableColumnModel xmodel = messageTable_.getColumnModel(); int xindex = xmodel.getColumnIndexAtX( evt.getX() ); int xcolumn = messageTable_.convertColumnIndexToModel( xindex ); if ( xcolumn != -1 ) { if ( previousColumn_ == xcolumn ) { if ( Package.DEBUG && Debug_ > 0 ) { System.err.println( "MessagePanel.mouseClicked(): as-" + xascending + " pas-" + previousAscending_ ); } xascending = (previousAscending_) ? false : true; } messageTable_.getSelectionModel().clearSelection(); currentIndex_ = -1; Object[] xargs = { folder_.getName() }; String msg = ICEMail.getBundle().getFormatString( "MessagePanel.Sorting", xargs ); String title = ICEMail.getBundle().getString( "MessagePanel.Sorting.title" ); DialogRunner runner = new DialogRunner( new ISortMailRunner( xcolumn, xascending ), (Frame)getTopLevelAncestor(), title, msg ); runner.start(); previousAscending_ = xascending; previousColumn_ = xcolumn; } } } } //............................................................ private class ISortMailRunner implements DialogRunnable { private int sortColumn; private boolean sortAscend; public ISortMailRunner( int col, boolean asc ) { this.sortColumn = col; this.sortAscend = asc; } public void run( JDialog dialog, JProgressBar progress ) { dialog.show(); MainFrame.getInstance().setWaitCursor(); progress.setMaximum( 10 + (messageTable_.getRowCount() * 2) ); progress.setValue( 5 ); model_.cacheAllMessages( progress ); progress.setValue( progress.getValue() + 5 ); model_.sortOnColumn( progress, this.sortColumn, this.sortAscend ); System.gc(); progress.setValue( progress.getMaximum() ); viewer_.setMessage( null ); statusBar_.setCurrentMessageNum( 1 ); showTableRow( 0 ); if ( messageTable_.getRowCount() > 0 ) { messageTable_.setRowSelectionInterval( 0, 0 ); } MainFrame.getInstance().resetCursor(); dialog.dispose(); } } }