1 package org.columba.mail.gui.message; 18 19 import java.awt.BorderLayout ; 20 import java.awt.Color ; 21 import java.awt.event.ComponentEvent ; 22 import java.awt.event.ComponentListener ; 23 24 import javax.swing.BorderFactory ; 25 import javax.swing.JComponent ; 26 import javax.swing.JPanel ; 27 import javax.swing.UIManager ; 28 import javax.swing.border.Border ; 29 import javax.swing.border.LineBorder ; 30 import javax.swing.event.EventListenerList ; 31 32 import org.columba.core.charset.CharsetEvent; 33 import org.columba.core.charset.CharsetListener; 34 import org.columba.core.charset.CharsetOwnerInterface; 35 import org.columba.core.command.CommandCancelledException; 36 import org.columba.core.command.CommandProcessor; 37 import org.columba.core.gui.menu.ExtendablePopupMenu; 38 import org.columba.core.xml.XmlElement; 39 import org.columba.mail.command.IMailFolderCommandReference; 40 import org.columba.mail.command.MailFolderCommandReference; 41 import org.columba.mail.config.MailConfig; 42 import org.columba.mail.folder.IMailbox; 43 import org.columba.mail.gui.frame.MailFrameMediator; 44 import org.columba.mail.gui.message.command.ViewMessageCommand; 45 import org.columba.mail.gui.message.filter.PGPMessageFilter; 46 import org.columba.mail.gui.message.viewer.HeaderViewer; 47 import org.columba.mail.gui.message.viewer.MessageBorder; 48 import org.columba.mail.gui.message.viewer.SecurityStatusViewer; 49 import org.columba.mail.gui.message.viewer.SpamStatusViewer; 50 import org.columba.mail.gui.message.viewer.TextViewer; 51 import org.columba.ristretto.message.MimePart; 52 import org.columba.ristretto.message.MimeTree; 53 import org.columba.ristretto.message.MimeType; 54 55 59 public class MessageController extends JPanel implements CharsetListener, 60 IMessageController { 61 62 private MailFrameMediator frameController; 63 64 private SecurityStatusViewer securityStatusViewer; 65 66 private TextViewer bodytextViewer; 67 68 private SpamStatusViewer spamStatusViewer; 69 70 private HeaderViewer headerController; 71 72 private PGPMessageFilter pgpFilter; 73 74 private ExtendablePopupMenu menu; 75 76 private IMailbox folder; 77 78 private Object uid; 79 80 protected EventListenerList listenerList = new EventListenerList (); 81 82 public MessageController(MailFrameMediator frameMediator) { 83 this.frameController = frameMediator; 84 85 Border outterBorder = BorderFactory.createCompoundBorder(BorderFactory 86 .createEmptyBorder(5, 5, 5, 5), new MessageBorder( 87 Color.LIGHT_GRAY, 1, true)); 88 Border innerBorder = BorderFactory.createCompoundBorder(outterBorder, 89 new LineBorder (Color.WHITE, 5, true)); 90 91 setBorder(innerBorder); 92 93 initComponents(); 94 95 layoutComponents(); 96 97 ((CharsetOwnerInterface) getFrameController()).addCharsetListener(this); 98 99 addComponentListener(new ComponentListener () { 100 101 public void componentHidden(ComponentEvent e) { 102 } 103 104 public void componentMoved(ComponentEvent e) { 105 } 106 107 public void componentResized(ComponentEvent e) { 108 try { 109 if (getSelectedMessageId() != null) { 110 updateGUI(); 111 repaint(); 112 } 113 114 } catch (Exception e1) { 115 e1.printStackTrace(); 116 } 117 } 118 119 public void componentShown(ComponentEvent e) { 120 } 121 122 }); 123 } 124 125 private void initComponents() { 126 spamStatusViewer = new SpamStatusViewer(this); 127 bodytextViewer = new TextViewer(this); 128 securityStatusViewer = new SecurityStatusViewer(); 129 headerController = new HeaderViewer(this, securityStatusViewer, 130 spamStatusViewer); 131 132 pgpFilter = new PGPMessageFilter(getFrameController(), this); 133 pgpFilter.addSecurityStatusListener(securityStatusViewer); 134 135 } 136 137 private void layoutComponents() { 138 139 Color backgroundColor = UIManager.getColor("TextField.background"); 140 141 setLayout(new BorderLayout ()); 142 143 JPanel top = new JPanel (); 144 top.setBackground(backgroundColor); 145 top.setLayout(new BorderLayout ()); 146 147 if (spamStatusViewer.isVisible()) 148 top.add(spamStatusViewer.getView(), BorderLayout.NORTH); 149 150 top.add(headerController, BorderLayout.CENTER); 151 152 add(top, BorderLayout.NORTH); 153 154 159 JComponent c = bodytextViewer.getView(); 160 c.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); 161 c.setBackground(backgroundColor); 162 164 add(c, BorderLayout.CENTER); 165 } 166 167 public void clear() { 168 170 } 171 172 180 public IMailFolderCommandReference filterMessage(IMailbox folder, Object uid) 181 throws Exception { 182 return pgpFilter.filter(folder, uid); 183 } 184 185 190 public MailFrameMediator getFrameController() { 191 return frameController; 192 } 193 194 198 public void charsetChanged(CharsetEvent e) { 199 CommandProcessor.getInstance().addOp( 200 new ViewMessageCommand(getFrameController(), 201 ((MailFrameMediator) getFrameController()) 202 .getTableSelection())); 203 } 204 205 206 207 217 public void showMessage(IMailbox folder, Object uid) throws Exception { 218 this.folder = folder; 219 this.uid = uid; 220 221 IMailFolderCommandReference newRefs = filterMessage(folder, uid); 223 224 if (newRefs != null) { 226 folder = (IMailbox) newRefs.getSourceFolder(); 227 uid = newRefs.getUids()[0]; 228 } 229 230 MimeTree mimePartTree = folder.getMimePartTree(uid); 231 if (mimePartTree == null) 232 throw new CommandCancelledException( 233 "Message does not exist anymore."); 234 235 MimePart mp = chooseBodyPart(mimePartTree); 236 if (mp != null) 237 bodytextViewer.view(folder, uid, mp.getAddress(), this 238 .getFrameController()); 239 240 spamStatusViewer.view(folder, uid, this.getFrameController()); 241 securityStatusViewer.view(folder, uid, this.getFrameController()); 242 243 headerController.view(folder, uid, this.getFrameController()); 244 245 fireMessageSelectionChangedEvent(folder, uid.toString()); 247 } 248 249 256 public void updateGUI() throws Exception { 257 258 bodytextViewer.updateGUI(); 259 260 spamStatusViewer.updateGUI(); 261 securityStatusViewer.updateGUI(); 262 263 headerController.updateGUI(); 264 265 } 266 267 270 public IMailFolderCommandReference getSelectedReference() { 271 return new MailFolderCommandReference(folder, new Object [] { uid }); 272 } 273 274 public JComponent getView() { 275 return this; 276 } 277 278 281 public String getSelectedText() { 282 return bodytextViewer.getSelectedText(); 283 } 284 285 288 public String getText() { 289 return bodytextViewer.getText(); 290 } 291 292 public IMailbox getSelectedFolder() { 293 return folder; 294 } 295 296 public Object getSelectedMessageId() { 297 return uid; 298 } 299 300 private MimePart chooseBodyPart(MimeTree mimePartTree) { 301 MimePart bodyPart = null; 302 303 XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig() 304 .getRoot().getElement("/options/html"); 305 306 309 if ((Boolean.valueOf(html.getAttribute("prefer")).booleanValue()) 311 && hasHtmlPart(mimePartTree.getRootMimeNode())) { 312 bodyPart = mimePartTree.getFirstTextPart("html"); 313 } else { 314 bodyPart = mimePartTree.getFirstTextPart("plain"); 315 } 316 317 return bodyPart; 318 319 } 320 321 private boolean hasHtmlPart(MimePart mimeTypes) { 322 323 if (mimeTypes.getHeader().getMimeType().equals( 324 new MimeType("text", "plain"))) 325 return true; 327 java.util.List children = mimeTypes.getChilds(); 328 329 for (int i = 0; i < children.size(); i++) { 330 if (hasHtmlPart(mimeTypes.getChild(i))) 331 return true; 332 } 333 334 return false; 335 336 } 337 338 341 public void setCaretPosition(int position) { 342 bodytextViewer.setCaretPosition(position); 343 } 344 345 348 public void moveCaretPosition(int position) { 349 bodytextViewer.moveCaretPosition(position); 350 } 351 352 public void addMessageSelectionListener(IMessageSelectionListener l) { 353 listenerList.add(IMessageSelectionListener.class, l); 354 } 355 356 public void removeMessageSelectionListener(IMessageSelectionListener l) { 357 listenerList.remove(IMessageSelectionListener.class, l); 358 } 359 360 protected void fireMessageSelectionChangedEvent(IMailbox folder, String messageId) { 361 362 IMessageSelectionEvent e = new MessageSelectionEvent(this, folder, messageId); 363 Object [] listeners = listenerList.getListenerList(); 365 366 for (int i = listeners.length - 2; i >= 0; i -= 2) { 369 if (listeners[i] == IMessageSelectionListener.class) { 370 ((IMessageSelectionListener) listeners[i + 1]).selectionChanged(e); 371 } 372 } 373 } 374 375 } | Popular Tags |