/**
* Distribution License:
* JSword is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License, version 2.1 as published by
* the Free Software Foundation. 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 Lesser General Public License for more details.
*
* The License is available on the internet at:
* http://www.gnu.org/copyleft/lgpl.html
* or by writing to:
* Free Software Foundation, Inc.
* 59 Temple Place - Suite 330
* Boston, MA 02111-1307, USA
*
* Copyright: 2005
* The copyright to this program is held by it's authors.
*
* ID: $Id$
*/
package org.crosswire.jsword.book;
import java.util.Map;
import java.util.TreeMap;
import org.crosswire.common.config.ChoiceFactory;
/**
* Handles the current default Books.
*
* @see gnu.lgpl.License for license details.
* The copyright to this program is held by it's authors.
* @author Joe Walker [joe at eireneh dot com]
*/
public final class Defaults {
/**
* Prevent construction
*/
private Defaults() {
}
/**
* Determine whether the getBible should return the current Bible or the
* user's chosen default.
*
* @return true if the bible tracks the user's selection
*/
public static boolean isCurrentBible() {
return trackBible;
}
/**
* Establish whether the getBible should return the current Bible or the
* user's chosen default.
*
* @param current
*/
public static void setCurrentBible(boolean current) {
trackBible = current;
}
/**
* If the user has chosen to remember the book (by type) then set the
* current book for that type.
*
* @param book
*/
public static void setCurrentBook(Book book) {
BookCategory type = book.getBookCategory();
if (type.equals(BookCategory.BIBLE) && isCurrentBible()) {
currentBible = book;
}
}
public static Book getCurrentBible() {
if (currentBible == null) {
return bibleDeft.getDefault();
}
return currentBible;
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setBible(Book book) {
bibleDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetBible() {
bibleDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getBible() {
return bibleDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getBibleByName() {
return bibleDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setBibleByName(String name) {
bibleDeft.setDefaultByName(name);
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setCommentary(Book book) {
commentaryDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetCommentary() {
commentaryDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getCommentary() {
return commentaryDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getCommentaryByName() {
return commentaryDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setCommentaryByName(String name) {
commentaryDeft.setDefaultByName(name);
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setDictionary(Book book) {
dictionaryDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetDictionary() {
dictionaryDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getDictionary() {
return dictionaryDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getDictionaryByName() {
return dictionaryDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setDictionaryByName(String name) {
dictionaryDeft.setDefaultByName(name);
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setDailyDevotional(Book book) {
dictionaryDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetDailyDevotional() {
dailyDevotionalDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getDailyDevotional() {
return dailyDevotionalDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getDailyDevotionalByName() {
return dailyDevotionalDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setDailyDevotionalByName(String name) {
dailyDevotionalDeft.setDefaultByName(name);
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setGreekDefinitions(Book book) {
greekDefinitionsDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetGreekDefinitions() {
greekDefinitionsDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getGreekDefinitions() {
return greekDefinitionsDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getGreekDefinitionsByName() {
return greekDefinitionsDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setGreekDefinitionsByName(String name) {
greekDefinitionsDeft.setDefaultByName(name);
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setHebrewDefinitions(Book book) {
hebrewDefinitionsDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetHebrewDefinitions() {
hebrewDefinitionsDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getHebrewDefinitions() {
return hebrewDefinitionsDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getHebrewDefinitionsByName() {
return hebrewDefinitionsDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setHebrewDefinitionsByName(String name) {
hebrewDefinitionsDeft.setDefaultByName(name);
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setGreekParse(Book book) {
greekParseDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetGreekParse() {
greekParseDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getGreekParse() {
return greekParseDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getGreekParseByName() {
return greekParseDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setGreekParseByName(String name) {
greekParseDeft.setDefaultByName(name);
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefault(org.crosswire.jsword
* .book.Book)
*/
public static void setHebrewParse(Book book) {
hebrewParseDeft.setDefault(book);
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#unsetDefault()
*/
protected static void unsetHebrewParse() {
hebrewParseDeft.unsetDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefault()
*/
public static Book getHebrewParse() {
return hebrewParseDeft.getDefault();
}
/*
* (non-Javadoc)
*
* @see org.crosswire.jsword.book.DefaultBook#getDefaultName()
*/
public static String getHebrewParseByName() {
return hebrewParseDeft.getDefaultName();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.DefaultBook#setDefaultByName(java.lang.String)
*/
public static void setHebrewParseByName(String name) {
hebrewParseDeft.setDefaultByName(name);
}
protected static DefaultBook getDefaultBible() {
return bibleDeft;
}
protected static DefaultBook getDefaultCommentary() {
return commentaryDeft;
}
protected static DefaultBook getDefaultDictionary() {
return dictionaryDeft;
}
protected static DefaultBook getDefaultDailyDevotional() {
return dailyDevotionalDeft;
}
protected static DefaultBook getDefaultGreekDefinitions() {
return greekDefinitionsDeft;
}
protected static DefaultBook getDefaultHebrewDefinitions() {
return hebrewDefinitionsDeft;
}
protected static DefaultBook getDefaultGreekParse() {
return greekParseDeft;
}
protected static DefaultBook getDefaultHebrewParse() {
return hebrewParseDeft;
}
/**
* Create book lists for every type of book.
*/
public static void refreshBooks() {
// Create the array of Bibles
Map bnames = getBookMap(BookFilters.getOnlyBibles());
ChoiceFactory.getDataMap().put(BIBLE_KEY, bnames);
// Create the array of Commentaries
Map cnames = getBookMap(BookFilters.getCommentaries());
ChoiceFactory.getDataMap().put(COMMENTARY_KEY, cnames);
// Create the array of Dictionaries
Map dnames = getBookMap(BookFilters.getDictionaries());
ChoiceFactory.getDataMap().put(DICTIONARY_KEY, dnames);
// Create the array of DailyDevotionals
Map rnames = getBookMap(BookFilters.getDailyDevotionals());
ChoiceFactory.getDataMap().put(DAILY_DEVOTIONALS_KEY, rnames);
// Create the array of Dictionaries
Map greekDef = getBookMap(BookFilters.getGreekDefinitions());
ChoiceFactory.getDataMap().put(GREEKDEF_KEY, greekDef);
// Create the array of Dictionaries
Map hebrewDef = getBookMap(BookFilters.getHebrewDefinitions());
ChoiceFactory.getDataMap().put(HEBREWDEF_KEY, hebrewDef);
// Create the array of Dictionaries
Map greekParse = getBookMap(BookFilters.getGreekParse());
ChoiceFactory.getDataMap().put(GREEKPARSE_KEY, greekParse);
// Create the array of Dictionaries
Map hebrewParse = getBookMap(BookFilters.getHebrewParse());
ChoiceFactory.getDataMap().put(HEBREWPARSE_KEY, hebrewParse);
}
/**
* Go through all of the current books checking to see if we need to replace
* the current defaults with one of these.
*/
protected static void checkAllPreferable() {
for (Book book : Books.installed().getBooks()) {
checkPreferable(book);
}
}
/**
* Determine whether this Book become the default. It should, only if there
* is not one.
*/
protected static void checkPreferable(Book book) {
assert book != null;
bibleDeft.setDefaultConditionally(book);
commentaryDeft.setDefaultConditionally(book);
dictionaryDeft.setDefaultConditionally(book);
dailyDevotionalDeft.setDefaultConditionally(book);
greekDefinitionsDeft.setDefaultConditionally(book);
greekParseDeft.setDefaultConditionally(book);
hebrewDefinitionsDeft.setDefaultConditionally(book);
hebrewParseDeft.setDefaultConditionally(book);
}
/**
* Convert a filter into an array of names of Books that pass the filter.
*/
private static Map getBookMap(BookFilter filter) {
Map books = new TreeMap(BookComparators.getDefault());
for (Book book : Books.installed().getBooks(filter)) {
books.put(book, book.getName());
}
return books;
}
/**
* To keep us up to date with changes in the available Books
*/
static class DefaultsBookListener implements BooksListener {
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.BooksListener#bookAdded(org.crosswire.jsword
* .book.BooksEvent)
*/
public void bookAdded(BooksEvent ev) {
Book book = ev.getBook();
checkPreferable(book);
refreshBooks();
}
/*
* (non-Javadoc)
*
* @see
* org.crosswire.jsword.book.BooksListener#bookRemoved(org.crosswire
* .jsword.book.BooksEvent)
*/
public void bookRemoved(BooksEvent ev) {
Book book = ev.getBook();
getDefaultBible().unsetDefaultConditionally(book);
getDefaultCommentary().unsetDefaultConditionally(book);
getDefaultDailyDevotional().unsetDefaultConditionally(book);
getDefaultDictionary().unsetDefaultConditionally(book);
getDefaultGreekDefinitions().unsetDefaultConditionally(book);
getDefaultGreekParse().unsetDefaultConditionally(book);
getDefaultHebrewDefinitions().unsetDefaultConditionally(book);
getDefaultHebrewParse().unsetDefaultConditionally(book);
}
}
private static final String BIBLE_KEY = "bible-names";
private static final String COMMENTARY_KEY = "commentary-names";
private static final String DICTIONARY_KEY = "dictionary-names";
private static final String DAILY_DEVOTIONALS_KEY = "daily-devotional-names";
private static final String GREEKDEF_KEY = "greekdef-names";
private static final String HEBREWDEF_KEY = "hebrewdef-names";
private static final String GREEKPARSE_KEY = "greekparse-names";
private static final String HEBREWPARSE_KEY = "hebrewparse-names";
/**
* Indicates whether the last book of each type is used next time.
*/
private static boolean trackBible = true;
/**
* The current bible being tracked.
*/
private static Book currentBible;
/**
* The default Bible
*/
private static DefaultBook bibleDeft = new DefaultBook(Books.installed(), BookFilters.getOnlyBibles());
/**
* The default Commentary
*/
private static DefaultBook commentaryDeft = new DefaultBook(Books.installed(), BookFilters.getCommentaries());
/**
* The default DailyDevotional
*/
private static DefaultBook dailyDevotionalDeft = new DefaultBook(Books.installed(), BookFilters.getDailyDevotionals());
/**
* The default Dictionary
*/
private static DefaultBook dictionaryDeft = new DefaultBook(Books.installed(), BookFilters.getDictionaries());
/**
* The default Greek Parse Dictinary.
*/
private static DefaultBook greekParseDeft = new DefaultBook(Books.installed(), BookFilters.getGreekParse());
/**
* The default Hebrew Parse Dictinary.
*/
private static DefaultBook hebrewParseDeft = new DefaultBook(Books.installed(), BookFilters.getHebrewParse());
/**
* The default Greek Definitions Dictinary.
*/
private static DefaultBook greekDefinitionsDeft = new DefaultBook(Books.installed(), BookFilters.getGreekDefinitions());
/**
* The default Hebrew Definitions Dictionary.
*/
private static DefaultBook hebrewDefinitionsDeft = new DefaultBook(Books.installed(), BookFilters.getHebrewDefinitions());
/**
* Register with Books so we know how to provide valid defaults
*/
static {
Books.installed().addBooksListener(new DefaultsBookListener());
checkAllPreferable();
}
}