de.dal33t.powerfolder.ui.dialog.RestoreArchiveDialog.java Source code

Java tutorial

Introduction

Here is the source code for de.dal33t.powerfolder.ui.dialog.RestoreArchiveDialog.java

Source

/*
 * Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
 *
 * This file is part of PowerFolder.
 *
 * PowerFolder is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * PowerFolder is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with PowerFolder. If not, see <http://www.gnu.org/licenses/>.
 *
 * $Id$
 */
package de.dal33t.powerfolder.ui.dialog;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.clientserver.ServerClient;
import de.dal33t.powerfolder.clientserver.FolderService;
import de.dal33t.powerfolder.disk.FileArchiver;
import de.dal33t.powerfolder.disk.Folder;
import de.dal33t.powerfolder.disk.FolderRepository;
import de.dal33t.powerfolder.light.FileInfo;
import de.dal33t.powerfolder.ui.widget.JButtonMini;
import de.dal33t.powerfolder.ui.util.Icons;
import de.dal33t.powerfolder.ui.dialog.BaseDialog;
import de.dal33t.powerfolder.ui.dialog.DialogFactory;
import de.dal33t.powerfolder.ui.dialog.GenericDialogType;
import de.dal33t.powerfolder.ui.information.folder.files.versions.FileInfoVersionTypeHolder;
import de.dal33t.powerfolder.util.Translation;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * Dialog for restoring a selected file archive.
 */
public class RestoreArchiveDialog extends BaseDialog {

    private JButton okButton;
    private JPanel uiComponent;

    private FileInfo fileInfo;
    private FileInfo versionInfo;
    private boolean online;
    private JRadioButton restoreRB;
    private JRadioButton saveRB;
    private JLabel fileLocationLabel;
    private JTextField fileLocationField;
    private JButtonMini fileLocationButton;

    /**
     * Constructor
     * 
     * @param controller
     * @param fileInfo
     *            the original file
     * @param fileInfoVersionTypeHolder
     *            info about the file version to restore.
     */
    public RestoreArchiveDialog(Controller controller, FileInfo fileInfo,
            FileInfoVersionTypeHolder fileInfoVersionTypeHolder) {
        super(Senior.NONE, controller, true);
        versionInfo = fileInfoVersionTypeHolder.getFileInfo();
        online = fileInfoVersionTypeHolder.isOnline();
        this.fileInfo = fileInfo;
    }

