001: package org.columba.mail.gui.tagging;
002:
003: import java.awt.event.MouseEvent;
004: import java.util.Collection;
005: import java.util.Iterator;
006:
007: import javax.swing.event.ListSelectionEvent;
008: import javax.swing.event.ListSelectionListener;
009: import javax.swing.tree.MutableTreeNode;
010:
011: import org.columba.api.gui.frame.IFrameMediator;
012: import org.columba.api.plugin.PluginLoadingFailedException;
013: import org.columba.core.association.AssociationStore;
014: import org.columba.core.base.UUIDGenerator;
015: import org.columba.core.command.CommandProcessor;
016: import org.columba.core.gui.base.DoubleClickListener;
017: import org.columba.core.gui.frame.FrameManager;
018: import org.columba.core.gui.tagging.TagList;
019: import org.columba.core.tagging.api.ITag;
020: import org.columba.mail.command.IMailFolderCommandReference;
021: import org.columba.mail.command.MailFolderCommandReference;
022: import org.columba.mail.folder.IMailbox;
023: import org.columba.mail.folder.headercache.CachedHeaderfields;
024: import org.columba.mail.folder.virtual.VirtualFolder;
025: import org.columba.mail.gui.frame.TreeViewOwner;
026: import org.columba.mail.gui.table.command.ViewHeaderListCommand;
027: import org.columba.mail.gui.tree.FolderTreeModel;
028: import org.columba.mail.message.ColumbaHeader;
029: import org.columba.ristretto.message.Header;
030:
031: public class MailTagList extends TagList {
032:
033: private IFrameMediator frameMediator;
034:
035: public MailTagList(IFrameMediator frameMediator) {
036: super ();
037:
038: this .frameMediator = frameMediator;
039:
040: final MyListSelectionListener sl = new MyListSelectionListener();
041: addListSelectionListener(sl);
042:
043: // do not only update the tag search result when click on a different
044: // tag, also do a refresh of the same tag when double click on it
045: addMouseListener(new DoubleClickListener() {
046:
047: @Override
048: public void doubleClick(MouseEvent event) {
049: sl.valueChanged(new ListSelectionEvent(event
050: .getSource(), 0, 0, false));
051: }
052:
053: });
054: }
055:
056: private IMailFolderCommandReference getMessageFromURI(String uri) {
057: // example: "columba://org.columba.mail/<folder-id>/<message-id>"
058: String s = uri;
059:
060: // TODO: @author fdietz replace with regular expression
061: int index = s.lastIndexOf('/');
062: String messageId = s.substring(index + 1, s.length());
063: String folderId = s.substring(
064: s.lastIndexOf('/', index - 1) + 1, index);
065:
066: IMailbox folder = (IMailbox) FolderTreeModel.getInstance()
067: .getFolder(folderId);
068: IMailFolderCommandReference r = new MailFolderCommandReference(
069: folder, new Object[] { Integer.parseInt(messageId) });
070:
071: return r;
072: }
073:
074: class MyListSelectionListener implements ListSelectionListener {
075: MyListSelectionListener() {
076: }
077:
078: public void valueChanged(ListSelectionEvent event) {
079: // return if selection change is in flux
080: if (event.getValueIsAdjusting()) {
081: return;
082: }
083:
084: ITag result = (ITag) getSelectedValue();
085:
086: // if there is nothing selected return
087: if (result == null) {
088: return;
089: }
090:
091: // create a virtual folder with all messages holding this tag
092: Collection<String> uriList = AssociationStore.getInstance()
093: .getAssociatedItems("tagging", result.getId());
094:
095: // TODO @author hubms show if there is already a virtual folder for
096: // this tag
097: String uuid = new UUIDGenerator().newUUID();
098:
099: // create a virtual folder
100: VirtualFolder taggedMessageFolder = new VirtualFolder(
101: "Tag Search Result");
102:
103: // should be a MutableTreeNode
104: Object root = ((TreeViewOwner) frameMediator)
105: .getTreeController().getModel().getRoot();
106: if (root instanceof MutableTreeNode)
107: taggedMessageFolder.setParent((MutableTreeNode) root);
108:
109: for (Iterator<String> it = uriList.iterator(); it.hasNext();) {
110: String uri = it.next();
111: // skip all non-mail component items
112: if (!uri.startsWith("columba://org.columba.mail"))
113: continue;
114:
115: IMailFolderCommandReference r = getMessageFromURI(uri);
116: try {
117: Header header = ((IMailbox) r.getSourceFolder())
118: .getHeaderFields(r.getUids()[0],
119: CachedHeaderfields
120: .getDefaultHeaderfields());
121: ColumbaHeader pHeader = new ColumbaHeader(header);
122: taggedMessageFolder.add(pHeader, (IMailbox) r
123: .getSourceFolder(), r.getUids()[0]);
124: } catch (Exception e) {
125: // TODO Auto-generated catch block
126: e.printStackTrace();
127: }
128: }
129:
130: // try {
131: // taggedMessageFolder.activate();
132: // } catch (Exception e1) {
133: // // TODO Auto-generated catch block
134: // e1.printStackTrace();
135: // }
136:
137: // ensure that we are currently in the mail component
138: IFrameMediator newMediator = null;
139: try {
140: newMediator = FrameManager.getInstance().switchView(
141: frameMediator.getContainer(), "ThreePaneMail");
142: } catch (PluginLoadingFailedException e) {
143: e.printStackTrace();
144: }
145:
146: // select invisible virtual folder
147: ((TreeViewOwner) newMediator).getTreeController()
148: .setSelected(taggedMessageFolder);
149:
150: // update message list
151: CommandProcessor.getInstance().addOp(
152: new ViewHeaderListCommand(newMediator,
153: new MailFolderCommandReference(
154: taggedMessageFolder)));
155: }
156: }
157: }
|