📄 messagepanel.java
字号:
/*** $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 <http://www.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. * <p> * 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; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -