1 21 22 package org.armedbear.j.mail; 23 24 import java.util.Enumeration ; 25 import java.util.List ; 26 import javax.swing.tree.DefaultMutableTreeNode ; 27 import javax.swing.tree.DefaultTreeModel ; 28 import javax.swing.tree.TreeNode ; 29 import org.armedbear.j.Directories; 30 import org.armedbear.j.Editor; 31 import org.armedbear.j.File; 32 import org.armedbear.j.Property; 33 34 public final class FolderTreeModel extends DefaultTreeModel 35 { 36 private static FolderTreeModel model; 37 38 private FolderTreeModel(TreeNode root) 39 { 40 super(root); 41 } 42 43 public static synchronized FolderTreeModel getDefaultModel() 44 { 45 if (model == null) { 46 DefaultMutableTreeNode root = new DefaultMutableTreeNode (); 48 File local = 49 File.getInstance(Directories.getMailDirectory(), "local"); 50 if (local.isDirectory()) { 51 DefaultMutableTreeNode localFolders = 52 new DefaultMutableTreeNode ("Local Folders"); 53 root.add(localFolders); 54 Folder drafts = new Folder("drafts", 56 new LocalMailboxURL(Directories.getDraftsFolder())); 57 localFolders.add(new DefaultMutableTreeNode (drafts)); 58 String [] list = local.list(); 60 for (int i = 0; i < list.length; i++) { 61 final String name = list[i]; 62 if (name.equals("drafts")) 63 continue; 64 File file = File.getInstance(local, name); 65 if (file.isDirectory()) { 66 File mailboxFile = File.getInstance(file, "mbox"); 67 final LocalMailboxURL url = 68 new LocalMailboxURL(mailboxFile); 69 Folder folder = new Folder(file.getName(), url); 70 localFolders.add(new DefaultMutableTreeNode (folder)); 71 } 72 } 73 } 74 model = new FolderTreeModel(root); 75 String inbox = 76 Editor.preferences().getStringProperty(Property.INBOX); 77 if (inbox != null) { 78 MailboxURL url = MailboxURL.parse(inbox); 79 if (url != null) 80 model.addNodeForFolder(url); 81 } 82 } 83 return model; 84 } 85 86 public void maybeAddNodeForFolder(MailboxURL url) 87 { 88 if (findNodeForFolder(url) == null) 89 addNodeForFolder(url); 90 } 91 92 private DefaultMutableTreeNode findNodeForFolder(MailboxURL url) 93 { 94 Enumeration nodes = 95 ((DefaultMutableTreeNode ) root).depthFirstEnumeration(); 96 while (nodes.hasMoreElements()) { 97 DefaultMutableTreeNode node = 98 (DefaultMutableTreeNode ) nodes.nextElement(); 99 Object obj = node.getUserObject(); 100 if (obj instanceof Folder && ((Folder) obj).getUrl().equals(url)) 101 return node; 102 } 103 return null; 104 } 105 106 private void addNodeForFolder(MailboxURL url) 107 { 108 if (url instanceof ImapURL) { 109 Enumeration nodes = root.children(); 110 DefaultMutableTreeNode parent = null; 111 while (nodes.hasMoreElements()) { 112 DefaultMutableTreeNode node = 113 (DefaultMutableTreeNode ) nodes.nextElement(); 114 Object obj = node.getUserObject(); 115 if (obj instanceof String ) { 116 String s = (String ) obj; 117 if (s.equals(url.getHost())) { 118 parent = node; 119 break; 120 } 121 } 122 } 123 if (parent == null) { 124 parent = new DefaultMutableTreeNode (url.getHost()); 125 ((DefaultMutableTreeNode ) root).add(parent); 126 } 127 List list = ((ImapURL)url).getFolderPathComponents(); 128 for (int i = 0; i < list.size()-1; i++) { 129 boolean add = true; 130 nodes = parent.children(); 131 while (nodes.hasMoreElements()) { 132 DefaultMutableTreeNode node = 133 (DefaultMutableTreeNode ) nodes.nextElement(); 134 Object obj = node.getUserObject(); 135 if (obj instanceof String ) { 136 String s = (String ) obj; 137 if (s.equals(list.get(i))) { 138 parent = node; 139 add = false; 140 break; 141 } 142 } 143 } 144 if (add) { 145 DefaultMutableTreeNode node = 146 new DefaultMutableTreeNode (list.get(i)); 147 parent.add(node); 148 parent = node; 149 } 150 } 151 parent.add(new DefaultMutableTreeNode (new Folder((String )list.get(list.size()-1), url))); 153 } else 154 ((DefaultMutableTreeNode )root).add(new DefaultMutableTreeNode (new Folder(url.toString(), url))); 155 reload(); 156 } 157 } 158 | Popular Tags |