// 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: ViewModePreferences.java,v 1.11 2008/02/28 15:59:52 spyromus Exp $ // package com.salas.bb.domain.prefs; import com.salas.bb.utils.StringUtils; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; import java.util.prefs.Preferences; /** * View mode preferences collection. */ public final class ViewModePreferences { /** Categories visibility property name. */ public static final String CATEGORIES_VISIBLE = "categoriesVisible"; /** Author visibility property name. */ public static final String AUTHOR_VISIBLE = "authorVisible"; /** Date visibility property name. */ public static final String DATE_VISIBLE = "dateVisible"; /** Time visibility property name. */ public static final String TIME_VISIBLE = "timeVisible"; /** Pin visibility property name. */ public static final String PIN_VISIBLE = "pinVisible"; /** URL visibility property name. */ public static final String URL_VISIBLE = "urlVisible"; /** Color code property name. */ public static final String COLOR_CODE_VISIBLE = "colorCodeVisible"; /** The list of listeners. */ private final List<IViewModePreferencesChangeListener> listeners; /** List of enableness flags of the author field for all view modes. */ private final boolean[] author; /** List of enableness flags of the categories field for all view modes. */ private final boolean[] categories; /** List of enableness flags of the date field for all view modes. */ private final boolean[] date; /** The state of time field for all view modes. */ private final boolean[] time; /** List of enableness flags of the pin field for all view modes. */ private final boolean[] pin; /** List of enableness flags of the article URL field for all view modes. */ private final boolean[] url; /** List of flags for the color code. */ private final boolean[] colorCode; /** * Creates preferences. */ public ViewModePreferences() { listeners = new CopyOnWriteArrayList<IViewModePreferencesChangeListener>(); author = new boolean[] { false, true, true }; categories = new boolean[] { false, false, true}; date = new boolean[] { true, true, true }; time = new boolean[] { false, false, true }; pin = new boolean[] { true, true, true }; colorCode = new boolean[] { true, true, true }; url = new boolean[] { false, false, false }; } /** * Returns <code>TRUE</code> if author should be visible. * * @param mode view mode. * * @return <code>TRUE</code> if author should be visible. */ public boolean isAuthorVisible(int mode) { return author[mode]; } /** * Sets the flag of author visibility assigned to some mode. * * @param mode mode. * @param flag flag. */ public void setAuthorVisible(int mode, boolean flag) { boolean oldValue = author[mode]; author[mode] = flag; if (oldValue != flag) fireModeChanged(mode); } /** * Returns <code>TRUE</code> if categories should be visible. * * @param mode view mode. * * @return <code>TRUE</code> if categories should be visible. */ public boolean isCategoriesVisible(int mode) { return categories[mode]; } /** * Sets the flag of categories visibility assigned to some mode. * * @param mode mode. * @param flag flag. */ public void setCategoriesVisible(int mode, boolean flag) { boolean oldValue = categories[mode]; categories[mode] = flag; if (oldValue != flag) fireModeChanged(mode); } /** * Returns <code>TRUE</code> if URL should be visible. * * @param mode view mode. * * @return <code>TRUE</code> if URL should be visible. */ public boolean isUrlVisible(int mode) { return url[mode]; } /** * Sets the flag of URL visibility assigned to some mode. * * @param mode mode. * @param flag flag. */ public void setUrlVisible(int mode, boolean flag) { boolean oldValue = url[mode]; url[mode] = flag; if (oldValue != flag) fireModeChanged(mode); } /** * Returns <code>TRUE</code> if date should be visible. * * @param mode view mode. * * @return <code>TRUE</code> if date should be visible. */ public boolean isDateVisible(int mode) { return date[mode]; } /** * Sets the date visibility flag. * * @param mode mode. * @param flag flag. */ public void setDateVisible(int mode, boolean flag) { boolean oldValue = date[mode]; date[mode] = flag; if (oldValue != flag) fireModeChanged(mode); } /** * Returns <code>TRUE</code> if time should be visible. * * @param mode view mode. * * @return <code>TRUE</code> if time should be visible. */ public boolean isTimeVisible(int mode) { return time[mode]; } /** * Sets the time visibility flag. * * @param mode mode. * @param flag flag. */ public void setTimeVisible(int mode, boolean flag) { boolean oldValue = time[mode]; time[mode] = flag; if (oldValue != flag) fireModeChanged(mode); } /** * Returns <code>TRUE</code> if pin should be visible. * * @param mode view mode. * * @return <code>TRUE</code> if pin should be visible. */ public boolean isPinVisible(int mode) { return pin[mode]; } /** * Sets the pin visibility flag. * * @param mode mode. * @param flag flag. */ public void setPinVisible(int mode, boolean flag) { boolean oldValue = pin[mode]; pin[mode] = flag; if (oldValue != flag) fireModeChanged(mode); } /** * Returns <code>TRUE</code> if color code should be visible. * * @param mode view mode. * * @return <code>TRUE</code> if color code should be visible. */ public boolean isColorCodeVisible(int mode) { return colorCode[mode]; } /** * Sets the color code visibility flag. * * @param mode mode. * @param flag flag. */ public void setColorCodeVisible(int mode, boolean flag) { boolean oldValue = colorCode[mode]; colorCode[mode] = flag; if (oldValue != flag) fireModeChanged(mode); } /** * Restores preferences from the storage. * * @param prefs preferences storage. */ public void restore(Preferences prefs) { restore(prefs, AUTHOR_VISIBLE, author); restore(prefs, CATEGORIES_VISIBLE, categories); restore(prefs, DATE_VISIBLE, date); restore(prefs, TIME_VISIBLE, time); restore(prefs, PIN_VISIBLE, pin); restore(prefs, URL_VISIBLE, url); restore(prefs, COLOR_CODE_VISIBLE, colorCode); } /** * Takes the property from preferences and analyzes it. The property should be * 3 characters corresponding to three modes. When the character is '1' it means * that the field is enabled. * * @param prefs preferences storage. * @param property property name. * @param field field mode list. */ private void restore(Preferences prefs, String property, boolean[] field) { String value = prefs.get(property, null); if (value != null && value.length() == 3) { for (int i = 0; i < 3; i++) field[i] = value.charAt(i) == '1'; } } /** * Stores modes to the preferences storage. * * @param prefs preference storage. */ public void store(Preferences prefs) { store(prefs, AUTHOR_VISIBLE, author); store(prefs, CATEGORIES_VISIBLE, categories); store(prefs, DATE_VISIBLE, date); store(prefs, TIME_VISIBLE, time); store(prefs, PIN_VISIBLE, pin); store(prefs, URL_VISIBLE, url); store(prefs, COLOR_CODE_VISIBLE, colorCode); } /** * Stores single field to modes map into preferences storage. * * @param prefs preferences storage. * @param property property name. * @param field field mode list. */ private void store(Preferences prefs, String property, boolean[] field) { StringBuffer buf = new StringBuffer(3); for (boolean f : field) buf.append(f ? 1 : 0); prefs.put(property, buf.toString()); } /** * Restores preferences from the storage. * * @param prefs preferences storage. */ public void restore(Map prefs) { restore(prefs, AUTHOR_VISIBLE, author); restore(prefs, CATEGORIES_VISIBLE, categories); restore(prefs, DATE_VISIBLE, date); restore(prefs, TIME_VISIBLE, time); restore(prefs, PIN_VISIBLE, pin); restore(prefs, URL_VISIBLE, url); restore(prefs, COLOR_CODE_VISIBLE, colorCode); } /** * Takes the property from preferences and analyzes it. The property should be * 3 characters corresponding to three modes. When the character is '1' it means * that the field is enabled. * * @param prefs preferences storage. * @param property property name. * @param field field mode list. */ private void restore(Map prefs, String property, boolean[] field) { byte[] bytes = (byte[])prefs.get(property); String value = bytes == null ? null : StringUtils.fromUTF8(bytes); if (value != null && value.length() == 3) { for (int i = 0; i < 3; i++) field[i] = value.charAt(i) == '1'; } } /** * Stores modes to the preferences storage. * * @param prefs preference storage. */ public void store(Map prefs) { store(prefs, AUTHOR_VISIBLE, author); store(prefs, CATEGORIES_VISIBLE, categories); store(prefs, DATE_VISIBLE, date); store(prefs, TIME_VISIBLE, time); store(prefs, PIN_VISIBLE, pin); store(prefs, URL_VISIBLE, url); store(prefs, COLOR_CODE_VISIBLE, colorCode); } /** * Stores single field to modes map into preferences storage. * * @param prefs preferences storage. * @param property property name. * @param field field mode list. */ private void store(Map prefs, String property, boolean[] field) { StringBuffer buf = new StringBuffer(3); for (boolean f : field) buf.append(f ? 1 : 0); prefs.put(property, StringUtils.toUTF8(buf.toString())); } // --------------------------------------------------------------------------------------------- /** * View mode preferences bean. */ public static class ViewModeBean { /** Preference to wrap with a bean. */ private final ViewModePreferences prefs; /** The mode we are adjusting. */ private final int mode; /** * Creates bean for mode preferences manipulation. * * @param aPrefs prefs. * @param aMode mode. */ public ViewModeBean(ViewModePreferences aPrefs, int aMode) { prefs = aPrefs; mode = aMode; } /** * Returns <code>TRUE</code> if author should be visible. * * @return <code>TRUE</code> if author should be visible. */ public boolean isAuthorVisible() { return prefs.isAuthorVisible(mode); } /** * Sets the flag of author visibility assigned to some mode. * * @param flag flag. */ public void setAuthorVisible(boolean flag) { prefs.setAuthorVisible(mode, flag); } /** * Returns <code>TRUE</code> if categories should be visible. * * @return <code>TRUE</code> if categories should be visible. */ public boolean isCategoriesVisible() { return prefs.isCategoriesVisible(mode); } /** * Sets the flag of categories visibility assigned to some mode. * * @param flag flag. */ public void setCategoriesVisible(boolean flag) { prefs.setCategoriesVisible(mode, flag); } /** * Returns <code>TRUE</code> if URLs should be visible. * * @return <code>TRUE</code> if URLs should be visible. */ public boolean isUrlVisible() { return prefs.isUrlVisible(mode); } /** * Sets the flag of URLs visibility assigned to some mode. * * @param flag flag. */ public void setUrlVisible(boolean flag) { prefs.setUrlVisible(mode, flag); } /** * Returns <code>TRUE</code> if date should be visible. * * @return <code>TRUE</code> if date should be visible. */ public boolean isDateVisible() { return prefs.isDateVisible(mode); } /** * Sets the date visibility flag. * * @param flag flag. */ public void setDateVisible(boolean flag) { prefs.setDateVisible(mode, flag); } /** * Returns <code>TRUE</code> if time should be visible. * * @return <code>TRUE</code> if time should be visible. */ public boolean isTimeVisible() { return prefs.isTimeVisible(mode); } /** * Sets the time visibility flag. * * @param flag flag. */ public void setTimeVisible(boolean flag) { prefs.setTimeVisible(mode, flag); } /** * Returns <code>TRUE</code> if pin should be visible. * * @return <code>TRUE</code> if pin should be visible. */ public boolean isPinVisible() { return prefs.isPinVisible(mode); } /** * Sets the pin visibility flag. * * @param flag flag. */ public void setPinVisible(boolean flag) { prefs.setPinVisible(mode, flag); } /** * Returns <code>TRUE</code> if color code should be visible. * * @return <code>TRUE</code> if color code should be visible. */ public boolean isColorCodeVisible() { return prefs.isColorCodeVisible(mode); } /** * Sets the color code visibility flag. * * @param flag flag. */ public void setColorCodeVisible(boolean flag) { prefs.setColorCodeVisible(mode, flag); } } // --------------------------------------------------------------------------------------------- /** * Adds listener. * * @param l listener. */ public void addListener(IViewModePreferencesChangeListener l) { listeners.add(l); } /** * Removes listener. * * @param l listener. */ public void removeListener(IViewModePreferencesChangeListener l) { listeners.remove(l); } /** * Fires view mode change event. * * @param mode mode. */ private void fireModeChanged(int mode) { for (IViewModePreferencesChangeListener listener : listeners) { listener.viewModeChanged(mode); } } }