/*
* TV-Browser
* Copyright (C) 04-2003 Martin Oberhauser (martin@tvbrowser.org)
*
* 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; either version 2
* of the License, or (at your option) any later version.
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package tvbrowser.ui.settings;
import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import tvbrowser.core.Settings;
import tvbrowser.extras.favoritesplugin.FavoritesPluginProxy;
import tvbrowser.extras.reminderplugin.ReminderPluginProxy;
import tvbrowser.ui.mainframe.MainFrame;
import util.settings.PluginPictureSettings;
import util.settings.ProgramPanelSettings;
import util.ui.CaretPositionCorrector;
import util.ui.Localizer;
import util.ui.MarkerChooserDlg;
import util.ui.PluginsPictureSettingsPanel;
import util.ui.ScrollableJPanel;
import util.ui.UiUtilities;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
import devplugin.Marker;
import devplugin.Plugin;
import devplugin.PluginAccess;
import devplugin.SettingsItem;
/**
* The settings tab for the program panel picture settings.
*
* @author René Mach
* @since 2.2.2
*/
public class PictureSettingsTab extends AbstractSettingsTab {
private static final Localizer mLocalizer = Localizer.getLocalizerFor(PictureSettingsTab.class);
private JRadioButton mShowPicturesEver, mShowPicturesNever, mShowPicturesForSelection;
private JCheckBox mShowPicturesInTimeRange, mShowPicturesForDuration, mShowPicturesForPlugins;
private JSpinner mPictureStartTime, mPictureEndTime, mDuration;
private JLabel mStartLabel, mEndLabel;
private JCheckBox mShowDescription;
private JLabel mPluginLabel;
private Marker[] mClientPlugins;
private JButton choose;
private PluginsPictureSettingsPanel mPluginsPictureSettings;
private JSpinner mDescriptionLines;
private JLabel mDescriptionLabel;
public JPanel createSettingsPanel() {
try {
mShowPicturesNever = new JRadioButton(mLocalizer.msg("showNever", "Show never"), Settings.propPictureType.getInt() == ProgramPanelSettings.SHOW_PICTURES_NEVER);
mShowPicturesEver = new JRadioButton(mLocalizer.msg("showEver", "Show always"), Settings.propPictureType.getInt() == ProgramPanelSettings.SHOW_PICTURES_EVER);
mShowPicturesForSelection = new JRadioButton(mLocalizer.msg("showForSelection", "Selection..."), Settings.propPictureType.getInt() > 1);
mShowPicturesInTimeRange = new JCheckBox(mLocalizer.msg("showInTimeRange", "Show in time range:"), ProgramPanelSettings.typeContainsType(Settings.propPictureType.getInt(), ProgramPanelSettings.SHOW_PICTURES_IN_TIME_RANGE));
mShowPicturesForDuration = new JCheckBox(mLocalizer.msg("showForDuration", "Show for duration more than or equals to:"), ProgramPanelSettings.typeContainsType(Settings.propPictureType.getInt(), ProgramPanelSettings.SHOW_PICTURES_FOR_DURATION));
ButtonGroup bg = new ButtonGroup();
bg.add(mShowPicturesEver);
bg.add(mShowPicturesNever);
bg.add(mShowPicturesForSelection);
String timePattern = mLocalizer.msg("timePattern", "hh:mm a");
mPictureStartTime = new JSpinner(new SpinnerDateModel());
mPictureStartTime.setEditor(new JSpinner.DateEditor(mPictureStartTime, timePattern));
CaretPositionCorrector.createCorrector(((JSpinner.DateEditor) mPictureStartTime.getEditor()).getTextField(), new char[]{':'}, -1);
mPictureEndTime = new JSpinner(new SpinnerDateModel());
mPictureEndTime.setEditor(new JSpinner.DateEditor(mPictureEndTime, timePattern));
CaretPositionCorrector.createCorrector(((JSpinner.DateEditor) mPictureEndTime.getEditor()).getTextField(), new char[]{':'}, -1);
mDuration = new JSpinner(new SpinnerNumberModel(Settings.propPictureDuration.getInt(), 10, 240, 1));
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, Settings.propPictureStartTime.getInt() / 60);
cal.set(Calendar.MINUTE, Settings.propPictureStartTime.getInt() % 60);
mPictureStartTime.setValue(cal.getTime());
cal.set(Calendar.HOUR_OF_DAY, Settings.propPictureEndTime.getInt() / 60);
cal.set(Calendar.MINUTE, Settings.propPictureEndTime.getInt() % 60);
mPictureEndTime.setValue(cal.getTime());
mShowDescription = new JCheckBox(mLocalizer.msg("showDescription", "Show description for pictures"), Settings.propIsPictureShowingDescription.getBoolean());
JEditorPane helpLabel = UiUtilities.createHtmlHelpTextArea(mLocalizer.msg("help", "These settings affect only the showing of the pictures. The pictures can only be shown if the download of pictures in enabled. To enable the picture download look at the <a href=\"#link\">settings of the TV dataservices</a>."), new HyperlinkListener() {
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
SettingsDialog.getInstance().showSettingsTab(SettingsItem.PLUGINS);
}
}
});
CellConstraints cc = new CellConstraints();
FormLayout layout = new FormLayout(
"5dlu, 12dlu, 15dlu, pref, 5dlu, pref, 5dlu, pref:grow, 5dlu",
"pref,5dlu,pref,pref,pref,2dlu,pref,pref,2dlu,pref" +
",2dlu,pref,pref,5dlu,pref,pref,10dlu,pref,5dlu,pref,10dlu,pref,5dlu");
PanelBuilder pb = new PanelBuilder(layout, new ScrollableJPanel());
pb.setDefaultDialogBorder();
int y = 1;
pb.addSeparator(mLocalizer.msg("basics", "Picture settings for the program table"), cc.xyw(1, y, 9));
pb.add(mShowPicturesNever, cc.xyw(2, y+=2, 8));
pb.add(mShowPicturesEver, cc.xyw(2, y+=1, 8));
pb.add(mShowPicturesForSelection, cc.xyw(2, y+=1, 8));
pb.add(mShowPicturesInTimeRange, cc.xyw(3, y+=2, 7));
mStartLabel = pb.addLabel(mLocalizer.msg("startTime", "From:"), cc.xy(4, y+=1));
pb.add(mPictureStartTime, cc.xy(6, y));
mEndLabel = pb.addLabel(mLocalizer.msg("endTime", "To:"), cc.xy(4, y+=2));
pb.add(mPictureEndTime, cc.xy(6, y));
pb.add(mShowPicturesForDuration, cc.xyw(3, y+=2, 7));
pb.add(mDuration, cc.xy(6, y+=1));
final JLabel minutesLabel = pb.addLabel(mLocalizer.msg("minutes", "Minutes"), cc.xy(8, y));
y++;
if (Settings.propPicturePluginIds.getStringArray() != null) {
JPanel mSubPanel = new JPanel(new FormLayout("15dlu,pref:grow,5dlu,pref", "pref,2dlu,pref"));
mShowPicturesForPlugins = new JCheckBox(mLocalizer.msg("showPicturesForPlugins", "Show for programs that are marked by plugins:"), ProgramPanelSettings.typeContainsType(Settings.propPictureType.getInt(), ProgramPanelSettings.SHOW_PICTURES_FOR_PLUGINS));
mPluginLabel = new JLabel();
mPluginLabel.setEnabled(ProgramPanelSettings.typeContainsType(Settings.propPictureType.getInt(), ProgramPanelSettings.SHOW_PICTURES_FOR_PLUGINS));
choose = new JButton(mLocalizer.msg("selectPlugins", "Choose Plugins"));
choose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Window parent = UiUtilities.getLastModalChildOf(MainFrame
.getInstance());
MarkerChooserDlg chooser = new MarkerChooserDlg(parent,
mClientPlugins, null);
chooser.setLocationRelativeTo(parent);
chooser.setVisible(true);
mClientPlugins = chooser.getMarker();
handlePluginSelection();
}
});
choose.setEnabled(ProgramPanelSettings.typeContainsType(Settings.propPictureType.getInt(), ProgramPanelSettings.SHOW_PICTURES_FOR_PLUGINS));
mShowPicturesForPlugins.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
mPluginLabel.setEnabled(e.getStateChange() == ItemEvent.SELECTED);
choose.setEnabled(e.getStateChange() == ItemEvent.SELECTED);
}
});
String[] clientPluginIdArr = Settings.propPicturePluginIds.getStringArray();
ArrayList<Marker> clientPlugins = new ArrayList<Marker>();
for (String arr : clientPluginIdArr) {
PluginAccess plugin = Plugin.getPluginManager().getActivatedPluginForId(arr);
if (plugin != null) {
clientPlugins.add(plugin);
} else if (ReminderPluginProxy.getInstance().getId().compareTo(arr) == 0) {
clientPlugins.add(ReminderPluginProxy.getInstance());
} else if (FavoritesPluginProxy.getInstance().getId().compareTo(arr) == 0) {
clientPlugins.add(FavoritesPluginProxy.getInstance());
}
}
mClientPlugins = clientPlugins.toArray(new Marker[clientPlugins.size()]);
handlePluginSelection();
mSubPanel.add(mShowPicturesForPlugins, cc.xyw(1, 1, 4));
mSubPanel.add(mPluginLabel, cc.xy(2, 3));
mSubPanel.add(choose, cc.xy(4, 3));
layout.insertRow(y, RowSpec.decode("2dlu"));
layout.insertRow(y+=1, RowSpec.decode("pref"));
pb.add(mSubPanel, cc.xyw(3, y, 6));
layout.insertRow(y+=1, RowSpec.decode("2dlu"));
y++;
}
pb.add(mShowDescription, cc.xyw(2, y+=1, 8));
mDescriptionLines = new JSpinner(new SpinnerNumberModel(Settings.propPictureDescriptionLines.getInt(), 1, 20, 1));
pb.add(mDescriptionLines, cc.xyw(3, y+=1, 4));
mDescriptionLabel = new JLabel(mLocalizer.msg("lines", "lines"));
pb.add(mDescriptionLabel, cc.xy(8, y));
mDescriptionLabel.setEnabled(mShowDescription.isSelected());
mShowDescription.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mDescriptionLines.setEnabled(mShowDescription.isSelected());
mDescriptionLabel.setEnabled(mShowDescription.isSelected());
}});
pb.addSeparator(mLocalizer.msg("pluginPictureTitle", "Default picture settings for the program lists of the Plugins"), cc.xyw(1, y+=2, 8));
pb.add(mPluginsPictureSettings = new PluginsPictureSettingsPanel(new PluginPictureSettings(Settings.propPluginsPictureSetting.getInt()), true), cc.xyw(2, y+=2, 7));
pb.add(helpLabel, cc.xyw(1, y+=2, 9));
mShowPicturesInTimeRange.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
mPictureStartTime.setEnabled(mShowPicturesInTimeRange.isSelected());
mPictureEndTime.setEnabled(mShowPicturesInTimeRange.isSelected());
mStartLabel.setEnabled(mShowPicturesInTimeRange.isSelected());
mEndLabel.setEnabled(mShowPicturesInTimeRange.isSelected());
}
});
mShowPicturesForDuration.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
mDuration.setEnabled(mShowPicturesForDuration.isSelected());
minutesLabel.setEnabled(mShowPicturesForDuration.isSelected());
}
});
mShowPicturesNever.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
mShowDescription.setEnabled(!mShowPicturesNever.isSelected());
}
});
mShowPicturesForSelection.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
mShowPicturesForDuration.setEnabled(mShowPicturesForSelection.isSelected());
mShowPicturesInTimeRange.setEnabled(mShowPicturesForSelection.isSelected());
mStartLabel.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesInTimeRange.isSelected());
mEndLabel.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesInTimeRange.isSelected());
minutesLabel.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesForDuration.isSelected());
mPictureStartTime.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesInTimeRange.isSelected());
mPictureEndTime.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesInTimeRange.isSelected());
mDuration.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesForDuration.isSelected());
if (mShowPicturesForPlugins != null) {
mShowPicturesForPlugins.setEnabled(mShowPicturesForSelection.isSelected());
}
if (mPluginLabel != null) {
mPluginLabel.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesForPlugins.isSelected());
}
if (choose != null) {
choose.setEnabled(mShowPicturesForSelection.isSelected() && mShowPicturesForPlugins.isSelected());
}
}
});
mShowPicturesInTimeRange.getItemListeners()[0].itemStateChanged(null);
mShowPicturesForDuration.getItemListeners()[0].itemStateChanged(null);
mShowPicturesForSelection.getItemListeners()[0].itemStateChanged(null);
mShowPicturesNever.getItemListeners()[0].itemStateChanged(null);
JScrollPane scrollPane = new JScrollPane(pb.getPanel());
scrollPane.getViewport().setBackground(pb.getPanel().getBackground());
scrollPane.setBorder(null);
JPanel scrollPanel = new JPanel(new BorderLayout());
scrollPanel.add(scrollPane, BorderLayout.CENTER);
return scrollPanel;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public Icon getIcon() {
return getPictureIcon();
}
public String getTitle() {
return Localizer.getLocalization(Localizer.I18N_PICTURES);
}
public void saveSettings() {
Settings.propPictureType.setInt(getPictureShowingType());
Settings.propPictureStartTime.setInt(getPictureTimeRangeStart());
Settings.propPictureEndTime.setInt(getPictureTimeRangeEnd());
Settings.propPictureDuration.setInt((Integer) mDuration.getValue());
Settings.propIsPictureShowingDescription.setBoolean(mShowDescription.isSelected());
if (ProgramPanelSettings.typeContainsType(getPictureShowingType(), ProgramPanelSettings.SHOW_PICTURES_FOR_PLUGINS)) {
Settings.propPicturePluginIds.setStringArray(getClientPluginIds());
}
Settings.propPluginsPictureSetting.setInt(mPluginsPictureSettings.getSettings().getType());
Settings.propPictureDescriptionLines.setInt((Integer) mDescriptionLines.getValue());
}
/**
* @since 2.6
*/
private void handlePluginSelection() {
if (mClientPlugins.length > 0) {
mPluginLabel.setText(mClientPlugins[0].toString());
mPluginLabel.setEnabled(true);
} else {
mPluginLabel.setText(mLocalizer.msg("noPlugins", "No Plugins choosen"));
mPluginLabel.setEnabled(false);
}
for (int i = 1; i < (mClientPlugins.length > 4 ? 3 : mClientPlugins.length); i++) {
mPluginLabel.setText(mPluginLabel.getText() + ", " + mClientPlugins[i]);
}
if (mClientPlugins.length > 4) {
mPluginLabel.setText(mPluginLabel.getText() + " (" + (mClientPlugins.length - 3) + " " + mLocalizer.ellipsisMsg("otherPlugins", "others") + ")");
}
}
/**
* @return The picture showing type of this settings
* @since 2.6
*/
private int getPictureShowingType() {
int value = ProgramPanelSettings.SHOW_PICTURES_NEVER;
if (mShowPicturesEver.isSelected()) {
value = ProgramPanelSettings.SHOW_PICTURES_EVER;
} else if (mShowPicturesForSelection.isSelected()) {
if (mShowPicturesForDuration.isSelected()) {
value += ProgramPanelSettings.SHOW_PICTURES_FOR_DURATION;
}
if (mShowPicturesForPlugins != null && mShowPicturesForPlugins.isSelected() && mClientPlugins != null && mClientPlugins.length > 0) {
value += ProgramPanelSettings.SHOW_PICTURES_FOR_PLUGINS;
}
if (mShowPicturesInTimeRange.isSelected()) {
value += ProgramPanelSettings.SHOW_PICTURES_IN_TIME_RANGE;
}
}
return value;
}
/**
* @return The time range start time.
* @since 2.6
*/
private int getPictureTimeRangeStart() {
Calendar cal = Calendar.getInstance();
Date startTime = (Date) mPictureStartTime.getValue();
cal.setTime(startTime);
return cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
}
/**
* @return The time range end time.
* @since 2.6
*/
private int getPictureTimeRangeEnd() {
Calendar cal = Calendar.getInstance();
Date startTime = (Date) mPictureEndTime.getValue();
cal.setTime(startTime);
return cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
}
/**
* @return The selected client plugins.
* @since 2.6
*/
private String[] getClientPluginIds() {
if (mShowPicturesForPlugins != null) {
String[] clientPluginIdArr = new String[mClientPlugins.length];
for (int i = 0; i < mClientPlugins.length; i++) {
clientPluginIdArr[i] = mClientPlugins[i].getId();
}
return clientPluginIdArr;
}
return null;
}
}