// 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: BloggingPreferencesPanel.java,v 1.20 2008/02/15 15:36:59 spyromus Exp $ // package com.salas.bb.remixfeeds.prefs; import com.jgoodies.binding.adapter.BasicComponentFactory; import com.jgoodies.binding.beans.PropertyAdapter; import com.jgoodies.binding.value.ValueModel; import com.jgoodies.uif.util.ResourceUtils; import com.salas.bb.core.GlobalController; import com.salas.bb.core.actions.feed.FeedLinkPostToBlogAction; import com.salas.bb.remixfeeds.PostToBlogAction; import com.salas.bb.remixfeeds.api.WeblogAPIs; import com.salas.bb.utils.i18n.Strings; import com.salas.bb.utils.uif.BBFormBuilder; import com.salas.bb.utils.uif.ComponentsFactory; import com.salas.bb.utils.uif.UifUtilities; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.List; /** * Blogging preferences panel. */ public class BloggingPreferencesPanel extends JPanel { private final BloggingPreferences originalPrefs; private final BloggingPreferences prefs; private final BlogDetailsPreferencesPanel pnlBlogDetails; private JComboBox cbBlogs; private JButton btnAdd; private JButton btnDelete; private boolean ptbAdvanced; /** * Creates the panel. * * @param parent parent dialog. * @param trigger trigger. * @param preferences blogging preferences object to manipulate. */ public BloggingPreferencesPanel(JDialog parent, ValueModel trigger, BloggingPreferences preferences) { ptbAdvanced = GlobalController.SINGLETON.getFeatureManager().isPtbAdvanced(); originalPrefs = preferences; prefs = preferences.createClone(); trigger.addValueChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { Object newValue = evt.getNewValue(); if (Boolean.TRUE.equals(newValue)) { originalPrefs.copyFrom(prefs); PostToBlogAction.update(); FeedLinkPostToBlogAction.update(); } } }); Component tfWording = ComponentsFactory.createWrappedMultilineLabel(Strings.message("ptb.prefs.wording")); Dimension btnSize = new Dimension(21, 21); btnAdd = new JButton(new AddAction()); btnAdd.setPreferredSize(btnSize); btnDelete = new JButton(new DeleteAction()); btnDelete.setPreferredSize(btnSize); pnlBlogDetails = new BlogDetailsPreferencesPanel(parent); cbBlogs = new JComboBox(); cbBlogs.addItemListener(new BlogSelectionListener()); onBlogSelected(null); populateListAndSelect(prefs.getDefaultBlog()); // Layout BBFormBuilder builder = new BBFormBuilder("max(p;100dlu), 2dlu, p, 2dlu, p, 2dlu, p, 0:grow", this); builder.setDefaultDialogBorder(); builder.append(tfWording, 8); builder.appendUnrelatedComponentsGapRow(2); builder.append(buildPostTextEditorOptionsPanel(), 8); builder.appendUnrelatedComponentsGapRow(2); builder.append(cbBlogs, btnAdd); builder.append(btnDelete); builder.append(UifUtilities.makePublisherPlanIcon(!ptbAdvanced)); builder.appendUnrelatedComponentsGapRow(2); builder.append(pnlBlogDetails, 8); } private Component buildPostTextEditorOptionsPanel() { JLabel lbPostEditor = new JLabel(Strings.message("ptb.prefs.editor.label")); ValueModel orientMdl = new PropertyAdapter(new EditorModeFilter(), BloggingPreferences.PROP_RICH_EDITOR, true); JRadioButton rbRichEditor = BasicComponentFactory.createRadioButton(orientMdl, true, Strings.message("ptb.prefs.editor.rich")); rbRichEditor.setToolTipText(Strings.message("ptb.prefs.editor.rich.tt")); JRadioButton rbPlainEditor = BasicComponentFactory.createRadioButton(orientMdl, false, Strings.message("ptb.prefs.editor.plain")); rbPlainEditor.setToolTipText(Strings.message("ptb.prefs.editor.plain.tt")); lbPostEditor.setEnabled(ptbAdvanced); rbRichEditor.setEnabled(ptbAdvanced); rbPlainEditor.setEnabled(ptbAdvanced); BBFormBuilder builder = new BBFormBuilder("max(60dlu;p), 4dlu, p, 2dlu, p, 2dlu, p"); builder.append(lbPostEditor); builder.append(rbRichEditor); builder.append(rbPlainEditor); builder.append(UifUtilities.makePublisherPlanIcon(!ptbAdvanced)); return builder.getPanel(); } /** * Invoked when a targetBlog is selected in the list. * * @param targetBlog selected targetBlog or <code>NULL</code>. */ private void onBlogSelected(TargetBlog targetBlog) { btnDelete.setEnabled(targetBlog != null); if (!ptbAdvanced) btnAdd.setEnabled(targetBlog == null); pnlBlogDetails.setBlogPreferences(targetBlog); } /** * Populates blogs list with blogs. * * @param targetBlog targetBlog to select. */ private void populateListAndSelect(TargetBlog targetBlog) { List blogs = prefs.getBlogs(); if (blogs.size() > 0) { Object sel = targetBlog == null ? cbBlogs.getSelectedItem() : targetBlog; for (int i = 0; i < blogs.size(); i++) cbBlogs.addItem(blogs.get(i)); if (sel != null) cbBlogs.setSelectedItem(sel); } checkDropDownAndUpdateStatus(); } private void checkDropDownAndUpdateStatus() { if (cbBlogs.getItemCount() == 0) { cbBlogs.addItem(Strings.message("ptb.prefs.no.blogs")); cbBlogs.setEnabled(false); } else { cbBlogs.setEnabled(true); } } /** * Add new blog record action. */ private class AddAction extends AbstractAction { /** * Creates action. */ public AddAction() { super(null, ResourceUtils.getIcon("add.icon")); } /** * Invoked when the action is performed. * * @param e event. */ public void actionPerformed(ActionEvent e) { if (cbBlogs.getItemCount() == 1 && cbBlogs.getItemAt(0) instanceof String) { cbBlogs.removeAllItems(); cbBlogs.setEnabled(true); } TargetBlog targetBlog = new TargetBlog(); targetBlog.setTitle("Blog"); targetBlog.setApiType(WeblogAPIs.getDefaultWeblogAPI()); prefs.addBlog(targetBlog); cbBlogs.addItem(targetBlog); cbBlogs.setSelectedItem(targetBlog); } } /** * Deletes the selected blog record. */ private class DeleteAction extends AbstractAction { /** * Creates action. */ public DeleteAction() { super(null, ResourceUtils.getIcon("delete.icon")); } /** * Invoked when the action is performed. * * @param e event. */ public void actionPerformed(ActionEvent e) { TargetBlog targetBlog = (TargetBlog)cbBlogs.getSelectedItem(); if (targetBlog != null) { cbBlogs.removeItem(targetBlog); prefs.removeBlog(targetBlog); checkDropDownAndUpdateStatus(); } } } /** * The listener for blog selection change events. */ private class BlogSelectionListener implements ItemListener { /** * Invoked when another blog is selected in the drop-down menu. * * @param e event. */ public void itemStateChanged(ItemEvent e) { Object sel = cbBlogs.getSelectedItem(); TargetBlog targetBlog = sel instanceof TargetBlog ? (TargetBlog)sel : null; prefs.setDefaultBlog(targetBlog); onBlogSelected(targetBlog); } } public class EditorModeFilter { private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); public boolean isRichEditor() { return !ptbAdvanced || prefs.isRichEditor(); } public void setRichEditor(boolean rich) { boolean old = prefs.isRichEditor(); prefs.setRichEditor(rich); pcs.firePropertyChange(BloggingPreferences.PROP_RICH_EDITOR, old, rich); } public void addPropertyChangeListener(PropertyChangeListener l) { pcs.addPropertyChangeListener(l); } public void removePropertyChangeListener(PropertyChangeListener l) { pcs.removePropertyChangeListener(l); } } }