    protected JComponent getContent() {
        if (uiComponent == null) {

            JLabel restoreLabel = new JLabel(Translation.getTranslation("dialog.restore_archive.restore"));
            restoreRB = new JRadioButton(Translation.getTranslation("dialog.restore_archive.restore"));
            saveRB = new JRadioButton(Translation.getTranslation("dialog.restore_archive.save"));
            ButtonGroup bg = new ButtonGroup();
            bg.add(restoreRB);
            bg.add(saveRB);

            // Layout
            FormLayout layout = new FormLayout("pref, 3dlu, 122dlu, 3dlu, 15dlu, pref:grow",
                    "pref, 3dlu, pref, 3dlu, pref");
            PanelBuilder builder = new PanelBuilder(layout);
            CellConstraints cc = new CellConstraints();

            fileLocationLabel = new JLabel(Translation.getTranslation("dialog.restore_archive.file_location"));
            fileLocationField = new JTextField();
            fileLocationField.setEnabled(false);
            fileLocationButton = new JButtonMini(Icons.getIconById(Icons.DIRECTORY),
                    Translation.getTranslation("dialog.restore_archive.file_location.tip"));
            fileLocationButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    showFileDialog();
                }
            });

            // Add components
            if (online) {
                builder.add(restoreLabel, cc.xyw(1, 1, 6));
            } else {
                builder.add(restoreRB, cc.xyw(1, 1, 6));
                builder.add(saveRB, cc.xyw(1, 3, 6));
                builder.add(fileLocationLabel, cc.xy(1, 5));
                builder.add(fileLocationField, cc.xy(3, 5));
                builder.add(fileLocationButton, cc.xy(5, 5));
            }

            restoreRB.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    enableComponents();
                }
            });
            saveRB.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent e) {
                    enableComponents();
                }
            });

            restoreRB.setSelected(true);
            enableComponents();
            uiComponent = builder.getPanel();
        }
        return uiComponent;
    }

    private void showFileDialog() {
        List<File> files = DialogFactory.chooseDirectory(getController().getUIController(),
                fileLocationField.getText(), false);
        if (!files.isEmpty()) {
            fileLocationField.setText(files.get(0).getAbsolutePath());
            enableComponents();
        }
    }

    protected Icon getIcon() {
        return null;
    }

    public String getTitle() {
        return Translation.getTranslation("dialog.restore_archive.title");
    }

    protected Component getButtonBar() {
        okButton = createOKButton(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                restore();
            }
        });
        enableComponents();
        JButton cancelButton = createCancelButton(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                close();
            }
        });

        return ButtonBarFactory.buildCenteredBar(okButton, cancelButton);
    }

    /**
     * Save / restore the archived file.
     */
    private void restore() {

        FolderRepository repo = getController().getFolderRepository();
        final Folder folder = repo.getFolder(versionInfo.getFolderInfo());
        final FileArchiver fileArchiver = folder.getFileArchiver();
        final File restoreTo;

        if (restoreRB.isSelected()) {
            restoreTo = versionInfo.getDiskFile(getController().getFolderRepository());
        } else {
            restoreTo = new File(fileLocationField.getText(), fileInfo.getFilenameOnly());
        }
        boolean restore = true;
        if (restoreTo.exists()) {
            // Check user is okay with overwriting the file.
            int result = DialogFactory.genericDialog(getController(),
                    Translation.getTranslation("dialog.restore_archive.overwrite_title"),
                    Translation.getTranslation("dialog.restore_archive.overwrite_message"),
                    new String[] { Translation.getTranslation("dialog.restore_archive.overwrite"),
                            Translation.getTranslation("general.cancel") },
                    0, GenericDialogType.QUESTION);
            if (result != 0) {
                restore = false;
            }
        }
        if (restore) {
            getController().getThreadPool().execute(new Runnable() {
                public void run() {
                    // Run this outside of the EDT, it may take some time.
                    restore0(folder, fileArchiver, restoreTo);
                }
            });
        }
        close();
    }

    /**
     * Restore from the archiver, or failing that from online storage.
     * 
     * @param folder
     * @param fileArchiver
     * @param restoreTo
     */
    private void restore0(Folder folder, FileArchiver fileArchiver, File restoreTo) {
        try {
            boolean restored = false;
            if (fileArchiver.restore(versionInfo, restoreTo)) {
                logInfo("Restored from local archive");
                folder.scanChangedFile(versionInfo);
                folder.scanAllParentDirectories(versionInfo);
                restored = true;
            } else {
                // Not local. OnlineStorage perhaps?
                boolean online = folder.hasMember(getController().getOSClient().getServer());
                if (online) {
                    ServerClient client = getController().getOSClient();
                    if (client != null && client.isConnected() && client.isLoggedIn()) {
                        FolderService service = client.getFolderService();
                        FileInfo rInfo = service.restore(versionInfo, true);
                        logInfo("Restored from OS archive");
                        getController().getTransferManager().downloadNewestVersion(rInfo, false);
                        restored = true;
                    }
                }
            }

            if (!restored) {
                throw new IOException("Restore failed");
            }
        } catch (IOException e) {
            logSevere(e);
            DialogFactory.genericDialog(getController(), Translation.getTranslation("dialog.restore_archive.title"),
                    Translation.getTranslation("dialog.restore_archive.save_error", e.getMessage()),
                    GenericDialogType.ERROR);
        }
    }

    protected JButton getDefaultButton() {
        return okButton;
    }

    private void enableComponents() {
        boolean enabled = saveRB.isSelected();
        fileLocationLabel.setEnabled(enabled);
        fileLocationButton.setEnabled(enabled);
        if (okButton != null) {
            okButton.setEnabled(restoreRB.isSelected() || fileLocationField.getText().length() > 0);
        }
    }
}