KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > message > MessageController


1 //The contents of this file are subject to the Mozilla Public License Version 1.1
2
//(the "License"); you may not use this file except in compliance with the
3
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
4
//
5
//Software distributed under the License is distributed on an "AS IS" basis,
6
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
7
//for the specific language governing rights and
8
//limitations under the License.
9
//
10
//The Original Code is "The Columba Project"
11
//
12
//The Initial Developers of the Original Code are Frederik Dietz and Timo
13
// Stich.
14
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
15
//
16
//All Rights Reserved.
17
package org.columba.mail.gui.message;
18
19 import java.awt.BorderLayout JavaDoc;
20 import java.awt.Color JavaDoc;
21 import java.awt.event.ComponentEvent JavaDoc;
22 import java.awt.event.ComponentListener JavaDoc;
23
24 import javax.swing.BorderFactory JavaDoc;
25 import javax.swing.JComponent JavaDoc;
26 import javax.swing.JPanel JavaDoc;
27 import javax.swing.UIManager JavaDoc;
28 import javax.swing.border.Border JavaDoc;
29 import javax.swing.border.LineBorder JavaDoc;
30 import javax.swing.event.EventListenerList JavaDoc;
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 /**
56  * Shows the message. This includes message headers, body text, attachments and
57  * status.
58  */

59 public class MessageController extends JPanel JavaDoc 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 JavaDoc uid;
79
80     protected EventListenerList JavaDoc listenerList = new EventListenerList JavaDoc();
81     
82     public MessageController(MailFrameMediator frameMediator) {
83         this.frameController = frameMediator;
84
85         Border JavaDoc outterBorder = BorderFactory.createCompoundBorder(BorderFactory
86                 .createEmptyBorder(5, 5, 5, 5), new MessageBorder(
87                 Color.LIGHT_GRAY, 1, true));
88         Border JavaDoc innerBorder = BorderFactory.createCompoundBorder(outterBorder,
89                 new LineBorder JavaDoc(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 JavaDoc() {
100
101             public void componentHidden(ComponentEvent JavaDoc e) {
102             }
103
104             public void componentMoved(ComponentEvent JavaDoc e) {
105             }
106
107             public void componentResized(ComponentEvent JavaDoc e) {
108                 try {
109                     if (getSelectedMessageId() != null) {
110                         updateGUI();
111                         repaint();
112                     }
113
114                 } catch (Exception JavaDoc e1) {
115                     e1.printStackTrace();
116                 }
117             }
118
119             public void componentShown(ComponentEvent JavaDoc 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 JavaDoc backgroundColor = UIManager.getColor("TextField.background");
140
141         setLayout(new BorderLayout JavaDoc());
142
143         JPanel JavaDoc top = new JPanel JavaDoc();
144         top.setBackground(backgroundColor);
145         top.setLayout(new BorderLayout JavaDoc());
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         // JPanel bottom = new JPanel();
155
// bottom.setBackground(backgroundColor);
156
//
157
// bottom.setLayout(new BorderLayout());
158

159         JComponent JavaDoc c = bodytextViewer.getView();
160         c.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0));
161         c.setBackground(backgroundColor);
162         // bottom.add(c, BorderLayout.CENTER);
163

164         add(c, BorderLayout.CENTER);
165     }
166
167     public void clear() {
168         // TODO implement clear()
169

170     }
171
172     /**
173      * @param folder
174      * @param uid
175      * @return
176      * @throws Exception
177      * @see org.columba.mail.gui.message.IMessageController#filterMessage(org.columba.mail.folder.IMailbox,
178      * java.lang.Object)
179      */

180     public IMailFolderCommandReference filterMessage(IMailbox folder, Object JavaDoc uid)
181             throws Exception JavaDoc {
182         return pgpFilter.filter(folder, uid);
183     }
184
185     /**
186      * Returns the mailFrameController.
187      *
188      * @return MailFrameController
189      */

190     public MailFrameMediator getFrameController() {
191         return frameController;
192     }
193
194     /**
195      * @param e
196      * @see org.columba.core.util.CharsetListener#charsetChanged(org.columba.core.util.CharsetEvent)
197      */

198     public void charsetChanged(CharsetEvent e) {
199         CommandProcessor.getInstance().addOp(
200                 new ViewMessageCommand(getFrameController(),
201                         ((MailFrameMediator) getFrameController())
202                                 .getTableSelection()));
203     }
204
205     /** *********************************************************************** */
206
207     /**
208      * Show message in messages viewer. Should be called in
209      * <code>Command.execute()</code> or in another background thread.
210      *
211      * @param folder
212      * selected folder
213      * @param uid
214      * selected message UID
215      * @throws Exception
216      */

217     public void showMessage(IMailbox folder, Object JavaDoc uid) throws Exception JavaDoc {
218         this.folder = folder;
219         this.uid = uid;
220
221         // if necessary decrypt/verify message
222
IMailFolderCommandReference newRefs = filterMessage(folder, uid);
223
224         // map to new reference
225
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         // notify all interested listeners
246
fireMessageSelectionChangedEvent(folder, uid.toString());
247     }
248
249     /**
250      * Revalidate message viewer components.
251      * <p>
252      * Call this method after showMessage() to force a repaint():
253      * @throws Exception
254      *
255      */

256     public void updateGUI() throws Exception JavaDoc {
257
258         bodytextViewer.updateGUI();
259
260         spamStatusViewer.updateGUI();
261         securityStatusViewer.updateGUI();
262
263         headerController.updateGUI();
264
265     }
266
267     /**
268      * @see org.columba.mail.gui.message.IMessageController#getSelectedReference()
269      */

270     public IMailFolderCommandReference getSelectedReference() {
271         return new MailFolderCommandReference(folder, new Object JavaDoc[] { uid });
272     }
273
274     public JComponent JavaDoc getView() {
275         return this;
276     }
277
278     /**
279      * @see org.columba.mail.gui.message.IMessageController#getSelectedText()
280      */

281     public String JavaDoc getSelectedText() {
282         return bodytextViewer.getSelectedText();
283     }
284
285     /**
286      * @see org.columba.mail.gui.message.IMessageController#getText()
287      */

288     public String JavaDoc getText() {
289         return bodytextViewer.getText();
290     }
291
292     public IMailbox getSelectedFolder() {
293         return folder;
294     }
295
296     public Object JavaDoc 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         // ensure that there is an HTML part in the email, otherwise JTextPanel
307
// throws a RuntimeException
308

309         // Which Bodypart shall be shown? (html/plain)
310
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; // exit immediately
326

327         java.util.List JavaDoc 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     /**
339      * @see org.columba.mail.gui.message.IMessageController#setCaretPosition(int)
340      */

341     public void setCaretPosition(int position) {
342         bodytextViewer.setCaretPosition(position);
343     }
344
345     /**
346      * @see org.columba.mail.gui.message.IMessageController#moveCaretPosition(int)
347      */

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 JavaDoc messageId) {
361
362         IMessageSelectionEvent e = new MessageSelectionEvent(this, folder, messageId);
363         // Guaranteed to return a non-null array
364
Object JavaDoc[] listeners = listenerList.getListenerList();
365
366         // Process the listeners last to first, notifying
367
// those that are interested in this event
368
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