KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > tagging > MailTagList


1 package org.columba.mail.gui.tagging;
2
3 import java.awt.event.MouseEvent JavaDoc;
4 import java.util.Collection JavaDoc;
5 import java.util.Iterator JavaDoc;
6
7 import javax.swing.event.ListSelectionEvent JavaDoc;
8 import javax.swing.event.ListSelectionListener JavaDoc;
9 import javax.swing.tree.MutableTreeNode JavaDoc;
10
11 import org.columba.api.gui.frame.IFrameMediator;
12 import org.columba.api.plugin.PluginLoadingFailedException;
13 import org.columba.core.association.AssociationStore;
14 import org.columba.core.base.UUIDGenerator;
15 import org.columba.core.command.CommandProcessor;
16 import org.columba.core.gui.base.DoubleClickListener;
17 import org.columba.core.gui.frame.FrameManager;
18 import org.columba.core.gui.tagging.TagList;
19 import org.columba.core.tagging.api.ITag;
20 import org.columba.mail.command.IMailFolderCommandReference;
21 import org.columba.mail.command.MailFolderCommandReference;
22 import org.columba.mail.folder.IMailbox;
23 import org.columba.mail.folder.headercache.CachedHeaderfields;
24 import org.columba.mail.folder.virtual.VirtualFolder;
25 import org.columba.mail.gui.frame.TreeViewOwner;
26 import org.columba.mail.gui.table.command.ViewHeaderListCommand;
27 import org.columba.mail.gui.tree.FolderTreeModel;
28 import org.columba.mail.message.ColumbaHeader;
29 import org.columba.ristretto.message.Header;
30
31 public class MailTagList extends TagList {
32
33     private IFrameMediator frameMediator;
34
35     public MailTagList(IFrameMediator frameMediator) {
36         super();
37
38         this.frameMediator = frameMediator;
39
40         final MyListSelectionListener sl = new MyListSelectionListener();
41         addListSelectionListener(sl);
42
43         // do not only update the tag search result when click on a different
44
// tag, also do a refresh of the same tag when double click on it
45
addMouseListener(new DoubleClickListener() {
46
47             @Override JavaDoc
48             public void doubleClick(MouseEvent JavaDoc event) {
49                 sl.valueChanged(new ListSelectionEvent JavaDoc(event.getSource(), 0, 0,
50                         false));
51             }
52
53         });
54     }
55
56     private IMailFolderCommandReference getMessageFromURI(String JavaDoc uri) {
57         // example: "columba://org.columba.mail/<folder-id>/<message-id>"
58
String JavaDoc s = uri;
59
60         // TODO: @author fdietz replace with regular expression
61
int index = s.lastIndexOf('/');
62         String JavaDoc messageId = s.substring(index + 1, s.length());
63         String JavaDoc folderId = s.substring(s.lastIndexOf('/', index - 1) + 1, index);
64
65         IMailbox folder = (IMailbox) FolderTreeModel.getInstance().getFolder(
66                 folderId);
67         IMailFolderCommandReference r = new MailFolderCommandReference(folder,
68                 new Object JavaDoc[] { Integer.parseInt(messageId) });
69
70         return r;
71     }
72
73     class MyListSelectionListener implements ListSelectionListener JavaDoc {
74         MyListSelectionListener() {
75         }
76
77         public void valueChanged(ListSelectionEvent JavaDoc event) {
78             // return if selection change is in flux
79
if (event.getValueIsAdjusting()) {
80                 return;
81             }
82
83             ITag result = (ITag) getSelectedValue();
84
85             // if there is nothing selected return
86
if (result == null) {
87                 return;
88             }
89
90             // create a virtual folder with all messages holding this tag
91
Collection JavaDoc<String JavaDoc> uriList = AssociationStore.getInstance()
92                     .getAssociatedItems("tagging", result.getId());
93
94             // TODO @author hubms show if there is already a virtual folder for
95
// this tag
96
String JavaDoc uuid = new UUIDGenerator().newUUID();
97
98             // create a virtual folder
99
VirtualFolder taggedMessageFolder = new VirtualFolder(
100                     "Tag Search Result");
101
102             // should be a MutableTreeNode
103
Object JavaDoc root = ((TreeViewOwner) frameMediator).getTreeController()
104                     .getModel().getRoot();
105             if (root instanceof MutableTreeNode JavaDoc)
106                 taggedMessageFolder.setParent((MutableTreeNode JavaDoc) root);
107
108             for (Iterator JavaDoc<String JavaDoc> it = uriList.iterator(); it.hasNext();) {
109                 String JavaDoc uri = it.next();
110                 // skip all non-mail component items
111
if (!uri.startsWith("columba://org.columba.mail"))
112                     continue;
113
114                 IMailFolderCommandReference r = getMessageFromURI(uri);
115                 try {
116                     Header header = ((IMailbox) r.getSourceFolder())
117                             .getHeaderFields(r.getUids()[0], CachedHeaderfields
118                                     .getDefaultHeaderfields());
119                     ColumbaHeader pHeader = new ColumbaHeader(header);
120                     taggedMessageFolder.add(pHeader, (IMailbox) r
121                             .getSourceFolder(), r.getUids()[0]);
122                 } catch (Exception JavaDoc e) {
123                     // TODO Auto-generated catch block
124
e.printStackTrace();
125                 }
126             }
127
128             // try {
129
// taggedMessageFolder.activate();
130
// } catch (Exception e1) {
131
// // TODO Auto-generated catch block
132
// e1.printStackTrace();
133
// }
134

135             // ensure that we are currently in the mail component
136
IFrameMediator newMediator = null;
137             try {
138                 newMediator = FrameManager.getInstance().switchView(
139                         frameMediator.getContainer(), "ThreePaneMail");
140             } catch (PluginLoadingFailedException e) {
141                 e.printStackTrace();
142             }
143
144             // select invisible virtual folder
145
((TreeViewOwner) newMediator).getTreeController().setSelected(
146                     taggedMessageFolder);
147
148             // update message list
149
CommandProcessor.getInstance()
150                     .addOp(
151                             new ViewHeaderListCommand(newMediator,
152                                     new MailFolderCommandReference(
153                                             taggedMessageFolder)));
154         }
155     }
156 }
157
Popular Tags