KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > composer > command > OpenMessageWithComposerCommand


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 Stich.
13
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
14
//
15
//All Rights Reserved.
16

17 package org.columba.mail.gui.composer.command;
18
19 import java.io.InputStream JavaDoc;
20 import java.nio.charset.Charset JavaDoc;
21 import java.nio.charset.UnsupportedCharsetException JavaDoc;
22 import java.util.Iterator JavaDoc;
23 import java.util.List JavaDoc;
24
25 import org.columba.api.command.ICommandReference;
26 import org.columba.api.command.IWorkerStatusController;
27 import org.columba.core.command.Command;
28 import org.columba.core.gui.frame.DefaultContainer;
29 import org.columba.core.io.StreamUtils;
30 import org.columba.core.xml.XmlElement;
31 import org.columba.mail.command.MailFolderCommandReference;
32 import org.columba.mail.composer.MessageBuilderHelper;
33 import org.columba.mail.config.AccountItem;
34 import org.columba.mail.config.MailConfig;
35 import org.columba.mail.folder.IMailbox;
36 import org.columba.mail.gui.composer.ComposerController;
37 import org.columba.mail.gui.composer.ComposerModel;
38 import org.columba.ristretto.coder.Base64DecoderInputStream;
39 import org.columba.ristretto.coder.CharsetDecoderInputStream;
40 import org.columba.ristretto.coder.QuotedPrintableDecoderInputStream;
41 import org.columba.ristretto.io.Source;
42 import org.columba.ristretto.io.TempSourceFactory;
43 import org.columba.ristretto.message.BasicHeader;
44 import org.columba.ristretto.message.Flags;
45 import org.columba.ristretto.message.Header;
46 import org.columba.ristretto.message.LocalMimePart;
47 import org.columba.ristretto.message.Message;
48 import org.columba.ristretto.message.MimeHeader;
49 import org.columba.ristretto.message.MimePart;
50 import org.columba.ristretto.message.MimeTree;
51 import org.columba.ristretto.message.StreamableMimePart;
52 import org.columba.ristretto.parser.MessageParser;
53
54 /**
55  * Open message in composer.
56  *
57  * @author fdietz
58  */

