001: package org.columba.mail.gui.table.action;
002:
003: import java.util.Hashtable;
004: import java.util.Iterator;
005: import java.util.Map.Entry;
006: import java.util.logging.Logger;
007:
008: import org.columba.api.gui.frame.IFrameMediator;
009: import org.columba.api.selection.ISelectionListener;
010: import org.columba.api.selection.SelectionChangedEvent;
011: import org.columba.core.association.AssociationStore;
012: import org.columba.core.association.api.IAssociation;
013: import org.columba.core.command.CommandProcessor;
014: import org.columba.core.folder.api.IFolder;
015: import org.columba.core.gui.tagging.TaggingMenu;
016: import org.columba.core.tagging.TagManager;
017: import org.columba.core.tagging.api.ITag;
018: import org.columba.mail.command.IMailFolderCommandReference;
019: import org.columba.mail.folder.IMailbox;
020: import org.columba.mail.folder.command.TagMessageCommand;
021: import org.columba.mail.folder.virtual.VirtualFolder;
022: import org.columba.mail.folder.virtual.VirtualHeader;
023: import org.columba.mail.gui.frame.MailFrameMediator;
024: import org.columba.mail.gui.table.selection.TableSelectionChangedEvent;
025: import org.columba.mail.message.IHeaderList;
026: import org.columba.mail.util.MailResourceLoader;
027:
028: public class TagMessageMenu extends TaggingMenu implements
029: ISelectionListener {
030:
031: final static private String SERVICE_ID = "tagging";
032:
033: private static final Logger LOG = Logger
034: .getLogger("org.columba.mail.gui.table.action.TagMessageMenu");
035:
036: /**
037: * @param controller
038: */
039: public TagMessageMenu(IFrameMediator controller) {
040: super (controller, MailResourceLoader.getString("dialog",
041: "tagging", "menu_tag_message"), "menu_tag_message");
042:
043: ((MailFrameMediator) controller)
044: .registerTableSelectionListener(this );
045: }
046:
047: // listener updates selection status, when ever a message selection changes
048: public void selectionChanged(SelectionChangedEvent e) {
049: if (((TableSelectionChangedEvent) e).getUids().length > 0) {
050: setEnabled(true);
051: removeAll();
052: createSubMenu();
053: } else {
054: setEnabled(false);
055: }
056:
057: }
058:
059: private boolean checkOneUid(Object uid, IFolder srcFolder, ITag tag) {
060: for (IAssociation as : AssociationStore.getInstance()
061: .getAllAssociations(
062: TagMessageCommand.createURI(srcFolder.getId(),
063: uid).toString())) {
064: if (as.getServiceId().equals(SERVICE_ID)
065: && (as.getMetaDataId() != null)
066: && (as.getMetaDataId().equals(tag.getId()))) {
067: return true;
068: }
069: }
070: return false;
071: }
072:
073: @Override
074: protected void assignTag(String tagId) {
075:
076: // get current message list selection
077: IMailFolderCommandReference r = ((MailFrameMediator) getFrameMediator())
078: .getTableSelection();
079:
080: // pass command to scheduler
081: CommandProcessor.getInstance().addOp(
082: new TagMessageCommand(r, TagMessageCommand.ADD_TAG,
083: tagId));
084: }
085:
086: @Override
087: protected boolean isTagged(ITag tag) {
088: // get current message list selection
089: IMailFolderCommandReference r = ((MailFrameMediator) getFrameMediator())
090: .getTableSelection();
091:
092: if ((r == null) || (r.getUids().length <= 0) || (tag == null))
093: return false;
094:
095: Hashtable<Object, IFolder> mails = new Hashtable<Object, IFolder>();
096:
097: // check if virtual folder, if yes, do not use these uids, use the
098: // real uids instead
099: if (r.getSourceFolder() instanceof VirtualFolder) {
100: // get original folder
101: try {
102:
103: IHeaderList hl = ((IMailbox) r.getSourceFolder())
104: .getHeaderList();
105: for (Object uid : r.getUids()) {
106: // should be virtual
107: mails.put(
108: ((VirtualHeader) hl.get(uid)).getSrcUid(),
109: ((VirtualHeader) hl.get(uid))
110: .getSrcFolder());
111: }
112: } catch (Exception e) {
113: LOG
114: .severe("Error getting header list from virtual folder");
115: e.printStackTrace();
116: return false;
117: }
118: } else {
119: for (Object uid : r.getUids()) {
120: mails.put(uid, r.getSourceFolder());
121: }
122: }
123:
124: // if all messages are tagged with tag, then return true, else false
125: boolean result = true;
126: for (Entry<Object, IFolder> entry : mails.entrySet()) {
127: boolean current = checkOneUid(entry.getKey(), entry
128: .getValue(), tag);
129: if (current == false)
130: return false;
131: }
132: return result;
133: }
134:
135: @Override
136: protected void removeAllTags() {
137:
138: // get current message list selection
139: IMailFolderCommandReference r = ((MailFrameMediator) getFrameMediator())
140: .getTableSelection();
141:
142: for (Iterator<ITag> iter = TagManager.getInstance()
143: .getAllTags(); iter.hasNext();) {
144:
145: ITag tag = iter.next();
146: // TODO @author hubms: bad: if there is a icon it is tagged or
147: // not
148:
149: // pass command to scheduler
150: CommandProcessor.getInstance().addOp(
151: new TagMessageCommand(r,
152: TagMessageCommand.REMOVE_TAG, tag.getId()));
153: }
154: }
155:
156: @Override
157: protected void removeTag(String tagId) {
158:
159: // get current message list selection
160: IMailFolderCommandReference r = ((MailFrameMediator) getFrameMediator())
161: .getTableSelection();
162:
163: CommandProcessor.getInstance().addOp(
164: new TagMessageCommand(r, TagMessageCommand.REMOVE_TAG,
165: tagId));
166: }
167:
168: }
|