📄 foldertablemodel.java
字号:
if ( progress != null ) { progress.setValue( ++pVal ); } boolean insert = false; Message xmessage = messages_[ row ]; Object[] data = convData_[ row ]; for ( int di = 0 ; di < dV.size() ; ++di ) { Object[] d = (Object[]) dV.elementAt( di ); if ( colClass == javax.swing.ImageIcon.class ) { int v1 = getIconSortOrder( d[col] ); int v2 = getIconSortOrder( data[col] ); insert = asc ? ( v1 > v2 ) : ( v1 < v2 ); } else if ( colClass == java.lang.String.class ) { String s1 = (String) d[col]; String s2 = (String) data[col]; int comp = s1.compareTo( s2 ); insert = asc ? ( comp > 0 ) : ( comp < 0 ); } else if ( colClass == java.util.Date.class ) { Date d1 = (Date) d[col]; Date d2 = (Date) data[col]; if ( d1 != null && d2 != null ) { insert = asc ? ( d1.before( d2 ) ) : ( d2.before( d1 ) ); } } else if ( colClass == javax.swing.JLabel.class ) { String s1 = ((JLabel) d[col]).getText(); String s2 = ((JLabel) data[col]).getText(); int comp = s1.compareTo( s2 ); insert = asc ? ( comp > 0 ) : ( comp < 0 ); } if ( insert ) { dV.insertElementAt( data, di ); mV.insertElementAt( xmessage, di ); break; } } if ( ! insert ) { dV.addElement( data ); mV.addElement( xmessage ); } } dV.copyInto( convData_ ); mV.copyInto( messages_ ); dV.removeAllElements(); mV.removeAllElements(); fireTableRowsUpdated( 0, messages_.length - 1 ); } private int getIconSortOrder( Object object ) { if ( object == FolderTableModel.delMarkOnIcon ) return 4; if ( object == FolderTableModel.highMarkIcon ) return 3; if ( object == FolderTableModel.delMarkOffIcon ) return 2; // also normal priority if ( object == FolderTableModel.lowMarkIcon ) return 1; return 0; }//............................................................// Implementation of AbstractTableModel /** * <p> * Implementation of java.swing.table.AbstractTableModel.getColumnName() */ public String getColumnName( int column ) { return columnNames_[ column ]; } /** * <p> * Implementation of java.swing.table.AbstractTableModel.getColumnClass() */ public Class getColumnClass( int column ) { return columnTypes_[ column ]; } /** * <p> * Implementation of java.swing.table.AbstractTableModel.getColumnCount() */ public int getColumnCount() { return columnFields_.length; } /** * <p> * Implementation of java.swing.table.AbstractTableModel.getRowCount() */ public int getRowCount() { if ( messages_ == null ) return 0; return messages_.length; } /** * <p> * Implementation of java.swing.table.AbstractTableModel.getValueAt() */ public Object getValueAt( int aRow, int aColumn ) { Object[] data = getConvertedData( aRow ); if ( data == null ) { return "(null data)"; } return data[ aColumn ]; }//............................................................ private Object[] getConvertedData( int row ) { int maxtries = 3; if ( messages_ == null || row > convData_.length ) { return null; } if ( convData_[ row ] == null ) { int tries = 0; for ( ; tries < maxtries ; ++tries ) { try { int numCols = columnFields_.length; if ( useFetchProfile_ ) checkProfiledFetch( row ); Message xmessage = messages_[ row ]; Object[] xrowData = new Object[ numCols + 1 ]; // Make sure the folder didn't get closed // by a timeout while we were not using it... MailUtilities.setFolderOpenAndReady( folder_, Folder.READ_WRITE ); xrowData[ numCols ] = xmessage.getFlags(); for ( int c = 0 ; c < numCols ; ++c ) { String fld = columnFields_[ c ]; if ( fld.equalsIgnoreCase( "FLAG" ) ) { if ( xmessage.isSet( Flags.Flag.DELETED ) ) { xrowData[c] = FolderTableModel.delMarkOnIcon; } else { xrowData[c] = FolderTableModel.delMarkOffIcon; // mark messages with high and low priority indicators if ( MessageUtilities.isHighPriority( xmessage ) ) { xrowData[c] = FolderTableModel.highMarkIcon; } else if ( MessageUtilities.isLowPriority( xmessage ) ) { xrowData[c] = FolderTableModel.lowMarkIcon; } } } else if ( fld.equalsIgnoreCase( "TO" ) ) { Address[] adds = xmessage.getRecipients( Message.RecipientType.TO ); if ( adds != null && adds.length > 0 ) { InternetAddress iAddr = (InternetAddress) adds[0]; String perStr = iAddr.getPersonal(); if ( perStr == null || perStr.length() == 0 ) xrowData[c] = iAddr.getAddress(); else xrowData[c] = perStr; if ( adds.length > 1 && adds[1] != null ) xrowData[c] = ((String)xrowData[c]) + "..."; } else { xrowData[c] = ""; } } else if ( fld.equalsIgnoreCase( "FROM" ) ) { // create a readable form of the from address String xfrom = null; Address[] adds = xmessage.getFrom(); if ( adds != null && adds.length > 0 ) { InternetAddress iAddr = (InternetAddress) adds[0]; String perStr = iAddr.getPersonal(); if ( perStr == null || perStr.length() == 0 ) xfrom = iAddr.getAddress(); else xfrom = perStr; if ( adds.length > 1 && adds[1] != null ) xfrom = xfrom + "..."; } else { xfrom = ""; } // select an icon based on the MIME message type ImageIcon xicon = null; ContentType xct = MessageUtilities.getContentType( xmessage ); if ( xct.match( "application/pkcs7-signature" ) || // new implementations xct.match( "application/x-pkcs7-signature" ) || // old implementations xct.match( "multipart/signed" ) ) { // internet standard // signed by some means xicon = signedMarkIcon; } else if ( xct.match( "application/pkcs7-mime" ) || // new implementations xct.match( "application/x-pkcs7-mime" ) || // old implementations xct.match( "multipart/encrypted" ) ) { // internet standard // encrypted or enveloped by some means xicon = encryptMarkIcon; } else if ( xct.match( "multipart/mixed" ) ) { // attachments of some type xicon = attachMarkIcon; } xrowData[c] = new JLabel( xfrom, xicon, SwingConstants.LEFT ); } else if ( fld.equalsIgnoreCase( "SENTDATE" ) ) { xrowData[c] = xmessage.getSentDate(); } else if ( fld.equalsIgnoreCase( "RECVDATE" ) ) { xrowData[c] = xmessage.getReceivedDate(); } else if ( fld.equalsIgnoreCase( "SUBJECT" ) ) { String subject = xmessage.getSubject(); if ( subject != null ) { xrowData[c] = subject; } else { xrowData[c] = "(No Subject)"; } } else { System.err.println( "UNKNOWN FIELD TYPE '" + fld + "' in column " + c + " of MsgTable." ); break; } } convData_[ row ] = xrowData; break; } catch ( FolderClosedException ex ) { if ( tries >= (maxtries - 1) ) { System.err.println( "FOLDER CLOSED!" ); // ex.printStackTrace(); } else { try { MailUtilities.setFolderOpenAndReady( folder_, Folder.READ_WRITE ); try { Thread.currentThread().sleep( 500 ); } catch ( InterruptedException ex3 ) { } } catch ( MessagingException ex2 ) { ex2.printStackTrace(); break; } } } catch ( MessagingException ex ) { ex.printStackTrace(); } } if ( tries >= maxtries ) { (new Throwable( "MAX TRIES row=" + row )).printStackTrace(); } } return convData_[ row ]; } /** * @see getConvertedData() */ private void checkProfiledFetch( int row ) throws MessagingException { if ( row >= nextFetchRow_ ) { int newNext = row + fetchQuantum_; if ( newNext >= messages_.length ) newNext = messages_.length; int num = newNext - nextFetchRow_; Message[] fMsgs = new Message[ num ]; for ( int i = 0 ; i < num ; ++i ) { fMsgs[i] = messages_[ nextFetchRow_ + i]; } FetchProfile fp = new FetchProfile(); fp.add( FetchProfile.Item.ENVELOPE ); fp.add( FetchProfile.Item.FLAGS ); MailUtilities.setFolderOpenAndReady( folder_, Folder.READ_WRITE ); folder_.fetch( fMsgs, fp ); nextFetchRow_ = newNext; } }//............................................................ private class FTMCounterAdapter extends MessageCountAdapter { public FTMCounterAdapter() { super(); } public void messagesAdded( MessageCountEvent event ) { MailEventThread.getInstance().notifyIncomingMail( folder_, true ); } public void addNewMessages( Message[] addMsgs ) { synchronized ( FolderTableModel.this ) { Message[] oldMsgs = messages_; int oldLen = oldMsgs.length; int addLen = addMsgs.length; int newLen = oldLen + addLen; if ( Package.DEBUG && Debug_ > 0 ) { System.out.println( "FTMCounterAdapter.addNewMessages(): NewCount=" + addLen + " OldCount=" + oldLen + " NewLen=" + newLen ); } int m = 0; Message[] newMsgs = new Message[ newLen ]; for ( int a = 0 ; a < addLen ; ) { newMsgs[m++] = addMsgs[a++]; } for ( int o = 0 ; o < oldLen ; ) { newMsgs[m++] = oldMsgs[o++]; } messages_ = newMsgs; Object[][] newCache = new Object[ newLen ][]; int c = 0; for ( int a = 0 ; a < addLen ; ++a ) { newCache[c++] = null; } for ( int o = 0 ; o < oldLen ; ) { newCache[c++] = convData_[o++]; } convData_ = newCache; fireTableRowsInserted( 0, addLen - 1 ); //fireRowsInserted( 0, addLen - 1 ); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -