Java tutorial
/* * Copyright 2004 - 2012 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: MultiFileRestorePanel.java 19932 2012-10-14 06:01:18Z glasgow $ */ package de.dal33t.powerfolder.ui.wizard; import java.awt.Dimension; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.CancellationException; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.SwingWorker; import jwf.WizardPanel; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import de.dal33t.powerfolder.Controller; import de.dal33t.powerfolder.clientserver.FolderService; import de.dal33t.powerfolder.clientserver.ServerClient; import de.dal33t.powerfolder.disk.FileArchiver; import de.dal33t.powerfolder.disk.Folder; import de.dal33t.powerfolder.light.FileInfo; import de.dal33t.powerfolder.ui.util.UIUtil; import de.dal33t.powerfolder.ui.wizard.table.MultiFileRestoreTable; import de.dal33t.powerfolder.ui.wizard.table.MultiFileRestoreTableModel; import de.dal33t.powerfolder.util.Translation; /** * Call this class via PFWizard. */ public class MultiFileRestorePanel extends PFWizardPanel { private final List<FileInfo> fileInfosToRestore; private final JLabel infoLabel; private final JLabel warningLabel; private JProgressBar bar; private JScrollPane scrollPane; private boolean hasNext; private SwingWorker<List<FileInfo>, FileInfo> worker; private MultiFileRestoreTableModel tableModel = new MultiFileRestoreTableModel(getController()); public MultiFileRestorePanel(Controller controller, List<FileInfo> fileInfosToRestore) { super(controller); this.fileInfosToRestore = fileInfosToRestore; infoLabel = new JLabel(); warningLabel = new JLabel(); } protected JComponent buildContent() { FormLayout layout = new FormLayout("140dlu, pref:grow", "pref, 3dlu, pref, 3dlu, pref"); PanelBuilder builder = new PanelBuilder(layout); CellConstraints cc = new CellConstraints(); builder.add(infoLabel, cc.xyw(1, 1, 2)); // bar and scrollPane share the same row. builder.add(scrollPane, cc.xyw(1, 3, 2)); builder.add(bar, cc.xy(1, 3)); builder.add(warningLabel, cc.xyw(1, 5, 2)); return builder.getPanel(); } @Override protected void afterDisplay() { loadVersions(); } private void loadVersions() { infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieving.text")); hasNext = false; updateButtons(); if (worker != null) { worker.cancel(false); } tableModel.setFileInfos(new ArrayList<FileInfo>()); bar.setVisible(true); scrollPane.setVisible(false); worker = new VersionLoaderWorker(); worker.execute(); } protected String getTitle() { return Translation.getTranslation("wizard.multi_file_restore.title"); } protected void initComponents() { tableModel = new MultiFileRestoreTableModel(getController()); MultiFileRestoreTable table = new MultiFileRestoreTable(tableModel); scrollPane = new JScrollPane(table); scrollPane.setPreferredSize(new Dimension(400, 200)); scrollPane.setVisible(false); UIUtil.removeBorder(scrollPane); UIUtil.setZeroWidth(scrollPane); bar = new JProgressBar(0, 100); } public boolean hasNext() { return hasNext; } public WizardPanel next() { return new FileRestoringPanel(getController(), tableModel.getFileInfos()); } // //////////////// // Inner Classes // // //////////////// private class VersionLoaderWorker extends SwingWorker<List<FileInfo>, FileInfo> { private int fileInfosProcessed; public List<FileInfo> doInBackground() { bar.setIndeterminate(true); bar.setValue(0); warningLabel.setText(""); List<FileInfo> versions = new ArrayList<FileInfo>(fileInfosToRestore.size()); try { List<FileInfo> fileInfos = new ArrayList<FileInfo>(); fileInfos.addAll(fileInfosToRestore); for (FileInfo fileInfo : fileInfos) { Folder fo = fileInfo.getFolder(getController().getFolderRepository()); if (fo == null) { continue; } // Also try getting versions from OnlineStorage. boolean online = fo.hasMember(getController().getOSClient().getServer()); FolderService folderService = null; if (online) { ServerClient client = getController().getOSClient(); if (client != null && client.isConnected() && client.isLoggedIn()) { folderService = client.getFolderService(); } } FileArchiver fileArchiver = fo.getFileArchiver(); if (isCancelled()) { return Collections.emptyList(); } List<FileInfo> infoList = fileArchiver.getArchivedFilesInfos(fileInfo); FileInfo mostRecent = null; for (FileInfo info : infoList) { if (isBetterVersion(mostRecent, info)) { mostRecent = info; } } if (folderService != null) { try { List<FileInfo> serviceList = folderService.getArchivedFilesInfos(fileInfo); for (FileInfo info : serviceList) { if (isBetterVersion(mostRecent, info)) { mostRecent = info; } } } catch (Exception e) { // Maybe gone offline. No worries. } } if (mostRecent != null) { versions.add(mostRecent); publish(mostRecent); } } } catch (Exception e) { // Hmmmmm. } Collections.reverse(versions); return versions; } private boolean isBetterVersion(FileInfo mostRecent, FileInfo info) { return mostRecent == null || mostRecent.getVersion() < info.getVersion(); } /** * Intermediate results. Tap the progress bar on. * * @param chunks */ protected void process(List<FileInfo> chunks) { fileInfosProcessed += chunks.size(); if (fileInfosToRestore.isEmpty()) { bar.setIndeterminate(true); } else { bar.setIndeterminate(false); bar.setValue(100 * fileInfosProcessed / fileInfosToRestore.size()); infoLabel.setText(Translation.getTranslation("general.processed", String.valueOf(fileInfosProcessed), String.valueOf(fileInfosToRestore.size()))); } } protected void done() { scrollPane.setVisible(true); bar.setVisible(false); hasNext = false; try { tableModel.setFileInfos(get()); if (get().isEmpty()) { infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieved_none.text")); } else { infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieved.text")); hasNext = true; if (fileInfosProcessed < fileInfosToRestore.size()) { warningLabel.setText(Translation.getTranslation("wizard.multi_file_restore.some.text")); } } } catch (CancellationException e) { infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieve_cancelled.text")); } catch (Exception e) { infoLabel.setText(Translation.getTranslation("wizard.multi_file_restore.retrieve_exception.text", e.getMessage())); } updateButtons(); } } }