r36 - in trunk: . faxtomail-persistence/src/main/xmi faxtomail-service faxtomail-service/src/main/java/com/franciaflex/faxtomail/services faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service faxtomail-service/src/main/resources/i18n faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachmen
Author: kmorin Date: 2014-04-17 19:27:05 +0200 (Thu, 17 Apr 2014) New Revision: 36 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/36 Log: refs #4667 [ECRAN] R?\195?\169pondre Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/ButtonDemandReplies.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.jaxx 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/AttachmentItem.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx trunk/faxtomail-ui-swing/src/main/resources/icons/action-cross.png trunk/faxtomail-ui-swing/src/main/resources/icons/action-open.png trunk/faxtomail-ui-swing/src/main/resources/icons/cross_blue.png trunk/faxtomail-ui-swing/src/main/resources/icons/cross_red.png Removed: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/history/ trunk/faxtomail-ui-swing/src/main/resources/icons/action-cross.png trunk/faxtomail-ui-swing/src/main/resources/icons/cross.png Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo trunk/faxtomail-service/pom.xml trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_en_GB.properties trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GroupAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ReplyAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/MainUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ButtonEmailGroup.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupItem.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupItem.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUI.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/ButtonHistory.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryItemModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryListUIHandler.java 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/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractToolbarPopupButton.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_en_GB.properties trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java trunk/pom.xml Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo =================================================================== (Binary files differ) Modified: trunk/faxtomail-service/pom.xml =================================================================== --- trunk/faxtomail-service/pom.xml 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-service/pom.xml 2014-04-17 17:27:05 UTC (rev 36) @@ -113,6 +113,17 @@ <artifactId>xwork-core</artifactId> </dependency> + <dependency> + <groupId>javax.mail</groupId> + <artifactId>mail</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-email</artifactId> + <version>${commonsEmailVersion}</version> + </dependency> + <!-- Logging --> <dependency> Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java 2014-04-17 17:27:05 UTC (rev 36) @@ -3,9 +3,11 @@ import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; import com.franciaflex.faxtomail.persistence.entities.HasLabel; +import com.franciaflex.faxtomail.persistence.entities.Reply; import org.nuiton.decorator.Decorator; import org.nuiton.decorator.DecoratorProvider; +import java.io.File; import java.text.DateFormat; import java.util.Date; @@ -86,6 +88,17 @@ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(bean); } }); + registerDecorator(new Decorator<File>(File.class) { + private static final long serialVersionUID = 1L; + + @Override + public String toString(Object bean) { + if (bean == null) { + return ""; + } + return ((File) bean).getName(); + } + }); registerMultiJXPathDecorator(HasLabel.class, "${label}$s", SEPARATOR, " - "); registerMultiJXPathDecorator(Attachment.class, "${originalFile}$s", SEPARATOR, " - "); registerMultiJXPathDecorator(FaxToMailUser.class, "${trigraph}$s#${firstName}$s#${lastName}$s", SEPARATOR, " "); Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java 2014-04-17 17:27:05 UTC (rev 36) @@ -2,6 +2,7 @@ import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.AttachmentTopiaDao; +import com.franciaflex.faxtomail.persistence.entities.Client; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.EmailGroup; @@ -15,24 +16,54 @@ import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.persistence.entities.RangeRow; import com.franciaflex.faxtomail.persistence.entities.RangeRowTopiaDao; +import com.franciaflex.faxtomail.persistence.entities.Reply; +import com.franciaflex.faxtomail.persistence.entities.ReplyTopiaDao; import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.commons.mail.DefaultAuthenticator; +import org.apache.commons.mail.EmailAttachment; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.MultiPartEmail; +import org.apache.commons.mail.SimpleEmail; import org.nuiton.topia.persistence.TopiaEntityVisitor; import org.nuiton.topia.persistence.internal.AbstractTopiaDao; import org.nuiton.topia.persistence.pager.TopiaPagerBean; +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.BodyPart; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MailDateFormat; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.text.DateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.Properties; import java.util.Set; /** @@ -54,7 +85,8 @@ HistoryTopiaDao historyDao = getPersistenceContext().getHistoryDao(); Set<String> fieldSet = Sets.newHashSet(modifiedFields); - if (!fieldSet.isEmpty() && !fieldSet.contains(Email.PROPERTY_TAKEN_BY)) { + if (email.getTakenBy() == null && + !fieldSet.isEmpty() && !fieldSet.contains(Email.PROPERTY_TAKEN_BY)) { email.setTakenBy(user); fieldSet.add(Email.PROPERTY_TAKEN_BY); } @@ -97,7 +129,7 @@ //TODO transmit to EDI } - History history = historyDao.create(History.PROPERTY_TYPE, HistoryType.MODIFICATION, + History history = historyDao.create(History.PROPERTY_TYPE, email.isHistoryEmpty() ? HistoryType.CREATION : HistoryType.MODIFICATION, History.PROPERTY_FAX_TO_MAIL_USER, user, History.PROPERTY_FIELDS, fieldSet, History.PROPERTY_MODIFICATION_DATE, now); @@ -186,7 +218,7 @@ EmailTopiaDao dao = getPersistenceContext().getEmailDao(); List<Email> result = new ArrayList<>(dao.newQueryBuilder() - .addContainsText(Email.PROPERTY_OBJECT, emailLike.getObject()) + .addContainsText(Email.PROPERTY_SUBJECT, emailLike.getSubject()) .addContainsText(Email.PROPERTY_SENDER, emailLike.getSender()) // .addContainsText(Email.PROPERTY_CLIENT_CODE, emailLike.getClientCode()) .addContainsText(Email.PROPERTY_PROJECT_REFERENCE, emailLike.getProjectReference()) @@ -243,13 +275,13 @@ email1.addHistory(historyDao.create(History.PROPERTY_TYPE, HistoryType.GROUP, History.PROPERTY_FAX_TO_MAIL_USER, user, - History.PROPERTY_FIELDS, Sets.newHashSet(email2.getObject()), + History.PROPERTY_FIELDS, Sets.newHashSet(email2.getSubject()), History.PROPERTY_MODIFICATION_DATE, now)); Email result = emailDao.update(email1); email2.addHistory(historyDao.create(History.PROPERTY_TYPE, HistoryType.GROUP, History.PROPERTY_FAX_TO_MAIL_USER, user, - History.PROPERTY_FIELDS, Sets.newHashSet(email1.getObject()), + History.PROPERTY_FIELDS, Sets.newHashSet(email1.getSubject()), History.PROPERTY_MODIFICATION_DATE, now)); emailDao.update(email2); @@ -257,4 +289,74 @@ return result; } + + public Email reply(String from, String to, String subject, + String content, Collection<File> attachments, + String originalEmailId, FaxToMailUser user) { + + Email email = getEmailById(originalEmailId); + + try { + Properties properties = new Properties(); + + try { + URL smtpPropertiesURL = ClassLoader.getSystemResource("smtp.properties"); + if (smtpPropertiesURL != null) { + properties.load(smtpPropertiesURL.openStream()); + } + } catch(Exception e) { + log.error("error getting the smtp properties", e); + } + + final String smtpUser = properties.getProperty("mail.user"); + final String password = properties.getProperty("mail.password"); + + MultiPartEmail message = new MultiPartEmail(); + message.setHostName(properties.getProperty("mail.smtp.host")); + message.setSmtpPort(Integer.parseInt(properties.getProperty("mail.smtp.port"))); + message.setAuthenticator(new DefaultAuthenticator(smtpUser, password)); + message.setSSLOnConnect(true); + + message.setFrom(from); + message.addTo(to); + message.setSubject(subject); + message.setMsg(content); + + for (File attachment : attachments) { + // Create the attachment + message.attach(attachment); + } + + String emailId = message.send(); + + ReplyTopiaDao replyTopiaDao = getPersistenceContext().getReplyDao(); + Date now = new Date(); + String emailSource = String.format("Date: %1$s\nFrom: %2$s\nTo: %3$s\nMessage-ID: %4$s\nSubject: %5$s\nContent-Type: %6$s\n", + MailDateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US).format(now), + from, to, emailId, subject, message.getMimeMessage().getContentType()); + + emailSource += IOUtils.toString(message.getMimeMessage().getInputStream()); + Reply reply = replyTopiaDao.create(Reply.PROPERTY_EMAIL_SOURCE, emailSource, + Reply.PROPERTY_SENT_DATE, now, + Reply.PROPERTY_SUBJECT, subject); + + email.addReplies(reply); + + HistoryTopiaDao historyDao = getPersistenceContext().getHistoryDao(); + History history = historyDao.create(History.PROPERTY_TYPE, HistoryType.REPLY, + History.PROPERTY_FAX_TO_MAIL_USER, user, + History.PROPERTY_MODIFICATION_DATE, now); + email.addHistory(history); + + email = saveEmail(email, user); + + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("", e); + } + } + + return email; + } } + Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java 2014-04-17 17:27:05 UTC (rev 36) @@ -237,7 +237,8 @@ int etatAttenteSize = etatAttentes.size(); // root folders - MailFolder chargesClientelle = folderDao.create(MailFolder.PROPERTY_NAME, "Chargés de clientèle"); + MailFolder chargesClientelle = folderDao.create(MailFolder.PROPERTY_NAME, "Chargés de clientèle", + MailFolder.PROPERTY_REPLY_ADRESSES, Lists.newArrayList("no-reply@franciaflex.com")); folders.put("Chargés de clientèle", chargesClientelle); Collections.shuffle(etatAttentes); @@ -398,7 +399,7 @@ History.PROPERTY_FIELDS, Sets.newHashSet(Email.PROPERTY_SENDER, Email.PROPERTY_CLIENT, Email.PROPERTY_PROJECT_REFERENCE, - Email.PROPERTY_OBJECT, + Email.PROPERTY_SUBJECT, Email.PROPERTY_RECEPTION_DATE, Email.PROPERTY_MAIL_FOLDER, Email.PROPERTY_DEMAND_STATUS), @@ -409,7 +410,7 @@ Email.PROPERTY_FAX, fax, Email.PROPERTY_CLIENT, client, Email.PROPERTY_PROJECT_REFERENCE, projectRef, - Email.PROPERTY_OBJECT, client.getCaracteristic1() + " / " + client.getCode() + " / " + client.getName() + " / " + client.getFaxNumber() + " / " + dateDecorator.toString(now), + Email.PROPERTY_SUBJECT, client.getCaracteristic1() + " / " + client.getCode() + " / " + client.getName() + " / " + client.getFaxNumber() + " / " + dateDecorator.toString(now), Email.PROPERTY_RECEPTION_DATE, now, Email.PROPERTY_MAIL_FOLDER, folder, Email.PROPERTY_DEMAND_STATUS, opened ? DemandStatus.IN_PROGRESS : DemandStatus.UNTREATED, @@ -431,7 +432,7 @@ History.PROPERTY_FIELDS, Sets.newHashSet(Email.PROPERTY_SENDER, Email.PROPERTY_CLIENT, Email.PROPERTY_PROJECT_REFERENCE, - Email.PROPERTY_OBJECT, + Email.PROPERTY_SUBJECT, Email.PROPERTY_RECEPTION_DATE, Email.PROPERTY_MAIL_FOLDER, Email.PROPERTY_DEMAND_STATUS), @@ -442,7 +443,7 @@ Email.PROPERTY_FAX, fax, Email.PROPERTY_CLIENT, client, Email.PROPERTY_PROJECT_REFERENCE, projectRef, - Email.PROPERTY_OBJECT, client.getCaracteristic1() + " / " + client.getCode() + " / " + client.getName() + " / " + client.getFaxNumber() + " / " + dateDecorator.toString(yesterday), + Email.PROPERTY_SUBJECT, client.getCaracteristic1() + " / " + client.getCode() + " / " + client.getName() + " / " + client.getFaxNumber() + " / " + dateDecorator.toString(yesterday), Email.PROPERTY_RECEPTION_DATE, yesterday, Email.PROPERTY_MAIL_FOLDER, folder, Email.PROPERTY_DEMAND_STATUS, opened ? DemandStatus.IN_PROGRESS : DemandStatus.UNTREATED, Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/MailFolderService.java 2014-04-17 17:27:05 UTC (rev 36) @@ -30,7 +30,6 @@ private static final Log log = LogFactory.getLog(MailFolderService.class); - public MailFolder getFolderForRecipient(String recipient) { MailFilterTopiaDao filterTopiaDao = getPersistenceContext().getMailFilterDao(); Modified: trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_en_GB.properties =================================================================== --- trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_en_GB.properties 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_en_GB.properties 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,7 @@ +faxtomail.email.projectReference.default= +faxtomail.service.referential.import.clients.error= +faxtomail.service.referential.import.emailAccount.error= +faxtomail.service.referential.import.emailFilter.error= +faxtomail.validator.error.email.clientCode.required= +faxtomail.validator.error.email.demandType.required= +faxtomail.validator.error.email.projectReference.required= Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GroupAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GroupAction.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GroupAction.java 2014-04-17 17:27:05 UTC (rev 36) @@ -43,7 +43,7 @@ int i = JOptionPane.showConfirmDialog( null, - t("faxtomail.alert.groupConfirmation.message", currentEmail.getObject(), selectedEmail.getObject()), + t("faxtomail.alert.groupConfirmation.message", currentEmail.getSubject(), selectedEmail.getSubject()), t("faxtomail.alert.groupConfirmation.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); @@ -64,7 +64,7 @@ currentEmail.fromEntity(email1); currentEmail.setGroupedDemandes(email1.getEmailGroup()); - handler.showInformationMessage(t("faxtomail.demande.group.successful", email2.getObject())); + handler.showInformationMessage(t("faxtomail.demande.group.successful", email2.getSubject())); handler.closeFrame(); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ReplyAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ReplyAction.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/ReplyAction.java 2014-04-17 17:27:05 UTC (rev 36) @@ -1,5 +1,8 @@ package com.franciaflex.faxtomail.ui.swing.actions; +import com.franciaflex.faxtomail.persistence.entities.Email; +import com.franciaflex.faxtomail.services.service.EmailService; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUI; import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUIHandler; import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUIModel; @@ -13,6 +16,7 @@ public class ReplyAction extends AbstractFaxToMailAction<ReplyFormUIModel, ReplyFormUI, ReplyFormUIHandler> { private static final Log log = LogFactory.getLog(ReplyAction.class); + private EmailService emailService; public ReplyAction(ReplyFormUIHandler handler) { super(handler, false); @@ -20,12 +24,26 @@ @Override public void doAction() throws Exception { - log.warn("do reply"); + log.info("do reply"); + + ReplyFormUIModel model = getModel(); + emailService = getContext().getEmailService(); + DemandeUIModel originalDemand = getModel().getOriginalDemand(); + + Email email = emailService.reply(model.getFrom(), + model.getTo(), + model.getSubject(), + model.getMessage(), + model.getAttachments(), + originalDemand.getTopiaId(), + getContext().getCurrentUser()); + + originalDemand.fromEntity(email); } @Override public void postSuccessAction() { super.postSuccessAction(); - handler.closeDialog(); + handler.closeFrame(); } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java 2014-04-17 17:27:05 UTC (rev 36) @@ -72,9 +72,14 @@ FaxToMailUser currentUser = context.getCurrentUser(); Email email = model.toEntity(persistedEmail); - String[] modifiedProperties = getHandler().getMonitor().getModifiedProperties(); + BeanMonitor monitor = getHandler().getMonitor(); + + String[] modifiedProperties = monitor.getModifiedProperties(); email = context.getEmailService().saveEmail(email, currentUser, modifiedProperties); model.fromEntity(email); + + getModel().setModify(false); + monitor.clearModified(); } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/MainUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/MainUIHandler.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/MainUIHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -340,7 +340,7 @@ case DEMANDE: screenUI = new DemandeUI(ui); DemandeUIModel currentEmail = getContext().getCurrentEmail(); - screenTitle = currentEmail.getObject(); + screenTitle = currentEmail.getSubject(); icon = JAXXWidgetUtil.createActionIcon("email"); rightDecoration = ((DemandeUI) screenUI).getTopToolBar(); break; Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUI.css 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUI.css 2014-04-17 17:27:05 UTC (rev 36) @@ -9,6 +9,8 @@ #noAttachmentsLabel { text: "faxtomail.attachmentEditor.attachments.empty"; visible: { model.getAttachment().isEmpty() }; + border: { javax.swing.BorderFactory.createEmptyBorder(3, 3, 3, 3) }; + font-style: italic; } #attachments { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css 2014-04-17 17:27:05 UTC (rev 36) @@ -45,12 +45,12 @@ borderPainted: false; } -#objectLabel { - text: "faxtomail.demande.object.label"; +#subjectLabel { + text: "faxtomail.demande.subject.label"; } -#objectField { - text: {model.getObject()}; +#subjectField { + text: {model.getSubject()}; } #receivedDateLabel { @@ -154,7 +154,6 @@ #mailBodyField { editable: false; - text: { model.getContent() }; } #takenByLabel { @@ -235,7 +234,6 @@ visible: { model.getEdiCodeNumber() != null }; } - .horizontal-separator { text: " | "; } @@ -312,4 +310,4 @@ text: "faxtomail.demande.group.button.label"; actionIcon: group; enabled: { model.isEditable() }; -} +} \ No newline at end of file Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.jaxx 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -27,8 +27,9 @@ com.franciaflex.faxtomail.ui.swing.util.FaxToMailUI com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil com.franciaflex.faxtomail.ui.swing.content.attachment.ButtonAttachment - com.franciaflex.faxtomail.ui.swing.content.history.ButtonHistory - com.franciaflex.faxtomail.ui.swing.content.demandgroup.ButtonEmailGroup + com.franciaflex.faxtomail.ui.swing.content.demande.history.ButtonHistory + com.franciaflex.faxtomail.ui.swing.content.demande.demandgroup.ButtonEmailGroup + com.franciaflex.faxtomail.ui.swing.content.demande.replies.ButtonDemandReplies com.franciaflex.faxtomail.persistence.entities.Email com.franciaflex.faxtomail.persistence.entities.DemandType @@ -71,6 +72,7 @@ </BeanValidator> <JToolBar id='topToolBar'> + <ButtonDemandReplies id="demandRepliesButton"/> <ButtonEmailGroup id="demandGroupButton"/> <ButtonHistory id="historyButton"/> <ButtonAttachment id="attachmentsButton" @@ -103,11 +105,11 @@ </row> <row> <cell> - <JLabel id='objectLabel'/> + <JLabel id='subjectLabel'/> </cell> <cell weightx='1' columns="3"> - <JTextField id='objectField' - onKeyReleased='handler.setText(event, "object")'/> + <JTextField id='subjectField' + onKeyReleased='handler.setText(event, "subject")'/> </cell> </row> <row> @@ -301,7 +303,8 @@ constraints="BorderLayout.NORTH"/> <JScrollPane id='messagePane' constraints="BorderLayout.CENTER"> - <JEditorPane id='messageField'/> + <JEditorPane id='messageField' + onKeyReleased='handler.setText(event, "message")'/> </JScrollPane> </JPanel> </JSplitPane> Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -141,36 +141,8 @@ initBeanFilterableComboBox(ui.getEtatAttenteComboBox(), etatAttentes, model.getEtatAttente()); JTextPane editor = ui.getMailBodyField(); - String content = model.getContent(); + FaxToMailUIUtil.setEmailContentInTextPane(editor, model); - if (model.getContentType() != null) { - editor.setContentType(model.getContentType()); - - if (model.getContentType().contains("text/html")) { - HTMLEditorKit htmlEditorKit = new HTMLEditorKit(); - editor.setEditorKit(htmlEditorKit); - editor.addHyperlinkListener(new HyperlinkListener() { - @Override - public void hyperlinkUpdate(HyperlinkEvent e) { - if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { - FaxToMailUIUtil.openLink(e.getURL()); - } - } - }); - - for (Attachment attachment : model.getAttachment()) { - File file = attachment.getOriginalFile(); - log.info("file " + file.getName()); - String key = file.getName(); - // the meta tag makes the content is not displayed - content = content.replaceAll("<meta (.*?)>(</meta>)?", ""); - // replace the inline attachments with the extracted attachment file url - content = content.replaceAll("<img src=\"cid:" + key + "\"(.*?>)", "<img src=\"file://" + file.getAbsolutePath() + "\"$1"); - } - } - } - editor.setText(content); - // init table final JXTable table = ui.getRangeTable(); @@ -376,7 +348,7 @@ @Override protected JComponent getComponentToFocus() { - return getUI().getObjectField(); + return getUI().getSubjectField(); } @Override @@ -385,6 +357,7 @@ result.add(DemandeUIModel.PROPERTY_EDITABLE); result.add(Email.PROPERTY_HISTORY); result.add(DemandeUIModel.PROPERTY_GROUPED_DEMANDES); + result.add(Email.PROPERTY_REPLIES); return result; } @@ -394,6 +367,10 @@ log.debug("closing: " + ui); } clearValidators(); + closeButtonPopups(); + } + + protected void closeButtonPopups() { ui.getAttachmentsButton().setSelected(false); ui.getHistoryButton().setSelected(false); ui.getGroupButton().setSelected(false); @@ -424,6 +401,7 @@ } return result; } + public BeanMonitor getMonitor() { return monitor; } @@ -433,11 +411,17 @@ } public void transmitDemande() { + closeButtonPopups(); + saveBeforeAction(); + MailFolderChooserUI dialogContent = new MailFolderChooserUI(ui, getModel()); openDialog(dialogContent, t("faxtomail.chooseMailFolder.title"), new Dimension(350, 500)); } public void print() { + closeButtonPopups(); + saveBeforeAction(); + for (Attachment attachment : getModel().getAttachment()) { // try { File editedFile = attachment.getEditedFile(); @@ -457,25 +441,31 @@ } public void reply() { + closeButtonPopups(); + saveBeforeAction(); + ReplyFormUI dialogContent = new ReplyFormUI(ui); ReplyFormUIModel model = dialogContent.getModel(); - String client = getModel().getClientCode(); - model.setObject(client == null ? null : client); model.setTo(getModel().getSender()); - openFrame(dialogContent, t("faxtomail.reply.title", getModel().getObject()), new Dimension(800, 600)); + openFrame(dialogContent, t("faxtomail.reply.title", getModel().getSubject()), new Dimension(800, 600)); } public void group() { - ui.getGroupButton().setSelected(false); + closeButtonPopups(); + saveBeforeAction(); + SearchToGroupUI dialogContent = new SearchToGroupUI(ui); + openFrame(dialogContent, t("faxtomail.searchToGroup.title", getModel().getSubject()), getContext().getMainUI().getSize()); + } + + protected void saveBeforeAction() { + if (getModel().getTakenBy() == null) { + getModel().setTakenBy(getContext().getCurrentUser()); + } + if (getMonitor().wasModified()) { getContext().getActionFactory().createUIAction(this, SaveDemandeAction.class).actionPerformed(null); - getModel().setModify(false); - getMonitor().clearModified(); } - - SearchToGroupUI dialogContent = new SearchToGroupUI(ui); - openFrame(dialogContent, t("faxtomail.searchToGroup.title", getModel().getObject()), getContext().getMainUI().getSize()); } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-04-17 17:27:05 UTC (rev 36) @@ -36,6 +36,7 @@ import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.persistence.entities.Priority; import com.franciaflex.faxtomail.persistence.entities.RangeRow; +import com.franciaflex.faxtomail.persistence.entities.Reply; import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailBeanUIModel; import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentModelAware; import org.apache.commons.logging.Log; @@ -179,34 +180,34 @@ return editObject.getRecipient(); } - public void setObject(String object) { - Object oldValue = getObject(); - editObject.setObject(object); - firePropertyChanged(Email.PROPERTY_OBJECT, oldValue, object); + public void setSubject(String object) { + Object oldValue = getSubject(); + editObject.setSubject(object); + firePropertyChanged(Email.PROPERTY_SUBJECT, oldValue, object); } - public String getObject() { - return editObject.getObject(); + public String getSubject() { + return editObject.getSubject(); } - public String getContent() { - return editObject.getContent(); + public String getPlainContent() { + return editObject.getPlainContent(); } - public void setContent(String content) { - Object oldValue = getContent(); - editObject.setContent(content); - firePropertyChanged(Email.PROPERTY_CONTENT, oldValue, content); + public void setPlainContent(String content) { + Object oldValue = getPlainContent(); + editObject.setPlainContent(content); + firePropertyChanged(Email.PROPERTY_PLAIN_CONTENT, oldValue, content); } - public String getContentType() { - return editObject.getContentType(); + public String getHtmlContent() { + return editObject.getHtmlContent(); } - public void setContentType(String contentType) { - Object oldValue = getContentType(); - editObject.setContentType(contentType); - firePropertyChanged(Email.PROPERTY_CONTENT_TYPE, oldValue, contentType); + public void setHtmlContent(String content) { + Object oldValue = getHtmlContent(); + editObject.setHtmlContent(content); + firePropertyChanged(Email.PROPERTY_HTML_CONTENT, oldValue, content); } public void setClientCode(String clientCode) { @@ -621,6 +622,32 @@ return groupedDemandes.size(); } + public void addReplies(Reply reply) { + Object oldValue = null; + if (getReplies() != null) { + oldValue = new ArrayList<Reply>(getReplies()); + } + editObject.addReplies(reply); + firePropertyChange(Email.PROPERTY_REPLIES, null, getReplies()); + } + + public void setReplies(Collection<Reply> replies) { + Object oldValue = null; + if (getReplies() != null) { + oldValue = new ArrayList<Reply>(getReplies()); + } + editObject.setReplies(replies); + firePropertyChange(Email.PROPERTY_REPLIES, null, getReplies()); + } + + public Collection<Reply> getReplies() { + return editObject.getReplies(); + } + + public int sizeReplies() { + return editObject.sizeReplies(); + } + @Override protected Email newEntity() { return new EmailImpl(); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ButtonEmailGroup.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/ButtonEmailGroup.java 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/ButtonEmailGroup.java 2014-04-17 17:27:05 UTC (rev 36) @@ -1,10 +1,7 @@ -package com.franciaflex.faxtomail.ui.swing.content.demandgroup; +package com.franciaflex.faxtomail.ui.swing.content.demande.demandgroup; -import com.franciaflex.faxtomail.persistence.entities.Email; -import com.franciaflex.faxtomail.persistence.entities.History; import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; -import com.franciaflex.faxtomail.ui.swing.content.history.HistoryListUI; import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupButton; import java.beans.PropertyChangeEvent; @@ -31,7 +28,8 @@ public void propertyChange(PropertyChangeEvent evt) { Collection<DemandeUIModel> demands = (Collection<DemandeUIModel>) evt.getNewValue(); if (demands != null) { - setText(t("faxtomail.demandGroup.text", demands.size())); + int size = demands.size(); + setText(t("faxtomail.demandGroup.text", size)); } } }); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupItem.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupItem.css 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupItem.css 2014-04-17 17:27:05 UTC (rev 36) @@ -2,8 +2,8 @@ border: { BorderFactory.createEmptyBorder(2, 3, 2, 3) }; } -#demandeObjectLabel { - text: { getDemande().getObject() }; +#demandeSubjectLabel { + text: { getDemande().getSubject() }; } #toolbar { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupItem.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupItem.jaxx 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupItem.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -8,7 +8,8 @@ <DemandeUIModel id='demande' javaBean='null'/> - <DemandGroupUIHandler id='handler' javaBean='null'/> + <DemandGroupUIHandler id='handler' + initializer='getContextValue(DemandGroupUIHandler.class)'/> <script><![CDATA[ public DemandGroupItem(DemandGroupUIHandler handler) { @@ -16,7 +17,7 @@ } ]]></script> - <JLabel id='demandeObjectLabel' constraints='BorderLayout.CENTER'/> + <JLabel id='demandeSubjectLabel' constraints='BorderLayout.CENTER'/> <JToolBar id='toolbar' constraints='BorderLayout.EAST'> <JButton id='openDemandeButton' Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupUI.css 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUI.css 2014-04-17 17:27:05 UTC (rev 36) @@ -6,6 +6,14 @@ title: "faxtomail.demandGroup.title"; } +#noGroupedDemandLabel { + text: "faxtomail.demandGroup.empty"; + visible: { model.getGroupedDemandes().isEmpty() }; + border: { javax.swing.BorderFactory.createEmptyBorder(3, 3, 3, 3) }; + font-style: italic; +} + #demandGroup { editable: true; -} \ No newline at end of file + visible: { !model.getGroupedDemandes().isEmpty() }; +} Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUI.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupUI.jaxx 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUI.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -15,6 +15,7 @@ <JXTitledPanel id='body'> <JScrollPane id='demandGroupBodyScrollPane'> <JPanel id='mainPanel' layout="{new BorderLayout()}"> + <JLabel id='noGroupedDemandLabel' constraints="BorderLayout.NORTH"/> <JXTable id='demandGroup' constraints="BorderLayout.CENTER"/> </JPanel> </JScrollPane> Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupUIHandler.java 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/demandgroup/DemandGroupUIHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -1,19 +1,13 @@ -package com.franciaflex.faxtomail.ui.swing.content.demandgroup; +package com.franciaflex.faxtomail.ui.swing.content.demande.demandgroup; -import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; import com.franciaflex.faxtomail.ui.swing.actions.ShowDemandeAction; -import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentItem; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupHandler; import com.google.common.collect.Iterables; -import jaxx.runtime.SwingUtil; -import jaxx.runtime.swing.model.JaxxDefaultListModel; import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.JXList; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.HighlighterFactory; @@ -22,7 +16,6 @@ import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableColumnModel; -import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; @@ -31,7 +24,6 @@ import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.Collection; /** * @author Kevin Morin (Code Lutin) @@ -149,8 +141,7 @@ protected DemandGroupItem demandGroupItem; public DemandGroupItemEditor() { - demandGroupItem = new DemandGroupItem(); - demandGroupItem.setHandler(DemandGroupUIHandler.this); + demandGroupItem = new DemandGroupItem(DemandGroupUIHandler.this); } public Component getTableCellEditorComponent(JTable table, Object value, Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/ButtonHistory.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/history/ButtonHistory.java 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/ButtonHistory.java 2014-04-17 17:27:05 UTC (rev 36) @@ -1,10 +1,9 @@ -package com.franciaflex.faxtomail.ui.swing.content.history; +package com.franciaflex.faxtomail.ui.swing.content.demande.history; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.History; import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupButton; -import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentEditorUI; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryItemModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/history/HistoryItemModel.java 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryItemModel.java 2014-04-17 17:27:05 UTC (rev 36) @@ -1,4 +1,4 @@ -package com.franciaflex.faxtomail.ui.swing.content.history; +package com.franciaflex.faxtomail.ui.swing.content.demande.history; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; import com.franciaflex.faxtomail.persistence.entities.History; Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryListUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/history/HistoryListUIHandler.java 2014-04-10 12:18:23 UTC (rev 32) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/history/HistoryListUIHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -1,4 +1,4 @@ -package com.franciaflex.faxtomail.ui.swing.content.history; +package com.franciaflex.faxtomail.ui.swing.content.demande.history; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.History; @@ -39,7 +39,7 @@ n("faxtomail.demande.sender.label"); n("faxtomail.demande.fax.label"); n("faxtomail.demande.recipient.label"); - n("faxtomail.demande.object.label"); + n("faxtomail.demande.subject.label"); n("faxtomail.demande.clientCode.label"); n("faxtomail.demande.mailFolder.label"); n("faxtomail.demande.attachment.label"); Copied: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/ButtonDemandReplies.java (from rev 32, trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/ButtonEmailGroup.java) =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/ButtonDemandReplies.java (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/ButtonDemandReplies.java 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,50 @@ +package com.franciaflex.faxtomail.ui.swing.content.demande.replies; + +import com.franciaflex.faxtomail.persistence.entities.Email; +import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; +import com.franciaflex.faxtomail.ui.swing.content.demande.demandgroup.DemandGroupUI; +import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupButton; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Collection; + +import static org.nuiton.i18n.I18n.t; + +/** + * Button to edit attachments. + * + * @author tchemit <chemit@codelutin.com> + * @since 1.1 + */ +public class ButtonDemandReplies extends AbstractToolbarPopupButton<DemandRepliesUI> { + + public ButtonDemandReplies() { + setToolTipText(t("faxtomail.demandReplies.action.tip")); + int replyNb = popup.getModel().sizeReplies(); + setText(t("faxtomail.demandReplies.text", replyNb)); + + popup.getModel().addPropertyChangeListener(Email.PROPERTY_REPLIES, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + Collection<String> replies = (Collection<String>) evt.getNewValue(); + if (replies != null) { + int size = replies.size(); + setText(t("faxtomail.demandReplies.text", size)); + } + } + }); + } + + @Override + protected String getActionIcon() { + return "reply"; + } + + @Override + protected DemandRepliesUI createNewPopup() { + return new DemandRepliesUI(FaxToMailUIContext.getApplicationContext()); + } + +} Copied: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.css (from rev 32, trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupUI.css) =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.css (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.css 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,19 @@ +#repliesDialog { + minimumSize: { new java.awt.Dimension(500, 0) }; +} + +#body { + title: "faxtomail.demandReplies.title"; +} + +#noReplyLabel { + text: "faxtomail.demandReplies.empty"; + visible: { model.getReplies().isEmpty() }; + border: { javax.swing.BorderFactory.createEmptyBorder(3, 3, 3, 3) }; + font-style: italic; +} + +#replies { + editable: true; + visible: { !model.getReplies().isEmpty() }; +} Copied: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.jaxx (from rev 32, trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupUI.jaxx) =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.jaxx (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUI.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,24 @@ +<com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupUI + superGenericType="com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel, DemandRepliesUIHandler" + id='repliesDialog'> + + <import> + com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel + + org.jdesktop.swingx.JXTable + org.jdesktop.swingx.JXTitledPanel + </import> + + <DemandeUIModel id='model' + initializer='getContextValue(DemandeUIModel.class)'/> + + <JXTitledPanel id='body'> + <JScrollPane id='demandRepliesBodyScrollPane'> + <JPanel id='mainPanel' layout="{new BorderLayout()}"> + <JLabel id='noReplyLabel' constraints="BorderLayout.NORTH"/> + <JXTable id='replies' constraints="BorderLayout.CENTER"/> + </JPanel> + </JScrollPane> + </JXTitledPanel> + +</com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupUI> \ No newline at end of file Copied: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java (from rev 32, trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupUIHandler.java) =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,168 @@ +package com.franciaflex.faxtomail.ui.swing.content.demande.replies; + +import com.franciaflex.faxtomail.persistence.entities.Email; +import com.franciaflex.faxtomail.persistence.entities.Reply; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; +import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupHandler; +import com.google.common.collect.Iterables; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.decorator.HighlighterFactory; + +import javax.swing.*; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableColumnModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; +import javax.swing.table.TableModel; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class DemandRepliesUIHandler extends AbstractToolbarPopupHandler<DemandeUIModel, DemandRepliesUI> { + + 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); + + initTable(ui.getReplies()); + + getModel().addPropertyChangeListener(Email.PROPERTY_REPLIES, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + AbstractTableModel tableModel = (AbstractTableModel) getUI().getReplies().getModel(); + tableModel.fireTableDataChanged(); + } + }); + } + + protected void initTable(JXTable table) { + + TableModel demandRepliesTableModel = new AbstractTableModel() { + @Override + public int getRowCount() { + return getModel().sizeReplies(); + } + + @Override + public int getColumnCount() { + return 1; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return Iterables.get(getModel().getReplies(), rowIndex); + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return true; + } + }; + + demandRepliesTableModel.addTableModelListener(new TableModelListener() { + @Override + public void tableChanged(TableModelEvent e) { + getUI().pack(); + } + }); + + TableColumnModel columnModel = new DefaultTableColumnModel(); + TableColumn column = new TableColumn(); + column.setCellRenderer(new DemandReplyItemRenderer()); + column.setCellEditor(new DemandReplyItemEditor()); + columnModel.addColumn(column); + + table.setModel(demandRepliesTableModel); + table.setColumnModel(columnModel); + table.addHighlighter(HighlighterFactory.createAlternateStriping()); + } + + @Override + public void onCloseUI() { + } + + @Override + public SwingValidator<DemandeUIModel> getValidator() { + return null; + } + + @Override + protected JComponent getComponentToFocus() { + return null; + } + + public void openReply(Reply reply) { + closeEditor(); + +// FaxToMailUIContext context = getContext(); +// context.setCurrentEmail(demande); +// context.getActionEngine().runAction(new ShowDemandeAction(context.getMainUI().getHandler())); + } + + protected class DemandReplyItemRenderer extends DemandReplyItem + implements TableCellRenderer { + + public DemandReplyItemRenderer() { + super(DemandRepliesUIHandler.this); + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, + boolean isSelected, boolean hasFocus, int row, int column) { + Reply reply = (Reply) value; + setReply(reply); + return this; + } + } + + protected class DemandReplyItemEditor extends AbstractCellEditor implements TableCellEditor { + + protected DemandReplyItem demandReplyItem; + + public DemandReplyItemEditor() { + demandReplyItem = new DemandReplyItem(DemandRepliesUIHandler.this); + } + + public Component getTableCellEditorComponent(JTable table, Object value, + boolean isSelected, int row, int column) { + Reply reply = (Reply) value; + demandReplyItem.setReply(reply); + + return demandReplyItem; + } + + @Override + public Object getCellEditorValue() { + return demandReplyItem.getReply(); + } + + public boolean stopCellEditing() { + return super.stopCellEditing(); + } + + protected void fireEditingStopped() { + super.fireEditingStopped(); + } + } +} Copied: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.css (from rev 32, trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupItem.css) =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.css (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.css 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,22 @@ +#replyPanel { + border: { BorderFactory.createEmptyBorder(2, 3, 2, 3) }; +} + +#replyDateLabel { + text: { getHandler().decorate(getReply().getSentDate()) + " - " }; + font-style: italic; +} + +#replySubjectLabel { + text: { getReply().getSubject() }; +} + +#toolbar { + borderPainted: false; + floatable: false; +} + +#openReplyButton { + actionIcon: "open-file"; + toolTipText: "faxtomail.demandReplies.action.open.tip"; +} \ No newline at end of file Copied: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.jaxx (from rev 32, trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demandgroup/DemandGroupItem.jaxx) =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.jaxx (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandReplyItem.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,30 @@ +<JPanel id='replyPanel' layout='{new BorderLayout()}'> + + <import> + com.franciaflex.faxtomail.persistence.entities.Reply + com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel + static org.nuiton.i18n.I18n.t + static jaxx.runtime.JAXXUtil.getStringValue + </import> + + <Reply id='reply' javaBean='null'/> + + <DemandRepliesUIHandler id='handler' + initializer='getContextValue(DemandRepliesUIHandler.class)'/> + + <script><![CDATA[ +public DemandReplyItem(DemandRepliesUIHandler handler) { + setContextValue(handler); +} + ]]></script> + + <JLabel id='replyDateLabel' constraints='BorderLayout.WEST'/> + + <JLabel id='replySubjectLabel' constraints='BorderLayout.CENTER'/> + + <JToolBar id='toolbar' constraints='BorderLayout.EAST'> + <JButton id='openReplyButton' + onActionPerformed='handler.openReply(reply)'/> + </JToolBar> + +</JPanel> \ No newline at end of file Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.css (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.css 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,16 @@ +#attachmentPanel { + border: { BorderFactory.createLineBorder(Color.LIGHT_GRAY) }; +} + +#attachmentNameLabel { + text: { attachment != null ? getAttachment().getName() : null }; + border: { BorderFactory.createEmptyBorder(3, 3, 3, 3) }; +} + +#openAttachmentButton { + actionIcon: "cross"; + opaque: false; + border: { BorderFactory.createEmptyBorder(3, 3, 3, 3) }; + borderPainted: false; + contentAreaFilled: false; +} \ No newline at end of file Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -0,0 +1,24 @@ +<JPanel id='attachmentPanel' layout='{new BorderLayout()}'> + + <import> + com.franciaflex.faxtomail.persistence.entities.Attachment + + java.awt.Color + java.io.File + javax.swing.BorderFactory + + static org.nuiton.i18n.I18n.t + static jaxx.runtime.JAXXUtil.getStringValue + </import> + + <File id='attachment' javaBean='null'/> + + <ReplyFormUIHandler id='handler' javaBean='null'/> + + <JLabel id='attachmentNameLabel' constraints='BorderLayout.CENTER'/> + + <JButton id='openAttachmentButton' + constraints='BorderLayout.EAST' + onActionPerformed='handler.removeAttachment(this)'/> + +</JPanel> \ No newline at end of file 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-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.css 2014-04-17 17:27:05 UTC (rev 36) @@ -1,31 +1,64 @@ #fromLabel { - text: "faxtomail.reply.from"; + text: "faxtomail.reply.label.from"; } +#fromField { + text: { model.getFrom() }; +} + +#fromComboBox { + editable: true; + selectedItem: { model.getFrom() }; +} + #toLabel { - text: "faxtomail.reply.to"; + text: "faxtomail.reply.label.to"; } #toField { - text: {model.getTo()}; + text: { model.getTo() }; } -#objectLabel { - text: "faxtomail.reply.object"; +#subjectLabel { + text: "faxtomail.reply.label.subject"; } #objectField { - text: {model.getObject()}; + text: { model.getObject() }; } -#attachmentCheckbox { - text: "faxtomail.reply.attachment"; +#splitPane { + dividerLocation: 300; } -#attachmentButton { - enabled: {attachmentCheckbox.isSelected()}; +#message { + text: { model.getMessage() }; } +#attachmentsPanel { + background: { Color.WHITE }; +} + +#attachmentsLabel { + text: "faxtomail.attachmentEditor.title"; +} + +#addAttachmentLabel { + text: "faxtomail.attachmentEditor.field.file"; +} + +#addAttachmentFile { + editable: true; +} + +#chooseFileButton { + actionIcon: "open"; +} + +#addAttachmentButton { + actionIcon: "add"; +} + #cancelButton { actionIcon: cancel; text: "faxtomail.reply.action.cancel"; @@ -36,5 +69,5 @@ actionIcon: validate; text: "faxtomail.reply.action.validate"; toolTipText: "faxtomail.reply.action.validate.tip"; - _applicationAction: {com.franciaflex.faxtomail.ui.swing.actions.ReplyAction.class}; + _applicationAction: { com.franciaflex.faxtomail.ui.swing.actions.ReplyAction.class }; } \ No newline at end of file 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-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUI.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -36,6 +36,12 @@ java.text.SimpleDateFormat java.util.Date + + java.awt.Color + + jaxx.runtime.swing.editor.FileEditor + + org.jdesktop.swingx.WrapLayout </import> <script><![CDATA[ @@ -49,14 +55,17 @@ <ReplyFormUIModel id='model' initializer='getContextValue(ReplyFormUIModel.class)'/> - <Table constraints='BorderLayout.CENTER' + <Table constraints='BorderLayout.NORTH' fill='both'> <row> <cell> <JLabel id="fromLabel"/> </cell> <cell weightx='1'> - <JTextField id="fromField"/> + <!--<JTextField id="fromField"--> + <!--onKeyReleased='handler.setText(event, "from")'/>--> + <JComboBox id="fromComboBox" + onItemStateChanged='handler.setText(event, "from")'/> </cell> </row> <row> @@ -64,34 +73,58 @@ <JLabel id="toLabel"/> </cell> <cell weightx='1'> - <JTextField id="toField"/> + <JTextField id="toField" + onKeyReleased='handler.setText(event, "to")'/> </cell> </row> <row> <cell> - <JLabel id="objectLabel"/> + <JLabel id="subjectLabel"/> </cell> <cell weightx='1'> - <JTextField id="objectField"/> + <JTextField id="subjectField" + onKeyReleased='handler.setText(event, "subject")'/> </cell> </row> - <row> - <cell columns='2'> - <JPanel layout='{new BorderLayout()}'> - <JCheckBox id="attachmentCheckbox" constraints="BorderLayout.CENTER"/> - <ButtonAttachment id="attachmentButton" - constructorParams="model" - constraints="BorderLayout.EAST"/> - </JPanel> - </cell> - </row> - <row weighty='1'> - <cell columns='2'> - <JEditorPane id="message" /> - </cell> - </row> </Table> + <JSplitPane id="splitPane" + orientation="{JSplitPane.VERTICAL_SPLIT}" + constraints='BorderLayout.CENTER'> + <JScrollPane> + <JEditorPane id="message" + onKeyReleased='handler.setText(event, "message")'/> + </JScrollPane> + + <JPanel layout='{new BorderLayout()}'> + <JLabel id="attachmentsLabel" constraints='BorderLayout.NORTH'/> + <JScrollPane id="attachmentsContainer" + constraints='BorderLayout.CENTER'> + <JPanel id="attachmentsPanel" layout="{new WrapLayout(WrapLayout.LEFT)}"/> + </JScrollPane> + <Table fill="both" + constraints='BorderLayout.SOUTH'> + <row> + <cell> + <JLabel id='addAttachmentLabel'/> + </cell> + <cell weightx="1"> + <JComboBox id="addAttachmentFile"/> + </cell> + <cell> + <JButton id='chooseFileButton' + onActionPerformed='handler.openLocation()'/> + </cell> + <cell> + <JButton id='addAttachmentButton' + onActionPerformed='handler.addAttachment()'/> + </cell> + </row> + </Table> + + </JPanel> + </JSplitPane> + <JPanel layout='{new GridLayout(1, 0)}' constraints='BorderLayout.SOUTH'> <JButton id='cancelButton' onActionPerformed='handler.cancel()'/> <JButton id='validateButton'/> 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-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -1,18 +1,42 @@ package com.franciaflex.faxtomail.ui.swing.content.reply; +import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.MailFolder; +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; +import com.google.common.collect.Lists; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.swing.editor.FileEditor; +import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import javax.swing.*; -import javax.swing.text.html.HTMLEditorKit; +import javax.swing.plaf.basic.BasicComboBoxEditor; +import java.awt.*; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.Serializable; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.List; + +import static org.nuiton.i18n.I18n.t; + /** * @author Kevin Morin (Code Lutin) * @since x.x */ public class ReplyFormUIHandler extends AbstractFaxToMailUIHandler<ReplyFormUIModel, ReplyFormUI> implements Cancelable { + private static final Log log = LogFactory.getLog(ReplyFormUIHandler.class); + @Override public void beforeInit(ReplyFormUI ui) { @@ -20,16 +44,60 @@ ReplyFormUIModel model = new ReplyFormUIModel(); + DemandeUIModel currentEmail = getContext().getCurrentEmail(); + model.setOriginalDemand(currentEmail); + + for (Attachment attachment : currentEmail.getAttachment()) { + File file = attachment.getEditedFile(); + if (file == null) { + file = attachment.getOriginalFile(); + } + model.addAvailableAttachment(file); + } + + model.setFrom(currentEmail.getRecipient()); + + model.setSubject(t("faxtomail.reply.subject", currentEmail.getSubject())); + + String plainContent = JAXXUtil.getStringValue(currentEmail.getPlainContent()); + String quotedReply = t("faxtomail.reply.message", + decorate(currentEmail.getReceptionDate()), + currentEmail.getSender(), + plainContent.replaceAll("\n", "\n> ")); + model.setMessage(quotedReply); + this.ui.setContextValue(model); } @Override - public void afterInit(ReplyFormUI replyFormUIModel) { + public void afterInit(ReplyFormUI replyFormUI) { initUI(ui); JEditorPane editor = ui.getMessage(); - editor.setEditorKitForContentType("text/html", new HTMLEditorKit()); - editor.setContentType("text/html"); + editor.setCaretPosition(0); + + ReplyFormUIModel model = getModel(); + + DemandeUIModel originalDemand = model.getOriginalDemand(); + MailFolder folder = originalDemand.getMailFolder(); + Collection<String> folderReplyAdresses; + do { + folderReplyAdresses = folder.getReplyAdresses(); + folder = folder.getParent(); + } while (CollectionUtils.isEmpty(folderReplyAdresses) && folder != null); + + List<String> replyToAddresses = Lists.newArrayList(originalDemand.getRecipient()); + if (folderReplyAdresses != null) { + replyToAddresses.addAll(folderReplyAdresses); + } + + ui.getFromComboBox().setModel(newComboModel(replyToAddresses.toArray())); + + JComboBox addAttachmentFile = ui.getAddAttachmentFile(); + addAttachmentFile.setRenderer(new DecoratorListCellRenderer(getDecorator(File.class, null))); + addAttachmentFile.setEditor(new FileComboBoxEditor()); + addAttachmentFile.setModel(newComboModel(model.getAvailableAttachments().toArray())); + addAttachmentFile.setSelectedItem(null); } @Override @@ -48,6 +116,133 @@ @Override protected JComponent getComponentToFocus() { - return null; + return getUI().getMessage(); } + + public void removeAttachment(AttachmentItem item) { + ReplyFormUIModel model = getModel(); + + File attachment = item.getAttachment(); + model.removeAttachment(attachment); + + ui.getAttachmentsPanel().remove(item); + ui.getAttachmentsPanel().updateUI(); + + model.addAvailableAttachment(attachment); + ui.getAddAttachmentFile().addItem(attachment); + } + + public void addAttachment() { + JComboBox addAttachmentFile = ui.getAddAttachmentFile(); + File file = (File) addAttachmentFile.getSelectedItem(); + if (file != null) { + ReplyFormUIModel model = getModel(); + model.addAttachment(file); + + AttachmentItem item = new AttachmentItem(); + item.setHandler(this); + item.setAttachment(file); + ui.getAttachmentsPanel().add(item); + + ui.getAttachmentsPanel().updateUI(); + + model.removeAvailableAttachment(file); + ui.getAddAttachmentFile().removeItem(file); + + addAttachmentFile.setSelectedItem(null); + } + } + + public void openLocation() { + // use last selected file + ReplyFormUIModel model = getModel(); + + File startFile = model.getLastVisitedDirectory(); + JFileChooser fc = new JFileChooser(startFile); + +// fc.setDialogTitle(view.getTitle()); + + // used to enable file selection + fc.setFileSelectionMode(JFileChooser.FILES_ONLY); + + int returnVal = fc.showOpenDialog(ui); + model.setLastVisitedDirectory(fc.getCurrentDirectory()); + + if (returnVal == JFileChooser.APPROVE_OPTION) { + + // get selected to display in ui + File file = fc.getSelectedFile(); + + ui.getAddAttachmentFile().setSelectedItem(file); + } + } + + protected class FileComboBoxEditor implements ComboBoxEditor { + + protected File oldValue; + + protected JTextField editorComponent = new JTextField(); + + @Override + public Component getEditorComponent() { + return editorComponent; + } + + @Override + public void setItem(Object anObject) { + String text; + File file = (File) anObject; + + if ( anObject != null ) { + text = decorate(file); + oldValue = file; + + } else { + text = ""; + } + if (! text.equals(editorComponent.getText())) { + editorComponent.setText(text); + } + } + + @Override + public Object getItem() { + Object newValue = editorComponent.getText(); + + if (oldValue != null) { + // The original value is not a string. Should return the value in it's + // original type. + if (newValue.equals(decorate(oldValue))) { + return oldValue; + + } else { + // Must take the value from the editor and get the value and cast it to the new type. + Class<?> cls = oldValue.getClass(); + try { + Method method = cls.getMethod("valueOf", new Class[]{String.class}); + newValue = method.invoke(oldValue, new Object[] { editorComponent.getText()}); + } catch (Exception ex) { + // Fail silently and return the newValue (a String object) + } + } + } + return newValue; + } + + @Override + public void selectAll() { + editorComponent.selectAll(); + editorComponent.requestFocus(); + } + + @Override + public void addActionListener(ActionListener l) { + editorComponent.addActionListener(l); + } + + @Override + public void removeActionListener(ActionListener l) { + editorComponent.removeActionListener(l); + } + } } 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-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java 2014-04-17 17:27:05 UTC (rev 36) @@ -2,8 +2,11 @@ import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentModelAware; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; +import org.apache.commons.io.FileUtils; import org.jdesktop.beans.AbstractSerializableBean; +import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -12,19 +15,25 @@ * @author Kevin Morin (Code Lutin) * @since x.x */ -public class ReplyFormUIModel extends AbstractSerializableBean implements AttachmentModelAware { +public class ReplyFormUIModel extends AbstractSerializableBean { public static final String PROPERTY_TO = "to"; public static final String PROPERTY_FROM = "from"; - public static final String PROPERTY_OBJECT = "object"; + public static final String PROPERTY_SUBJECT = "subject"; public static final String PROPERTY_MESSAGE = "message"; + public static final String PROPERTY_ORIGINAL_DEMAND = "originalDemand"; protected String to; protected String from; - protected String object; + protected String subject; protected String message; - protected List<Attachment> attachments = new ArrayList<Attachment>(); + protected DemandeUIModel originalDemand; + protected List<File> attachments = new ArrayList<File>(); + protected List<File> availableAttachments = new ArrayList<File>(); + + protected File lastVisitedDirectory = FileUtils.getUserDirectory(); + public String getTo() { return to; } @@ -45,14 +54,14 @@ firePropertyChange(PROPERTY_FROM, oldValue, from); } - public String getObject() { - return object; + public String getSubject() { + return subject; } - public void setObject(String object) { - Object oldValue = getObject(); - this.object = object; - firePropertyChange(PROPERTY_OBJECT, oldValue, object); + public void setSubject(String subject) { + Object oldValue = getSubject(); + this.subject = subject; + firePropertyChange(PROPERTY_SUBJECT, oldValue, subject); } public String getMessage() { @@ -65,27 +74,45 @@ firePropertyChange(PROPERTY_MESSAGE, oldValue, message); } - @Override - public Collection<Attachment> getAttachment() { - return attachments; + public DemandeUIModel getOriginalDemand() { + return originalDemand; } - @Override - public void addAllAttachment(Collection<Attachment> attachments) { - this.attachments.addAll(attachments); - firePropertyChange(AttachmentModelAware.PROPERTY_ATTACHMENT, null, getAttachment()); + public void setOriginalDemand(DemandeUIModel originalDemand) { + Object oldValue = getOriginalDemand(); + this.originalDemand = originalDemand; + firePropertyChange(PROPERTY_ORIGINAL_DEMAND, oldValue, originalDemand); } - @Override - public void addAttachment(Attachment attachment) { + public Collection<File> getAttachments() { + return attachments; + } + + public void addAttachment(File attachment) { attachments.add(attachment); - firePropertyChange(AttachmentModelAware.PROPERTY_ATTACHMENT, null, getAttachment()); } - @Override - public void removeAttachment(Attachment attachment) { + public void removeAttachment(File attachment) { attachments.remove(attachment); - firePropertyChange(AttachmentModelAware.PROPERTY_ATTACHMENT, null, getAttachment()); } + public List<File> getAvailableAttachments() { + return availableAttachments; + } + + public void addAvailableAttachment(File attachment) { + availableAttachments.add(attachment); + } + + public void removeAvailableAttachment(File attachment) { + availableAttachments.remove(attachment); + } + + public File getLastVisitedDirectory() { + return lastVisitedDirectory; + } + + public void setLastVisitedDirectory(File lastVisitedDirectory) { + this.lastVisitedDirectory = lastVisitedDirectory; + } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUI.css 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUI.css 2014-04-17 17:27:05 UTC (rev 36) @@ -93,12 +93,12 @@ date: { model.getMaxPrintingDate() }; } -#objectLabel { - text: "faxtomail.demande.object.label"; +#subjectLabel { + text: "faxtomail.demande.subject.label"; } -#objectField { - text: {model.getObject()}; +#subjectField { + text: {model.getSubject()}; } #senderLabel { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.css 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.css 2014-04-17 17:27:05 UTC (rev 36) @@ -93,12 +93,12 @@ date: { model.getMaxPrintingDate() }; } -#objectLabel { - text: "faxtomail.demande.object.label"; +#subjectLabel { + text: "faxtomail.demande.subject.label"; } -#objectField { - text: {model.getObject()}; +#subjectField { + text: {model.getSubject()}; } #senderLabel { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.jaxx 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUI.jaxx 2014-04-17 17:27:05 UTC (rev 36) @@ -156,11 +156,11 @@ <row> <cell> - <JLabel id='objectLabel'/> + <JLabel id='subjectLabel'/> </cell> <cell columns='3' weightx='1'> - <JTextField id='objectField' - onKeyReleased='handler.setText(event, "object")'/> + <JTextField id='subjectField' + onKeyReleased='handler.setText(event, "subject")'/> </cell> <cell> Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIModel.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIModel.java 2014-04-17 17:27:05 UTC (rev 36) @@ -113,14 +113,14 @@ return editObject.getRecipient(); } - public void setObject(String object) { - Object oldValue = getObject(); - editObject.setObject(object); - firePropertyChanged(Email.PROPERTY_OBJECT, oldValue, object); + public void setSubject(String subject) { + Object oldValue = getSubject(); + editObject.setSubject(subject); + firePropertyChanged(Email.PROPERTY_SUBJECT, oldValue, subject); } - public String getObject() { - return editObject.getObject(); + public String getSubject() { + return editObject.getSubject(); } // public void setClientCode(String clientCode) { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -63,7 +63,7 @@ columns = StringUtils.join(new String[]{ Email.PROPERTY_PRIORITY, Email.PROPERTY_DEMAND_TYPE, - Email.PROPERTY_OBJECT, + Email.PROPERTY_SUBJECT, DemandeUIModel.PROPERTY_CLIENT_CODE, DemandeUIModel.PROPERTY_CLIENT_BRAND, Email.PROPERTY_SENDER, Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailUIHandler.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailUIHandler.java 2014-04-17 17:27:05 UTC (rev 36) @@ -37,6 +37,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; +import org.nuiton.jaxx.application.ApplicationDataUtil; import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; import org.nuiton.jaxx.application.swing.ApplicationUI; import org.nuiton.jaxx.application.swing.action.ApplicationActionUI; @@ -48,6 +49,7 @@ import javax.swing.event.TableModelListener; import java.awt.*; import java.awt.event.ActionEvent; +import java.awt.event.ItemEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; @@ -126,6 +128,11 @@ return decorate(user); } + public void setText(ItemEvent e, String property) { + String value = JAXXUtil.getStringValue(e.getItem()); + ApplicationDataUtil.setProperty(getModel(), property, value); + } + //------------------------------------------------------------------------// //-- Internal methods --// //------------------------------------------------------------------------// Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractToolbarPopupButton.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractToolbarPopupButton.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractToolbarPopupButton.java 2014-04-17 17:27:05 UTC (rev 36) @@ -33,7 +33,9 @@ public AbstractToolbarPopupButton() { - setIcon(SwingUtil.createActionIcon(getActionIcon())); + ImageIcon actionIcon = SwingUtil.createActionIcon(getActionIcon()); + setIcon(actionIcon); + setDisabledIcon(actionIcon); popup = createNewPopup(); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java 2014-04-17 17:27:05 UTC (rev 36) @@ -53,11 +53,11 @@ n("faxtomail.demandeList.table.header.sender"), n("faxtomail.demandeList.table.header.sender.tip"))); - put(Email.PROPERTY_OBJECT, + put(Email.PROPERTY_SUBJECT, ColumnIdentifier.<Email>newReadOnlyId( - Email.PROPERTY_OBJECT, - n("faxtomail.demandeList.table.header.object"), - n("faxtomail.demandeList.table.header.object.tip"))); + Email.PROPERTY_SUBJECT, + n("faxtomail.demandeList.table.header.subject"), + n("faxtomail.demandeList.table.header.subject.tip"))); put(Email.PROPERTY_RECEPTION_DATE, ColumnIdentifier.<Email>newReadOnlyId( Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-04-17 17:27:05 UTC (rev 36) @@ -22,6 +22,7 @@ * #L% */ +import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; @@ -35,6 +36,9 @@ import org.nuiton.util.FileUtil; import javax.swing.*; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.text.html.HTMLEditorKit; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; @@ -169,4 +173,37 @@ public static boolean isFileATif(File file) { return FileUtil.extension(file).toUpperCase().equals("TIF"); } + + public static void setEmailContentInTextPane(JTextPane textPane, DemandeUIModel demandeUIModel) { + String content = demandeUIModel.getHtmlContent(); + if (content != null) { + textPane.setContentType("text/html"); + + HTMLEditorKit htmlEditorKit = new HTMLEditorKit(); + textPane.setEditorKit(htmlEditorKit); + textPane.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + FaxToMailUIUtil.openLink(e.getURL()); + } + } + }); + + // the meta tag makes the content is not displayed + content = content.replaceAll("<meta (.*?)>(</meta>)?", ""); + + for (Attachment attachment : demandeUIModel.getAttachment()) { + File file = attachment.getOriginalFile(); + log.info("file " + file.getName()); + String key = file.getName(); + // replace the inline attachments with the extracted attachment file url + content = content.replaceAll("<img src=\"cid:" + key + "\"(.*?>)", "<img src=\"file://" + file.getAbsolutePath() + "\"$1"); + } + + } else { + content = demandeUIModel.getPlainContent(); + } + textPane.setText(content); + } } Modified: trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_en_GB.properties =================================================================== --- trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_en_GB.properties 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_en_GB.properties 2014-04-17 17:27:05 UTC (rev 36) @@ -36,6 +36,7 @@ faxtomail.attachmentEditor.action.save.mnemonic= faxtomail.attachmentEditor.action.save.tip= faxtomail.attachmentEditor.action.tip= +faxtomail.attachmentEditor.add.label= faxtomail.attachmentEditor.attachments.empty= faxtomail.attachmentEditor.deleteAttachment.message= faxtomail.attachmentEditor.deleteAttachment.title= @@ -108,8 +109,14 @@ faxtomail.demand.alreadyTakenBy= faxtomail.demand.group.successful= faxtomail.demandGroup.action.tip= +faxtomail.demandGroup.empty= faxtomail.demandGroup.text= faxtomail.demandGroup.title= +faxtomail.demandReplies.action.open.tip= +faxtomail.demandReplies.action.tip= +faxtomail.demandReplies.empty= +faxtomail.demandReplies.text= +faxtomail.demandReplies.title= faxtomail.demande.alreadyTakenBy= faxtomail.demande.archive.button.label= faxtomail.demande.archive.button.mnemonic= @@ -169,6 +176,7 @@ faxtomail.demande.sender.manualCreation= faxtomail.demande.sender.manual_creation= faxtomail.demande.status.label= +faxtomail.demande.subject.label= faxtomail.demande.takenBy.label= faxtomail.demande.tcc.label= faxtomail.demande.title= @@ -236,6 +244,8 @@ faxtomail.demandeList.table.header.senderEmail.tip= faxtomail.demandeList.table.header.status= faxtomail.demandeList.table.header.status.tip= +faxtomail.demandeList.table.header.subject= +faxtomail.demandeList.table.header.subject.tip= faxtomail.demandeList.table.header.type= faxtomail.demandeList.table.header.type.tip= faxtomail.demandeList.table.header.user= @@ -310,7 +320,14 @@ faxtomail.reply.action.validate.tip= faxtomail.reply.attachment= faxtomail.reply.from= +faxtomail.reply.label.attachment= +faxtomail.reply.label.from= +faxtomail.reply.label.object= +faxtomail.reply.label.subject= +faxtomail.reply.label.to= +faxtomail.reply.message= faxtomail.reply.object= +faxtomail.reply.subject= faxtomail.reply.title= faxtomail.reply.to= faxtomail.save.button.label= 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-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties 2014-04-17 17:27:05 UTC (rev 36) @@ -25,7 +25,7 @@ faxtomail.attachmentEditor.deleteAttachment.title=Suppression de pièce-jointe faxtomail.attachmentEditor.field.file=Fichier faxtomail.attachmentEditor.fileNotFound=Le fichier %s de la pièce jointe n'a pas été trouvé -faxtomail.attachmentEditor.none.tip=Pas de pièce-jointes +faxtomail.attachmentEditor.none.tip=Aucune pièce-jointe faxtomail.attachmentEditor.saveAttachment.button=Enregistrer faxtomail.attachmentEditor.saveAttachment.error.message=Erreur lors de l'enregistrement de la pièce jointe %1s dans le fichier %2s faxtomail.attachmentEditor.saveAttachment.success.message=Le fichier %s a été sauvegardé sur votre machine @@ -42,8 +42,14 @@ faxtomail.config.application= faxtomail.config.title= faxtomail.demandGroup.action.tip=Éléments groupés avec l'élément courant +faxtomail.demandGroup.empty=Aucune demande groupée faxtomail.demandGroup.text=Groupe (%s) faxtomail.demandGroup.title=Groupe +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 +faxtomail.demandReplies.text=Réponses (%s) +faxtomail.demandReplies.title=Réponses envoyées faxtomail.demande.archive.button.label=Archiver faxtomail.demande.askCancelEditBeforeLeaving.cancelSave=L'élément n'est pas valide et ne peut être sauvé. faxtomail.demande.askSaveBeforeLeaving.save=Vous avez modifié l'élément mais vous n'avez pas enregistré ces modifications. @@ -67,7 +73,6 @@ faxtomail.demande.mailBody.label=Corps du mail faxtomail.demande.mailFolder.label=Dossier faxtomail.demande.message.label=Message -faxtomail.demande.object.label=Objet faxtomail.demande.print.button.label=Imprimer faxtomail.demande.priority.label=Priorité faxtomail.demande.projectReference.label=Référence chantier @@ -80,6 +85,7 @@ faxtomail.demande.sender.label=Émetteur faxtomail.demande.sender.manualCreation=Création manuelle faxtomail.demande.status.label=Statut +faxtomail.demande.subject.label=Objet faxtomail.demande.takenBy.label=Pris par faxtomail.demande.transmit.button.label=Transmettre faxtomail.demandeList.action.archive=Archiver @@ -110,8 +116,6 @@ faxtomail.demandeList.table.header.ediCodeNumber.tip=Code EDI faxtomail.demandeList.table.header.lastAttachmentOpeningUser=Dernier à ouvrir une PJ faxtomail.demandeList.table.header.lastAttachmentOpeningUser.tip=Dernier utilisateur à avoir ouvert une pièce-jointe -faxtomail.demandeList.table.header.object=Objet -faxtomail.demandeList.table.header.object.tip=Objet faxtomail.demandeList.table.header.pfNb=Qté produits faxtomail.demandeList.table.header.pfNb.tip=Quantité de produits faxtomail.demandeList.table.header.priority=P @@ -128,6 +132,8 @@ faxtomail.demandeList.table.header.sender.tip=Addresse email ou numéro de fax de l'émetteur faxtomail.demandeList.table.header.status=Statut faxtomail.demandeList.table.header.status.tip=Statut +faxtomail.demandeList.table.header.subject=Objet +faxtomail.demandeList.table.header.subject.tip=Objet faxtomail.demandeList.table.header.type=Type faxtomail.demandeList.table.header.type.tip=Type faxtomail.demandeList.table.header.user=Pris par @@ -180,11 +186,13 @@ faxtomail.reply.action.cancel.tip=Annuler et fermer la popup faxtomail.reply.action.validate=Valider faxtomail.reply.action.validate.tip=Valider et répondre au mail -faxtomail.reply.attachment=Ajouter des pièces jointes -faxtomail.reply.from=De \: -faxtomail.reply.object=Objet \: +faxtomail.reply.label.attachment=Ajouter des pièces jointes +faxtomail.reply.label.from=De \: +faxtomail.reply.label.subject=Objet \: +faxtomail.reply.label.to=À \: +faxtomail.reply.message=\nLe %1$s, %2$s a écrit \:\n> %3$s +faxtomail.reply.subject=Re \: %s faxtomail.reply.title=Réponse à \: %s -faxtomail.reply.to=À \: faxtomail.search.action.gotoFolder=Aller au dossier faxtomail.search.action.gotoFolder.tip=Aller au dossier faxtomail.search.between2ndPart.label=et le @@ -195,13 +203,13 @@ faxtomail.search.docType.label=Type document faxtomail.search.modifiedBetween.label=Modifié entre le faxtomail.search.modifiedBy.label=Modifié par -faxtomail.search.object.label=Objet faxtomail.search.printedBetween.label=Imprimé entre le faxtomail.search.receivedBetween.label=Reçu entre le faxtomail.search.ref.label=Référence faxtomail.search.resultNb=Nombre de résultats \: %s faxtomail.search.sender.label=Émetteur faxtomail.search.status.label=Statut +faxtomail.search.subject.label=Objet faxtomail.search.title=Recherche faxtomail.searchToGroup.action.cancel=Annuler faxtomail.searchToGroup.action.cancel.tip=Fermer la fenêtre sans grouper l'élément @@ -213,4 +221,3 @@ faxtomail.validator.error.email.demandType.required=Type de demande requis faxtomail.validator.error.email.projectReference.required=Référence chantier requise swing.error.cannot.open.file= -test= Deleted: trunk/faxtomail-ui-swing/src/main/resources/icons/action-cross.png =================================================================== (Binary files differ) Copied: trunk/faxtomail-ui-swing/src/main/resources/icons/action-cross.png (from rev 32, trunk/faxtomail-ui-swing/src/main/resources/icons/cross.png) =================================================================== (Binary files differ) Added: trunk/faxtomail-ui-swing/src/main/resources/icons/action-open.png =================================================================== (Binary files differ) Property changes on: trunk/faxtomail-ui-swing/src/main/resources/icons/action-open.png ___________________________________________________________________ Added: svn:executable + * Added: svn:mime-type + application/octet-stream Deleted: trunk/faxtomail-ui-swing/src/main/resources/icons/cross.png =================================================================== (Binary files differ) Added: trunk/faxtomail-ui-swing/src/main/resources/icons/cross_blue.png =================================================================== (Binary files differ) Property changes on: trunk/faxtomail-ui-swing/src/main/resources/icons/cross_blue.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/faxtomail-ui-swing/src/main/resources/icons/cross_red.png =================================================================== (Binary files differ) Property changes on: trunk/faxtomail-ui-swing/src/main/resources/icons/cross_red.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java 2014-04-17 17:27:05 UTC (rev 36) @@ -36,8 +36,11 @@ import javax.mail.internet.MimeMultipart; import java.io.File; import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Date; +import java.util.List; import java.util.Properties; import static org.nuiton.i18n.I18n.t; @@ -134,41 +137,58 @@ log.debug(count + " messages, " + unread + " unread"); - for (int i = 0 ; i < count ; i++ ) { + for (int i = 0 ; i < count ; i++) { Email email = new EmailImpl(); + EmailService emailService = serviceContext.newService(EmailService.class); + emailService.saveEmail(email, null); + int messageNumber = count - i; Message message = folder.getMessage(messageNumber); - log.debug("Message n°" + messageNumber); + List<String> modifiedProperties = new ArrayList<>(); + log.debug("Object: " + message.getSubject()); - email.setObject(message.getSubject()); + email.setSubject(message.getSubject()); + modifiedProperties.add(Email.PROPERTY_SUBJECT); - log.debug("Sender: "); Address[] addresses = message.getFrom(); - if (addresses != null) { - for (Address address : addresses) { - email.setSender(address.toString()); - } + if (addresses != null && addresses.length > 0) { + email.setSender(addresses[0].toString()); + modifiedProperties.add(Email.PROPERTY_SENDER); } - log.debug("Recipients: "); - addresses = message.getRecipients(Message.RecipientType.TO); - if (addresses != null) { - for (Address address : addresses) { - log.debug("\tTo : " + address); - email.setRecipient(address.toString()); - } + List<Address> recipients = new ArrayList<>(); + Address[] toRecipients = message.getRecipients(Message.RecipientType.TO); + if (toRecipients != null) { + recipients.addAll(Arrays.asList(toRecipients)); } + Address[] ccRecipients = message.getRecipients(Message.RecipientType.CC); + if (ccRecipients != null) { + recipients.addAll(Arrays.asList(ccRecipients)); + } - addresses = message.getRecipients(Message.RecipientType.CC); - if (addresses != null) { - for (Address address : addresses) { - log.debug("\tCopy : " + address); + for (Address address : recipients) { + String recipient = address.toString(); + MailFolder mailFolder = serviceContext.newService(MailFolderService.class).getFolderForRecipient(recipient); + + log.debug("\tTo : " + address + " -> " + (mailFolder != null ? mailFolder.getName() : "none")); + + if (mailFolder != null) { + email.setRecipient(recipient); + email.setMailFolder(mailFolder); + modifiedProperties.add(Email.PROPERTY_RECIPIENT); + modifiedProperties.add(Email.PROPERTY_MAIL_FOLDER); + break; } } - email.setReceptionDate(message.getReceivedDate()); + Date receivedDate = message.getReceivedDate(); + if (receivedDate == null) { + receivedDate = message.getSentDate(); + } + email.setReceptionDate(receivedDate); + modifiedProperties.add(Email.PROPERTY_RECEPTION_DATE); Date now = new Date(); @@ -176,39 +196,27 @@ Decorator<Date> dateDecorator = decoratorService.getDecoratorByType(Date.class, DecoratorService.DATE); String projectRef = t("faxtomail.email.projectReference.default", dateDecorator.toString(now)); email.setProjectReference(projectRef); + modifiedProperties.add(Email.PROPERTY_PROJECT_REFERENCE); email.setDemandStatus(DemandStatus.UNTREATED); + modifiedProperties.add(Email.PROPERTY_DEMAND_STATUS); String originalContent = IOUtils.toString(message.getInputStream()); email.setOriginalEmail(originalContent); - log.debug("ContentType: " + message.getContentType()); - if (message.isMimeType("multipart/*")) { decomposeMultipartEmail(message, email); } else { String content = IOUtils.toString(message.getInputStream()); - email.setContent(content); - email.setContentType(message.getContentType()); + email.setPlainContent(content); } - log.debug("Content: "); - log.debug(email.getContent()); + emailService.saveEmail(email, null, modifiedProperties.toArray(new String[modifiedProperties.size()])); -// content = content.replaceAll("<img src=\"(.*?)\"(/>|>.*?</img>)", "[image : $1]"); -// content = content.replaceAll("<a href=\"(.*?)\">(.*?)</a>", "[$2 : $1]"); -// log.debug("Content : "); -// log.debug(content); -// email.setContent(content); - - MailFolder mailFolder = serviceContext.newService(MailFolderService.class).getFolderForRecipient(email.getRecipient()); - email.setMailFolder(mailFolder); - - serviceContext.newService(EmailService.class).saveEmail(email, null); - message.setFlag(Flags.Flag.DELETED, true); } + log.debug("End of emails"); } catch (Exception e) { log.error("Error while reading the emails", e); @@ -235,8 +243,11 @@ // if it is a text part, the,n this is the email content if (bp.isMimeType("text/*")) { String content = IOUtils.toString(bp.getInputStream()); - email.setContent(content); - email.setContentType(bp.getContentType()); + if (bp.isMimeType("text/plain")) { + email.setPlainContent(content); + } else { + email.setHtmlContent(content); + } // if it is multipart part, decompose it } else if (bp.isMimeType("multipart/*")) { @@ -245,14 +256,18 @@ // else, this is an attachment } else { String fileName = bp.getFileName(); - log.debug("FileName : " + fileName); if (fileName == null) { fileName = bp.getHeader("Content-ID")[0]; // remove the guillemets between the id fileName = fileName.replaceFirst("^<(.*)>$", "$1"); } + log.debug("FileName : " + fileName); - File file = new File(FileUtils.getTempDirectory(), fileName); + File dir = new File(FileUtils.getTempDirectory(), email.getTopiaId()); + if (!dir.exists()) { + dir.mkdir(); + } + File file = new File(dir, fileName); FileOutputStream fos = new FileOutputStream(file); DataHandler dh = bp.getDataHandler(); Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ConfigurationAction.java 2014-04-17 17:27:05 UTC (rev 36) @@ -153,7 +153,7 @@ result.put(Email.PROPERTY_SENDER, "Adresse email"); result.put(Email.PROPERTY_RECEPTION_DATE, "Date de réception"); result.put(Email.PROPERTY_EDI_CODE_NUMBER, "Code EDI"); - result.put(Email.PROPERTY_OBJECT, "Objet"); + result.put(Email.PROPERTY_SUBJECT, "Objet"); result.put(Email.PROPERTY_PROJECT_REFERENCE, "Référence travaux"); result.put(Email.PROPERTY_PRIORITY, "Priorité"); result.put(Email.PROPERTY_RANGE_ROW, "Gamme"); Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-04-14 16:33:11 UTC (rev 35) +++ trunk/pom.xml 2014-04-17 17:27:05 UTC (rev 36) @@ -115,7 +115,7 @@ <h2Version>1.3.174</h2Version> <jaxxVersion>2.8.5-SNAPSHOT</jaxxVersion> - <swingXVersion>1.6.4</swingXVersion> + <swingXVersion>1.6.5-1</swingXVersion> <xworkVersion>2.3.15.1</xworkVersion> <struts2Version>2.3.15.3</struts2Version>
participants (1)
-
kmorin@users.forge.codelutin.com