From a1208626fad77d9e09f88f7b9fdaae13d1adf0f2 Mon Sep 17 00:00:00 2001 From: tkellner Date: Wed, 10 Apr 2013 19:22:50 +0000 Subject: Completely rework Output(State/Composite) Only save once Allow saving to input doc directory Ask whether to overwrite existing file git-svn-id: https://joinup.ec.europa.eu/svn/pdf-over/trunk@289 174cde9d-5d70-4d2a-aa98-46368bc2aaf7 --- .../pdfover/gui/composites/OutputComposite.java | 404 +++++++++++---------- .../pdfover/gui/workflow/states/OutputState.java | 67 +--- .../at/asit/pdfover/gui/messages.properties | 3 +- .../at/asit/pdfover/gui/messages_de.properties | 3 +- 4 files changed, 235 insertions(+), 242 deletions(-) (limited to 'pdf-over-gui/src/main') diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java index 855b3f65..d2ef6a54 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java @@ -41,6 +41,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.Constants; +import at.asit.pdfover.gui.controls.Dialog; +import at.asit.pdfover.gui.controls.Dialog.BUTTONS; +import at.asit.pdfover.gui.controls.Dialog.ICON; import at.asit.pdfover.gui.utils.Messages; import at.asit.pdfover.gui.workflow.states.State; import at.asit.pdfover.signator.DocumentSource; @@ -55,17 +58,81 @@ public class OutputComposite extends StateComposite { **/ static final Logger log = LoggerFactory.getLogger(OutputComposite.class); + private Link lnk_saved_file; + + private Button btn_save; + + private Label lbl_success_message; + + private DocumentSource signedDocument; + private File inputFile; + String outputDir = null; + + String tempDirectory = null; + File outputFile = null; - String outputDir = null; + private boolean saveFailed = false; /** - * @return the outputDir + * Create the composite. + * + * @param parent + * The parent composite + * @param style + * The swt style + * @param state + * The owning state */ - public String getOutputDir() { - return this.outputDir; + public OutputComposite(Composite parent, int style, State state) { + super(parent, style, state); + + this.setLayout(new FormLayout()); + + this.lbl_success_message = new Label(this, SWT.NATIVE | SWT.RESIZE); + FormData fd_lbl_success_message = new FormData(); + fd_lbl_success_message.top = new FormAttachment(40, 0); + fd_lbl_success_message.left = new FormAttachment(0); + fd_lbl_success_message.right = new FormAttachment(100); + this.lbl_success_message.setLayoutData(fd_lbl_success_message); + this.lbl_success_message.setAlignment(SWT.CENTER); + + FontData[] fD1 = this.lbl_success_message.getFont().getFontData(); + fD1[0].setHeight(Constants.TEXT_SIZE_BIG); + this.lbl_success_message.setFont(new Font(Display.getCurrent(), fD1[0])); + + this.lnk_saved_file = new Link(this, SWT.NATIVE | SWT.RESIZE); + FormData fd_lnk_saved_file = new FormData(); + fd_lnk_saved_file.top = new FormAttachment(this.lbl_success_message, 10); + fd_lnk_saved_file.left = new FormAttachment(this.lbl_success_message, 0, + SWT.CENTER); + // fd_lnk_saved_file.right = new FormAttachment(100); + this.lnk_saved_file.setLayoutData(fd_lnk_saved_file); + + this.lnk_saved_file.addSelectionListener(new OpenSelectionListener()); + + FontData[] fD2 = this.lnk_saved_file.getFont().getFontData(); + fD2[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.lnk_saved_file.setFont(new Font(Display.getCurrent(), fD2[0])); + + this.btn_save = new Button(this, SWT.NATIVE | SWT.RESIZE); + + FontData[] fD_btn_save = this.btn_save.getFont().getFontData(); + fD_btn_save[0].setHeight(Constants.TEXT_SIZE_BUTTON); + this.btn_save.setFont(new Font(Display.getCurrent(), fD_btn_save[0])); + + FormData fd_btn_save = new FormData(); + fd_btn_save.top = new FormAttachment(this.lnk_saved_file, 10); + fd_btn_save.left = new FormAttachment(this.lnk_saved_file, 0, + SWT.CENTER); + this.btn_save.setLayoutData(fd_btn_save); + + this.btn_save.addSelectionListener(new SaveSelectionListener()); + enableSaveButton(false); + + reloadResources(); } /** @@ -76,6 +143,13 @@ public class OutputComposite extends StateComposite { this.outputDir = outputDir; } + /** + * @return the outputDir + */ + public String getOutputDir() { + return this.outputDir; + } + /** * Sets the input file * @@ -96,85 +170,140 @@ public class OutputComposite extends StateComposite { } /** - * Saves the file - * - * @throws IOException + * @param tempDirectory */ - void saveFile() throws IOException { - FileDialog save = new FileDialog(OutputComposite.this.getShell(), - SWT.SAVE | SWT.NATIVE); - save.setFilterExtensions(new String[] { "*.pdf", "*" }); //$NON-NLS-1$ //$NON-NLS-2$ - save.setFilterNames(new String[] { - Messages.getString("common.PDFExtension_Description"), //$NON-NLS-1$ - Messages.getString("common.AllExtension_Description")}); //$NON-NLS-1$ - - String proposed = OutputComposite.this.getInputFile().getAbsolutePath(); - - String path = this.getOutputDir(); - - if (path == null || path.equals("")) { //$NON-NLS-1$ - path = FilenameUtils.getFullPath(proposed); - } - - if(!path.endsWith(File.separator)) { - path += File.separator; - } - - String name = FilenameUtils.getName(proposed); + public void setTempDir(String tempDirectory) { + this.tempDirectory = tempDirectory; + } - String extension = FilenameUtils.getExtension(proposed); + /** + * Gets the signed document + * + * @return the signed document + */ + public DocumentSource getSignedDocument() { + return this.signedDocument; + } - name = FilenameUtils.removeExtension(name); + /** + * Sets the signed document + * + * @param signedDocument + * the signed document + */ + public void setSignedDocument(final DocumentSource signedDocument) { + this.signedDocument = signedDocument; + } - proposed = path + name + Constants.SIGNED_SUFFIX + "." + extension; //$NON-NLS-1$ + private void enableSaveButton(boolean doEnable) + { + this.btn_save.setEnabled(doEnable); + this.btn_save.setVisible(doEnable); + } - if (this.getOutputDir() != null && !this.getOutputDir().equals("")) //$NON-NLS-1$ - { - // Output directory is set save there without asking user... - - saveResultAsFile(proposed); + /** + * Saves the signed document. + * + * If user has a default output directory set, try to save there. + * If not (or if directory unavailable), ask user for location. + */ + public void saveDocument() { + File inputFolder = getInputFile().getParentFile(); + String fileName = getInputFile().getName(); + String proposedName = getSignedFileName(fileName); + String outputFileName; + + String outputFolder = getOutputDir(); + if (!this.saveFailed && outputFolder != null && !outputFolder.trim().equals("")) { //$NON-NLS-1$ + // Output folder configured, try to save there + + if(!outputFolder.endsWith(File.separator)) { + outputFolder += File.separator; + } + outputFileName = outputFolder + proposedName; } else { + // Ask user where to save + + FileDialog save = new FileDialog(this.getShell(), + SWT.SAVE | SWT.NATIVE); + save.setFilterExtensions(new String[] { "*.pdf", "*" }); //$NON-NLS-1$ //$NON-NLS-2$ + save.setFilterNames(new String[] { + Messages.getString("common.PDFExtension_Description"), //$NON-NLS-1$ + Messages.getString("common.AllExtension_Description")}); //$NON-NLS-1$ + save.setFilterPath(inputFolder.getAbsolutePath()); + save.setFileName(proposedName); + + outputFileName = save.open(); + inputFolder = null; + } + log.debug("Trying to save to '" + outputFileName + "'"); //$NON-NLS-1$ //$NON-NLS-2$ - save.setFileName(proposed); - - String target = save.open(); + this.saveFailed = !saveResultAsFile(inputFolder, outputFileName); - if (target != null) { - saveResultAsFile(target); - } else { - // Show save message ... - this.lnk_saved_file.setText(Messages - .getString("output.link_save_message")); //$NON-NLS-1$ - this.btn_save.setVisible(true); - } + if (!this.saveFailed) { + // Save successful + this.outputFile = new File(inputFolder, outputFileName); } + + // If saving failed, enable save button + enableSaveButton(this.saveFailed); + reloadResources(); + layout(true); } /** - * @param target + * Save the signed document under the given filename + * @param inputFolder the Folder the original document is located at + * @param target the filename to save the document as + * + * @return whether save was successful * @throws FileNotFoundException * @throws IOException */ - private void saveResultAsFile(String target) throws FileNotFoundException, - IOException { - File targetFile = new File(target); + private boolean saveResultAsFile(File inputFolder, String target) { + if (target == null) + return false; + + File targetFile = new File(inputFolder, target); + + if (targetFile.exists()) { + Dialog dialog = new Dialog(this.getShell(), + String.format(Messages.getString("output.file_ask_overwrite"), targetFile.getName()), //$NON-NLS-1$ + BUTTONS.OK_CANCEL, ICON.QUESTION); + if (dialog.open() == SWT.CANCEL) + { + return false; + } + } - DocumentSource source = OutputComposite.this - .getSignedDocument(); + DocumentSource source = this.getSignedDocument(); - FileOutputStream outstream = new FileOutputStream(targetFile); - outstream.write(source.getByteArray(), 0, - source.getByteArray().length); - outstream.close(); + try { + FileOutputStream outstream = new FileOutputStream(targetFile); + outstream.write(source.getByteArray(), 0, + source.getByteArray().length); + outstream.close(); + } catch (FileNotFoundException e) { + log.debug("File not found", e); //$NON-NLS-1$ + return false; + } catch (IOException e) { + log.debug("IO Error", e); //$NON-NLS-1$ + return false; + } - OutputComposite.this.savedFile = targetFile; + return targetFile.exists(); + } - this.outputFile = targetFile; - // Show open message ... - this.lnk_saved_file.setText(Messages - .getString("output.link_open_message")); //$NON-NLS-1$ - this.layout(true); - this.btn_save.setVisible(false); + /** + * Get the proposed filename of a signed document for a given input filename + * @param name input filename + * @return proposed output filename + */ + private static String getSignedFileName(String name) { + name = FilenameUtils.getName(name); + String extension = FilenameUtils.getExtension(name); + name = FilenameUtils.removeExtension(name); + return name + Constants.SIGNED_SUFFIX + "." + extension; //$NON-NLS-1$ } /** @@ -190,7 +319,7 @@ public class OutputComposite extends StateComposite { @Override public void widgetSelected(SelectionEvent e) { try { - OutputComposite.this.saveFile(); + OutputComposite.this.saveDocument(); } catch (Exception ex) { log.error("SaveSelectionListener: ", ex); //$NON-NLS-1$ } @@ -210,19 +339,18 @@ public class OutputComposite extends StateComposite { @Override public void widgetSelected(SelectionEvent e) { try { - - if (OutputComposite.this.outputFile != null) { - - if (OutputComposite.this.outputFile.exists()) { - // Desktop supported check already done in constructor - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open( - OutputComposite.this.outputFile); - } else { - log.error("SWT Desktop is not supported on this platform!"); //$NON-NLS-1$ - } - return; - } + if (OutputComposite.this.outputFile == null) + return; + + if (!OutputComposite.this.outputFile.exists()) + return; + + // Desktop supported check already done in constructor + if (Desktop.isDesktopSupported()) { + Desktop.getDesktop().open( + OutputComposite.this.outputFile); + } else { + log.error("SWT Desktop is not supported on this platform!"); //$NON-NLS-1$ } } catch (Exception ex) { log.error("OpenSelectionListener: ", ex); //$NON-NLS-1$ @@ -230,114 +358,11 @@ public class OutputComposite extends StateComposite { } } - File savedFile = null; - - private DocumentSource signedDocument; - - /** - * Create the composite. - * - * @param parent - * The parent composite - * @param style - * The swt style - * @param state - * The owning state - */ - public OutputComposite(Composite parent, int style, State state) { - super(parent, style, state); - - this.setLayout(new FormLayout()); - - this.lbl_success_message = new Label(this, SWT.NATIVE | SWT.RESIZE); - FormData fd_lbl_success_message = new FormData(); - fd_lbl_success_message.top = new FormAttachment(40, 0); - fd_lbl_success_message.left = new FormAttachment(0); - fd_lbl_success_message.right = new FormAttachment(100); - this.lbl_success_message.setLayoutData(fd_lbl_success_message); - this.lbl_success_message.setAlignment(SWT.CENTER); - this.lbl_success_message.setText(Messages - .getString("output.success_message")); //$NON-NLS-1$ - - FontData[] fD1 = this.lbl_success_message.getFont().getFontData(); - fD1[0].setHeight(Constants.TEXT_SIZE_BIG); - this.lbl_success_message.setFont(new Font(Display.getCurrent(), fD1[0])); - - this.lnk_saved_file = new Link(this, SWT.NATIVE | SWT.RESIZE); - this.lnk_saved_file.setText(Messages - .getString("output.link_save_message")); //$NON-NLS-1$ - FormData fd_lnk_saved_file = new FormData(); - fd_lnk_saved_file.top = new FormAttachment(this.lbl_success_message, 10); - fd_lnk_saved_file.left = new FormAttachment(this.lbl_success_message, 0, - SWT.CENTER); - // fd_lnk_saved_file.right = new FormAttachment(100); - this.lnk_saved_file.setLayoutData(fd_lnk_saved_file); - - this.lnk_saved_file.addSelectionListener(new OpenSelectionListener()); - - FontData[] fD2 = this.lnk_saved_file.getFont().getFontData(); - fD2[0].setHeight(Constants.TEXT_SIZE_NORMAL); - this.lnk_saved_file.setFont(new Font(Display.getCurrent(), fD2[0])); - - this.btn_save = new Button(this, SWT.NATIVE | SWT.RESIZE); - this.btn_save.setText(Messages.getString("common.Save")); //$NON-NLS-1$ - - FontData[] fD_btn_save = this.btn_save.getFont().getFontData(); - fD_btn_save[0].setHeight(Constants.TEXT_SIZE_BUTTON); - this.btn_save.setFont(new Font(Display.getCurrent(), fD_btn_save[0])); - - FormData fd_btn_save = new FormData(); - fd_btn_save.top = new FormAttachment(this.lnk_saved_file, 10); - fd_btn_save.left = new FormAttachment(this.lnk_saved_file, 0, - SWT.CENTER); - this.btn_save.setLayoutData(fd_btn_save); - - this.btn_save.setVisible(false); - this.btn_save.addSelectionListener(new SaveSelectionListener()); - - } - - String tempDirectory; - - /** - * @param tempDirectory - */ - public void setTempDirectory(String tempDirectory) { - this.tempDirectory = tempDirectory; - } - - /** - * Gets the signed document - * - * @return the signed document - */ - public DocumentSource getSignedDocument() { - return this.signedDocument; - } - - /** - * Sets the signed document - * - * @param signedDocument - * the signed document - */ - public void setSignedDocument(final DocumentSource signedDocument) { - this.signedDocument = signedDocument; - } - @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } - private boolean save_showed = false; - - private Link lnk_saved_file; - - private Button btn_save; - - private Label lbl_success_message; - /* * (non-Javadoc) * @@ -347,14 +372,6 @@ public class OutputComposite extends StateComposite { public void doLayout() { // Nothing to do this.layout(true); - try { - if (!this.save_showed) { - OutputComposite.this.saveFile(); - this.save_showed = true; - } - } catch (Exception ex) { - log.error("SaveSelectionListener: ", ex); //$NON-NLS-1$ - } } /* (non-Javadoc) @@ -364,6 +381,13 @@ public class OutputComposite extends StateComposite { public void reloadResources() { this.lbl_success_message.setText(Messages .getString("output.success_message")); //$NON-NLS-1$ + if (this.outputFile == null) { + this.lnk_saved_file.setText(Messages + .getString("output.link_save_message")); //$NON-NLS-1$ + } else { + this.lnk_saved_file.setText(Messages + .getString("output.link_open_message")); //$NON-NLS-1$ + } + this.btn_save.setText(Messages.getString("common.Save")); //$NON-NLS-1$ } - } diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java index cdf8694a..64df41f6 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java @@ -17,30 +17,22 @@ package at.asit.pdfover.gui.workflow.states; //Imports import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.MainWindow.Buttons; import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.composites.OutputComposite; -import at.asit.pdfover.gui.controls.Dialog; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.Dialog.ICON; -import at.asit.pdfover.gui.utils.Messages; import at.asit.pdfover.gui.workflow.StateMachine; import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.signator.DocumentSource; /** * Procduces the output of the signature process. (save file, open file) */ public class OutputState extends State { + private OutputComposite outputComposite = null; + /** * @param stateMachine */ @@ -48,15 +40,7 @@ public class OutputState extends State { super(stateMachine); } - /** - * SFL4J Logger instance - **/ - private static final Logger log = LoggerFactory - .getLogger(OutputState.class); - - private OutputComposite outputComposite = null; - - private OutputComposite getSelectionComposite() { + private OutputComposite getOutputComposite() { if (this.outputComposite == null) { this.outputComposite = this.stateMachine.getGUIProvider() .createComposite(OutputComposite.class, SWT.RESIZE, this); @@ -68,48 +52,31 @@ public class OutputState extends State { } this.outputComposite.setOutputDir(this.stateMachine.getConfigProvider().getDefaultOutputFolder()); - this.outputComposite.setTempDirectory(tmpDir.getAbsolutePath()); + this.outputComposite.setTempDir(tmpDir.getAbsolutePath()); this.outputComposite.setInputFile(this.stateMachine.getStatus().getDocument()); } return this.outputComposite; } - private boolean saved = false; - @Override public void run() { Status status = this.stateMachine.getStatus(); - if (status.getSignResult() != null) { - OutputComposite outputComposite = this.getSelectionComposite(); - outputComposite.setSignedDocument(status.getSignResult() - .getSignedDocument()); - this.stateMachine.getGUIProvider().display(outputComposite); - - if (!this.saved) { - this.saved = true; - String outputFolder = this.stateMachine.getConfigProvider() - .getDefaultOutputFolder(); - String fileName = status.getDocument().getName(); - if (outputFolder != null && !outputFolder.trim().equals("")) { //$NON-NLS-1$ - DocumentSource signedDocument = status.getSignResult().getSignedDocument(); - FileOutputStream output; - try { - output = new FileOutputStream(new File(outputFolder + "/" + fileName + "_signed.pdf")); //$NON-NLS-1$ //$NON-NLS-2$ - output.write(signedDocument.getByteArray(), 0, - signedDocument.getByteArray().length); - output.close(); - } catch (IOException e) { - log.error("Failed to save signed document to configured output folder.", e); //$NON-NLS-1$ - ErrorDialog dialog = new ErrorDialog(outputComposite.getShell(), - Messages.getString("error.SaveOutputFolder"), BUTTONS.OK); //$NON-NLS-1$ - dialog.open(); - } - } - } - + if (status.getSignResult() == null) { + // TODO + return; } + + OutputComposite outputComposite = this.getOutputComposite(); + outputComposite.setSignedDocument(status.getSignResult() + .getSignedDocument()); + + // Save signed document + outputComposite.saveDocument(); + + // Display dialog + this.stateMachine.getGUIProvider().display(outputComposite); } /* diff --git a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties index 46cdc566..895da18f 100644 --- a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties +++ b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties @@ -15,7 +15,7 @@ advanced_config.OutputFolder=Default output folder: advanced_config.OutputFolder.Dialog=Select a folder advanced_config.OutputFolder.Dialog_Title=Select Output folder advanced_config.OutputFolder_Title=&Output location -advanced_config.OutputFolder_ToolTip=Select the folder where the signed document will be saved automatically (clear this field to disable automatic saving) +advanced_config.OutputFolder_ToolTip=Select the folder where the signed document will be saved automatically (clear this field to disable automatic saving, enter a single dot (".") to denote the input document directory) advanced_config.Signature_Title=Si&gnature advanced_config.SigPHTransparency=Signature placeholder transparency advanced_config.SigPHTransparencyMax=Opaque @@ -98,6 +98,7 @@ main.signature=Signing main.title=PDF-Over mobileBKU.number=Number: mobileBKU.password=Password: +output.file_ask_overwrite=File %s already exists, do you want to overwrite it? output.link_open_message=You can open the signed file here output.link_save_message=You can save the signed file output.success_message=Signature was successful diff --git a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties index 5f50d7b9..ec1ce9cb 100644 --- a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties +++ b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties @@ -15,7 +15,7 @@ advanced_config.OutputFolder=Standard-Ausgabeordner: advanced_config.OutputFolder.Dialog=Wählen Sie einen Ordner advanced_config.OutputFolder.Dialog_Title=Ausgabeordner Wählen advanced_config.OutputFolder_Title=Ausgabe&ort -advanced_config.OutputFolder_ToolTip=Wählen Sie einen Ordner, in dem signierte Dokumente automatisch abgelegt werden (deaktivert, wenn das Feld leer ist) +advanced_config.OutputFolder_ToolTip=Wählen Sie einen Ordner, in dem signierte Dokumente automatisch abgelegt werden (deaktivert, wenn das Feld leer ist; ein einzelner Punkt (".") wählt das Verzeichnis des Ursprungsdokuments) advanced_config.Signature_Title=Si&gnatur advanced_config.SigPHTransparency=Signaturplatzhalter-Transparenz advanced_config.SigPHTransparencyMax=Undurchsichtig @@ -98,6 +98,7 @@ main.signature=Signatur main.title=PDF-Over mobileBKU.number=Nummer: mobileBKU.password=Passwort: +output.file_ask_overwrite=Datei %s existiert bereits, wollen Sie sie überschreiben? output.link_open_message=Sie können das signierte Dokument hier öffnen output.link_save_message=Sie können das signierte Dokument speichern output.success_message=Signatur war erfolgreich -- cgit v1.2.3