net.pms.medialibrary.gui.tab.ManagedFoldersPanel.java Source code

Java tutorial

Introduction

Here is the source code for net.pms.medialibrary.gui.tab.ManagedFoldersPanel.java

Source

/*
 * PS3 Media Server, for streaming any medias to your PS3.
 * Copyright (C) 2012  Ph.Waeber
 *
 * This program 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; version 2
 * of the License only.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package net.pms.medialibrary.gui.tab;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import net.pms.Messages;
import net.pms.medialibrary.commons.dataobjects.DOFileImportTemplate;
import net.pms.medialibrary.commons.dataobjects.DOManagedFile;
import net.pms.medialibrary.commons.events.FileImportDialogListener;
import net.pms.medialibrary.commons.helpers.GUIHelper;
import net.pms.medialibrary.commons.interfaces.IMediaLibraryStorage;
import net.pms.medialibrary.gui.dialogs.FileImportTemplateDialog;
import net.pms.medialibrary.gui.shared.EButton;
import net.pms.medialibrary.storage.MediaLibraryStorage;

public class ManagedFoldersPanel extends JPanel {
    private static final long serialVersionUID = 1558319355911044800L;
    //   private static final Logger    log              = Logger.getLogger(ManagedFoldersPanel.class);

    private final int MAX_FOLDERS = 40;
    private JButton bAddFolder;
    private List<ManagedFolderObj> managedFolders = new ArrayList<ManagedFolderObj>();
    private IMediaLibraryStorage storage;

    public ManagedFoldersPanel() {
        setLayout(new GridLayout());
        init();

        storage = MediaLibraryStorage.getInstance();
        addManagedFolders(storage.getManagedFolders());
        applyLayout();
    }

    private void addManagedFolders(List<DOManagedFile> mFolder) {
        for (DOManagedFile f : mFolder) {
            addManagedFolder(f);
        }
    }

    private void addManagedFolder(DOManagedFile f) {
        if (getManagedFolders().size() < MAX_FOLDERS) {
            JCheckBox cbWatch = new JCheckBox();
            cbWatch.setSelected(f.isWatchEnabled());
            JTextField tfFolderPath = new JTextField(f.getPath());
            JButton bBrowse = new JButton(Messages.getString("ML.ManagedFoldersPanel.bBrowse"));
            JCheckBox cbVideo = new JCheckBox();
            cbVideo.setSelected(f.isVideoEnabled());
            JCheckBox cbAudio = new JCheckBox();
            cbAudio.setSelected(f.isAudioEnabled());
            JCheckBox cbPictures = new JCheckBox();
            cbPictures.setSelected(f.isPicturesEnabled());
            JButton bScan = new JButton(Messages.getString("ML.ManagedFoldersPanel.bScan"));
            JButton bDelete = new JButton(new ImageIcon(getClass().getResource("/resources/images/tp_remove.png")));
            JCheckBox cbSubFolders = new JCheckBox();
            cbSubFolders.setSelected(f.isSubFoldersEnabled());
            JCheckBox cbEnablePlugins = new JCheckBox();
            cbEnablePlugins.setSelected(f.isFileImportEnabled());

            EButton bConfigureFileImportTemplate = new EButton(Messages.getString("ML.ScanFolderDialog.bConfigure"),
                    f.getFileImportTemplate());
            bConfigureFileImportTemplate.setEnabled(f.isFileImportEnabled());
            bConfigureFileImportTemplate.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    int templateId = 1;

                    final EButton b = (EButton) e.getSource();
                    Object uo = b.getUserObject();
                    if (uo instanceof DOFileImportTemplate) {
                        templateId = ((DOFileImportTemplate) uo).getId();
                    }

                    //show the dialog
                    FileImportTemplateDialog vid = new FileImportTemplateDialog(SwingUtilities.getWindowAncestor(b),
                            templateId);
                    vid.setLocation(GUIHelper.getCenterDialogOnParentLocation(vid.getPreferredSize(), b));
                    vid.setResizable(false);
                    vid.setModal(true);

                    vid.addFileImportDialogListener(new FileImportDialogListener() {

                        @Override
                        public void templateSaved(DOFileImportTemplate fileImportTemplate) {
                            b.setUserObject(fileImportTemplate);
                            storage.setManagedFolders(getManagedFolders());
                        }
                    });

                    vid.pack();
                    vid.setVisible(true);

                    if (vid.isSave()) {
                        templateId = vid.getTemplateId();
                    }

                    b.setUserObject(storage.getFileImportTemplate(templateId));

                    //Store the media library folders in the db when a template changes
                    //to be able to check if a template is being used when deleting one
                    cleanManagedFolders();
                    storage.setManagedFolders(getManagedFolders());
                }
            });

            ManagedFolderObj obj = new ManagedFolderObj(cbWatch, tfFolderPath, cbVideo,
                    bConfigureFileImportTemplate, cbAudio, cbPictures, bBrowse, bScan, bDelete, cbSubFolders,
                    cbEnablePlugins, managedFolders.size());
            managedFolders.add(obj);

            obj.addRemoveListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    managedFolders.remove(((ManagedFolderObj) e.getSource()).getIndex());
                    applyLayout();
                }
            });
        } else {
            JOptionPane.showMessageDialog(this,
                    String.format(Messages.getString("ML.ManagedFoldersPanel.FolderLimitMsg"), MAX_FOLDERS));
        }
    }

    public List<DOManagedFile> getManagedFolders() {
        List<DOManagedFile> mf = new ArrayList<DOManagedFile>();
        for (ManagedFolderObj obj : managedFolders) {
            DOManagedFile f = new DOManagedFile(obj.getCbWatch().isSelected(), obj.getTfFolderPath().getText(),
                    obj.getCbVideo().isSelected(), obj.getCbAudio().isSelected(), obj.getCbPictures().isSelected(),
                    obj.getCbSubFolders().isSelected(), obj.getCbEnablePlugins().isSelected(),
                    obj.getFileImportTemplate());
            if (!mf.contains(f)) {
                mf.add(f);
            }
        }

        return mf;
    }

    public void cleanManagedFolders() {
        List<DOManagedFile> mf = getManagedFolders();

        if (mf.size() != managedFolders.size()) {
            managedFolders.clear();
            addManagedFolders(mf);
            applyLayout();
        }
    }

    private void init() {
        bAddFolder = new JButton(Messages.getString("ML.ManagedFoldersPanel.bAddFolder"));
        bAddFolder.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                DOManagedFile mf = new DOManagedFile();
                mf.setFileImportTemplate(storage.getFileImportTemplate(1));
                addManagedFolder(mf);
                applyLayout();
            }
        });
    }

    private void applyLayout() {
        FormLayout layout = new FormLayout("fill:p:grow", // columns
                "fill:10:grow, p");
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setOpaque(true);

        CellConstraints cc = new CellConstraints();

        builder.add(bAddFolder, cc.xy(1, 2, CellConstraints.CENTER, CellConstraints.BOTTOM));

        FormLayout layout2 = new FormLayout(
                "center:p, 2px, 20:grow, 2px, p, 2px, p, 10px, center:p, 2px, center:p, 2px, center:p, 10px, p, 2px, p, 10px, p", // columns
                "p, p, p, p, p, p, p, p, p, p," + // rows (40)
                        "p, p, p, p, p, p, p, p, p, p," + "p, p, p, p, p, p, p, p, p, p,"
                        + "p, p, p, p, p, p, p, p, p, p");
        PanelBuilder builder2 = new PanelBuilder(layout2);

        // show folders if there are any
        JPanel pManagedFolders;
        if (managedFolders.size() > 0) {
            //create labels with tooltips
            JLabel lSubFolders = new JLabel(
                    new ImageIcon(getClass().getResource("/resources/images/subfolders-16.png")));
            lSubFolders.setToolTipText(Messages.getString("ML.ManagedFoldersPanel.lSubfolders"));
            JLabel lVideo = new JLabel(
                    new ImageIcon(getClass().getResource("/resources/images/videofolder-16.png")));
            lVideo.setToolTipText(Messages.getString("ML.ManagedFoldersPanel.lVideo"));
            JLabel lAudio = new JLabel(
                    new ImageIcon(getClass().getResource("/resources/images/audiofolder-16.png")));
            lAudio.setToolTipText(Messages.getString("ML.ManagedFoldersPanel.lAudio"));
            JLabel lPictures = new JLabel(
                    new ImageIcon(getClass().getResource("/resources/images/picturesfolder-16.png")));
            lPictures.setToolTipText(Messages.getString("ML.ManagedFoldersPanel.lPictures"));

            // set headers
            builder2.add(lSubFolders, cc.xy(1, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));
            builder2.addLabel(Messages.getString("ML.ManagedFoldersPanel.lFolderPath"),
                    cc.xy(3, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));
            builder2.add(lVideo, cc.xy(9, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));
            builder2.add(lAudio, cc.xy(11, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));
            builder2.add(lPictures, cc.xy(13, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));
            builder2.addLabel(Messages.getString("ML.ManagedFoldersPanel.lPlugins"),
                    cc.xyw(15, 1, 3, CellConstraints.CENTER, CellConstraints.DEFAULT));

            int rowIndex = 2;
            for (ManagedFolderObj f : managedFolders) {
                f.setIndex(rowIndex - 2);
                builder2.add(f.getCbSubFolders(), cc.xy(1, rowIndex));
                builder2.add(f.getTfFolderPath(), cc.xy(3, rowIndex));
                builder2.add(f.getbBrowse(), cc.xy(5, rowIndex));
                builder2.add(f.getbDelete(), cc.xy(7, rowIndex));
                builder2.add(f.getCbVideo(), cc.xy(9, rowIndex));
                builder2.add(f.getCbAudio(), cc.xy(11, rowIndex));
                builder2.add(f.getCbPictures(), cc.xy(13, rowIndex));
                builder2.add(f.getCbEnablePlugins(), cc.xy(15, rowIndex));
                builder2.add(f.getbConfigureFileImportTemplate(), cc.xy(17, rowIndex));
                builder2.add(f.getbScan(), cc.xy(19, rowIndex));
                rowIndex++;
            }
            pManagedFolders = builder2.getPanel();
        } else {
            pManagedFolders = new JPanel(new GridLayout());
            pManagedFolders.add(
                    new JLabel(Messages.getString("ML.ManagedFoldersPanel.pNoFoldersConfigures"), JLabel.CENTER));
        }

        JScrollPane sp = new JScrollPane(pManagedFolders);
        sp.setBorder(BorderFactory.createEmptyBorder());
        builder.add(sp, cc.xy(1, 1));

        removeAll();
        add(builder.getPanel());
        validate();
    }
}