net.pms.medialibrary.gui.dialogs.folderdialog.FolderDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.pms.medialibrary.gui.dialogs.folderdialog.FolderDialog.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.dialogs.folderdialog;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.pms.Messages;
import net.pms.medialibrary.commons.dataobjects.DOMediaLibraryFolder;
import net.pms.medialibrary.commons.dataobjects.comboboxitems.FileTypeCBItem;
import net.pms.medialibrary.commons.enumarations.DialogActionType;
import net.pms.medialibrary.commons.enumarations.FileType;
import net.pms.medialibrary.commons.events.FolderDialogFolderUpdateEvent;
import net.pms.medialibrary.commons.events.FolderDialogActionListener;
import net.pms.medialibrary.commons.exceptions.ConditionException;
import net.pms.medialibrary.commons.exceptions.TemplateException;
import net.pms.medialibrary.commons.helpers.FolderHelper;

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

public class FolderDialog extends JDialog {
    private static final Logger log = LoggerFactory.getLogger(FolderDialog.class);
    private static final long serialVersionUID = 1L;

    private final int MIN_BUTTON_WIDTH = 60;

    private DOMediaLibraryFolder folder;
    private List<FolderDialogActionListener> folderDialogActionListeners = new ArrayList<FolderDialogActionListener>();
    private boolean isNewFolder;
    private FileTypeCBItem selectedFileType = new FileTypeCBItem();
    private boolean isInitializing = false;

    private JTextField tfName;
    private JLabel lName;
    private JPanel pButtons;
    private JLabel lFolderType;
    private JComboBox cbFileType;
    private FolderPropsTabbedPane tabs;

    private boolean isMediaLibraryFolderEnabled;

    public FolderDialog(DOMediaLibraryFolder folder, boolean isNewFilter, boolean isMediaLibraryFolderEnabled) {
        this.folder = folder.clone();
        setTitle(String.format(Messages.getString("ML.FolderDialog.Title"), getMediaLibraryFolder().getName()));
        this.isNewFolder = isNewFilter;

        setMinimumSize(new Dimension(810, 100));

        ((java.awt.Frame) getOwner()).setIconImage(
                new ImageIcon(FolderDialog.class.getResource("/resources/images/icon-16.png")).getImage());

        isInitializing = true;
        init();
        setMediaLibraryFolderEnabled(isMediaLibraryFolderEnabled);
        isInitializing = false;
    }

    public void addFolderDialogActionListener(FolderDialogActionListener l) {
        if (!folderDialogActionListeners.contains(l)) {
            folderDialogActionListeners.add(l);
        }
    }

    public DOMediaLibraryFolder getMediaLibraryFolder() {
        return folder;
    }

    public void setMediaLibraryFolderEnabled(boolean enabled) {
        isMediaLibraryFolderEnabled = enabled;
        cbFileType.setEnabled(enabled);
    }

    public boolean getMediaLibraryFolderEnabled() {
        return isMediaLibraryFolderEnabled;
    }

    /*****************
     * 
     * Private Methods
     * 
     *****************/

    private void notifyFolderDialogAction(DOMediaLibraryFolder folder, DialogActionType actionType,
            boolean isNewFolder) {
        for (FolderDialogActionListener l : folderDialogActionListeners) {
            l.folderDialogActionReceived(
                    new FolderDialogFolderUpdateEvent(this, getMediaLibraryFolder(), actionType, isNewFolder));
        }
    }

