1 package org.columba.mail.gui.tree; 18 19 import java.util.Enumeration ; 20 import java.util.Map ; 21 import java.util.MissingResourceException ; 22 import java.util.WeakHashMap ; 23 24 import javax.swing.tree.DefaultTreeModel ; 25 26 import org.columba.api.plugin.IExtension; 27 import org.columba.api.plugin.IExtensionHandler; 28 import org.columba.api.plugin.PluginHandlerNotFoundException; 29 import org.columba.core.config.DefaultConfigDirectory; 30 import org.columba.core.gui.dialog.ErrorDialog; 31 import org.columba.core.plugin.PluginManager; 32 import org.columba.core.shutdown.ShutdownManager; 33 import org.columba.core.xml.XmlElement; 34 import org.columba.mail.config.FolderItem; 35 import org.columba.mail.config.FolderXmlConfig; 36 import org.columba.mail.config.IFolderItem; 37 import org.columba.mail.config.MailConfig; 38 import org.columba.mail.folder.AbstractMessageFolder; 39 import org.columba.mail.folder.IMailFolder; 40 import org.columba.mail.folder.Root; 41 import org.columba.mail.folder.imap.IMAPRootFolder; 42 import org.columba.mail.folder.temp.TempFolder; 43 import org.columba.mail.gui.tree.util.TreeNodeList; 44 import org.columba.mail.plugin.IExtensionHandlerKeys; 45 import org.columba.mail.util.MailResourceLoader; 46 47 54 55 public class FolderTreeModel extends DefaultTreeModel { 56 protected FolderXmlConfig folderXmlConfig; 57 58 protected TempFolder tempFolder; 59 60 private Map <String , IMailFolder> temporaryFolders = new WeakHashMap <String ,IMailFolder>(); 61 62 private static FolderTreeModel instance = new FolderTreeModel(MailConfig 63 .getInstance().getFolderConfig()); 64 65 public FolderTreeModel(FolderXmlConfig folderConfig) { 66 super(new Root(folderConfig.getRoot().getElement("tree"))); 67 this.folderXmlConfig = folderConfig; 68 69 tempFolder = new TempFolder(DefaultConfigDirectory.getInstance().getCurrentPath() 71 + "/mail/"); 72 73 createDirectories(((IMailFolder) getRoot()).getConfiguration() 74 .getRoot(), (IMailFolder) getRoot()); 75 76 ShutdownManager.getInstance().register(new Runnable () { 79 public void run() { 80 saveFolder((IMailFolder) getRoot()); 81 } 82 83 protected void saveFolder(IMailFolder parentFolder) { 84 IMailFolder child; 85 86 for (Enumeration e = parentFolder.children(); e 87 .hasMoreElements();) { 88 child = (IMailFolder) e.nextElement(); 89 90 if (child instanceof AbstractMessageFolder) { 91 try { 92 ((AbstractMessageFolder) child).save(); 93 } catch (Exception ex) { 94 ex.printStackTrace(); 95 } 96 } 97 98 saveFolder(child); 99 } 100 } 101 }); 102 } 103 104 public static FolderTreeModel getInstance() { 105 return instance; 106 } 107 108 109 public void addTemporaryFolder(IMailFolder folder) { 110 temporaryFolders.put(folder.getId(), folder); 111 } 112 113 public void createDirectories(XmlElement parentTreeNode, 114 IMailFolder parentFolder) { 115 int count = parentTreeNode.count(); 116 XmlElement child; 117 118 if (count > 0) { 119 for (int i = 0; i < count; i++) { 120 child = parentTreeNode.getElement(i); 121 122 String name = child.getName(); 123 124 if (name.equals("folder")) { 125 IMailFolder folder = add(child, parentFolder); 126 127 if (folder != null) { 128 createDirectories(child, folder); 129 } 130 } 131 } 132 } 133 } 134 135 public IMailFolder add(XmlElement childNode, IMailFolder parentFolder) { 136 FolderItem item = new FolderItem(childNode); 137 138 if (item == null) { 139 return null; 140 } 141 142 String name = null; 144 145 int uid = item.getInteger("uid"); 147 148 try { 149 if (uid == 100) { 150 name = MailResourceLoader.getString("tree", "localfolders"); 151 } else if (uid == 101) { 152 name = MailResourceLoader.getString("tree", "inbox"); 153 } else if (uid == 102) { 154 name = MailResourceLoader.getString("tree", "drafts"); 155 } else if (uid == 103) { 156 name = MailResourceLoader.getString("tree", "outbox"); 157 } else if (uid == 104) { 158 name = MailResourceLoader.getString("tree", "sent"); 159 } else if (uid == 105) { 160 name = MailResourceLoader.getString("tree", "trash"); 161 } else if (uid == 106) { 162 name = MailResourceLoader.getString("tree", "search"); 163 } else if (uid == 107) { 164 name = MailResourceLoader.getString("tree", "templates"); 165 } else { 166 name = item.getString("property", "name"); 167 } 168 169 item.setString("property", "name", name); 170 } catch (MissingResourceException ex) { 171 name = item.getString("property", "name"); 172 } 173 174 String type = item.get("type"); 176 IExtensionHandler handler = null; 177 178 try { 179 handler = PluginManager.getInstance() 180 .getExtensionHandler(IExtensionHandlerKeys.ORG_COLUMBA_MAIL_FOLDER); 181 } catch (PluginHandlerNotFoundException ex) { 182 ErrorDialog.createDialog(ex.getMessage(), ex); 183 } 184 185 String path = DefaultConfigDirectory.getInstance().getCurrentPath() + "/mail/"; 188 Object [] args = { item, path }; 189 IMailFolder folder = null; 190 191 try { 192 IExtension extension = handler.getExtension(type); 193 194 folder = (IMailFolder) extension.instanciateExtension(args); 195 parentFolder.add(folder); 196 } catch (Exception ex) { 197 ex.printStackTrace(); 198 } 199 200 return folder; 201 } 202 203 public IMailFolder getFolder(String folderId) { 204 IMailFolder root = (IMailFolder) getRoot(); 205 206 for (Enumeration e = root.breadthFirstEnumeration(); e 207 .hasMoreElements();) { 208 IMailFolder node = (IMailFolder) e.nextElement(); 209 String id = node.getId(); 210 211 if (folderId.equals(id)) { 212 return node; 213 } 214 } 215 216 if ( temporaryFolders.containsKey(folderId)) 217 return temporaryFolders.get(folderId); 218 219 return null; 220 } 221 222 public IMailFolder getTrashFolder() { 223 return getFolder("105"); 224 } 225 226 public IMailFolder getImapFolder(int accountUid) { 227 IMailFolder root = (IMailFolder) getRoot(); 228 229 for (Enumeration e = root.breadthFirstEnumeration(); e 230 .hasMoreElements();) { 231 IMailFolder node = (IMailFolder) e.nextElement(); 232 IFolderItem item = node.getConfiguration(); 233 234 if (item == null) { 235 continue; 236 } 237 238 if (node instanceof IMAPRootFolder) { 240 int account = item.getInteger("account_uid"); 241 242 if (account == accountUid) { 243 String uid = item.get("uid"); 244 245 return getFolder(uid); 246 } 247 } 248 } 249 250 return null; 251 } 252 253 public IMailFolder getFolder(TreeNodeList list) { 254 IMailFolder parentFolder = (IMailFolder) getRoot(); 255 256 if ((list == null) || (list.count() == 0)) { 257 return parentFolder; 258 } 259 260 IMailFolder child = parentFolder; 261 262 for (int i = 0; i < list.count(); i++) { 263 String str = list.get(i); 264 child = findFolder(child, str); 265 } 266 267 return child; 268 } 269 270 public IMailFolder findFolder(IMailFolder parentFolder, String str) { 271 IMailFolder child; 272 273 for (Enumeration e = parentFolder.children(); e.hasMoreElements();) { 274 child = (IMailFolder) e.nextElement(); 275 276 if (child.getName().equals(str)) { 277 return child; 278 } 279 } 280 281 return null; 282 } 283 284 public TempFolder getTempFolder() { 285 return tempFolder; 286 } 287 } 288 | Popular Tags |