1 package org.columba.mail.gui.message.command; 18 19 import java.util.Date ; 20 21 import javax.swing.JOptionPane ; 22 23 import org.columba.api.command.ICommandReference; 24 import org.columba.api.command.IWorkerStatusController; 25 import org.columba.api.gui.frame.IFrameMediator; 26 import org.columba.api.selection.ISelectionListener; 27 import org.columba.api.selection.SelectionChangedEvent; 28 import org.columba.core.command.Command; 29 import org.columba.core.command.CommandCancelledException; 30 import org.columba.core.command.StatusObservableImpl; 31 import org.columba.core.command.Worker; 32 import org.columba.core.context.base.api.IStructureValue; 33 import org.columba.core.context.semantic.api.ISemanticContext; 34 import org.columba.core.gui.frame.FrameManager; 35 import org.columba.core.util.NameParser; 36 import org.columba.mail.command.IMailFolderCommandReference; 37 import org.columba.mail.folder.AbstractMessageFolder; 38 import org.columba.mail.folder.FolderInconsistentException; 39 import org.columba.mail.folder.IMailFolder; 40 import org.columba.mail.folder.IMailbox; 41 import org.columba.mail.folder.headercache.SyncHeaderList; 42 import org.columba.mail.gui.frame.MailFrameMediator; 43 import org.columba.mail.gui.frame.MessageViewOwner; 44 import org.columba.mail.gui.message.IMessageController; 45 import org.columba.mail.gui.message.viewer.MarkAsReadTimer; 46 import org.columba.mail.gui.table.selection.TableSelectionChangedEvent; 47 import org.columba.mail.util.MailResourceLoader; 48 import org.columba.ristretto.message.Address; 49 import org.columba.ristretto.message.Flags; 50 51 55 public class ViewMessageCommand extends Command implements ISelectionListener { 56 57 private Flags flags; 58 59 private IMailbox srcFolder; 60 61 private Object uid; 62 63 private IFrameMediator mediator; 64 65 private boolean updateGui; 66 67 private IStructureValue value; 68 69 private String subject; 70 71 private String bodyText; 72 73 private Date date; 74 75 private NameParser.Name name; 76 77 private Address from; 78 79 84 public ViewMessageCommand(IFrameMediator mediator, 85 ICommandReference reference) { 86 super(reference); 87 88 this.mediator = mediator; 89 priority = Command.REALTIME_PRIORITY; 90 commandType = Command.NORMAL_OPERATION; 91 92 updateGui = true; 93 94 97 ((MailFrameMediator) mediator).registerTableSelectionListener(this); 98 99 } 100 101 104 public void updateGUI() throws Exception { 105 ((MailFrameMediator) mediator).removeTableSelectionListener(this); 106 107 if (updateGui) { 109 IMessageController messageController = ((MessageViewOwner) mediator) 110 .getMessageController(); 111 112 messageController.updateGUI(); 114 115 fillContext(); 116 } 117 118 119 } 120 121 private void fillContext() { 122 if ( value == null) return; 123 124 IStructureValue identity = value.addChild( 126 ISemanticContext.CONTEXT_NODE_IDENTITY, 127 ISemanticContext.CONTEXT_NAMESPACE_CORE); 128 if (name != null && name.toString() != null) 129 identity.setString(ISemanticContext.CONTEXT_ATTR_DISPLAY_NAME, 130 ISemanticContext.CONTEXT_NAMESPACE_CORE, name.toString()); 131 if (from != null && from.getMailAddress() != null) 132 identity.setString(ISemanticContext.CONTEXT_ATTR_EMAIL_ADDRESS, 133 ISemanticContext.CONTEXT_NAMESPACE_CORE, from 134 .getMailAddress()); 135 if (name != null && name.getFirstName() != null) 136 identity.setString(ISemanticContext.CONTEXT_ATTR_FIRST_NAME, 137 ISemanticContext.CONTEXT_NAMESPACE_CORE, name 138 .getFirstName()); 139 if (name != null && name.getLastName() != null) 140 identity 141 .setString(ISemanticContext.CONTEXT_ATTR_LAST_NAME, 142 ISemanticContext.CONTEXT_NAMESPACE_CORE, name 143 .getLastName()); 144 145 IStructureValue message = value.addChild( 147 ISemanticContext.CONTEXT_NODE_MESSAGE, 148 ISemanticContext.CONTEXT_NAMESPACE_CORE); 149 if (subject != null) 150 message.setString(ISemanticContext.CONTEXT_ATTR_SUBJECT, 151 ISemanticContext.CONTEXT_NAMESPACE_CORE, subject); 152 if (date != null) 153 message.setDate(ISemanticContext.CONTEXT_ATTR_DATE, 154 ISemanticContext.CONTEXT_NAMESPACE_CORE, date); 155 156 IMessageController messageController = ((MessageViewOwner) mediator) 157 .getMessageController(); 158 159 bodyText = messageController.getText(); 160 161 message.setString(ISemanticContext.CONTEXT_ATTR_BODY_TEXT, 163 ISemanticContext.CONTEXT_NAMESPACE_CORE, bodyText); 164 165 mediator.getSemanticContext().setValue(value); 167 } 168 169 172 public void execute(IWorkerStatusController wsc) throws Exception { 173 if (!updateGui) 174 return; 175 176 IMailFolderCommandReference r = (IMailFolderCommandReference) getReference(); 178 179 srcFolder = (IMailbox) r.getSourceFolder(); 181 182 ((StatusObservableImpl) srcFolder.getObservable()).setWorker(wsc); 184 185 uid = r.getUids()[0]; 187 188 if (!srcFolder.exists(uid)) { 189 return; 190 } 191 192 try { 193 flags = srcFolder.getFlags(uid); 195 196 IMessageController messageController = ((MessageViewOwner) mediator) 198 .getMessageController(); 199 200 messageController.showMessage(srcFolder, uid); 201 202 restartMarkAsReadTimer(flags, messageController, r); 203 204 prepareContextData(); 206 } catch (FolderInconsistentException e) { 207 Object [] options = new String [] { MailResourceLoader.getString("", 208 "global", "ok").replaceAll("&", ""), }; 209 int result = JOptionPane.showOptionDialog(FrameManager.getInstance() 210 .getActiveFrame(), MailResourceLoader 211 .getString("dialog", "error", "message_deleted"), "Error", 212 JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, null, 213 null, null); 214 215 if (result == JOptionPane.YES_OPTION) { 216 SyncHeaderList.sync((AbstractMessageFolder) srcFolder, 218 srcFolder.getHeaderList()); 219 } 220 221 throw new CommandCancelledException(); 222 } 223 } 224 225 private void prepareContextData() throws Exception { 226 227 value = mediator.getSemanticContext().createValue(); 229 230 Object fromObj = srcFolder.getAttribute(uid, "columba.from"); 232 if (fromObj instanceof Address) { 233 name = NameParser.getInstance().parseDisplayName(((Address)fromObj).getDisplayName()); 234 from = (Address) fromObj; 235 } else if ( fromObj instanceof String ){ 236 name = NameParser.getInstance().parseDisplayName((String ) fromObj); 237 } 238 239 subject = (String ) srcFolder.getAttribute(uid, "columba.subject"); 240 date = (Date ) srcFolder.getAttribute(uid, "columba.date"); 241 242 } 243 244 private void restartMarkAsReadTimer(Flags flags, 245 IMessageController messageController, IMailFolderCommandReference r) 246 throws Exception { 247 248 if (flags == null) 249 return; 250 if (!flags.getSeen() && !srcFolder.isReadOnly()) { 252 MarkAsReadTimer.getInstance().start(messageController, r); 253 } 254 } 255 256 259 public void selectionChanged(SelectionChangedEvent e) { 260 261 IMailFolderCommandReference r = (IMailFolderCommandReference) getReference(); 263 264 IMailbox folder = (IMailbox) r.getSourceFolder(); 266 267 Object [] uid = r.getUids(); 269 270 IMailFolder newFolder = ((TableSelectionChangedEvent) e).getFolder(); 272 Object [] newUid = ((TableSelectionChangedEvent) e).getUids(); 273 274 if (folder == null) 276 return; 277 if (newUid == null || newUid.length == 0) 278 return; 279 280 if (folder.getId() != newFolder.getId()) 284 updateGui = false; 285 286 if (uid[0].equals(newUid[0]) == false) 287 updateGui = false; 288 289 } 290 } | Popular Tags |