// PreferencesDataElementChooser
package org.javamoney.examples.ez.money.gui.dialog.preferences;
import static javax.swing.tree.TreeSelectionModel.SINGLE_TREE_SELECTION;
import static org.javamoney.examples.ez.money.gui.GUIConstants.CELL_HEIGHT;
import static org.javamoney.examples.ez.money.gui.GUIConstants.COLOR_BACKGROUND_FILL;
import static org.javamoney.examples.ez.money.gui.GUIConstants.COLOR_SELECTION_BACKGROUND;
import static org.javamoney.examples.ez.money.gui.GUIConstants.COLOR_SELECTION_BORDER;
import static org.javamoney.examples.ez.money.gui.GUIConstants.COLOR_SELECTION_TEXT;
import static org.javamoney.examples.ez.money.gui.dialog.preferences.PreferencesKeys.ACCOUNTS;
import static org.javamoney.examples.ez.money.gui.dialog.preferences.PreferencesKeys.EXPENSES;
import static org.javamoney.examples.ez.money.gui.dialog.preferences.PreferencesKeys.INCOME;
import static org.javamoney.examples.ez.money.gui.dialog.preferences.PreferencesKeys.PAYEES;
import static org.javamoney.examples.ez.money.gui.dialog.preferences.PreferencesKeys.REMINDERS;
import static org.javamoney.examples.ez.money.model.DataManager.getAccounts;
import static org.javamoney.examples.ez.money.model.DataManager.getExpenses;
import static org.javamoney.examples.ez.money.model.DataManager.getIncome;
import static org.javamoney.examples.ez.money.model.DataManager.getPayees;
import static org.javamoney.examples.ez.money.model.DataManager.getReminders;
import java.util.Collection;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import org.javamoney.examples.ez.money.model.DataCollection;
import org.javamoney.examples.ez.money.model.DataElement;
import org.javamoney.examples.ez.money.model.persisted.category.Category;
/**
* This class facilitates choosing a element from a tree for the preferences
* panels.
*/
final
class
PreferencesDataElementChooser
extends JTree
{
/**
* Constructs a new chooser for the specified preferences panel.
*/
protected
PreferencesDataElementChooser(PreferencesKeys key)
{
setKey(key);
// Customize look.
getTreeCellRenderer().setBackgroundNonSelectionColor(COLOR_BACKGROUND_FILL);
getTreeCellRenderer().setBackgroundSelectionColor(COLOR_SELECTION_BACKGROUND);
getTreeCellRenderer().setBorderSelectionColor(COLOR_SELECTION_BORDER);
getTreeCellRenderer().setTextSelectionColor(COLOR_SELECTION_TEXT);
getTreeCellRenderer().setClosedIcon(null);
getTreeCellRenderer().setLeafIcon(null);
getTreeCellRenderer().setOpenIcon(null);
getSelectionModel().setSelectionMode(SINGLE_TREE_SELECTION);
setBackground(COLOR_BACKGROUND_FILL);
setRootVisible(false);
setRowHeight(CELL_HEIGHT);
setShowsRootHandles(true);
// Initially display all the elements and select the first one.
displayCollectables();
selectFirst();
}
/**
* This method puts all the elements for its preferences panel into its
* chooser.
*/
protected
void
displayCollectables()
{
DefaultMutableTreeNode root = new DefaultMutableTreeNode("");
setCollection(getCollectableCollection());
// Clear.
((DefaultTreeModel)getModel()).setRoot(null);
// Add.
addCollectables(root, getCollection().getCollection());
// Display.
((DefaultTreeModel)getModel()).setRoot(root);
// Expand all rows.
for(int len = 0; len < getRowCount(); ++len)
{
expandRow(len);
}
}
/**
* This method returns this chooser's element collection.
*
* @return This chooser's element collection.
*/
protected
DataCollection
getCollection()
{
return itsCollection;
}
/**
* This method returns this chooser's key.
*
* @return This chooser's key.
*/
protected
PreferencesKeys
getKey()
{
return itsKey;
}
/**
* This method returns the selected element.
*
* @return This method returns the selected element.
*/
protected
DataElement
getSelectedElement()
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode)getLastSelectedPathComponent();
DataElement element = null;
if(node != null)
{
element = (DataElement)node.getUserObject();
}
return element;
}
/**
* This method returns the amount of elements that are being referenced in
* the chooser.
*
* @return The amount of elements that are being referenced in the
* chooser.
*/
protected
int
length()
{
return getCollection().size();
}
/**
* This method causes the first element in the chooser to become selected,
* unless the chooser is empty.
*/
protected
void
selectFirst()
{
setSelectionRow(0);
}
/**
* This method selects the specified element.
* <p>
* <b>Note:</b> This method will not work as expected if the row that contains
* the specified element is not expanded.
*
* @param element The element to select.
*/
protected
void
setSelectedCollectable(DataElement element)
{
TreePath[] paths = getPathBetweenRows(0, getRowCount());
int index = 0;
// Iterate all the expanded tree paths.
for(TreePath path : paths)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
DataElement elementAt = (DataElement)node.getUserObject();
if(elementAt == element)
{
break;
}
++index;
}
setSelectionRow(index);
}
/**
* This method sets the selection row and then scrolls to that roll if
* contained in a scroll pane.
*
* @param row The row to select and scroll to.
*/
@Override
public
void
setSelectionRow(int row)
{
super.setSelectionRow(row);
scrollRowToVisible(row);
}
//////////////////////////////////////////////////////////////////////////////
// Start of private methods.
//////////////////////////////////////////////////////////////////////////////
private
void
addCollectables(DefaultMutableTreeNode root, Collection<DataElement> collection)
{
for(DataElement element : collection)
{
DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(element);
root.add(leaf);
if(element instanceof Category)
{
Category category = (Category)element;
if(category.isGroup() == true)
{
addCollectables(leaf, category.getSubcategories());
}
}
}
}
private
DataCollection
getCollectableCollection()
{
DataCollection collection = null;
if(getKey() == ACCOUNTS)
{
collection = getAccounts();
}
else if(getKey() == EXPENSES)
{
collection = getExpenses();
}
else if(getKey() == INCOME)
{
collection = getIncome();
}
else if(getKey() == PAYEES)
{
collection = getPayees();
}
else if(getKey() == REMINDERS)
{
collection = getReminders();
}
return collection;
}
private
DefaultTreeCellRenderer
getTreeCellRenderer()
{
return (DefaultTreeCellRenderer)getCellRenderer();
}
private
void
setCollection(DataCollection collection)
{
itsCollection = collection;
}
private
void
setKey(PreferencesKeys key)
{
itsKey = key;
}
//////////////////////////////////////////////////////////////////////////////
// Start of class members.
//////////////////////////////////////////////////////////////////////////////
private DataCollection itsCollection;
private PreferencesKeys itsKey;
}