From: Frederik D. <fd...@us...> - 2004-04-22 08:02:10
|
Update of /cvsroot/columba/columba/src/mail/core/org/columba/mail/gui/table/model In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15796/src/mail/core/org/columba/mail/gui/table/model Modified Files: TableModelThreadedView.java Log Message: [intern]removed obsolete code, added documentation Index: TableModelThreadedView.java =================================================================== RCS file: /cvsroot/columba/columba/src/mail/core/org/columba/mail/gui/table/model/TableModelThreadedView.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** TableModelThreadedView.java 29 Feb 2004 20:09:25 -0000 1.8 --- TableModelThreadedView.java 22 Apr 2004 08:01:53 -0000 1.9 *************** *** 1,3 **** ! //The contents of this file are subject to the Mozilla Public License Version 1.1 //(the "License"); you may not use this file except in compliance with the //License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ --- 1,4 ---- ! // The contents of this file are subject to the Mozilla Public License Version ! // 1.1 //(the "License"); you may not use this file except in compliance with the //License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ *************** *** 10,14 **** //The Original Code is "The Columba Project" // ! //The Initial Developers of the Original Code are Frederik Dietz and Timo Stich. //Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003. // --- 11,16 ---- //The Original Code is "The Columba Project" // ! //The Initial Developers of the Original Code are Frederik Dietz and Timo ! // Stich. //Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003. // *************** *** 30,46 **** import java.util.logging.Logger; - /** ! * @author ! * @version 1.0 */ public class TableModelThreadedView extends TreeTableModelDecorator { /** JDK 1.4+ logging framework logger, used for logging. */ ! private static final Logger LOG = Logger.getLogger("org.columba.mail.gui.table.model"); private boolean enabled; private HashMap hashtable; private int idCount = 0; private Collator collator; --- 32,62 ---- import java.util.logging.Logger; /** ! * Threaded model using Message-Id:, In-Reply-To: and References: headers to ! * create a tree structure of discussions. ! * <p> ! * The algorithm works this way: ! * <ul> ! * <li>save every header in hashmap, use Message-Id: as key, MessageNode as ! * value</li> ! * <li>for each header, check if In-Reply-To:, or References: points to a ! * matching Message-Id:. If match was found, add header as child</li> ! * </ul> ! * <p> ! * ! * @author fdietz */ public class TableModelThreadedView extends TreeTableModelDecorator { /** JDK 1.4+ logging framework logger, used for logging. */ ! private static final Logger LOG = Logger ! .getLogger("org.columba.mail.gui.table.model"); private boolean enabled; + private HashMap hashtable; + private int idCount = 0; + private Collator collator; *************** *** 61,181 **** } ! protected String parseSubject(String subject) { ! if ((subject == null) || (subject.length() == 0)) { ! return ""; ! } ! ! int start = 0; ! int length = subject.length(); ! ! boolean done = false; ! ! try { ! while (!done) { ! done = true; ! ! if (start >= length) { ! return ""; ! } ! ! while (subject.charAt(start) <= ' ') { ! start++; ! } ! ! if ((start < (length - 2)) && ! ((subject.charAt(start) == 'r') || ! (subject.charAt(start) == 'R')) && ! ((subject.charAt(start + 1) == 'e') || ! (subject.charAt(start + 1) == 'E'))) { ! if (subject.charAt(start + 2) == ':') { ! // skip "Re:" ! start += 3; ! done = false; ! } else if ((start < (length - 2)) && ! ((subject.charAt(start + 2) == '[') || ! (subject.charAt(start + 2) == '('))) { ! int i = start + 3; ! ! // skip character in "[| ! while ((i < length) && (subject.charAt(i) >= ' ') && ! (subject.charAt(i) <= '9')) { ! i++; ! } ! ! if ((i < (length - 1)) && ! ((subject.charAt(i) == ']') || ! (subject.charAt(i) == ')')) && ! (subject.charAt(i + 1) == ':')) { ! // skip "]:" ! start = i + 2; ! done = false; ! } ! } ! } ! } ! ! int end = length; ! ! while ((end > start) && (subject.charAt(end - 1) < ' ')) { ! end--; ! } ! ! if ((start == 0) && (end == length)) { ! return subject; ! } else { ! return subject.substring(start, end); ! } ! } catch (StringIndexOutOfBoundsException e) { ! e.printStackTrace(); ! ! return subject; ! } ! } ! ! /* ! protected String parseSubject( String subject ) ! { ! String result = subject; ! ! if ( result == null ) return new String(""); ! ! if ( result.length() == 0 ) return result; ! ! ! while ( result.toLowerCase().indexOf("re:") != -1) ! { ! ! if ( result.toLowerCase().startsWith("re:") ) ! { ! // delete only the leading 3 char ! result = result.substring( 3, result.length() ); ! result = result.trim(); ! } ! else ! { ! // maybe there es a [nautilus] in front of the re: ! int index = result.toLowerCase().indexOf("re:"); ! result = result.substring( index+3, result.length() ); ! result = result.trim(); ! } ! ! } ! ! if ( result.startsWith("[") ) ! { ! if ( result.endsWith("]") ) return result; ! ! int index = result.indexOf("]"); ! result = result.substring( index+1, result.length() ); ! result = result.trim(); ! } ! ! - return result; - } - */ - protected String[] parseReferences(String references) { - //System.out.println("references: "+ references ); StringTokenizer tk = new StringTokenizer(references, ">"); String[] list = new String[tk.countTokens()]; --- 77,92 ---- } ! /** ! * Parse References: header value and save every found Message-Id: in array. ! * <p> ! * TODO: cleanup tokenizer, this could be much faster using regexp ! * ! * @param references ! * References: header value ! * ! * @return array containing Message-Id: header values ! */ ! public static String[] parseReferences(String references) { StringTokenizer tk = new StringTokenizer(references, ">"); String[] list = new String[tk.countTokens()]; *************** *** 188,192 **** list[i++] = str; - //System.out.println("reference: "+ str ); } --- 99,102 ---- *************** *** 203,213 **** if (hashtable.containsKey(inReply)) { ! //System.out.println("contains: "+ inReply ); MessageNode parent = (MessageNode) hashtable.get(inReply); parent.add(node); return true; - } else { - return false; } } else if (references != null) { --- 113,121 ---- if (hashtable.containsKey(inReply)) { ! MessageNode parent = (MessageNode) hashtable.get(inReply); parent.add(node); return true; } } else if (references != null) { *************** *** 218,237 **** if (count >= 1) { ! // create empty container ! MessageNode parent = null; ! parent = generateDummy(node, 0, referenceList, rootNode); ! if (parent != null) { parent.add(node); - return true; - } else { - return false; } - - //return true; } - } else { - return false; } --- 126,137 ---- if (count >= 1) { ! // the last element is the direct parent ! MessageNode parent = (MessageNode) hashtable ! .get(referenceList[referenceList.length - 1].trim()); if (parent != null) { parent.add(node); return true; } } } *************** *** 243,250 **** idCount = 0; ! if (rootNode == null) { ! return; } hashtable = new HashMap(); --- 143,177 ---- idCount = 0; ! if (rootNode == null) { return; } ! ! // save every MessageNode in hashmap for later reference ! createHashmap(rootNode); ! ! // for each element in the message-header-reference or in-reply-to ! // headerfield: - find a container whose message-id matches and add ! // message, otherwise create empty container ! for (int i = 0; i < rootNode.getChildCount(); i++) { ! MessageNode node = (MessageNode) rootNode.getChildAt(i); ! boolean result = add(node, rootNode); ! ! if (result) { ! i--; ! } ! } + // go through whole tree and sort the siblings after date + sort(rootNode); + } + + /** + * Save every MessageNode in HashMap for later reference. + * <p> + * Message-Id: is key, MessageNode is value + * + * @param rootNode + * root node + */ + private void createHashmap(MessageNode rootNode) { hashtable = new HashMap(); *************** *** 260,264 **** } ! //System.out.println("id: "+id); if (id == null) { id = new String("<bogus-id:" + (idCount++) + ">"); --- 187,191 ---- } ! // if no Message-Id: available create bogus if (id == null) { id = new String("<bogus-id:" + (idCount++) + ">"); *************** *** 270,392 **** hashtable.put(id, node); - /* - String subject = (String) header.get("Subject"); - //System.out.println("subject: "+ subject); - subject = parseSubject(subject); - node.setParsedSubject(subject); - */ - } - - /* for each element in the message-header-reference or in-reply-to headerfield: - - find a container whose message-id matches and add message - otherwise create empty container - */ - for (int i = 0; i < rootNode.getChildCount(); i++) { - MessageNode node = (MessageNode) rootNode.getChildAt(i); - boolean result = add(node, rootNode); - - if (result) { - i--; - } - } - - // group everything together which is in no group, because - // of missing in-reply-to or reference headerfield, or - // because of missing parent reference - // - // use parsed subject for grouping - /* - for ( int i=0; i<rootNode.getChildCount(); i++ ) - { - MessageNode node = (MessageNode) rootNode.getChildAt( i ); - String parsedSubject = node.getParsedSubject(); - - - // do not use vector - boolean alreadyDec = false; - - for ( int j=0; j<rootNode.getChildCount(); j++ ) - { - if ( j==i ) continue; - - MessageNode node2 = (MessageNode) rootNode.getChildAt( j ); - String subject2 = node2.getParsedSubject(); - String subject = (String) node2.getMessage().getHeader().get("Subject"); - - if ( parsedSubject.equals( subject2 ) ) - { - if ( subject.toLowerCase().indexOf("re:") == -1 ) - { - //node.insert( node2, node.getChildCount() ); - node2.add( node ); - if ( alreadyDec == false ) - { - i--; - alreadyDec = true; - } - } - } - } - - } - */ - // go through whole tree and sort the siblings after date - sort(rootNode); - } - - protected MessageNode generateDummy(MessageNode node, int i, - String[] referenceList, MessageNode rootNode) { - MessageNode parent = null; - - /* - MessageNode child = null; - for ( int index=i; index<referenceList.length; index++ ) - { - - if ( hashtable.containsKey( referenceList[index].trim() ) == true ) - { - //System.out.println("reference is in hashtable: "+index); - parent = (MessageNode) hashtable.get( referenceList[index].trim() ); - continue; - } - else - { - Message message = new Message(); - message.getHeader().set("Message-ID", referenceList[index].trim() ); - message.getHeader().set("Subject", node.getParsedSubject()+ " (message not available)" ); - child = new MessageNode( message, null ); - child.enableDummy(true); - hashtable.put( referenceList[index].trim(), child ); - - if ( parent != null ) - { - parent.add( child ); - } - else - { - int pos = rootNode.getIndex( node ); - rootNode.insert( child, pos ); - //rootNode.add( child ); - } - - parent = child; - } - } - */ - if (hashtable.containsKey( - referenceList[referenceList.length - 1].trim())) { - //System.out.println("reference is in hashtable: "+index); - parent = (MessageNode) hashtable.get(referenceList[referenceList.length - - 1].trim()); } - - return parent; } /** ! * * sort all children after date ! * ! * @param node root MessageNode */ protected void sort(MessageNode node) { --- 197,209 ---- hashtable.put(id, node); } } /** ! * * sort all children after date ! * ! * @param node ! * root MessageNode */ protected void sort(MessageNode node) { *************** *** 394,404 **** MessageNode child = (MessageNode) node.getChildAt(i); ! //if ( ( child.isLeaf() == false ) && ( !child.getParent().equals( node ) ) ) if (!child.isLeaf()) { // has children List v = child.getVector(); ! Collections.sort(v, ! new MessageHeaderComparator(getRealModel().getColumnNumber("Date"), ! true)); // check if there are messages marked as recent --- 211,221 ---- MessageNode child = (MessageNode) node.getChildAt(i); ! //if ( ( child.isLeaf() == false ) && ( !child.getParent().equals( ! // node ) ) ) if (!child.isLeaf()) { // has children List v = child.getVector(); ! Collections.sort(v, new MessageHeaderComparator(getRealModel() ! .getColumnNumber("Date"), true)); // check if there are messages marked as recent *************** *** 427,466 **** } - /* - public boolean manipulateModel(int mode) { - //System.out.println("threading enabled: "+ isEnabled() ); - - if (!isEnabled()) - return false; - - switch (mode) { - case TableModelPlugin.STRUCTURE_CHANGE : - { - - //System.out.println("starting to thread"); - - MessageNode rootNode = getHeaderTableModel().getRootNode(); - - //Vector v = new Vector(); - - thread(rootNode); - - //System.out.println("finished threading"); - - return true; - } - - case TableModelPlugin.NODES_INSERTED : - { - // FIXME - - return true; - } - - } - - return false; - } - */ public MessageNode addItem(MessageNode child) { MessageNode rootNode = getRealModel().getRootNode(); --- 244,247 ---- *************** *** 484,548 **** add(child, rootNode); - /* - // we did not find a parent, just group message with subject - String childSubject = (String) childHeader.get("Subject"); - childSubject = parseSubject( childSubject ); - child.setParsedSubject( childSubject ); - - // group everything together - for ( int i=0; i<rootNode.getChildCount(); i++ ) - { - MessageNode node = (MessageNode) rootNode.getChildAt( i ); - String subject = node.getParsedSubject(); - if ( subject == null ) - { - Message message = (Message) node.getUserObject(); - Rfc822Header header = message.getHeader(); - subject = (String) header.get("Subject"); - - if ( subject.equals( childSubject ) ) return node; - } - } - */ return rootNode; - /* - Message childMessage = (Message) child.getUserObject(); - Rfc822Header childHeader = childMessage.getHeader(); - String childSubject = (String) childHeader.get("Subject"); - - childSubject = parseSubject( childSubject ); - child.setParsedSubject( childSubject ); - - // group everything together - for ( int i=0; i<rootNode.getChildCount(); i++ ) - { - - MessageNode node = (MessageNode) rootNode.getChildAt( i ); - String subject = node.getParsedSubject(); - if ( subject == null ) - { - Message message = (Message) node.getUserObject(); - Rfc822Header header = message.getHeader(); - subject = (String) header.get("Subject"); - - if ( subject == null ) - subject = new String(""); - else - subject = parseSubject( subject ); - - node.setParsedSubject( subject ); } ! if ( childSubject.equals( subject ) ) return node; ! ! } ! */ ! } ! ! /******************************* implements TableModelModifier *******************/ ! ! /* (non-Javadoc) * @see org.columba.mail.gui.table.model.TableModelModifier#modify(java.lang.Object[]) */ --- 265,280 ---- add(child, rootNode); return rootNode; } + /** + * implements TableModelModifier + * + */ ! /* ! * (non-Javadoc) ! * * @see org.columba.mail.gui.table.model.TableModelModifier#modify(java.lang.Object[]) */ *************** *** 551,555 **** } ! /* (non-Javadoc) * @see org.columba.mail.gui.table.model.TableModelModifier#remove(java.lang.Object[]) */ --- 283,289 ---- } ! /* ! * (non-Javadoc) ! * * @see org.columba.mail.gui.table.model.TableModelModifier#remove(java.lang.Object[]) */ *************** *** 558,562 **** } ! /* (non-Javadoc) * @see org.columba.mail.gui.table.model.TreeTableModelInterface#set(org.columba.mail.message.HeaderList) */ --- 292,298 ---- } ! /* ! * (non-Javadoc) ! * * @see org.columba.mail.gui.table.model.TreeTableModelInterface#set(org.columba.mail.message.HeaderList) */ *************** *** 567,571 **** } ! /* (non-Javadoc) * @see org.columba.mail.gui.table.model.TableModelModifier#update() */ --- 303,309 ---- } ! /* ! * (non-Javadoc) ! * * @see org.columba.mail.gui.table.model.TableModelModifier#update() */ *************** *** 578,606 **** } - /* - public MessageNode getChildAtRow( int row, JTree tree ) - { - int index = 0; - - MessageNode rootNode = getHeaderTableModel().getRootNode(); - - for ( int i=0; i<rootNode.getChildCount(); i++ ) - { - MessageNode node = (MessageNode) rootNode.getChildAt( i ); - - - if ( node.isLeaf() == true ) - { - - } - - - } - - return rootNode; - } - */ class MessageHeaderComparator implements Comparator { protected int column; protected boolean ascending; --- 316,323 ---- } class MessageHeaderComparator implements Comparator { + protected int column; + protected boolean ascending; *************** *** 611,629 **** public int compare(Object o1, Object o2) { ! //Integer int1 = (Integer) o1; ! //Integer int2 = (Integer) o2; MessageNode node1 = (MessageNode) o1; MessageNode node2 = (MessageNode) o2; - //Message message1 = folder.get( int1.intValue() ); - //Message message1 = (Message) node1.getUserObject(); - //Message message2 = folder.get( int2.intValue() ); - //Message message2 =(Message) node2.getUserObject(); ColumbaHeader header1 = node1.getHeader(); ColumbaHeader header2 = node2.getHeader(); ! if ((header1 == null) || (header2 == null)) { ! return 0; ! } int result = 0; --- 328,339 ---- public int compare(Object o1, Object o2) { ! MessageNode node1 = (MessageNode) o1; MessageNode node2 = (MessageNode) o2; ColumbaHeader header1 = node1.getHeader(); ColumbaHeader header2 = node2.getHeader(); ! if ((header1 == null) || (header2 == null)) { return 0; } int result = 0; *************** *** 666,671 **** MessageHeaderComparator compObj = (MessageHeaderComparator) obj; ! return (compObj.column == column) && ! (compObj.ascending == ascending); } --- 376,381 ---- MessageHeaderComparator compObj = (MessageHeaderComparator) obj; ! return (compObj.column == column) ! && (compObj.ascending == ascending); } *************** *** 673,675 **** } } ! } --- 383,385 ---- } } ! } \ No newline at end of file |