    private void init() {

        //Name
        lName = new JLabel(Messages.getString("ML.FolderDialog.Name"));
        tfName = new JTextField();
        tfName.setPreferredSize(new Dimension(200, tfName.getPreferredSize().height));
        tfName.setText(folder.getName());

        //Folder Type      
        cbFileType = new JComboBox(FolderHelper.getHelper().getAllFileTypeCBItems());

        cbFileType.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (isInitializing) {
                    return;
                }

                FileType ft = ((FileTypeCBItem) cbFileType.getSelectedItem()).getFileType();
                if (tabs.hasConditions()) {
                    int resp = JOptionPane.showConfirmDialog(SwingUtilities.getRoot(cbFileType),
                            String.format(Messages.getString("ML.FolderDialog.ChangeFoldertypeMsg"),
                                    System.getProperty("line.separator")),
                            Messages.getString("ML.General.MessageType.WARNING"), JOptionPane.YES_NO_OPTION);
                    if (resp == JOptionPane.YES_OPTION) {
                        tabs.resetConditions();
                    } else {
                        cbFileType.setSelectedItem(selectedFileType);
                        return;
                    }
                }

                tabs.setFileType(ft);
                folder.setFileType(ft);

                selectedFileType = FolderHelper.getHelper().getFileTypeCBItem(ft);
            }
        });
        lFolderType = new JLabel(Messages.getString("ML.FolderDialog.FolderType"));

        tabs = new FolderPropsTabbedPane(folder, folderDialogActionListeners);

        //Buttons      
        JButton buttonOk = new JButton(Messages.getString("ML.FolderDialog.bOk"));
        buttonOk.setName("buttonOk");
        if (buttonOk.getPreferredSize().width < MIN_BUTTON_WIDTH)
            buttonOk.setPreferredSize(new Dimension(MIN_BUTTON_WIDTH, buttonOk.getPreferredSize().height));
        buttonOk.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                try {
                    DOMediaLibraryFolder tmpFolder = getDisplayedMediaLibraryFolder();
                    tmpFolder.getInheritedFilter().validate();
                    folder = tmpFolder;
                    notifyFolderDialogAction(getMediaLibraryFolder(), DialogActionType.OK, isNewFolder);
                    isNewFolder = false;
                } catch (Exception e2) {
                    log.error("Save error: " + e2.getMessage(), e2);
                    JOptionPane.showMessageDialog(tabs.getTopLevelAncestor(), e2.getMessage(),
                            Messages.getString("ML.FolderDialog.SaveErrorHeader"), JOptionPane.WARNING_MESSAGE);
                }
            }
        });

        JButton buttonApply = new JButton(Messages.getString("ML.FolderDialog.bApply"));
        buttonApply.setName("buttonApply");
        if (buttonApply.getPreferredSize().width < MIN_BUTTON_WIDTH)
            buttonApply.setPreferredSize(new Dimension(MIN_BUTTON_WIDTH, buttonApply.getPreferredSize().height));
        buttonApply.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                try {
                    DOMediaLibraryFolder tmpFolder = getDisplayedMediaLibraryFolder();
                    tmpFolder.getInheritedFilter().validate();
                    folder = tmpFolder;
                    setTitle(String.format(Messages.getString("ML.FolderDialog.Title"),
                            getMediaLibraryFolder().getName()));
                    notifyFolderDialogAction(getMediaLibraryFolder(), DialogActionType.APPLY, isNewFolder);
                    isNewFolder = false;
                } catch (Exception e2) {
                    log.error("Save error: " + e2.getMessage(), e2);
                    JOptionPane.showMessageDialog(tabs.getTopLevelAncestor(), e2.getMessage(),
                            Messages.getString("ML.FolderDialog.SaveErrorHeader"), JOptionPane.WARNING_MESSAGE);
                }
            }
        });

        JButton buttonCancel = new JButton(Messages.getString("ML.FolderDialog.bCancel"));
        buttonCancel.setName("buttonCancel");
        if (buttonCancel.getPreferredSize().width < MIN_BUTTON_WIDTH)
            buttonCancel.setPreferredSize(new Dimension(MIN_BUTTON_WIDTH, buttonCancel.getPreferredSize().height));
        buttonCancel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                notifyFolderDialogAction(getMediaLibraryFolder(), DialogActionType.CANCEL, isNewFolder);
            }
        });

        pButtons = new JPanel();
        pButtons.setLayout(new FlowLayout(FlowLayout.CENTER));
        pButtons.add(buttonOk);
        pButtons.add(buttonApply);
        pButtons.add(buttonCancel);

        selectedFileType = FolderHelper.getHelper().getFileTypeCBItem(folder.getFileType());
        cbFileType.setSelectedItem(selectedFileType);

        rebuildPanel();
        pack();
    }

    private void rebuildPanel() {
        PanelBuilder builder;
        CellConstraints cc = new CellConstraints();

        FormLayout layout = new FormLayout("3px, p, 3px, p, p:grow, p, 3px, p, 3px, p, 3px", // columns
                "10px, p, 10px, fill:p:grow, p, 3px"); // raws
        builder = new PanelBuilder(layout);
        builder.setOpaque(true);

        //Name & Filter Type
        builder.add(lName, cc.xy(2, 2));
        builder.add(tfName, cc.xy(4, 2));
        builder.add(lFolderType, cc.xy(6, 2));
        builder.add(cbFileType, cc.xy(8, 2));
        builder.addSeparator("", cc.xyw(2, 3, 9));
        builder.add(tabs, cc.xyw(2, 4, 9));

        builder.add(pButtons, cc.xyw(2, 5, 9));

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

    private DOMediaLibraryFolder getDisplayedMediaLibraryFolder() throws ConditionException, TemplateException {
        DOMediaLibraryFolder tmpFolder = folder;
        tmpFolder.setName(tfName.getText().trim());
        tmpFolder.setFileType(((FileTypeCBItem) cbFileType.getSelectedItem()).getFileType());
        tmpFolder.setInheritsConditions(tabs.getInheritsConditions());
        tmpFolder.setFilter(tabs.getFilter());
        tmpFolder.setDisplayProperties(tabs.getDisplayProperties());
        tmpFolder.setInheritSort(tabs.isInheritSort());
        tmpFolder.setInheritDisplayFileAs(tabs.isInheritDisplayFileAs());
        tmpFolder.setDisplayItems(tabs.isDisplayItems());
        tmpFolder.setMaxFiles(tabs.getMaxFiles());

        return tmpFolder;
    }

    @Override
    public void pack() {
        super.pack();
        setMinimumSize(getSize());
    }
}