net.pms.medialibrary.gui.dialogs.fileeditdialog.panels.VideoFilePropertiesPanel.java Source code

Java tutorial

Introduction

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

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

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.DOCertification;
import net.pms.medialibrary.commons.dataobjects.DOFileInfo;
import net.pms.medialibrary.commons.dataobjects.DORating;
import net.pms.medialibrary.commons.dataobjects.DOVideoFileInfo;
import net.pms.medialibrary.commons.enumarations.ConditionType;
import net.pms.medialibrary.commons.interfaces.IFilePropertiesEditor;
import net.pms.medialibrary.gui.dialogs.fileeditdialog.controls.PropertyInfoEntry;
import net.pms.medialibrary.gui.shared.JHeader;

public class VideoFilePropertiesPanel extends JPanel implements IFilePropertiesEditor {
    private static final long serialVersionUID = -2983607076103804005L;

    private final String GENRES_NAME = Messages.getString("ML.Condition.Type.VIDEO_GENRES");

    private PropertyInfoEntry hName;
    private PropertyInfoEntry hOriginalName;
    private PropertyInfoEntry hSortName;
    private PropertyInfoEntry hDirector;
    private PropertyInfoEntry hImdbId;
    private PropertyInfoEntry hTmdbId;
    private PropertyInfoEntry hRating;
    private PropertyInfoEntry hRatingVoters;
    private PropertyInfoEntry hRevenue;
    private PropertyInfoEntry hYear;
    private PropertyInfoEntry hBudget;
    private PropertyInfoEntry hHomePage;
    private PropertyInfoEntry hCertification;
    private PropertyInfoEntry hCertificationReason;
    private PropertyInfoEntry hTrailer;
    private PropertyInfoEntry hTagLine;
    private JHeader hOverview;
    private JTextArea taOverview;
    private JCheckBox cbActive;
    private FileTagsPanel pGenres;

    private boolean isConfirmEdit;

    public VideoFilePropertiesPanel(DOVideoFileInfo fileInfo, boolean isConfirmEdit) {
        setLayout(new GridLayout());
        this.isConfirmEdit = isConfirmEdit;
        init(fileInfo);
        build();
    }

    public void init(DOVideoFileInfo fileInfo) {
        hName = new PropertyInfoEntry(fileInfo.getName(), ConditionType.VIDEO_NAME, isConfirmEdit);
        hOriginalName = new PropertyInfoEntry(fileInfo.getOriginalName(), ConditionType.VIDEO_ORIGINALNAME,
                isConfirmEdit);
        hYear = new PropertyInfoEntry(String.valueOf(fileInfo.getYear()), ConditionType.VIDEO_YEAR, isConfirmEdit);
        hSortName = new PropertyInfoEntry(fileInfo.getSortName(), ConditionType.VIDEO_SORTNAME, isConfirmEdit);
        hDirector = new PropertyInfoEntry(fileInfo.getDirector(), ConditionType.VIDEO_DIRECTOR, isConfirmEdit);
        hImdbId = new PropertyInfoEntry(fileInfo.getImdbId(), ConditionType.VIDEO_IMDBID, isConfirmEdit);
        hHomePage = new PropertyInfoEntry(fileInfo.getHomepageUrl(), ConditionType.VIDEO_HOMEPAGEURL,
                isConfirmEdit);
        hTrailer = new PropertyInfoEntry(fileInfo.getTrailerUrl(), ConditionType.VIDEO_TRAILERURL, isConfirmEdit);
        hTmdbId = new PropertyInfoEntry(String.valueOf(fileInfo.getTmdbId()), ConditionType.VIDEO_TMDBID,
                isConfirmEdit);
        hRating = new PropertyInfoEntry(String.valueOf(fileInfo.getRating().getRatingPercent()),
                ConditionType.VIDEO_RATINGPERCENT, isConfirmEdit);
        hRatingVoters = new PropertyInfoEntry(String.valueOf(fileInfo.getRating().getVotes()),
                ConditionType.VIDEO_RATINGVOTERS, isConfirmEdit);
        hCertificationReason = new PropertyInfoEntry(fileInfo.getAgeRating().getReason(),
                ConditionType.VIDEO_CERTIFICATIONREASON, isConfirmEdit);
        hCertification = new PropertyInfoEntry(fileInfo.getAgeRating().getLevel(),
                ConditionType.VIDEO_CERTIFICATION, isConfirmEdit);
        hTagLine = new PropertyInfoEntry(fileInfo.getTagLine(), ConditionType.VIDEO_TAGLINE, isConfirmEdit);
        hBudget = new PropertyInfoEntry(String.valueOf(fileInfo.getBudget()), ConditionType.VIDEO_BUDGET,
                isConfirmEdit);
        hRevenue = new PropertyInfoEntry(String.valueOf(fileInfo.getRevenue()), ConditionType.VIDEO_REVENUE,
                isConfirmEdit);

        hOverview = new JHeader(ConditionType.VIDEO_OVERVIEW, isConfirmEdit);
        taOverview = new JTextArea(String.valueOf(fileInfo.getOverview()));
        taOverview.setLineWrap(true);
        taOverview.setWrapStyleWord(true);
        taOverview.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent arg0) {
                hOverview.setSelected(true);
            }

