KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > tree > FolderTreeModel


1 //The contents of this file are subject to the Mozilla Public License Version 1.1
2
//(the "License"); you may not use this file except in compliance with the
3
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
4
//
5
//Software distributed under the License is distributed on an "AS IS" basis,
6
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
7
//for the specific language governing rights and
8
//limitations under the License.
9
//
10
//The Original Code is "The Columba Project"
11
//
12
//The Initial Developers of the Original Code are Frederik Dietz and Timo
13
// Stich.
14
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
15
//
16
//All Rights Reserved.
17
package org.columba.mail.gui.tree;
18
19 import java.util.Enumeration JavaDoc;
20 import java.util.Map JavaDoc;
21 import java.util.MissingResourceException JavaDoc;
22 import java.util.WeakHashMap JavaDoc;
23
24 import javax.swing.tree.DefaultTreeModel JavaDoc;
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 /**
48  * @author freddy
49  *
50  * To change this generated comment edit the template variable "typecomment":
51  * Window>Preferences>Java>Templates. To enable and disable the creation of type
52  * comments go to Window>Preferences>Java>Code Generation.
53  */

54
55 public class FolderTreeModel extends DefaultTreeModel JavaDoc {
56     protected FolderXmlConfig folderXmlConfig;
57
58     protected TempFolder tempFolder;
59
60     private Map JavaDoc<String JavaDoc, IMailFolder> temporaryFolders = new WeakHashMap JavaDoc<String JavaDoc,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         // create temporary folder in "<your-config-folder>/mail/"
70
tempFolder = new TempFolder(DefaultConfigDirectory.getInstance().getCurrentPath()
71                 + "/mail/");
72
73         createDirectories(((IMailFolder) getRoot()).getConfiguration()
74                 .getRoot(), (IMailFolder) getRoot());
75
76         // register at shutdownmanager
77
// -> when closing Columba, this will automatically save all folder data
78
ShutdownManager.getInstance().register(new Runnable JavaDoc() {
79             public void run() {
80                 saveFolder((IMailFolder) getRoot());
81             }
82
83             protected void saveFolder(IMailFolder parentFolder) {
84                 IMailFolder child;
85
86                 for (Enumeration JavaDoc 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 JavaDoc 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 JavaDoc 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         // i18n stuff
143
String JavaDoc name = null;
144
145         // XmlElement.printNode(item.getRoot(), "");
146
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 JavaDoc ex) {
171             name = item.getString("property", "name");
172         }
173
174         // now instanciate the folder classes
175
String JavaDoc 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         // parent directory for mail folders
186
// for example: ".columba/mail/"
187
String JavaDoc path = DefaultConfigDirectory.getInstance().getCurrentPath() + "/mail/";
188         Object JavaDoc[] 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 JavaDoc ex) {
197             ex.printStackTrace();
198         }
199
200         return folder;
201     }
202
203     public IMailFolder getFolder(String JavaDoc folderId) {
204         IMailFolder root = (IMailFolder) getRoot();
205
206         for (Enumeration JavaDoc e = root.breadthFirstEnumeration(); e
207                 .hasMoreElements();) {
208             IMailFolder node = (IMailFolder) e.nextElement();
209             String JavaDoc 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 JavaDoc 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 (item.get("type").equals("IMAPRootFolder")) {
239
if (node instanceof IMAPRootFolder) {
240                 int account = item.getInteger("account_uid");
241
242                 if (account == accountUid) {
243                     String JavaDoc 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 JavaDoc str = list.get(i);
264             child = findFolder(child, str);
265         }
266
267         return child;
268     }
269
270     public IMailFolder findFolder(IMailFolder parentFolder, String JavaDoc str) {
271         IMailFolder child;
272
273         for (Enumeration JavaDoc 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