Author: kmorin Date: 2014-03-21 17:34:28 +0100 (Fri, 21 Mar 2014) New Revision: 20 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/20 Log: refs #4666 [ECRAN] Pi?\195?\168ces jointes Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/JImagePanel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIModel.java trunk/faxtomail-ui-swing/src/main/resources/icons/action-cross.png trunk/faxtomail-ui-swing/src/main/resources/icons/action-note.png trunk/faxtomail-ui-swing/src/main/resources/icons/add.png trunk/faxtomail-ui-swing/src/main/resources/icons/cross.png Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo trunk/faxtomail-ui-swing/pom.xml trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/RunFaxToMail.java 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/util/AbstractFaxToMailUIHandler.java 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/attachment/AttachmentEditorUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentEditorUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentItem.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/SaveAttachmentAction.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/pom.xml Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo =================================================================== (Binary files differ) Modified: trunk/faxtomail-ui-swing/pom.xml =================================================================== --- trunk/faxtomail-ui-swing/pom.xml 2014-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/pom.xml 2014-03-21 16:34:28 UTC (rev 20) @@ -248,6 +248,16 @@ <!--<artifactId>novaworx-syntax</artifactId>--> <!--</dependency>--> + <dependency> + <groupId>com.itextpdf</groupId> + <artifactId>itextpdf</artifactId> + </dependency> + + <dependency> + <groupId>org.swinglabs</groupId> + <artifactId>pdf-renderer</artifactId> + </dependency> + </dependencies> <build> @@ -745,28 +755,28 @@ </build> </profile> - <profile> - <id>profiling</id> + <!--<profile>--> + <!--<id>profiling</id>--> - <build> - <resources> - <resource> - <directory>src/main/profiling</directory> - <includes> - <include>**/*</include> - </includes> - </resource> - </resources> - </build> + <!--<build>--> + <!--<resources>--> + <!--<resource>--> + <!--<directory>src/main/profiling</directory>--> + <!--<includes>--> + <!--<include>**/*</include>--> + <!--</includes>--> + <!--</resource>--> + <!--</resources>--> + <!--</build>--> - <dependencies> + <!--<dependencies>--> - <dependency> - <groupId>org.nuiton</groupId> - <artifactId>nuiton-profiling</artifactId> - <scope>runtime</scope> - </dependency> - </dependencies> - </profile> + <!--<dependency>--> + <!--<groupId>org.nuiton</groupId>--> + <!--<artifactId>nuiton-profiling</artifactId>--> + <!--<scope>runtime</scope>--> + <!--</dependency>--> + <!--</dependencies>--> + <!--</profile>--> </profiles> </project> \ No newline at end of file Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/RunFaxToMail.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/RunFaxToMail.java 2014-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/RunFaxToMail.java 2014-03-21 16:34:28 UTC (rev 20) @@ -27,6 +27,15 @@ import com.franciaflex.faxtomail.ui.swing.content.MainUIHandler; import com.franciaflex.faxtomail.ui.swing.actions.StartAction; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailExceptionHandler; +import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; +import com.itextpdf.text.*; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.ColumnText; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.itextpdf.text.pdf.PdfWriter; import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -34,6 +43,10 @@ import javax.swing.*; import javax.swing.plaf.BorderUIResource; import java.awt.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; import java.util.Arrays; /** Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java 2014-03-21 16:34:28 UTC (rev 20) @@ -0,0 +1,148 @@ +package com.franciaflex.faxtomail.ui.swing.actions; + +import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; +import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; +import com.franciaflex.faxtomail.ui.swing.util.JImagePanel; +import com.franciaflex.faxtomail.ui.swing.util.attachment.PDFEditorUI; +import com.franciaflex.faxtomail.ui.swing.util.attachment.PDFEditorUIHandler; +import com.franciaflex.faxtomail.ui.swing.util.attachment.PDFEditorUIModel; +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Document; +import com.itextpdf.text.Image; +import com.itextpdf.text.Phrase; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.BaseFont; +import com.itextpdf.text.pdf.ColumnText; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.itextpdf.text.pdf.PdfWriter; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.SwingUtil; +import org.nuiton.util.FileUtil; + +import javax.swing.*; +import java.awt.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.net.URL; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class GenerateAnnotatedAttachmentAction extends AbstractFaxToMailAction<PDFEditorUIModel, PDFEditorUI, PDFEditorUIHandler> { + + public GenerateAnnotatedAttachmentAction(PDFEditorUIHandler handler) { + super(handler, false); + } + + @Override + public void doAction() throws Exception { + + File file = getModel().getNotNullFile(); + + FileInputStream fis; + if (FaxToMailUIUtil.isFileAPDF(file)) { + fis = new FileInputStream(file); + + } else { + File target = File.createTempFile("test", ".pdf"); + + Document document = new Document(); + FileOutputStream fos = new FileOutputStream(target); + PdfWriter writer = PdfWriter.getInstance(document, fos); + writer.open(); + + URL resource = file.toURI().toURL(); + Image image = Image.getInstance(resource); + Rectangle pageSize = new Rectangle(image.getWidth(), image.getHeight()); + document.setPageSize(pageSize); + document.setMargins(0, 0, 0, 0); + + document.open(); + document.add(image); + document.close(); + writer.close(); + + fis = new FileInputStream(target); + } + + PdfReader pdfReader = new PdfReader(fis); + + File target = new File(getModel().getOriginalFile().getName() + "-annoté.pdf"); + FileOutputStream fos = new FileOutputStream(target); + PdfStamper pdfStamper = new PdfStamper(pdfReader, fos); + + int pageNb = getModel().getPages().length; + + for (int i = 0 ; i < pageNb ; i++) { + PdfContentByte cb = pdfStamper.getOverContent(i + 1); + + for (JPanel panel : getModel().getPages()[i].getNotes()) { + + Point location = panel.getLocation(); + int width = panel.getWidth(); + int height = panel.getHeight(); + int x = location.x; + int y = getUI().getContainer().getHeight() - location.y - height; + Insets insets = panel.getInsets(); + + cb.saveState(); + cb.setColorFill(BaseColor.YELLOW); + cb.rectangle(x, y, width, height); + cb.fill(); + cb.restoreState(); + + cb.saveState(); + JTextArea textArea = (JTextArea) panel.getComponent(0); + float fontSize = textArea.getFont().getSize2D(); + cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA_OBLIQUE, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), fontSize * 1.3f); + + ColumnText ct = new ColumnText(cb); + ct.setSimpleColumn(x + insets.left, y + insets.bottom, x + insets.left + width - insets.right, y + insets.bottom + height - insets.top); + ct.setLeading(fontSize + 3); + + String text = textArea.getText(); + String[] rows = text.split("\n"); + for (String s : rows) { + if (s.isEmpty()) { + s = " "; + } + ct.addText(new Phrase(s)); + ct.go(); + } + JLabel label = (JLabel) panel.getComponent(1); + ct.addText(new Phrase(label.getText())); + ct.go(); + + cb.restoreState(); + } + + for (JImagePanel panel : getModel().getPages()[i].getCrosses()) { + + Point location = panel.getLocation(); + int width = panel.getWidth(); + int height = panel.getHeight(); + int x = location.x; + int y = getUI().getContainer().getHeight() - location.y - height; + + cb.saveState(); + Image cross = Image.getInstance(JAXXUtil.class.getResource(SwingUtil.DEFAULT_ICON_PATH + PDFEditorUIHandler.CROSS_IMAGE_FILE)); + cross.scaleAbsolute(width, height); + cross.setAbsolutePosition(x, y); + cb.addImage(cross); + cb.restoreState(); + } + } + + pdfStamper.close(); + pdfReader.close(); + + getModel().setEditedFile(target); + } + + +} 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-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.css 2014-03-21 16:34:28 UTC (rev 20) @@ -259,3 +259,9 @@ actionIcon: reply; enabled: { model.isValid() && model.isEditable() }; } + +#linkButton { + text: "faxtomail.demande.link.button.label"; + actionIcon: link; + enabled: { model.isValid() && model.isEditable() }; +} 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-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUI.jaxx 2014-03-21 16:34:28 UTC (rev 20) @@ -274,6 +274,7 @@ <JButton id="printButton"/> <JButton id="archiveButton"/> <JButton id="replyButton" onActionPerformed="handler.reply()"/> + <JButton id="linkButton" onActionPerformed="handler.link()"/> </JPanel> </JPanel> \ No newline at end of file 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-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-03-21 16:34:28 UTC (rev 20) @@ -139,7 +139,6 @@ + "<p>This is some sample text</p>\n" + "<p><a href=\"http://devdaily.com/blog/\">devdaily blog</a></p>\n" + "<p><img src=\"http://jarnal.wikispaces.com/space/showlogo/1301230030/logo.png\"/></p>\n" - + "<p><test>ouaf ! une chaussette :P</test></p>\n" + "</body>\n"; htmlString = htmlString.replaceAll("<img src=\"(.*?)\"(/>|>.*?</img>)", "[image : $1]"); @@ -375,4 +374,8 @@ model.setTo(getModel().getSender()); openFrame(dialogContent, t("faxtomail.reply.title", getModel().getObject()), new Dimension(800, 600)); } + + public void link() { + //TODO + } } 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-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailUIHandler.java 2014-03-21 16:34:28 UTC (rev 20) @@ -40,6 +40,7 @@ import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; import org.nuiton.jaxx.application.swing.ApplicationUI; import org.nuiton.jaxx.application.swing.action.ApplicationActionUI; +import org.nuiton.jaxx.application.swing.util.*; import org.nuiton.validator.bean.simple.SimpleBeanValidator; import javax.swing.*; @@ -250,4 +251,5 @@ SwingUtil.center(getContext().getMainUI(), result); result.setVisible(true); } + } 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-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-03-21 16:34:28 UTC (rev 20) @@ -42,6 +42,7 @@ import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.util.ApplicationUIUtil; +import org.nuiton.util.FileUtil; import javax.swing.*; import javax.swing.event.ChangeListener; @@ -53,6 +54,7 @@ import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; @@ -152,4 +154,8 @@ } return new int[] { pfNb, savNb }; } + + public static boolean isFileAPDF(File file) { + return FileUtil.extension(file).toUpperCase().equals("PDF"); + } } Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/JImagePanel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/JImagePanel.java (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/JImagePanel.java 2014-03-21 16:34:28 UTC (rev 20) @@ -0,0 +1,90 @@ +package com.franciaflex.faxtomail.ui.swing.util; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class JImagePanel extends JPanel { + + protected Image img; + protected Image scaledImage; + + protected boolean scaleImageToFitPanel; + + protected ComponentAdapter resizeAdapter = new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + Component component = e.getComponent(); + if (img != null) { + scaledImage = img.getScaledInstance(component.getWidth(), component.getHeight(), Image.SCALE_SMOOTH); + } + repaint(); + } + }; + + public JImagePanel() { + setLayout(null); + } + + public JImagePanel(Image img) { + this(); + setImg(img); + } + + public JImagePanel(String img) { + this(new ImageIcon(img).getImage()); + } + + public boolean isScaleImageToFitPanel() { + return scaleImageToFitPanel; + } + + public void setScaleImageToFitPanel(boolean scaleImageToFitPanel) { + if (this.scaleImageToFitPanel != scaleImageToFitPanel) { + if (scaleImageToFitPanel) { + addComponentListener(resizeAdapter); + } else { + removeComponentListener(resizeAdapter); + } + } + this.scaleImageToFitPanel = scaleImageToFitPanel; + } + + public Image getImg() { + return img; + } + + public Image getScaledImage() { + return scaledImage; + } + + public void setImg(String img) { + setImg(new ImageIcon(img).getImage()); + } + + public void setImg(Image img) { + this.img = img; + this.scaledImage = img; + + Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); + setPreferredSize(size); + setMinimumSize(size); + setMaximumSize(size); + setSize(size); + } + + @Override + public void paintComponent(Graphics g) { + if (scaledImage != null) { + Insets insets = getInsets(); + g.drawImage(scaledImage, insets.left, insets.top, this); + } + } +} Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentEditorUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentEditorUIHandler.java 2014-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentEditorUIHandler.java 2014-03-21 16:34:28 UTC (rev 20) @@ -2,46 +2,35 @@ import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; -import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupHandler; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; -import com.google.common.base.Function; import com.google.common.collect.Iterables; -import jaxx.runtime.SwingUtil; -import jaxx.runtime.swing.model.JaxxDefaultListModel; +import com.google.common.collect.Lists; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; -import org.jdesktop.swingx.JXList; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.HighlighterFactory; -import org.jdesktop.swingx.table.DefaultTableColumnModelExt; -import org.jdesktop.swingx.table.TableColumnExt; -import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.jaxx.application.ApplicationTechnicalException; import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; -import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; +import org.nuiton.util.FileUtil; import javax.swing.*; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; -import javax.swing.table.DefaultTableCellRenderer; 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; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; +import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -52,6 +41,9 @@ */ public class AttachmentEditorUIHandler extends AbstractToolbarPopupHandler<AttachmentEditorUIModel, AttachmentEditorUI> { + public static final List<String> EDITABLE_EXTENSIONS = Lists.newArrayList("PDF", "PNG", "JPG", "JPEG", "GIF", + "TIF", "JP2", "BMP", "WMF", "JB2", "TXT"); + @Override public void afterInit(AttachmentEditorUI ui) { @@ -150,7 +142,7 @@ File file = ui.getFile().getSelectedFile(); if (file != null) { - attachment.setFile(file); + attachment.setOriginalFile(file); getModel().addAttachment(attachment); resetFields(); } @@ -162,18 +154,31 @@ public void openAttachment(Attachment attachment) { // File file = getPersistenceService().getAttachmentFile(attachment.getId()); - File file = attachment.getFile(); + File file = attachment.getEditedFile(); + if (file == null) { + file = attachment.getOriginalFile(); + } if (!file.exists()) { throw new ApplicationTechnicalException(t("faxtomail.attachmentEditor.fileNotFound", file.getAbsolutePath())); } - Desktop desktop = FaxToMailUIUtil.getDesktopForBrowse(); - try { - desktop.browse(file.toURI()); + String extension = FileUtil.extension(file); + if (EDITABLE_EXTENSIONS.contains(extension.toUpperCase())) { - } catch (IOException e) { - getContext().getErrorHelper().showErrorDialog(t("swing.error.cannot.open.file")); + PDFEditorUI dialogContent = new PDFEditorUI(ui); + dialogContent.getModel().fromEntity(attachment); + openDialog(dialogContent, file.getName(), getContext().getMainUI().getSize()); + dialogContent.getModel().toEntity(attachment); + + } else { + Desktop desktop = FaxToMailUIUtil.getDesktopForBrowse(); + try { + desktop.browse(file.toURI()); + + } catch (IOException e) { + getContext().getErrorHelper().showErrorDialog(t("swing.error.cannot.open.file")); + } } } @@ -184,9 +189,11 @@ ui.setAlwaysOnTop(false); } int answer = JOptionPane.showConfirmDialog(ui, - t("faxtomail.attachmentEditor.deleteAttachment.message", attachment.getFile()), + t("faxtomail.attachmentEditor.deleteAttachment.message", + attachment.getOriginalFile().getName()), t("faxtomail.attachmentEditor.deleteAttachment.title"), - JOptionPane.YES_NO_OPTION); + JOptionPane.YES_NO_OPTION + ); if (hackDialog) { ui.setAlwaysOnTop(true); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentEditorUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentEditorUIModel.java 2014-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentEditorUIModel.java 2014-03-21 16:34:28 UTC (rev 20) @@ -78,9 +78,11 @@ firePropertyChange(AttachmentModelAware.PROPERTY_ATTACHMENT, null, attachments); } - public void setAttachments(Collection<Attachment> attachments) { + public void setAttachment(Collection<Attachment> attachments) { this.attachments.clear(); - this.attachments.addAll(attachments); + if (attachments != null) { + this.attachments.addAll(attachments); + } firePropertyChange(AttachmentModelAware.PROPERTY_ATTACHMENT, null, this.attachments); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentItem.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentItem.css 2014-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/AttachmentItem.css 2014-03-21 16:34:28 UTC (rev 20) @@ -1,5 +1,5 @@ #attachmentNameLabel { - text: {attachment != null ? getAttachment().getFile().getName() : null}; + text: { attachment != null ? getAttachment().getOriginalFile().getName() : null }; } #toolbar { @@ -15,4 +15,5 @@ #removeAttachmentButton { actionIcon: "delete"; toolTipText: "faxtomail.attachmentEditor.action.remove.tip"; + enabled: { getAttachment() != null && getAttachment().getTopiaId() == null }; } \ No newline at end of file Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.css (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.css 2014-03-21 16:34:28 UTC (rev 20) @@ -0,0 +1,36 @@ +#toolbar { + floatable: false; + margin: {new java.awt.Insets(0, 0, 0, 5)}; + borderPainted: false; +} + +#noteButton { + actionIcon: note; +} + +#crossButton { + actionIcon: cross; +} + +#prevPageButton { + enabled: { getModel().getCurrentPageIndex() > 0 }; + actionIcon: cross; +} + +#nextPageButton { + enabled: { getModel().getCurrentPageIndex() < getModel().getPages().length - 1 }; + actionIcon: cross; +} + +#cancelButton { + actionIcon: cancel; + text: "faxtomail.reply.action.cancel"; + toolTipText: "faxtomail.reply.action.cancel.tip"; +} + +#validateButton { + actionIcon: validate; + text: "faxtomail.reply.action.validate"; + toolTipText: "faxtomail.reply.action.validate.tip"; + _applicationAction: {com.franciaflex.faxtomail.ui.swing.actions.GenerateAnnotatedAttachmentAction.class}; +} \ No newline at end of file Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.jaxx (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUI.jaxx 2014-03-21 16:34:28 UTC (rev 20) @@ -0,0 +1,45 @@ +<JPanel layout='{new BorderLayout()}' + implements='com.franciaflex.faxtomail.ui.swing.util.FaxToMailUI<PDFEditorUIModel, PDFEditorUIHandler>'> + + <import> + com.franciaflex.faxtomail.ui.swing.util.FaxToMailUI + com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil + + com.franciaflex.faxtomail.ui.swing.util.JImagePanel + + </import> + + <script><![CDATA[ + + public PDFEditorUI(FaxToMailUI parentUI) { + FaxToMailUIUtil.setParentUI(this, parentUI); + } + + ]]></script> + + <PDFEditorUIModel id='model' initializer='new PDFEditorUIModel()'/> + + <JToolBar id="toolbar" + constraints='BorderLayout.NORTH'> + <JButton id='noteButton' + onActionPerformed="handler.addNote()"/> + <JButton id='crossButton' + onActionPerformed="handler.addCross()"/> + <JButton id="prevPageButton" + onActionPerformed="getModel().decPageIndex()"/> + <JButton id="nextPageButton" + onActionPerformed="getModel().incPageIndex()"/> + </JToolBar> + + <JScrollPane constraints='BorderLayout.CENTER'> + <JPanel> + <JImagePanel id="container"> + </JImagePanel> + </JPanel> + </JScrollPane> + + <JPanel layout='{new GridLayout(1, 0)}' constraints='BorderLayout.SOUTH'> + <JButton id='cancelButton' onActionPerformed='handler.closeDialog()'/> + <JButton id='validateButton'/> + </JPanel> +</JPanel> \ No newline at end of file Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIHandler.java (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIHandler.java 2014-03-21 16:34:28 UTC (rev 20) @@ -0,0 +1,194 @@ +package com.franciaflex.faxtomail.ui.swing.util.attachment; + +import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; +import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; +import com.franciaflex.faxtomail.ui.swing.util.JImagePanel; +import com.itextpdf.text.pdf.BaseFont; +import com.sun.pdfview.PDFFile; +import com.sun.pdfview.PDFPage; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.ComponentMover; +import jaxx.runtime.swing.ComponentResizer; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.FileUtil; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.Date; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class PDFEditorUIHandler extends AbstractFaxToMailUIHandler<PDFEditorUIModel, PDFEditorUI> { + + private static final Log log = LogFactory.getLog(PDFEditorUIHandler.class); + + public static final String CROSS_IMAGE_FILE = "cross.png"; + + protected ComponentMover cm = new ComponentMover(); + protected ComponentResizer cr = new ComponentResizer(); + + protected PDFFile pdf; + + @Override + public void afterInit(PDFEditorUI pdfEditorUI) { + initUI(pdfEditorUI); + + cm.setDragInsets(cr.getDragInsets()); + cm.setEdgeInsets(new Insets(0, 0, 0, 0)); + + getModel().addPropertyChangeListener(PDFEditorUIModel.PROPERTY_CURRENT_PAGE_INDEX, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (pdf != null) { + int pageNb = (int) evt.getNewValue(); + PDFPage page = pdf.getPage(pageNb +1); + // create the image + Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), + (int) page.getBBox().getHeight()); + + Image image = page.getImage(rect.width, rect.height, // width & height + rect, // clip rect + null, // null for the ImageObserver + true, // fill background with white + true // block until drawing is done + ); + getUI().getContainer().setImg(image); + getUI().getContainer().updateUI(); + + //TODO kmorin 20140321 hide the panels of the previous pages + chanegs icons + display the number of pages + } + } + }); + + getModel().addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (Attachment.PROPERTY_ORIGINAL_FILE.equals(evt.getPropertyName()) + || Attachment.PROPERTY_EDITED_FILE.equals(evt.getPropertyName())) { + + PDFEditorUIModel model = (PDFEditorUIModel) evt.getSource(); + File file = model.getNotNullFile(); + + if (file != null) { + if (FaxToMailUIUtil.isFileAPDF(file)) { + getUI().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + try { + RandomAccessFile raf = new RandomAccessFile(file, "r"); + FileChannel channel = raf.getChannel(); + ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); + pdf = new PDFFile(buf); + + model.setPageNumber(pdf.getNumPages()); + model.setCurrentPageIndex(0); + + } catch (FileNotFoundException e) { + if (log.isErrorEnabled()) { + log.error("", e); + } + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error("", e); + } + } + getUI().setCursor(Cursor.getDefaultCursor()); + + } else { + model.setPageNumber(1); + model.setCurrentPageIndex(0); + getUI().getContainer().setImg(file.getAbsolutePath()); + + } + } + } + } + }); + } + + @Override + protected JComponent getComponentToFocus() { + return null; + } + + @Override + public SwingValidator<PDFEditorUIModel> getValidator() { + return null; + } + + @Override + public void onCloseUI() { + + } + + public void addNote() { + final JPanel panel = new JPanel(new BorderLayout()); + panel.setBackground(Color.YELLOW); + panel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + + JTextArea textArea = new JTextArea(); + textArea.setBorder(null); + textArea.setOpaque(false); + textArea.setBackground(null); + textArea.setFont(Font.decode(BaseFont.HELVETICA)); + panel.add(textArea, BorderLayout.CENTER); + + String title = decorate(new Date()) + " - " + getContext().getCurrentUser().getTrigraph(); + JLabel label = new JLabel(title); + label.setFont(Font.decode(BaseFont.HELVETICA).deriveFont(Font.ITALIC)); + panel.add(label, BorderLayout.SOUTH); + + textArea.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + Dimension size = panel.getPreferredSize(); + Point location = panel.getLocation(); + Insets insets = ui.getContainer().getInsets(); + panel.setBounds(0 + insets.left, 0 + insets.top, + size.width, size.height); + panel.setLocation(location); + } + }); + + addPanel(panel); + getModel().getCurrentPage().addNote(panel); + } + + public void addCross() { + java.awt.Image cross = SwingUtil.createImageIcon(CROSS_IMAGE_FILE).getImage(); + JImagePanel panel = new JImagePanel(cross); + panel.setScaleImageToFitPanel(true); + panel.setBorder(BorderFactory.createDashedBorder(null)); + addPanel(panel); + cr.registerComponent(panel); + getModel().getCurrentPage().addCross(panel); + } + + protected void addPanel(JPanel panel) { + ui.getContainer().add(panel, 0); + + Insets insets = ui.getContainer().getInsets(); + Dimension size = panel.getPreferredSize(); + panel.setBounds(0 + insets.left, 0 + insets.top, + size.width, size.height); + + ui.getContainer().updateUI(); + + cm.registerComponent(panel); + } + +} Added: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIModel.java (rev 0) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/PDFEditorUIModel.java 2014-03-21 16:34:28 UTC (rev 20) @@ -0,0 +1,145 @@ +package com.franciaflex.faxtomail.ui.swing.util.attachment; + +import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; +import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailBeanUIModel; +import com.franciaflex.faxtomail.ui.swing.util.JImagePanel; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + +import javax.swing.*; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Kevin Morin (Code Lutin) + * @since x.x + */ +public class PDFEditorUIModel extends AbstractFaxToMailBeanUIModel<Attachment, PDFEditorUIModel> { + + public static final String PROPERTY_CURRENT_PAGE_INDEX = "currentPageIndex"; + + protected final Attachment editObject = new AttachmentImpl(); + + public class Page { + + protected List<JPanel> notes = new ArrayList<JPanel>(); + protected List<JImagePanel> crosses = new ArrayList<JImagePanel>(); + + public List<JPanel> getNotes() { + return notes; + } + + public void addNote(JPanel note) { + notes.add(note); + } + + public List<JImagePanel> getCrosses() { + return crosses; + } + + public void addCross(JImagePanel cross) { + crosses.add(cross); + } + + } + + protected Page[] pages; + + protected int currentPageIndex = -1; + + protected static Binder<PDFEditorUIModel, Attachment> toBeanBinder = + BinderFactory.newBinder(PDFEditorUIModel.class, + Attachment.class); + + protected static Binder<Attachment, PDFEditorUIModel> fromBeanBinder = + BinderFactory.newBinder(Attachment.class, PDFEditorUIModel.class); + + public PDFEditorUIModel() { + super(fromBeanBinder, toBeanBinder); + } + + public void setOriginalFile(File file) { + Object oldValue = getOriginalFile(); + editObject.setOriginalFile(file); + firePropertyChange(Attachment.PROPERTY_ORIGINAL_FILE, oldValue, file); + } + + public File getOriginalFile() { + return editObject.getOriginalFile(); + } + + public void setEditedFile(File file) { + Object oldValue = getEditedFile(); + editObject.setEditedFile(file); + firePropertyChange(Attachment.PROPERTY_EDITED_FILE, oldValue, file); + } + + public File getEditedFile() { + return editObject.getEditedFile(); + } + + public File getNotNullFile() { + File file = getEditedFile(); + if (file == null) { + file = getOriginalFile(); + } + return file; + } + + public String getTopiaId() { + return editObject.getTopiaId(); + } + + public void setTopiaId(String id) { + Object oldValue = getTopiaId(); + editObject.setTopiaId(id); + firePropertyChange(Attachment.PROPERTY_TOPIA_ID, oldValue, id); + } + + public Page[] getPages() { + return pages; + } + + public void setPageNumber(int nb) { + pages = new Page[nb]; + for (int i = 0 ; i < nb ; i++) { + pages[i] = new Page(); + } + } + + public Page getCurrentPage() { + if (pages == null || currentPageIndex < 0 | currentPageIndex >= pages.length) { + return null; + } + return pages[currentPageIndex]; + } + + public int getCurrentPageIndex() { + return currentPageIndex; + } + + public void setCurrentPageIndex(int currentPageIndex) { + Object oldValue = getCurrentPageIndex(); + this.currentPageIndex = currentPageIndex; + firePropertyChange(PROPERTY_CURRENT_PAGE_INDEX, oldValue, currentPageIndex); + } + + public void decPageIndex() { + if (currentPageIndex > 0) { + setCurrentPageIndex(currentPageIndex - 1); + } + } + + public void incPageIndex() { + if (currentPageIndex < pages.length - 1) { + setCurrentPageIndex(currentPageIndex + 1); + } + } + + @Override + protected Attachment newEntity() { + return new AttachmentImpl(); + } +} Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/SaveAttachmentAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/SaveAttachmentAction.java 2014-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/attachment/SaveAttachmentAction.java 2014-03-21 16:34:28 UTC (rev 20) @@ -32,7 +32,7 @@ boolean doAction = super.prepareAction(); if (doAction) { - attachmentFile = attachment.getFile(); + attachmentFile = attachment.getOriginalFile(); file = saveFile( ApplicationIOUtil.getBaseName(attachmentFile.getName()), 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-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_en_GB.properties 2014-03-21 16:34:28 UTC (rev 20) @@ -125,6 +125,7 @@ faxtomail.demande.lastModificationDate.label= faxtomail.demande.lastModified.label= faxtomail.demande.lastModifiedBy.label= +faxtomail.demande.link.button.label= faxtomail.demande.mailBody.label= faxtomail.demande.mailFolder.label= faxtomail.demande.message.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-03-14 17:07:36 UTC (rev 19) +++ trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties 2014-03-21 16:34:28 UTC (rev 20) @@ -37,17 +37,19 @@ 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. -faxtomail.demande.attachment.label= +faxtomail.demande.attachment.label=Pièces-jointes faxtomail.demande.back.button.label=Quitter -faxtomail.demande.client.label= +faxtomail.demande.client.label=Client faxtomail.demande.clientCode.label=Client faxtomail.demande.demandStatus.label=Statut faxtomail.demande.demandType.label=Type +faxtomail.demande.docType.label=Type faxtomail.demande.ediCodeNumber.label=Retour EDI faxtomail.demande.etatAttente.label=État attente -faxtomail.demande.fax.label= +faxtomail.demande.fax.label=Fax faxtomail.demande.firstOpened.label=Première ouverture faxtomail.demande.lastModified.label=Dernière modification +faxtomail.demande.link.button.label=Coupler faxtomail.demande.mailBody.label=Corps du mail faxtomail.demande.mailFolder.label=Dossier faxtomail.demande.message.label=Message @@ -63,6 +65,7 @@ faxtomail.demande.save.button.label=Enregistrer faxtomail.demande.sender.label=Émetteur faxtomail.demande.sender.manualCreation=Création manuelle +faxtomail.demande.status.label=Statut faxtomail.demande.takenBy.label=Pris par faxtomail.demande.transmit.button.label=Transmettre faxtomail.demandeList.action.archive=Archiver Added: trunk/faxtomail-ui-swing/src/main/resources/icons/action-cross.png =================================================================== (Binary files differ) Property changes on: trunk/faxtomail-ui-swing/src/main/resources/icons/action-cross.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/faxtomail-ui-swing/src/main/resources/icons/action-note.png =================================================================== (Binary files differ) Property changes on: trunk/faxtomail-ui-swing/src/main/resources/icons/action-note.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/faxtomail-ui-swing/src/main/resources/icons/add.png =================================================================== (Binary files differ) Property changes on: trunk/faxtomail-ui-swing/src/main/resources/icons/add.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/faxtomail-ui-swing/src/main/resources/icons/cross.png =================================================================== (Binary files differ) Property changes on: trunk/faxtomail-ui-swing/src/main/resources/icons/cross.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-03-14 17:07:36 UTC (rev 19) +++ trunk/pom.xml 2014-03-21 16:34:28 UTC (rev 20) @@ -250,6 +250,12 @@ <!--<version>${xworkVersion}</version>--> <!--</dependency>--> + <dependency> + <groupId>com.itextpdf</groupId> + <artifactId>itextpdf</artifactId> + <version>5.5.0</version> + </dependency> + <!-- librairie Jaxx --> <dependency> <groupId>org.nuiton.jaxx</groupId> @@ -322,7 +328,19 @@ <version>${swingXVersion}</version> </dependency> + <!--<dependency>--> + <!--<groupId>de.intarsys.opensource</groupId>--> + <!--<artifactId>jPodRenderer</artifactId>--> + <!--<version>5.5.1</version>--> + <!--</dependency>--> + <dependency> + <groupId>org.swinglabs</groupId> + <artifactId>pdf-renderer</artifactId> + <version>1.0.5</version> + </dependency> + + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-vfs2</artifactId> <version>2.0</version>