59 public class OpenMessageWithComposerCommand extends Command {
60     protected ComposerController controller;
61     protected ComposerModel model;
62     protected IMailbox folder;
63     protected Object JavaDoc uid;
64
65     /**
66      * Constructor for OpenMessageInComposerCommand.
67      *
68      * @param frameMediator
69      * @param references
70      */

71     public OpenMessageWithComposerCommand(ICommandReference reference) {
72         super(reference);
73     }
74
75     public void updateGUI() throws Exception JavaDoc {
76         // open composer frame
77
controller = new ComposerController();
78         new DefaultContainer(controller);
79
80         // apply model
81
controller.setComposerModel(model);
82
83         // model->view update
84
controller.updateComponents(true);
85     }
86
87     public void execute(IWorkerStatusController worker) throws Exception JavaDoc {
88         model = new ComposerModel();
89
90         // get selected folder
91
folder = (IMailbox) ((MailFolderCommandReference) getReference())
92                 .getSourceFolder();
93
94         // get selected messages
95
Object JavaDoc[] uids = ((MailFolderCommandReference) getReference()).getUids();
96
97         // we only need the first message
98
uid = uids[0];
99
100         //TODO (@author fdietz): keep track of progress here
101

102         InputStream JavaDoc messageSourceStream = folder.getMessageSourceStream(uid);
103         Source tempSource = TempSourceFactory.createTempSource(
104                 messageSourceStream, -1);
105         messageSourceStream.close();
106
107         Message message = MessageParser.parse(tempSource);
108
109         initHeader(message);
110         
111         // get message flags
112
Flags flags = folder.getFlags(uid);
113         model.getMessage().getHeader().setFlags(flags);
114
115         // select the account this mail was received from
116
Integer JavaDoc accountUid = (Integer JavaDoc) folder.getAttribute(uids[0],
117                 "columba.accountuid");
118         AccountItem accountItem = MessageBuilderHelper
119                 .getAccountItem(accountUid);
120         model.setAccountItem(accountItem);
121
122         XmlElement html = MailConfig.getInstance().getMainFrameOptionsConfig()
123                 .getRoot().getElement("/options/html");
124
125         boolean preferHtml = Boolean.valueOf(html.getAttribute("prefer"))
126                 .booleanValue();
127
128         initBody(message, preferHtml);
129         
130         // store reference to source message
131
model.setSourceReference(new MailFolderCommandReference(folder, new Object JavaDoc[] {uid}));
132     }
133
134     private void initBody(Message message, boolean preferHtml) throws Exception JavaDoc {
135         MimeTree mimeTree = message.getMimePartTree();
136
137         // Which Bodypart shall be shown? (html/plain)
138
LocalMimePart bodyPart = null;
139
140         if (preferHtml) {
141             bodyPart = (LocalMimePart) mimeTree.getFirstTextPart("html");
142         } else {
143             bodyPart = (LocalMimePart) mimeTree.getFirstTextPart("plain");
144         }
145
146         if (bodyPart != null) {
147             MimeHeader header = bodyPart.getHeader();
148             if (header.getMimeType().getSubtype().equals("html")) {
149                 // html
150
model.setHtml(true);
151             } else {
152                 model.setHtml(false);
153             }
154             InputStream JavaDoc bodyStream = folder.getMimePartBodyStream(uid, bodyPart.getAddress());
155             
156             // Do decoding stuff
157
switch( header.getContentTransferEncoding() ) {
158                 case MimeHeader.QUOTED_PRINTABLE : {
159                     bodyStream = new QuotedPrintableDecoderInputStream(bodyStream);
160                     break;
161                 }
162                 
163                 case MimeHeader.BASE64 : {
164                     bodyStream = new Base64DecoderInputStream(bodyStream);
165                 }
166             }
167             String JavaDoc charset = header.getContentParameter("charset");
168             if (charset != null) {
169                 try {
170                     bodyStream = new CharsetDecoderInputStream(bodyStream, Charset.forName(charset));
171                     model.setCharset(Charset.forName(charset));
172                 } catch( UnsupportedCharsetException JavaDoc e ) {
173                     // Stick with the default charset
174
}
175             }
176
177             model.setBodyText(StreamUtils.readCharacterStream(
178                     bodyStream)
179                     .toString());
180
181         }
182
183         initAttachments(mimeTree, bodyPart);
184     }
185
186     private void initHeader(Message message) {
187         Header header = message.getHeader();
188
189         BasicHeader rfcHeader = new BasicHeader(header);
190
191         // set subject
192
model.setSubject(rfcHeader.getSubject());
193
194         model.setTo(rfcHeader.getTo());
195         
196         model.setCc(rfcHeader.getCc());
197         model.setBcc(rfcHeader.getBcc());
198
199         // copy every headerfield the original message contains
200
model.setHeader(header);
201     }
202
203     private void initAttachments(MimeTree collection, MimePart bodyPart) {
204         // Get all MimeParts
205
List JavaDoc displayedMimeParts = collection.getAllLeafs();
206
207         if (bodyPart != null) {
208             MimePart bodyParent = bodyPart.getParent();
209
210             // remove the bodypart from the mimeparts
211
// that are added to the attachment viewer
212
if (bodyParent != null && bodyParent.getHeader().getMimeType().getSubtype().equals(
213             "alternative")) {
214                 List JavaDoc bodyParts = bodyParent.getChilds();
215                 displayedMimeParts.removeAll(bodyParts);
216             } else {
217                 displayedMimeParts.remove(bodyPart);
218             }
219
220             Iterator JavaDoc it = displayedMimeParts.iterator();
221
222             while (it.hasNext()) {
223                 model.addMimePart((StreamableMimePart) it.next());
224             }
225         }
226     }
227 }
Popular Tags