/*
This file is part of JFLICKS.
JFLICKS 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, either version 3 of the License, or
(at your option) any later version.
JFLICKS 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 JFLICKS. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jflicks.ui.view.metadata;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Frame;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.jflicks.job.JobEvent;
import org.jflicks.job.JobListener;
import org.jflicks.metadata.Hit;
import org.jflicks.metadata.SearchEvent;
import org.jflicks.metadata.SearchListener;
import org.jflicks.nms.NMS;
import org.jflicks.tv.Recording;
import org.jflicks.util.ProgressBar;
import org.jflicks.util.Util;
/**
* Implements a View so a user can control the metadata of videos.
*
* @author Doug Barnum
* @version 1.0
*/
public class RecordingPanel extends BasePanel implements ListSelectionListener,
SearchListener {
private NMS nms;
private JList recordingDisplayList;
private RecordingDisplayPanel recordingDisplayPanel;
private JButton viewImagesButton;
private JButton saveButton;
private ViewImagesAction viewImagesAction;
private SaveAction saveAction;
private ArrayList<Recording> recordingList;
/**
* Default constructor.
*/
public RecordingPanel() {
setRecordingList(new ArrayList<Recording>());
JList l = new JList();
l.setPrototypeCellValue("0123456789012345678901234567890123456789");
l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
l.setVisibleRowCount(22);
l.addListSelectionListener(this);
setRecordingDisplayList(l);
JScrollPane videolistScroller = new JScrollPane(l,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
ViewImagesAction view = new ViewImagesAction();
view.setEnabled(false);
setViewImagesAction(view);
JButton viewb = new JButton(view);
setViewImagesButton(viewb);
SaveAction save = new SaveAction();
save.setEnabled(false);
setSaveAction(save);
JButton saveb = new JButton(save);
setSaveButton(saveb);
RecordingDisplayPanel rdp = new RecordingDisplayPanel();
setRecordingDisplayPanel(rdp);
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.CENTER;
gbc.weightx = 0.5;
gbc.weighty = 1.0;
gbc.insets = new Insets(4, 4, 4, 4);
add(videolistScroller, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.CENTER;
gbc.weightx = 0.5;
gbc.weighty = 0.0;
gbc.insets = new Insets(4, 4, 4, 4);
add(viewb, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.CENTER;
gbc.weightx = 0.5;
gbc.weighty = 0.0;
gbc.insets = new Insets(4, 4, 4, 4);
add(saveb, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 3;
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.CENTER;
gbc.weightx = 0.5;
gbc.weighty = 0.0;
gbc.insets = new Insets(4, 4, 4, 4);
add(rdp, gbc);
}
private ArrayList<Recording> getRecordingList() {
return (recordingList);
}
private void setRecordingList(ArrayList<Recording> l) {
recordingList = l;
}
private void addRecording(Recording r) {
ArrayList<Recording> l = getRecordingList();
if ((l != null) && (r != null)) {
if (l.contains(r)) {
l.remove(r);
l.add(r);
} else {
l.add(r);
}
getSaveAction().setEnabled(true);
}
}
/**
* A NMS instance is needed to access data.
*
* @return A NMS instance.
*/
public NMS getNMS() {
return (nms);
}
/**
* A NMS instance is needed to access data. We notify extensions that
* this property has been updated.
*
* @param n A NMS instance.
*/
public void setNMS(NMS n) {
nms = n;
nmsAction();
}
private JList getRecordingDisplayList() {
return (recordingDisplayList);
}
private void setRecordingDisplayList(JList l) {
recordingDisplayList = l;
}
private RecordingDisplayPanel getRecordingDisplayPanel() {
return (recordingDisplayPanel);
}
private void setRecordingDisplayPanel(RecordingDisplayPanel p) {
recordingDisplayPanel = p;
}
private JButton getViewImagesButton() {
return (viewImagesButton);
}
private void setViewImagesButton(JButton b) {
viewImagesButton = b;
}
private JButton getSaveButton() {
return (saveButton);
}
private void setSaveButton(JButton b) {
saveButton = b;
}
private ViewImagesAction getViewImagesAction() {
return (viewImagesAction);
}
private void setViewImagesAction(ViewImagesAction a) {
viewImagesAction = a;
}
private SaveAction getSaveAction() {
return (saveAction);
}
private void setSaveAction(SaveAction a) {
saveAction = a;
}
private Frame getFrame() {
return (Util.findFrame(this));
}
private JPanel getPanel() {
return (this);
}
/**
* Convenience method to get the currently selected Recording.
*
* @return A Recording instance if one is selected.
*/
public Recording getSelectedRecording() {
Recording result = null;
JList l = getRecordingDisplayList();
if (l != null) {
result = (Recording) l.getSelectedValue();
}
return (result);
}
/**
* {@inheritDoc}
*/
public void searchUpdate(SearchEvent event) {
if (event.getType() == SearchEvent.UPDATE) {
if (isVisible()) {
// Extract and update.
Hit h = event.getHit();
Recording r = getSelectedRecording();
if ((r != null) && (h != null)) {
r.setBannerURL(h.getBannerURL());
r.setPosterURL(h.getPosterURL());
r.setFanartURL(h.getFanartURL());
addRecording(r);
}
}
}
}
/**
* We listen for selection on the recording list box.
*
* @param event The given list selection event.
*/
public void valueChanged(ListSelectionEvent event) {
if (!event.getValueIsAdjusting()) {
if (event.getSource() == getRecordingDisplayList()) {
JList l = getRecordingDisplayList();
int index = l.getSelectedIndex();
if (index != -1) {
Recording r = (Recording) l.getSelectedValue();
RecordingDisplayPanel p = getRecordingDisplayPanel();
if ((r != null) && (p != null)) {
p.setRecording(r);
getViewImagesAction().setEnabled(true);
fireSearchEvent(SearchEvent.SEARCH_TV, r.getTitle());
}
}
}
}
}
private void nmsAction() {
NMS n = getNMS();
if (n != null) {
Recording[] recs = n.getRecordings();
if (recs != null) {
JList list = getRecordingDisplayList();
if (list != null) {
Arrays.sort(recs);
list.setListData(recs);
}
}
}
}
class ViewImagesAction extends AbstractAction {
public ViewImagesAction() {
ImageIcon sm = new ImageIcon(getClass().getResource("view16.png"));
ImageIcon lge = new ImageIcon(getClass().getResource("view32.png"));
putValue(NAME, "View Images");
putValue(SHORT_DESCRIPTION, "View Images");
putValue(SMALL_ICON, sm);
putValue(LARGE_ICON_KEY, lge);
putValue(MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_V));
}
public void actionPerformed(ActionEvent event) {
Recording r = getSelectedRecording();
if (r != null) {
JScrollPane scroll = new JScrollPane(new ImagePanel(r),
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JPanel p = new JPanel(new BorderLayout());
p.add(scroll, BorderLayout.CENTER);
p.setPreferredSize(new java.awt.Dimension(800, 600));
Util.showDoneDialog(getFrame(), "Images", p);
}
}
}
class SaveAction extends AbstractAction implements JobListener {
public SaveAction() {
ImageIcon sm = new ImageIcon(getClass().getResource("save16.png"));
ImageIcon lge = new ImageIcon(getClass().getResource("save32.png"));
putValue(NAME, "Save");
putValue(SHORT_DESCRIPTION, "Save");
putValue(SMALL_ICON, sm);
putValue(LARGE_ICON_KEY, lge);
putValue(MNEMONIC_KEY, Integer.valueOf(KeyEvent.VK_S));
}
public void jobUpdate(JobEvent event) {
if (event.getType() == JobEvent.COMPLETE) {
getSaveAction().setEnabled(false);
}
}
public void actionPerformed(ActionEvent event) {
// Time to save off all the changes the user has made...
NMS n = getNMS();
ArrayList<Recording> l = getRecordingList();
if ((n != null) && (l != null) && (l.size() > 0)) {
Recording[] array = l.toArray(new Recording[l.size()]);
SaveRecordingJob srj = new SaveRecordingJob(n, array);
ProgressBar pbar =
new ProgressBar(getPanel(), "Saving...", srj);
pbar.addJobListener(this);
pbar.execute();
l.clear();
}
}
}
}