tvbrowser.ui.settings.PictureSettingsTab.java Source code

Java tutorial

Introduction

Here is the source code for tvbrowser.ui.settings.PictureSettingsTab.java

Source

/*
 * 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;
    }
}