Author: echatellier Date: 2014-08-04 16:03:00 +0200 (Mon, 04 Aug 2014) New Revision: 461 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/461 Log: fixes #5556: Pouvoir reforwarder un mail envoy?\195?\169 en plus de pouvoir le visualiser Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java 2014-08-04 14:03:00 UTC (rev 461) @@ -86,14 +86,6 @@ private final static Log log = LogFactory.getLog(DemandRepliesUIHandler.class); -// @Override -// public void beforeInit(DemandRepliesUI ui) { -// super.beforeInit(ui); -// -// DemandeUIModel currentEmail = getContext().getCurrentEmail(); -// this.ui.setContextValue(currentEmail); -// } - @Override public void afterInit(DemandRepliesUI ui) { super.afterInit(ui); @@ -197,7 +189,9 @@ // TODO echatellier 20140804 : c'est très technique et très bas niveau, ca devrait se trouver dans les services Message message = new MimeMessage(null, new ByteArrayInputStream(reply.getEmailSource().getBytes())); ReplyFormUIModel replyModel = dialogContent.getModel(); + replyModel.setOriginalDemand(ui.getModel()); replyModel.setReadonly(true); + replyModel.setReadSentDate(reply.getSentDate()); replyModel.setSubject(message.getSubject()); replyModel.setTo(message.getRecipients(RecipientType.TO)[0].toString()); replyModel.setFrom(message.getFrom()[0].toString()); @@ -219,14 +213,46 @@ openFrame(dialogContent, t("faxtomail.reply.title", getModel().getSubject()), new Dimension(800, 600)); } catch (Exception e) { - getContext().getErrorHelper().showErrorDialog(t("faxtomail.demandReplies.error")); + getContext().getErrorHelper().showErrorDialog(t("faxtomail.demandReplies.error"), e); } -// FaxToMailUIContext context = getContext(); -// context.setCurrentEmails(demande); -// context.getActionEngine().runAction(new ShowDemandeAction(context.getMainUI().getHandler())); } + + public void openForward(Reply reply) { + closeEditor(); + try { + ReplyFormUI dialogContent = new ReplyFormUI(ui); + // TODO echatellier 20140804 : c'est très technique et très bas niveau, ca devrait se trouver dans les services + Message message = new MimeMessage(null, new ByteArrayInputStream(reply.getEmailSource().getBytes())); + ReplyFormUIModel replyModel = dialogContent.getModel(); + replyModel.setOriginalDemand(ui.getModel()); + replyModel.setReadSentDate(reply.getSentDate()); + replyModel.setSubject(t("faxtomail.reply.forwardsubject", message.getSubject())); + + if (message.isMimeType("multipart/*")) { + decomposeMultipartEmail(message, replyModel, reply.getTopiaId()); + + } else { + String content = IOUtils.toString(message.getInputStream()); + replyModel.setMessage(content); + } + + // XXX: à verifier pour le format, et si on quote ou pas encore le forward + String quotedReply = t("faxtomail.reply.message", + decorate(reply.getSentDate()), + message.getRecipients(RecipientType.TO)[0].toString(), + replyModel.getMessage().replaceAll("\n", "\n> ")); + replyModel.setMessage(quotedReply); + + openFrame(dialogContent, t("faxtomail.reply.forward", message.getSubject()), new Dimension(800, 600)); + + } catch (Exception e) { + getContext().getErrorHelper().showErrorDialog(t("faxtomail.demandReplies.error"), e); + } + + } + /** * Decompose a multipart part. * - sets the email content if the part contains a text bodypart Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.css 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.css 2014-08-04 14:03:00 UTC (rev 461) @@ -39,6 +39,11 @@ floatable: false; } +#openForwardButton { + actionIcon: "transmit"; + toolTipText: "faxtomail.demandReplies.action.forward.tip"; +} + #openReplyButton { actionIcon: "open"; toolTipText: "faxtomail.demandReplies.action.open.tip"; Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.jaxx 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.jaxx 2014-08-04 14:03:00 UTC (rev 461) @@ -46,6 +46,8 @@ <JLabel id='replySubjectLabel' constraints='BorderLayout.CENTER'/> <JToolBar id='toolbar' constraints='BorderLayout.EAST'> + <JButton id='openForwardButton' + onActionPerformed='handler.openForward(reply)'/> <JButton id='openReplyButton' onActionPerformed='handler.openReply(reply)'/> </JToolBar> Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.css 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.css 2014-08-04 14:03:00 UTC (rev 461) @@ -119,6 +119,12 @@ selected: { String.valueOf(model.isReadonly()) }; } +#forwardButton { + actionIcon: transmit; + text: "faxtomail.reply.action.forward"; + toolTipText: "faxtomail.reply.action.forward.tip"; +} + #closeButton { actionIcon: cancel; text: "faxtomail.reply.action.close"; Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.jaxx 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.jaxx 2014-08-04 14:03:00 UTC (rev 461) @@ -162,6 +162,7 @@ constraints='BorderLayout.SOUTH'> <JPanel constraints='"true"' layout='{new GridLayout(1, 0)}'> + <JButton id='forwardButton' onActionPerformed='handler.forward()'/> <JButton id='closeButton' onActionPerformed='handler.cancel()'/> </JPanel> <JPanel constraints='"false"' Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java 2014-08-04 14:03:00 UTC (rev 461) @@ -27,18 +27,23 @@ import static org.nuiton.i18n.I18n.t; import com.franciaflex.faxtomail.persistence.entities.AttachmentFileImpl; - import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; import com.franciaflex.faxtomail.services.service.EmailService; import com.google.common.base.Strings; + import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.nuiton.validator.bean.simple.SimpleBeanValidator; import java.awt.Component; +import java.awt.Dimension; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; @@ -46,6 +51,14 @@ import java.util.Collection; import java.util.List; +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.mail.BodyPart; +import javax.mail.Message; +import javax.mail.Part; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import javax.mail.internet.MimeMessage.RecipientType; import javax.swing.ComboBoxEditor; import javax.swing.JComboBox; import javax.swing.JComponent; @@ -63,6 +76,7 @@ import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; import com.franciaflex.faxtomail.persistence.entities.MailFolder; +import com.franciaflex.faxtomail.persistence.entities.Reply; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; import com.franciaflex.faxtomail.ui.swing.util.Cancelable; @@ -400,4 +414,42 @@ editorComponent.removeActionListener(l); } } + + /** + * Close current dialog ui, and reopen a new one for transfering repons to new recipient. + */ + public void forward() { + closeFrame(); + + try { + // display a new ui with a copy of original ui model + ReplyFormUI dialogContent = new ReplyFormUI(ui); + ReplyFormUIModel replyModel = dialogContent.getModel(); + replyModel.fromModel(ui.getModel()); + + // XXX: à verifier pour le format, et si on quote ou pas encore le forward + String quotedReply = t("faxtomail.reply.message", + decorate(replyModel.getReadSentDate()), + replyModel.getFrom(), + replyModel.getMessage().replaceAll("\n", "\n> ")); + replyModel.setMessage(quotedReply); + replyModel.setSubject(t("faxtomail.reply.forwardsubject", replyModel.getSubject())); + + // clear fields that need to be filled by hand + replyModel.setReadonly(false); + replyModel.setReadSentDate(null); + replyModel.setTo(null); + replyModel.setCc(null); + replyModel.setCci(null); + + openFrame(dialogContent, t("faxtomail.reply.forward", getModel().getSubject()), new Dimension(800, 600)); + + } catch (Exception ex) { + if (log.isErrorEnabled()) { + log.error("Can't display forward frame", ex); + } + getContext().getErrorHelper().showErrorDialog(t("faxtomail.demandReplies.error"), ex); + } + + } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java 2014-08-04 14:03:00 UTC (rev 461) @@ -24,18 +24,21 @@ * #L% */ -import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; -import com.google.common.base.Preconditions; +import java.io.File; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.beans.AbstractSerializableBean; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; -import java.io.File; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; +import com.google.common.base.Preconditions; /** * @author Kevin Morin (Code Lutin) @@ -53,12 +56,13 @@ public static final String PROPERTY_MESSAGE = "message"; public static final String PROPERTY_ORIGINAL_DEMAND = "originalDemand"; public static final String PROPERTY_ATTACHMENT = "attachment"; - public static final String PROPERTY_READONLY = "readonly"; public static final String PROPERTY_MAX_ATTACHMENT_LENGTH = "maxAttachmentLength"; public static final String PROPERTY_TOTAL_ATTACHMENT_LENGTH = "totalAttachmentLength"; public static final String PROPERTY_VALID = "valid"; public static final String PROPERTY_SENDER_ALLOWED_DOMAINS = "senderAllowedDomains"; public static final String PROPERTY_SENDER_ALLOWED_ADDRESSES = "senderAllowedAddresses"; + public static final String PROPERTY_READONLY = "readonly"; + public static final String PROPERTY_READ_SENT_DATE = "readSentDate"; protected String to; protected String cc; @@ -70,7 +74,13 @@ protected long maxAttachmentLength = 0; protected long totalAttachmentLength = 0; protected boolean valid = true; + + /** Flag pour marquer les champs non editables dans le cas d'une lecture d'une réponse déjà envoyée. */ protected boolean readonly = false; + + /** Date d'envoi d'une réponse ouverte en lecture seule (peut être {@code null}). */ + protected Date readSentDate; + protected List<String> senderAllowedDomains; protected List<String> senderAllowedAddresses; @@ -79,6 +89,12 @@ protected File lastVisitedDirectory = FileUtils.getUserDirectory(); + protected Binder<ReplyFormUIModel, ReplyFormUIModel> copyBinder = BinderFactory.newBinder(ReplyFormUIModel.class); + + public void fromModel(ReplyFormUIModel other) { + copyBinder.copyExcluding(other, this); + } + public String getTo() { return to; } @@ -164,6 +180,14 @@ setTotalAttachmentLength(totalAttachmentLength - attachment.getLength()); } + + public void setAttachments(Set<ReplyAttachmentModel> attachments) { + this.attachments = attachments; + if (availableAttachments != null) { + availableAttachments.removeAll(attachments); + } + firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachments()); + } public Set<ReplyAttachmentModel> getAvailableAttachments() { return availableAttachments; @@ -195,6 +219,16 @@ firePropertyChange(PROPERTY_READONLY, oldValue, readonly); } + public void setReadSentDate(Date readSentDate) { + Object oldValue = this.readSentDate; + this.readSentDate = readSentDate; + firePropertyChange(PROPERTY_READ_SENT_DATE, oldValue, readSentDate); + } + + public Date getReadSentDate() { + return readSentDate; + } + public long getMaxAttachmentLength() { return maxAttachmentLength / 1024; } Modified: trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties =================================================================== --- trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties 2014-08-04 09:42:59 UTC (rev 460) +++ trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties 2014-08-04 14:03:00 UTC (rev 461) @@ -67,6 +67,7 @@ faxtomail.demandGroup.action.tip=Éléments groupés avec l'élément courant faxtomail.demandGroup.text=Groupe (%s) faxtomail.demandGroup.title=Groupe +faxtomail.demandReplies.action.forward.tip= faxtomail.demandReplies.action.open.tip=Visualiser la réponse faxtomail.demandReplies.action.tip=Réponses envoyées faxtomail.demandReplies.empty=Aucune réponse envoyée @@ -232,11 +233,15 @@ faxtomail.reply.action.cancel.tip=Annuler et fermer la popup faxtomail.reply.action.close=Fermer faxtomail.reply.action.close.tip=Fermer +faxtomail.reply.action.forward=Transférer +faxtomail.reply.action.forward.tip=Retransférer la réponse vers une autre adresse email faxtomail.reply.action.validate=Envoyer faxtomail.reply.action.validate.tip=Envoyer la réponse au mail faxtomail.reply.attachment.label=%1$s (%2$s ko) faxtomail.reply.attachments.add.label=Ajouter des pièces jointes faxtomail.reply.attachments.title=Pièces-jointes (%1$s / %2$s ko autorisés) +faxtomail.reply.forward=Tranfer de la réponse \: %s +faxtomail.reply.forwardsubject=Tr\: %s faxtomail.reply.label.cc=Copie \: faxtomail.reply.label.cci=Copie cachée \: faxtomail.reply.label.from=De \: