de.dal33t.powerfolder.ui.information.folder.files.FilesTab.java Source code

Java tutorial

Introduction

Here is the source code for de.dal33t.powerfolder.ui.information.folder.files.FilesTab.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: FilesTab.java 5457 2008-10-17 14:25:41Z harry $
 */
package de.dal33t.powerfolder.ui.information.folder.files;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

import com.jgoodies.binding.value.ValueHolder;
import com.jgoodies.binding.value.ValueModel;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import de.dal33t.powerfolder.ConfigurationEntry;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.disk.Folder;
import de.dal33t.powerfolder.disk.dao.FileInfoCriteria;
import de.dal33t.powerfolder.event.NodeManagerEvent;
import de.dal33t.powerfolder.event.NodeManagerListener;
import de.dal33t.powerfolder.light.DirectoryInfo;
import de.dal33t.powerfolder.light.DiskItem;
import de.dal33t.powerfolder.light.FileInfo;
import de.dal33t.powerfolder.light.FileInfoFactory;
import de.dal33t.powerfolder.light.FolderInfo;
import de.dal33t.powerfolder.security.AccessMode;
import de.dal33t.powerfolder.security.FolderPermission;
import de.dal33t.powerfolder.ui.PFUIComponent;
import de.dal33t.powerfolder.ui.action.BaseAction;
import de.dal33t.powerfolder.ui.information.folder.files.breadcrumb.FilesBreadcrumbPanel;
import de.dal33t.powerfolder.ui.information.folder.files.table.FilesTablePanel;
import de.dal33t.powerfolder.ui.widget.FileFilterTextField;
import de.dal33t.powerfolder.ui.wizard.PFWizard;
import de.dal33t.powerfolder.util.Translation;

/**
 * UI component for the folder files tab
 */
public class FilesTab extends PFUIComponent implements DirectoryFilterListener {

    private JPanel uiComponent;
    private FilesTablePanel tablePanel;
    private FileFilterTextField filterTextField;
    private JComboBox<String> filterSelectionComboBox;
    private FilesStatsPanel statsPanel;
    private DirectoryFilter directoryFilter;
    private ValueModel flatMode;
    private Folder folder;
    private JCheckBox flatViewCB;
    private FilesBreadcrumbPanel breadcrumbPanel;
    private MyFileArchiveAction fileArchiveAction;

    /**
     * Constructor
     *
     * @param controller
     */
    public FilesTab(Controller controller) {
        super(controller);

        flatMode = new ValueHolder();

        statsPanel = new FilesStatsPanel(getController());

        filterTextField = new FileFilterTextField(getController());
        directoryFilter = new DirectoryFilter(controller, filterTextField.getSearchTextValueModel(),
                filterTextField.getSearchModeValueModel());
        directoryFilter.addListener(this);

        tablePanel = new FilesTablePanel(controller, this);
        directoryFilter.addListener(tablePanel);
        directoryFilter.setFlatMode(flatMode);

        breadcrumbPanel = new FilesBreadcrumbPanel(getController(), this);

        getController().getNodeManager().addNodeManagerListener(new MyNodeManagerListener());

        filterSelectionComboBox = new JComboBox<>();
        filterSelectionComboBox.setToolTipText(Translation.getTranslation("files_tab.combo.tool_tip"));
        filterSelectionComboBox.addItem(Translation.getTranslation("files_tab.combo.local_and_incoming"));
        filterSelectionComboBox.addItem(Translation.getTranslation("files_tab.combo.local_files_only"));
        // filterSelectionComboBox.addItem(Translation
        // .getTranslation("files_tab.combo.incoming_files_only"));
        filterSelectionComboBox.addItem(Translation.getTranslation("files_tab.combo.new_files_only"));
        filterSelectionComboBox.addItem(Translation.getTranslation("files_tab.combo.deleted_and_previous_files"));
        filterSelectionComboBox.addItem(Translation.getTranslation("files_tab.combo.unsynchronized_files"));
        filterSelectionComboBox.addActionListener(new MyActionListener());

    }

