// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// 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
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: ReadingListsPanel.java,v 1.7 2006/06/13 08:13:44 spyromus Exp $
//
package com.salas.bb.dialogs;
import com.salas.bb.utils.uif.ComponentsFactory;
import com.salas.bb.utils.uif.BBFormBuilder;
import com.salas.bb.utils.uif.MandatoryCheckBoxController;
import com.salas.bb.utils.i18n.Strings;
import com.salas.bb.domain.prefs.UserPreferences;
import com.salas.bb.domain.ReadingList;
import com.jgoodies.binding.value.ValueModel;
import com.jgoodies.binding.value.BufferedValueModel;
import com.jgoodies.binding.beans.PropertyAdapter;
import com.jgoodies.binding.adapter.ToggleButtonAdapter;
import com.jgoodies.binding.adapter.RadioButtonAdapter;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
/**
* Panel with reading lists settings.
*/
public class ReadingListsPanel extends JPanel
{
private static final String PERIOD_ONCE_PER_RUN = Strings.message("period.run");
private static final String PERIOD_DAILY = Strings.message("period.day");
private static final String PERIOD_HOURLY = Strings.message("period.hour");
private final UserPreferences prefs;
private final ValueModel triggerChannel;
private JRadioButton rbUpdateManually;
private JRadioButton rbUpdatePeriodically;
private JRadioButton rbChangeSilently;
private JRadioButton rbChangeWithNotification;
private JRadioButton rbChangeWithConfirmation;
private JCheckBox chUpdateFeeds;
private JCheckBox chUpdateReadingLists;
private JComboBox cbUpdatePeriod;
/**
* Creates panel.
*
* @param aUserPreferences user preferences object.
* @param aTriggerChannel trigger channel.
*/
public ReadingListsPanel(UserPreferences aUserPreferences, ValueModel aTriggerChannel)
{
prefs = aUserPreferences;
triggerChannel = aTriggerChannel;
initComponents();
layoutComponents();
}
/** Lays out components. */
private void layoutComponents()
{
JComponent wording = ComponentsFactory.createWrappedMultilineLabel(
Strings.message("userprefs.tab.readinglists.wording"));
BBFormBuilder builder = new BBFormBuilder("7dlu, p, 4dlu, p, 0:grow", this);
builder.setDefaultDialogBorder();
builder.append(wording, 5);
builder.appendUnrelatedComponentsGapRow(2);
builder.appendSeparator(Strings.message("userprefs.tab.readinglists.updates"));
builder.setLeadingColumnOffset(1);
builder.append(rbUpdateManually, 4);
builder.append(rbUpdatePeriodically, cbUpdatePeriod);
builder.setLeadingColumnOffset(0);
builder.appendSeparator(Strings.message("userprefs.tab.readinglists.command"));
builder.setLeadingColumnOffset(1);
builder.append(chUpdateFeeds, 4);
builder.append(chUpdateReadingLists, 4);
builder.setLeadingColumnOffset(0);
builder.appendSeparator(Strings.message("userprefs.tab.readinglists.action"));
builder.setLeadingColumnOffset(1);
builder.append(rbChangeSilently, 4);
builder.append(rbChangeWithNotification, 4);
builder.append(rbChangeWithConfirmation, 4);
}
/** Initializes components. */
private void initComponents()
{
// Updating
rbUpdateManually = ComponentsFactory.createRadioButton(
Strings.message("userprefs.tab.readinglists.updates.manual"));
rbUpdatePeriodically = ComponentsFactory.createRadioButton(
Strings.message("userprefs.tab.readinglists.updates.periodical"));
cbUpdatePeriod = new JComboBox(new Object[]
{
PERIOD_ONCE_PER_RUN, PERIOD_DAILY, PERIOD_HOURLY
});
ButtonGroup g1 = new ButtonGroup();
g1.add(rbUpdateManually);
g1.add(rbUpdatePeriodically);
setUpdatePeriodState();
PeriodMonitor monitor = new PeriodMonitor(new BufferedValueModel(
new PropertyAdapter(prefs, UserPreferences.PROP_READING_LIST_UPDATE_PERIOD),
triggerChannel));
rbUpdateManually.addChangeListener(monitor);
rbUpdatePeriodically.addChangeListener(monitor);
cbUpdatePeriod.addItemListener(monitor);
ValueModel updatesModel = new BufferedValueModel(
new PropertyAdapter(prefs, UserPreferences.PROP_ON_READING_LIST_UPDATE_ACTIONS),
triggerChannel);
// Applying changes
rbChangeSilently = ComponentsFactory.createRadioButton(
Strings.message("userprefs.tab.readinglists.action.accept.silently"),
new RadioButtonAdapter(updatesModel,
new Integer(UserPreferences.RL_UPDATE_NONE)));
rbChangeWithNotification = ComponentsFactory.createRadioButton(
Strings.message("userprefs.tab.readinglists.action.notify"),
new RadioButtonAdapter(updatesModel,
new Integer(UserPreferences.RL_UPDATE_NOTIFY)));
rbChangeWithConfirmation = ComponentsFactory.createRadioButton(
Strings.message("userprefs.tab.readinglists.action.confirm"),
new RadioButtonAdapter(updatesModel,
new Integer(UserPreferences.RL_UPDATE_CONFIRM)));
// Get Latest command actions
chUpdateFeeds = ComponentsFactory.createCheckBox(
Strings.message("userprefs.tab.readinglists.command.latest.articles"),
new ToggleButtonAdapter(new BufferedValueModel(new PropertyAdapter(prefs,
UserPreferences.PROP_UPDATE_FEEDS), triggerChannel)));
chUpdateReadingLists = ComponentsFactory.createCheckBox(
Strings.message("userprefs.tab.readinglists.command.lists.changes"),
new ToggleButtonAdapter(new BufferedValueModel(new PropertyAdapter(prefs,
UserPreferences.PROP_UPDATE_READING_LISTS), triggerChannel)));
new MandatoryCheckBoxController(chUpdateFeeds, chUpdateReadingLists);
}
/**
* Sets initial update period state.
*/
private void setUpdatePeriodState()
{
long period = prefs.getReadingListUpdatePeriod();
if (period == ReadingList.PERIOD_NEVER)
{
rbUpdateManually.setSelected(true);
cbUpdatePeriod.setEnabled(false);
} else
{
rbUpdatePeriodically.setSelected(true);
cbUpdatePeriod.setEnabled(true);
Object select;
if (period == ReadingList.PERIOD_ONCE_PER_RUN)
{
select = PERIOD_ONCE_PER_RUN;
} else if (period == ReadingList.PERIOD_DAILY)
{
select = PERIOD_DAILY;
} else
{
select = PERIOD_HOURLY;
}
cbUpdatePeriod.setSelectedItem(select);
}
}
/**
* Monitors the changes in period settings and updates given property.
*/
private class PeriodMonitor implements ChangeListener, ItemListener
{
private final ValueModel property;
private boolean manual;
private Object selectedPeriod;
/**
* Creates monitor for updating given property.
*
* @param aProperty property.
*/
public PeriodMonitor(ValueModel aProperty)
{
property = aProperty;
manual = rbUpdateManually.isSelected();
selectedPeriod = cbUpdatePeriod.getSelectedItem();
}
/**
* Invoked when the target of the listener has changed its state.
*
* @param e a ChangeEvent object
*/
public void stateChanged(ChangeEvent e)
{
manual = rbUpdateManually.isSelected();
updateProperty();
cbUpdatePeriod.setEnabled(!manual);
}
/**
* Invoked when an item has been selected or deselected by the user. The code written for this
* method performs the operations that need to occur when an item is selected (or deselected).
*/
public void itemStateChanged(ItemEvent e)
{
selectedPeriod = cbUpdatePeriod.getSelectedItem();
updateProperty();
rbUpdatePeriodically.setSelected(true);
}
/** Updates property value. */
private void updateProperty()
{
long period = ReadingList.PERIOD_NEVER;
if (!manual)
{
period = selectedPeriod == PERIOD_ONCE_PER_RUN
? ReadingList.PERIOD_ONCE_PER_RUN
: selectedPeriod == PERIOD_DAILY
? ReadingList.PERIOD_DAILY
: ReadingList.PERIOD_HOURLY;
}
property.setValue(new Long(period));
}
}
}