/*
* 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.
*
* CVS information:
* $RCSfile$
* $Source$
* $Date: 2010-01-16 09:35:26 +0100 (Sat, 16 Jan 2010) $
* $Author: troggan $
* $Revision: 6326 $
*/
package tvbrowser.ui.settings;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.Calendar;
import java.util.Date;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerDateModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
import tvbrowser.core.Settings;
import tvbrowser.ui.settings.tablebackgroundstyles.DayTimeBackgroundStyle;
import tvbrowser.ui.settings.tablebackgroundstyles.SingleColorBackgroundStyle;
import tvbrowser.ui.settings.tablebackgroundstyles.SingleImageBackgroundStyle;
import tvbrowser.ui.settings.tablebackgroundstyles.TableBackgroundStyle;
import tvbrowser.ui.settings.tablebackgroundstyles.TimeBlockBackgroundStyle;
import tvbrowser.ui.settings.util.ColorButton;
import tvbrowser.ui.settings.util.ColorLabel;
import util.ui.CaretPositionCorrector;
import util.ui.Localizer;
import util.ui.UiUtilities;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.factories.DefaultComponentFactory;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
import devplugin.SettingsTab;
/**
*
* @author Til Schneider, www.murfman.de
*/
public class ProgramTableSettingsTab implements SettingsTab, ActionListener {
private static final util.ui.Localizer mLocalizer = util.ui.Localizer.getLocalizerFor(ProgramTableSettingsTab.class);
private JPanel mSettingsPn;
private JComboBox mProgramArrangementCB;
private JComboBox mBackgroundStyleCB;
private JButton mConfigBackgroundStyleBt;
private JButton mDefaultBtn;
private JSpinner mColWidth, mStartOfDayTimeSp, mEndOfDayTimeSp;
private JCheckBox mMouseOverCb;
private ColorLabel mMouseOverColorLb;
private ColorLabel mForegroundColorLb;
private short mLastSelectedLayoutIndex;
private JCheckBox mCutLongTitlesCB;
private JSpinner mCutLongTitlesSelection;
private JCheckBox mAutoScrollCb;
private JSpinner mDescriptionLines;
private JLabel mCutLongTitlesLabel;
private JCheckBox mShortProgramsCB;
private JSpinner mShortProgramsMinutes;
private JLabel mShortProgramsLabel;
public void actionPerformed(ActionEvent event) {
Object source = event.getSource();
if (source == mDefaultBtn) {
mColWidth.setValue(Settings.propColumnWidth.getDefault());
}
}
/**
* Creates the settings panel for this tab.
*/
public JPanel createSettingsPanel() {
FormLayout layout = new FormLayout("5dlu, pref, 3dlu, pref, 3dlu, pref, fill:pref:grow, 3dlu", "");
mSettingsPn = new JPanel(layout);
mSettingsPn.setBorder(Borders.DIALOG_BORDER);
CellConstraints cc = new CellConstraints();
int currentRow = 1;
// Layout-Rows ****************************************
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("5dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("3dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("3dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("3dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("10dlu"));
mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(
mLocalizer.msg("layout", "Layout")), cc.xyw(1, currentRow, 8));
mSettingsPn.add(new JLabel(mLocalizer.msg("programArrangement",
"Program arrangement")), cc.xy(2, (currentRow += 2)));
// program table layout
String[] arrangementArr = { mLocalizer.msg(Settings.LAYOUT_TIME_SYNCHRONOUS, "Time synchronous"),
mLocalizer.msg(Settings.LAYOUT_REAL_SYNCHRONOUS, "Real time synchronous"),
mLocalizer.msg(Settings.LAYOUT_COMPACT, "Compact"),mLocalizer.msg(Settings.LAYOUT_REAL_COMPACT, "Real compact"),
mLocalizer.msg(Settings.LAYOUT_TIME_BLOCK, "Time block"),
mLocalizer.msg(Settings.LAYOUT_COMPACT_TIME_BLOCK, "Compact time block"),
mLocalizer.msg(Settings.LAYOUT_OPTIMIZED_COMPACT_TIME_BLOCK, "Optimized compact time block")};
mProgramArrangementCB = new JComboBox(arrangementArr);
if (Settings.propTableLayout.getString().equals(Settings.LAYOUT_COMPACT)) {
mProgramArrangementCB.setSelectedIndex(2);
} else if (Settings.propTableLayout.getString().equals(Settings.LAYOUT_REAL_COMPACT)) {
mProgramArrangementCB.setSelectedIndex(3);
} else if (Settings.propTableLayout.getString().equals(Settings.LAYOUT_TIME_SYNCHRONOUS)) {
mProgramArrangementCB.setSelectedIndex(0);
} else if (Settings.propTableLayout.getString().equals(Settings.LAYOUT_TIME_BLOCK)) {
mProgramArrangementCB.setSelectedIndex(4);
} else if (Settings.propTableLayout.getString().equals(Settings.LAYOUT_COMPACT_TIME_BLOCK)) {
mProgramArrangementCB.setSelectedIndex(5);
} else if (Settings.propTableLayout.getString().equals(Settings.LAYOUT_OPTIMIZED_COMPACT_TIME_BLOCK)) {
mProgramArrangementCB.setSelectedIndex(6);
} else {
mProgramArrangementCB.setSelectedIndex(1);
}
mLastSelectedLayoutIndex = (short)mProgramArrangementCB.getSelectedIndex();
mSettingsPn.add(mProgramArrangementCB, cc.xy(4, currentRow));
// Cut long titles
mCutLongTitlesCB = new JCheckBox(mLocalizer.msg("cutTitle",
"Cut long titles"), Settings.propProgramTableCutTitle.getBoolean());
mSettingsPn.add(mCutLongTitlesCB, cc.xyw(2, (currentRow += 2), 2));
mCutLongTitlesSelection = new JSpinner(new SpinnerNumberModel(
Settings.propProgramTableCutTitleLines.getInt(), 1, 3, 1));
mSettingsPn.add(mCutLongTitlesSelection, cc.xy(4, currentRow));
mCutLongTitlesLabel = new JLabel(mLocalizer.msg("lines", "Lines"));
mSettingsPn.add(mCutLongTitlesLabel, cc.xy(6, currentRow));
mCutLongTitlesCB.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mCutLongTitlesSelection.setEnabled(mCutLongTitlesCB.isSelected());
mCutLongTitlesLabel.setEnabled(mCutLongTitlesCB.isSelected());
}
});
mCutLongTitlesCB.getActionListeners()[0].actionPerformed(null);
// Short descriptions N lines
mDescriptionLines = new JSpinner(new SpinnerNumberModel(
Settings.propProgramPanelMaxLines.getInt(), 1, 5, 1));
mSettingsPn.add(new JLabel(mLocalizer.msg("shortDescription",
"Short description")), cc.xyw(2, currentRow += 2, 2));
mSettingsPn.add(mDescriptionLines, cc.xy(4, currentRow));
mSettingsPn.add(new JLabel(mLocalizer.msg("lines", "Lines")), cc.xy(6,
currentRow));
// Short programs no description
mShortProgramsCB = new JCheckBox(mLocalizer.msg("shortPrograms",
"If duration less than"),
Settings.propProgramPanelShortDurationActive.getBoolean());
mSettingsPn.add(mShortProgramsCB, cc.xyw(2, (currentRow += 2), 2));
mShortProgramsMinutes = new JSpinner(new SpinnerNumberModel(
Settings.propProgramPanelShortDurationMinutes.getInt(), 1, 30, 1));
mSettingsPn.add(mShortProgramsMinutes, cc.xy(4, currentRow));
mShortProgramsLabel = new JLabel(mLocalizer.msg("shortPrograms2",
"minutes, then hide description"));
mSettingsPn.add(mShortProgramsLabel, cc.xy(6, currentRow));
mShortProgramsCB.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mShortProgramsMinutes.setEnabled(mShortProgramsCB.isSelected());
mShortProgramsLabel.setEnabled(mShortProgramsCB.isSelected());
}
});
mShortProgramsCB.getActionListeners()[0].actionPerformed(null);
// Column Rows ***************************************
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("5dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("10dlu"));
mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(
mLocalizer.msg("columnwidth", "column width")), cc.xyw(1,
(currentRow += 2), 8));
// column width
int width = Settings.propColumnWidth.getInt();
if (width > Settings.MAX_COLUMN_WIDTH) {
width = Settings.MAX_COLUMN_WIDTH;
}
if (width < Settings.MIN_COLUMN_WIDTH) {
width = Settings.MIN_COLUMN_WIDTH;
}
mColWidth = new JSpinner(new SpinnerNumberModel(
width, Settings.MIN_COLUMN_WIDTH, Settings.MAX_COLUMN_WIDTH, 1));
mSettingsPn.add(new JLabel(mLocalizer.msg("widthInPixels", "Width in Pixels")), cc.xy(2, (currentRow += 2)));
mSettingsPn.add(mColWidth, cc.xy(4, currentRow));
mDefaultBtn = new JButton(Localizer.getLocalization(Localizer.I18N_DEFAULT));
mDefaultBtn.addActionListener(this);
mSettingsPn.add(mDefaultBtn, cc.xy(6, currentRow));
// Column Rows ***************************************
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("5dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("3dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("10dlu"));
mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(
mLocalizer.msg("range", "Range")), cc.xyw(1, (currentRow += 2), 8));
mSettingsPn.add(new JLabel(mLocalizer.msg("startOfDay", "Start of day")),
cc.xy(2, (currentRow += 2)));
TwoSpinnerDateModel startModel = new TwoSpinnerDateModel();
mStartOfDayTimeSp = new JSpinner(startModel);
startModel.setMe(mStartOfDayTimeSp);
JSpinner.DateEditor dateEditor = new JSpinner.DateEditor(mStartOfDayTimeSp, Settings.getTimePattern());
mStartOfDayTimeSp.setEditor(dateEditor);
mSettingsPn.add(mStartOfDayTimeSp, cc.xy(4, currentRow));
mSettingsPn.add(new JLabel("("
+ Localizer.getLocalization(Localizer.I18N_TODAY) + ")"), cc.xy(6,
currentRow));
CaretPositionCorrector.createCorrector(dateEditor.getTextField(), new char[] {':'}, -1);
mSettingsPn.add(new JLabel(mLocalizer.msg("endOfDay", "End of day")), cc
.xy(2, (currentRow += 2)));
TwoSpinnerDateModel endModel = new TwoSpinnerDateModel();
mEndOfDayTimeSp = new JSpinner(endModel);
endModel.setMe(mEndOfDayTimeSp);
dateEditor = new JSpinner.DateEditor(mEndOfDayTimeSp, Settings.getTimePattern());
mEndOfDayTimeSp.setEditor(dateEditor);
mSettingsPn.add(mEndOfDayTimeSp, cc.xy(4, currentRow));
mSettingsPn.add(new JLabel("(" + mLocalizer.msg("nextDay", "next day")
+ ")"), cc.xy(6, currentRow));
CaretPositionCorrector.createCorrector(dateEditor.getTextField(), new char[] {':'}, -1);
int minutes;
Calendar cal = Calendar.getInstance();
minutes = Settings.propProgramTableStartOfDay.getInt();
cal.set(Calendar.HOUR_OF_DAY, minutes / 60);
cal.set(Calendar.MINUTE, minutes % 60);
mStartOfDayTimeSp.setValue(cal.getTime());
minutes = Settings.propProgramTableEndOfDay.getInt();
cal.set(Calendar.HOUR_OF_DAY, minutes / 60);
cal.set(Calendar.MINUTE, minutes % 60);
mEndOfDayTimeSp.setValue(cal.getTime());
// Table Background ***************************************
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("5dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("10dlu"));
mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(
mLocalizer.msg("tableBackground", "Table background")), cc.xyw(1,
(currentRow += 2), 8));
mSettingsPn.add(new JLabel(mLocalizer.msg("tableBackgroundStyle",
"Table background style")), cc.xy(2, (currentRow += 2)));
TableBackgroundStyle[] styles = getTableBackgroundStyles();
mBackgroundStyleCB = new JComboBox(styles);
String style = Settings.propTableBackgroundStyle.getString();
for (int i = 0; i < styles.length; i++) {
if (styles[i].getSettingsString().equals(style)) {
mBackgroundStyleCB.setSelectedIndex(i);
break;
}
}
mBackgroundStyleCB.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
updateBackgroundStyleConfigureButton();
}
});
mSettingsPn.add(mBackgroundStyleCB, cc.xy(4, currentRow));
mConfigBackgroundStyleBt = new JButton(mLocalizer.ellipsisMsg("configure", "Configure"));
mConfigBackgroundStyleBt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ConfigureBackgroundStyleDialog dlg = new ConfigureBackgroundStyleDialog(mBackgroundStyleCB,
(TableBackgroundStyle) mBackgroundStyleCB.getSelectedItem());
dlg.show();
}
});
mSettingsPn.add(mConfigBackgroundStyleBt, cc.xy(6, currentRow));
// Foreground color
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("5dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("5dlu"));
mForegroundColorLb = new ColorLabel(Settings.propProgramPanelForegroundColor.getColor());
mForegroundColorLb.setStandardColor(Settings.propProgramPanelForegroundColor.getDefaultColor());
ColorButton programPanelForegroundColorChangeBtn = new ColorButton(mForegroundColorLb);
mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(
mLocalizer.msg("foreground", "Foreground")), cc.xyw(1,
(currentRow += 2), 8));
mSettingsPn.add(new JLabel(mLocalizer.msg("fontColor", "Font color")), cc
.xy(2,
(currentRow += 2)));
mSettingsPn.add(mForegroundColorLb, cc.xy(4, currentRow));
mSettingsPn.add(programPanelForegroundColorChangeBtn, cc.xy(6, currentRow));
// Miscellaneous *********************************************
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("5dlu"));
layout.appendRow(RowSpec.decode("pref"));
layout.appendRow(RowSpec.decode("3dlu"));
layout.appendRow(RowSpec.decode("pref"));
mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(
mLocalizer.msg("mouse", "Mouse")), cc.xyw(1,
(currentRow += 2), 8));
mMouseOverCb = new JCheckBox(mLocalizer.msg("MouseOver", "Mouse-Over-Effect"));
mMouseOverCb.setSelected(Settings.propProgramTableMouseOver.getBoolean());
mSettingsPn.add(mMouseOverCb, cc.xy(2, (currentRow += 2)));
mMouseOverColorLb = new ColorLabel(Settings.propProgramTableMouseOverColor.getColor());
mMouseOverColorLb.setStandardColor(Settings.propProgramTableMouseOverColor.getDefaultColor());
final ColorButton mouseOverColorChangeBtn = new ColorButton(mMouseOverColorLb);
mMouseOverCb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean enabled = mMouseOverCb.isSelected();
mMouseOverColorLb.setEnabled(enabled);
mouseOverColorChangeBtn.setEnabled(enabled);
}
});
mMouseOverCb.getActionListeners()[0].actionPerformed(null);
mSettingsPn.add(mMouseOverColorLb, cc.xy(4, currentRow));
mSettingsPn.add(mouseOverColorChangeBtn, cc.xy(6, currentRow));
// auto scrolling
mAutoScrollCb = new JCheckBox(mLocalizer.msg("mouseAutoScroll",
"Throw'n scroll"));
mAutoScrollCb.setSelected(Settings.propProgramTableMouseAutoScroll
.getBoolean());
mSettingsPn.add(mAutoScrollCb, cc.xyw(2, (currentRow += 2), 6));
updateBackgroundStyleConfigureButton();
return mSettingsPn;
}
private void updateBackgroundStyleConfigureButton() {
TableBackgroundStyle style = (TableBackgroundStyle) mBackgroundStyleCB.getSelectedItem();
mConfigBackgroundStyleBt.setEnabled(style.hasContent());
}
public static JButton createBrowseButton(final Component parent, final JTextField tf) {
JButton bt = new JButton(mLocalizer.msg("change", "Change"));
bt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
File file = new File(tf.getText());
JFileChooser fileChooser = new JFileChooser(file.getParent());
String[] extArr = { ".jpg", ".jpeg", ".gif", ".png" };
fileChooser.setFileFilter(new util.ui.ExtensionFileFilter(extArr, ".jpg, .gif, png"));
if (fileChooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
File selection = fileChooser.getSelectedFile();
if (selection != null) {
tf.setText(selection.getAbsolutePath());
}
}
}
});
Dimension size = bt.getPreferredSize();
if (tf.getPreferredSize().height > size.height) {
size.height = tf.getPreferredSize().height;
bt.setPreferredSize(size);
}
return bt;
}
private void setBackgroundStyleForTimeBlockLayout() {
if(!Settings.propTableLayout.getString().equals(Settings.LAYOUT_TIME_BLOCK) &&
!Settings.propTableLayout.getString().equals(Settings.LAYOUT_COMPACT_TIME_BLOCK)) {
Settings.propTableBackgroundStyle.setString("timeBlock");
Settings.propTimeBlockBackground1.setString(Settings.propTimeBlockBackground1.getDefault());
Settings.propTimeBlockBackground2.setString(Settings.propTimeBlockBackground2.getDefault());
Settings.propTimeBlockShowWest.setBoolean(true);
Settings.propTimeBlockWestImage1.setString(Settings.propTimeBlockBackground1.getString());
Settings.propTimeBlockWestImage2.setString(Settings.propTimeBlockBackground2.getString());
}
}
private void resetBackgroundStyle() {
if(Settings.propTableLayout.getString().equals(Settings.LAYOUT_TIME_BLOCK) ||
Settings.propTableLayout.getString().equals(Settings.LAYOUT_COMPACT_TIME_BLOCK) ||
Settings.propTableLayout.getString().equals(Settings.LAYOUT_OPTIMIZED_COMPACT_TIME_BLOCK)) {
Settings.propTableBackgroundStyle.setString("timeBlock");
Settings.propTimeBlockBackground1.setString("imgs/columns_evening.jpg");
Settings.propTimeBlockBackground2.setString("imgs/columns_afternoon.jpg");
Settings.propTimeBlockShowWest.setBoolean(false);
Settings.propTimeBlockWestImage1.setString(Settings.propTimeBlockBackground1.getString());
Settings.propTimeBlockWestImage2.setString(Settings.propTimeBlockBackground2.getString());
}
}
/**
* Called by the host-application, if the user wants to save the settings.
*/
public void saveSettings() {
String backgroundStyle = ((TableBackgroundStyle) mBackgroundStyleCB.getSelectedItem()).getSettingsString();
Settings.propTableBackgroundStyle.setString(backgroundStyle);
if (mProgramArrangementCB.getSelectedIndex() == 2 && mLastSelectedLayoutIndex != 2) {
resetBackgroundStyle();
Settings.propTableLayout.setString(Settings.LAYOUT_COMPACT);
} else if (mProgramArrangementCB.getSelectedIndex() == 3 && mLastSelectedLayoutIndex != 3) {
resetBackgroundStyle();
Settings.propTableLayout.setString(Settings.LAYOUT_REAL_COMPACT);
} else if (mProgramArrangementCB.getSelectedIndex() == 0 && mLastSelectedLayoutIndex != 0) {
resetBackgroundStyle();
Settings.propTableLayout.setString(Settings.LAYOUT_TIME_SYNCHRONOUS);
} else if (mProgramArrangementCB.getSelectedIndex() == 4 && mLastSelectedLayoutIndex != 4) {
setBackgroundStyleForTimeBlockLayout();
Settings.propTableLayout.setString(Settings.LAYOUT_TIME_BLOCK);
} else if (mProgramArrangementCB.getSelectedIndex() == 5 && mLastSelectedLayoutIndex != 5) {
setBackgroundStyleForTimeBlockLayout();
Settings.propTableLayout.setString(Settings.LAYOUT_COMPACT_TIME_BLOCK);
} else if (mProgramArrangementCB.getSelectedIndex() == 6 && mLastSelectedLayoutIndex != 6) {
setBackgroundStyleForTimeBlockLayout();
Settings.propTableLayout.setString(Settings.LAYOUT_OPTIMIZED_COMPACT_TIME_BLOCK);
} else if (mProgramArrangementCB.getSelectedIndex() == 1 && mLastSelectedLayoutIndex != 1){
resetBackgroundStyle();
Settings.propTableLayout.setString(Settings.LAYOUT_REAL_SYNCHRONOUS);
}
Settings.propColumnWidth.setInt((Integer)mColWidth.getValue());
Settings.propProgramPanelForegroundColor.setColor(mForegroundColorLb.getColor());
Calendar cal = Calendar.getInstance();
cal.setTime((Date) mStartOfDayTimeSp.getValue());
int minutes = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
Settings.propProgramTableStartOfDay.setInt(minutes);
cal.setTime((Date) mEndOfDayTimeSp.getValue());
minutes = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
Settings.propProgramTableEndOfDay.setInt(minutes);
Settings.propProgramTableMouseOver.setBoolean(mMouseOverCb.isSelected());
Settings.propProgramTableMouseOverColor.setColor(mMouseOverColorLb.getColor());
Settings.propProgramTableCutTitle.setBoolean(mCutLongTitlesCB.isSelected());
Settings.propProgramTableCutTitleLines
.setInt((Integer) mCutLongTitlesSelection.getValue());
Settings.propProgramTableMouseAutoScroll.setBoolean(mAutoScrollCb
.isSelected());
Settings.propProgramPanelMaxLines.setInt((Integer) mDescriptionLines
.getValue());
Settings.propProgramPanelShortDurationActive.setBoolean(mShortProgramsCB
.isSelected());
Settings.propProgramPanelShortDurationMinutes
.setInt((Integer) mShortProgramsMinutes.getValue());
}
/**
* Returns the name of the tab-sheet.
*/
public Icon getIcon() {
return null;
}
/**
* Returns the title of the tab-sheet.
*/
public String getTitle() {
return mLocalizer.msg("title", "Program table");
}
private TableBackgroundStyle[] getTableBackgroundStyles() {
return new TableBackgroundStyle[] { new SingleColorBackgroundStyle(), new SingleImageBackgroundStyle(),
new TimeBlockBackgroundStyle(), new DayTimeBackgroundStyle() };
}
private static class ConfigureBackgroundStyleDialog {
private JDialog mDialog;
private TableBackgroundStyle mStyle;
public ConfigureBackgroundStyleDialog(Component parent, TableBackgroundStyle style) {
mStyle = style;
mDialog = UiUtilities.createDialog(parent, true);
mDialog.setTitle(mLocalizer.msg("configureBackgroundStyleDialogTitle", "Configure background style '{0}'", style
.getName()));
JPanel dialogContent = (JPanel) mDialog.getContentPane();
dialogContent.setBorder(new EmptyBorder(10, 10, 11, 11));
dialogContent.setLayout(new BorderLayout(0, 15));
JPanel content = new JPanel(new BorderLayout());
content.add(style.createSettingsContent(), BorderLayout.NORTH);
dialogContent.add(content, BorderLayout.CENTER);
JPanel buttonPn = new JPanel(new BorderLayout());
JPanel pn = new JPanel();
pn.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 0));
JButton okBtn = new JButton(Localizer.getLocalization(Localizer.I18N_OK));
JButton cancelBtn = new JButton(Localizer.getLocalization(Localizer.I18N_CANCEL));
pn.add(okBtn);
pn.add(cancelBtn);
okBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mStyle.storeSettings();
mDialog.setVisible(false);
}
});
cancelBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mDialog.setVisible(false);
}
});
buttonPn.add(pn, BorderLayout.EAST);
dialogContent.add(buttonPn, BorderLayout.SOUTH);
mDialog.pack();
}
public void show() {
UiUtilities.centerAndShow(mDialog);
}
}
private class TwoSpinnerDateModel extends SpinnerDateModel {
private JSpinner mMeSpinner;
protected void setMe(JSpinner me) {
mMeSpinner = me;
}
public void setValue(Object value) {
correctValues((Date)value);
super.setValue(value);
}
public Object getPreviousValue() {
Date d = (Date)super.getPreviousValue();
correctValues(d);
return d;
}
public Object getNextValue() {
Date d = (Date)super.getNextValue();
correctValues(d);
return d;
}
private void correctValues(Date d) {
if(mMeSpinner != null && mStartOfDayTimeSp != null && mEndOfDayTimeSp != null) {
Calendar cal = Calendar.getInstance();
int endTime, startTime;
if(mMeSpinner.equals(mStartOfDayTimeSp)) {
cal.setTime((Date)mEndOfDayTimeSp.getValue());
endTime = cal.get(Calendar.HOUR_OF_DAY) * 60
+ cal.get(Calendar.MINUTE);
cal.setTime(d);
startTime = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
if(endTime - startTime < -1) {
mEndOfDayTimeSp.setValue(d);
}
}
else {
cal.setTime(d);
endTime = cal.get(Calendar.HOUR_OF_DAY) * 60
+ cal.get(Calendar.MINUTE);
cal.setTime((Date)mStartOfDayTimeSp.getValue());
startTime = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
if(endTime - startTime < -1) {
mStartOfDayTimeSp.setValue(d);
}
}
}
}
}
}