r4fterman/pdf.forms

View on GitHub
src/main/java/org/pdf/forms/gui/commands/SaveDesignerFileCommand.java

Summary

Maintainability
A
1 hr
Test Coverage
F
12%
package org.pdf.forms.gui.commands;

import java.awt.*;
import java.io.File;
import java.util.Optional;

import javax.swing.*;

import org.pdf.forms.gui.IMainFrame;
import org.pdf.forms.model.des.DesDocument;
import org.pdf.forms.model.des.Version;
import org.pdf.forms.writer.des.DesignerProjectFileWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class SaveDesignerFileCommand implements Command {

    private final Logger logger = LoggerFactory.getLogger(SaveDesignerFileCommand.class);

    private final IMainFrame mainFrame;
    private final Version version;

    SaveDesignerFileCommand(
            final IMainFrame mainFrame,
            final Version version) {
        this.mainFrame = mainFrame;
        this.version = version;
    }

    @Override
    public void execute() {
        final DesDocument designerDocument = mainFrame.getFormsDocument().getDesDocument();

        final String currentDesignerFileName = mainFrame.getCurrentDesignerFileName();
        if (currentDesignerFileName.equals("Untitled")) {
            // saving for the first time
            saveDesignerFileAs(designerDocument);
        } else {
            // saving an already saved file
            writeXML(designerDocument, new File(currentDesignerFileName));
        }
    }

    private void saveDesignerFileAs(final DesDocument designerDocument) {
        getSelectedDesignerFile().ifPresent(file -> saveDesignerFile(file, designerDocument));
    }

    private void saveDesignerFile(
            final File file,
            final DesDocument designerDocument) {
        final String fileToSave = file.getAbsolutePath();

        mainFrame.setCurrentDesignerFileName(fileToSave);
        writeXML(designerDocument, file);
        mainFrame.setTitle(fileToSave + " - PDF Forms Designer Version " + version.getVersion());

    }

    private void writeXML(
            final DesDocument designerDocument,
            final File file) {
        final DesignerProjectFileWriter writer = new DesignerProjectFileWriter();
        writer.writeToFile(designerDocument, file);
    }

    private Optional<File> getSelectedDesignerFile() {
        final Optional<File> designerFile = chooseDesignerFile().map(this::ensureDesignerFileExtension);
        if (designerFile.isPresent()) {
            final File file = designerFile.get();
            final int value = JOptionPane.showConfirmDialog(
                    (Component) mainFrame,
                    "The file already exists, are you sure you wish to overwrite?",
                    "File already exists",
                    JOptionPane.YES_NO_OPTION);
            if (value == JOptionPane.NO_OPTION) {
                return getSelectedDesignerFile();
            }
            return Optional.of(file);
        }
        return Optional.empty();
    }

    private Optional<File> chooseDesignerFile() {
        final JFileChooser chooser = new JFileChooser();
        chooser.addChoosableFileFilter(new DesFileFilter());
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        final int state = chooser.showSaveDialog(null);
        if (state != JFileChooser.APPROVE_OPTION) {
            return Optional.empty();
        }
        return Optional.ofNullable(chooser.getSelectedFile());
    }

    private File ensureDesignerFileExtension(final File file) {
        if (!file.getAbsolutePath().endsWith(".des")) {
            return new File(file.getAbsolutePath() + ".des");
        }
        return file;
    }
}