            @Override
            public void insertUpdate(DocumentEvent arg0) {
                hOverview.setSelected(true);
            }

            @Override
            public void changedUpdate(DocumentEvent arg0) {
                hOverview.setSelected(true);
            }
        });

        cbActive = new JCheckBox(Messages.getString("ML.Condition.Header.Type.FILE_ISACTIF"));
        cbActive.setFont(cbActive.getFont().deriveFont(Font.BOLD));
        cbActive.setSelected(fileInfo.isActive());
        if (isConfirmEdit) {
            cbActive.setSelected(false);
            cbActive.setEnabled(false);
        }

        Map<String, List<String>> genresMap = new HashMap<String, List<String>>();
        Collections.sort(fileInfo.getGenres());
        genresMap.put(GENRES_NAME, fileInfo.getGenres());
        pGenres = new FileTagsPanel(genresMap, false, false);
        pGenres.addRepaintListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                validate();
                repaint();
            }
        });
    }

    public void build() {
        //reset the sizes of all text fields to lay them out correctly when resizing
        //otherwise, scroll bars will show up if the dialog size is being reduced
        taOverview.setSize(new Dimension(10, 10));

        //build the panel
        PanelBuilder builder;
        CellConstraints cc = new CellConstraints();

        FormLayout layout = new FormLayout(
                "5px, 20:grow, 10px, 20:grow, 10px, 20:grow, 10px, 20:grow, 10px, d, 5px", // columns
                "3px, d, 3px, d, 3px, d, 3px, d, 3px, d, 3px, d, 3px, d, 5px, d, 3px"); // rows
        builder = new PanelBuilder(layout);
        builder.setOpaque(true);

        //row 1
        builder.add(hName, cc.xyw(2, 2, 3));
        builder.add(hOriginalName, cc.xyw(6, 2, 3));
        builder.add(hYear, cc.xy(10, 2));

        //row 2
        builder.add(hSortName, cc.xyw(2, 4, 3));
        builder.add(hDirector, cc.xyw(6, 4, 3));
        builder.add(hImdbId, cc.xy(10, 4));

        //row 3
        builder.add(hHomePage, cc.xyw(2, 6, 3));
        builder.add(hTrailer, cc.xyw(6, 6, 3));
        builder.add(hTmdbId, cc.xy(10, 6));

        //row 4      
        builder.add(hRating, cc.xy(2, 8));
        builder.add(hRatingVoters, cc.xy(4, 8));
        builder.add(hCertificationReason, cc.xyw(6, 8, 3));
        builder.add(hCertification, cc.xy(10, 8));

        //row 5
        builder.add(hTagLine, cc.xyw(2, 10, 7));
        builder.add(hBudget, cc.xy(10, 10));

        //row 6+7
        JPanel pOverviewHeader = new JPanel(new GridLayout());
        pOverviewHeader.setAlignmentY(LEFT_ALIGNMENT);
        pOverviewHeader.add(hOverview);

        JScrollPane spOverview = new JScrollPane(taOverview);
        spOverview.setBorder(new JTextField().getBorder());

        JPanel pOverview = new JPanel(new BorderLayout(0, 1));
        pOverview.add(pOverviewHeader, BorderLayout.NORTH);
        pOverview.add(spOverview, BorderLayout.CENTER);

        builder.add(pOverview, cc.xywh(2, 12, 7, 3));

        builder.add(hRevenue, cc.xy(10, 12));
        builder.add(cbActive, cc.xy(10, 14));

        //row 8
        builder.add(pGenres, cc.xyw(2, 16, 9));

        JPanel p = builder.getPanel();
        JScrollPane sp = new JScrollPane(p);
        sp.setBorder(BorderFactory.createEmptyBorder());

        removeAll();
        add(sp);
    }

    @Override
    public void updateFileInfo(DOFileInfo fileInfo) {
        if (!(fileInfo instanceof DOVideoFileInfo)) {
            return;
        }

        //try to parse all numerical values first to avoid modifying the fileinfo
        //if a value can't be set
        int year;
        int tmdbId;
        int budget;
        int revenue;
        int rating;
        int voters;

        try {
            year = Integer.parseInt(hYear.getText().trim());
        } catch (NumberFormatException ex) {
            year = 0;
        }
        try {
            tmdbId = Integer.parseInt(hTmdbId.getText().trim());
        } catch (NumberFormatException ex) {
            tmdbId = 0;
        }
        try {
            budget = Integer.parseInt(hBudget.getText().trim());
        } catch (NumberFormatException ex) {
            budget = 0;
        }
        try {
            revenue = Integer.parseInt(hRevenue.getText().trim());
        } catch (NumberFormatException ex) {
            revenue = 0;
        }
        try {
            rating = Integer.parseInt(hRating.getText().trim());
        } catch (NumberFormatException ex) {
            rating = 0;
        }
        try {
            voters = Integer.parseInt(hRatingVoters.getText().trim());
        } catch (NumberFormatException ex) {
            voters = 0;
        }

        DOVideoFileInfo fiVideo = (DOVideoFileInfo) fileInfo;
        fiVideo.setActive(cbActive.isSelected());

        fiVideo.setYear(year);
        fiVideo.setTmdbId(tmdbId);
        fiVideo.setBudget(budget);
        fiVideo.setRevenue(revenue);
        fiVideo.setRating(new DORating(rating, voters));

        fiVideo.setName(hName.getText().trim());
        fiVideo.setOriginalName(hOriginalName.getText().trim());
        fiVideo.setSortName(hSortName.getText().trim());
        fiVideo.setDirector(hDirector.getText().trim());
        fiVideo.setImdbId(hImdbId.getText().trim());
        fiVideo.setHomepageUrl(hHomePage.getText().trim());
        fiVideo.setTrailerUrl(hTrailer.getText().trim());
        fiVideo.setAgeRating(
                new DOCertification(hCertification.getText().trim(), hCertificationReason.getText().trim()));
        fiVideo.setTagLine(hTagLine.getText().trim());
        fiVideo.setOverview(taOverview.getText().trim());

        Map<String, List<String>> tags = pGenres.getTags();
        List<String> newGenres = new ArrayList<String>();
        if (tags.keySet().contains(GENRES_NAME)) {
            newGenres = tags.get(GENRES_NAME);
        }
        fiVideo.setGenres(newGenres);

    }

    @Override
    public List<ConditionType> getPropertiesToUpdate() {
        List<ConditionType> res = new ArrayList<ConditionType>();
        res.add(ConditionType.FILE_CONTAINS_TAG);
        res.add(ConditionType.VIDEO_CONTAINS_GENRE);

        if (hName.isSelected()) {
            res.add(ConditionType.VIDEO_NAME);
        }
        if (hOriginalName.isSelected()) {
            res.add(ConditionType.VIDEO_ORIGINALNAME);
        }
        if (hSortName.isSelected()) {
            res.add(ConditionType.VIDEO_SORTNAME);
        }
        if (hDirector.isSelected()) {
            res.add(ConditionType.VIDEO_DIRECTOR);
        }
        if (hImdbId.isSelected()) {
            res.add(ConditionType.VIDEO_IMDBID);
        }
        if (hTmdbId.isSelected()) {
            res.add(ConditionType.VIDEO_TMDBID);
        }
        if (hRating.isSelected()) {
            res.add(ConditionType.VIDEO_RATINGPERCENT);
        }
        if (hRatingVoters.isSelected()) {
            res.add(ConditionType.VIDEO_RATINGVOTERS);
        }
        if (hRevenue.isSelected()) {
            res.add(ConditionType.VIDEO_REVENUE);
        }
        if (hYear.isSelected()) {
            res.add(ConditionType.VIDEO_YEAR);
        }
        if (hBudget.isSelected()) {
            res.add(ConditionType.VIDEO_BUDGET);
        }
        if (hHomePage.isSelected()) {
            res.add(ConditionType.VIDEO_HOMEPAGEURL);
        }
        if (hCertification.isSelected()) {
            res.add(ConditionType.VIDEO_CERTIFICATION);
        }
        if (hCertificationReason.isSelected()) {
            res.add(ConditionType.VIDEO_CERTIFICATIONREASON);
        }
        if (hTrailer.isSelected()) {
            res.add(ConditionType.VIDEO_TRAILERURL);
        }
        if (hTagLine.isSelected()) {
            res.add(ConditionType.VIDEO_TAGLINE);
        }
        if (hOverview.isSelected()) {
            res.add(ConditionType.VIDEO_OVERVIEW);
        }

        return res;
    }
}