    public void scheduleDirectoryFiltering() {
        directoryFilter.scheduleFiltering();
    }

    /**
     * Set the tab with details for a folder.
     *
     * @param folderInfo
     */
    public void setFolderInfo(FolderInfo folderInfo) {
        folder = getController().getFolderRepository().getFolder(folderInfo);
        updateNodes();
        directoryFilter.setFolder(folder, folder.getBaseDirectoryInfo());
        tablePanel.setFolder(folder);
        flatViewCB.setSelected(false);
        flatMode.setValue(flatViewCB.isSelected());

        // Triggers mode change and schedule filtering (MyActionListener).
        setFilterComboBox(DirectoryFilter.FILE_FILTER_MODE_LOCAL_AND_INCOMING);
        filterTextField.reset();
        breadcrumbPanel.setRoot(folderInfo);
        statsPanel.setDirectory(folderInfo.getFolder(getController()).getBaseDirectoryInfo());
        setupArchive(folderInfo);
    }

    /**
     * Set the tab with details for a folder with new set and sort date
     * descending.
     *
     * @param folderInfo
     */
    public void setFolderInfoLatest(FolderInfo folderInfo) {
        folder = getController().getFolderRepository().getFolder(folderInfo);
        updateNodes();
        directoryFilter.setFolder(folder, folder.getBaseDirectoryInfo());
        tablePanel.setFolder(folder);
        tablePanel.sortLatestDate();
        flatViewCB.setSelected(true);
        flatMode.setValue(flatViewCB.isSelected());

        // Triggers mode change and schedule filtering (MyActionListener).
        setFilterComboBox(DirectoryFilter.FILE_FILTER_MODE_NEW_ONLY);
        filterTextField.reset();
        setupArchive(folderInfo);
    }

    public void setFolderInfoDeleted(FolderInfo folderInfo) {
        folder = getController().getFolderRepository().getFolder(folderInfo);
        updateNodes();
        directoryFilter.setFolder(folder, folder.getBaseDirectoryInfo());
        tablePanel.setFolder(folder);
        tablePanel.sortLatestDate();
        flatMode.setValue(flatViewCB.isSelected());

        // Triggers mode change and schedule filtering (MyActionListener).
        setFilterComboBox(DirectoryFilter.FILE_FILTER_MODE_DELETED_PREVIOUS);
        filterTextField.reset();
        setupArchive(folderInfo);
    }

    public void setFolderInfoUnsynced(FolderInfo folderInfo) {
        folder = getController().getFolderRepository().getFolder(folderInfo);
        updateNodes();
        directoryFilter.setFolder(folder, folder.getBaseDirectoryInfo());
        tablePanel.setFolder(folder);
        tablePanel.sortLatestDate();
        flatViewCB.setSelected(true);
        flatMode.setValue(flatViewCB.isSelected());

        // Triggers mode change and schedule filtering (MyActionListener).
        setFilterComboBox(DirectoryFilter.FILE_FILTER_MODE_UNSYNCHRONIZED);
        filterTextField.reset();
        setupArchive(folderInfo);
    }

    private void setupArchive(FolderInfo foInfo) {
        // PFS-1336
        AccessMode mode = AccessMode.fromString(
                ConfigurationEntry.SECURITY_FOLDER_ARCHIVE_PERMISSION.getValue(getController()),
                ConfigurationEntry.SECURITY_FOLDER_ARCHIVE_PERMISSION.getDefaultValue());
        fileArchiveAction.allowWith(FolderPermission.get(foInfo, mode));
    }

    /**
     * Set the tab with details for a folder with incoming files.
     *
     * @param folderInfo
     */
    // public void setFolderInfoIncoming(FolderInfo folderInfo) {
    // folder = getController().getFolderRepository().getFolder(folderInfo);
    // updateNodes();
    // directoryFilter.setFolder(folder, folder.getBaseDirectoryInfo());
    // tablePanel.setFolder(folder);
    // flatViewCB.setSelected(true);
    // flatMode.setValue(flatViewCB.isSelected());
    //
    // // Triggers mode change and schedule filtering (MyActionListener).
    // setFilterComboBox(DirectoryFilter.FILE_FILTER_MODE_INCOMING_ONLY);
    // filterTextField.reset();
    // }

    /**
     * Gets the ui component
     *
     * @return
     */
    public JPanel getUIComponent() {
        if (uiComponent == null) {
            buildUIComponent();
        }
        return uiComponent;
    }

    /**
     * Bulds the ui component.
     */
    private void buildUIComponent() {
        FormLayout layout = new FormLayout("3dlu, pref:grow, 3dlu",
                "3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, fill:pref:grow, 3dlu, pref, pref");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        CellConstraints cc = new CellConstraints();

        builder.add(createToolBar(), cc.xy(2, 2));
        builder.add(padBreadcrumb(), cc.xy(2, 4));
        builder.addSeparator(null, cc.xyw(1, 6, 3));

        builder.add(tablePanel.getUIComponent(), cc.xy(2, 8));
        builder.addSeparator(null, cc.xy(2, 10));
        builder.add(statsPanel.getUiComponent(), cc.xy(2, 11));
        uiComponent = builder.getPanel();
    }

    private Component padBreadcrumb() {
        FormLayout layout = new FormLayout("pref, pref:grow", "pref");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        CellConstraints cc = new CellConstraints();
        builder.add(breadcrumbPanel.getUiComponent(), cc.xy(1, 1));
        return builder.getPanel();
    }

    /**
     * @return the toolbar
     */
    private JPanel createToolBar() {

        DetailsAction detailsAction = new DetailsAction(getController());
        JToggleButton detailsButton = new JToggleButton(detailsAction);
        detailsButton.setIcon(null);

        fileArchiveAction = new MyFileArchiveAction(getController());
        JButton fileArchiveButton = new JButton(fileArchiveAction);
        fileArchiveButton.setIcon(null);

        flatViewCB = new JCheckBox(Translation.getTranslation("files_tab.flat_view.text"));
        flatViewCB.setToolTipText(Translation.getTranslation("files_tab.flat_view.tip"));
        flatViewCB.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                flatMode.setValue(flatViewCB.isSelected());
            }
        });

        FormLayout layout = new FormLayout("pref, 3dlu:grow, pref, 3dlu, pref, 3dlu, pref", "pref");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        CellConstraints cc = new CellConstraints();

        ButtonBarBuilder bar = ButtonBarBuilder.createLeftToRightBuilder();
        bar.addGridded(detailsButton);
        bar.addRelatedGap();
        bar.addGridded(fileArchiveButton);

        builder.add(bar.getPanel(), cc.xy(1, 1));
        builder.add(flatViewCB, cc.xy(3, 1));
        builder.add(filterSelectionComboBox, cc.xy(5, 1));
        builder.add(filterTextField.getUIComponent(), cc.xy(7, 1));

        return builder.getPanel();
    }

    public void adviseOfChange(FilteredDirectoryEvent event) {
        statsPanel.setStats(event.getLocalFiles(), event.getDeletedFiles());
    }

    public void adviseOfFilteringBegin() {
    }

    public void invalidate() {
        statsPanel.setStats(0, 0);
    }

    /**
     * Update the file filter with available nodes.
     */
    private void updateNodes() {
        if (folder != null) {
            filterTextField.setMembers(Arrays.asList(folder.getConnectedMembers()));
        } else {
            filterTextField.setMembers(null);
        }
    }

    public void selectionChanged(String relativeName) {
        DirectoryInfo dir = FileInfoFactory.lookupDirectory(folder.getInfo(), relativeName);
        selectionChanged(dir);
    }

    public void selectionChanged(DirectoryInfo dir) {
        directoryFilter.setFolder(folder, dir);
        breadcrumbPanel.setDirectory(folder.getInfo(), dir);
        statsPanel.setDirectory(dir);
    }

    public void fileArchive() {
        if (folder != null) {
            DiskItem[] diskItems = tablePanel.getSelectedRows();
            List<FileInfo> fileInfosToRestore = new ArrayList<FileInfo>();
            if (diskItems.length > 0) {
                for (DiskItem diskItem : diskItems) {
                    if (diskItem instanceof DirectoryInfo) {
                        DirectoryInfo di = (DirectoryInfo) diskItem;
                        FileInfoCriteria criteria = new FileInfoCriteria();
                        criteria.addWriteMembersAndMyself(folder);
                        criteria.setType(FileInfoCriteria.Type.FILES_ONLY);
                        criteria.setPath(di);
                        criteria.setRecursive(true);
                        Collection<FileInfo> infoCollection = folder.getDAO().findFiles(criteria);
                        for (FileInfo fileInfo : infoCollection) {
                            fileInfosToRestore.add(fileInfo);
                        }
                    } else if (diskItem instanceof FileInfo) {
                        fileInfosToRestore.add((FileInfo) diskItem);
                    }
                }
            } else {
                // Nothing selected. Do include everything also deleted
                FileInfoCriteria criteria = new FileInfoCriteria();
                criteria.addWriteMembersAndMyself(folder);
                criteria.setType(FileInfoCriteria.Type.FILES_ONLY);
                criteria.setPath(directoryFilter.getCurrentDirectoryInfo());
                criteria.setRecursive(true);
                Collection<FileInfo> infoCollection = folder.getDAO().findFiles(criteria);
                for (FileInfo fileInfo : infoCollection) {
                    fileInfosToRestore.add(fileInfo);
                }
            }

            PFWizard.openMultiFileRestoreWizard(getController(), fileInfosToRestore);
        }
    }

    public void resetFilters() {
        filterTextField.reset();
        flatViewCB.setSelected(false);
        flatMode.setValue(flatViewCB.isSelected());
        setFilterComboBox(DirectoryFilter.FILE_FILTER_MODE_LOCAL_AND_INCOMING);
    }

    private void setFilterComboBox(int index) {
        int oldValue = filterSelectionComboBox.getSelectedIndex();
        if (oldValue != index) {
            filterSelectionComboBox.setSelectedIndex(index);
        }
    }

    // ////////////////
    // Inner Classes //
    // ////////////////

    /**
     * Fire filter event for changes to dropdown selection.
     */
    private class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource().equals(filterSelectionComboBox)) {
                directoryFilter.setFileFilterMode(filterSelectionComboBox.getSelectedIndex());
                directoryFilter.scheduleFiltering();
            }
        }
    }

    @SuppressWarnings("serial")
    private class DetailsAction extends BaseAction {

        DetailsAction(Controller controller) {
            super("action_details", controller);
        }

        public void actionPerformed(ActionEvent e) {
            tablePanel.toggleDetails();
        }
    }

    @SuppressWarnings("serial")
    private class MyFileArchiveAction extends BaseAction {

        private MyFileArchiveAction(Controller controller) {
            super("action_file_archive", controller);
        }

        public void actionPerformed(ActionEvent e) {
            fileArchive();
        }
    }

    private class MyNodeManagerListener implements NodeManagerListener {
        public boolean fireInEventDispatchThread() {
            return true;
        }

        public void nodeConnected(NodeManagerEvent e) {
            updateNodes();
        }

        public void nodeDisconnected(NodeManagerEvent e) {
            updateNodes();
        }

        public void friendAdded(NodeManagerEvent e) {
        }

        public void friendRemoved(NodeManagerEvent e) {
        }

        public void nodeAdded(NodeManagerEvent e) {
        }

        public void nodeConnecting(NodeManagerEvent e) {
        }

        public void nodeOffline(NodeManagerEvent e) {
        }

        public void nodeOnline(NodeManagerEvent e) {
        }

        public void nodeRemoved(NodeManagerEvent e) {
        }

        public void settingsChanged(NodeManagerEvent e) {
        }

        public void startStop(NodeManagerEvent e) {
        }

    }

}