Coverage Report - org.homeunix.thecave.buddi.model.swing.SourceComboBoxModel
 
Classes in this File Line Coverage Branch Coverage Complexity
SourceComboBoxModel
85%
53/62
39%
15/38
2.462
SourceComboBoxModel$1
100%
3/3
N/A
2.462
 
 1  
 /*
 2  
  * Created on Aug 9, 2007 by wyatt
 3  
  */
 4  
 package org.homeunix.thecave.buddi.model.swing;
 5  
 
 6  
 import java.util.ArrayList;
 7  
 import java.util.Collections;
 8  
 import java.util.HashMap;
 9  
 import java.util.List;
 10  
 import java.util.Map;
 11  
 
 12  
 import javax.swing.ComboBoxModel;
 13  
 import javax.swing.DefaultComboBoxModel;
 14  
 import javax.swing.event.ListDataListener;
 15  
 
 16  
 import org.homeunix.thecave.buddi.i18n.BuddiKeys;
 17  
 import org.homeunix.thecave.buddi.model.Account;
 18  
 import org.homeunix.thecave.buddi.model.BudgetCategory;
 19  
 import org.homeunix.thecave.buddi.model.Document;
 20  
 import org.homeunix.thecave.buddi.model.Source;
 21  
 import org.homeunix.thecave.buddi.model.impl.FilteredLists;
 22  
 import org.homeunix.thecave.buddi.model.prefs.PrefsModel;
 23  
 import org.homeunix.thecave.buddi.plugin.api.util.TextFormatter;
 24  
 
 25  
 import ca.digitalcave.moss.application.document.DocumentChangeEvent;
 26  
 import ca.digitalcave.moss.application.document.DocumentChangeListener;
 27  
 
 28  
 public class SourceComboBoxModel implements ComboBoxModel {
 29  
         private static final long serialVersionUID = 0; 
 30  
 
 31  
         private final Document model;
 32  
         private final boolean includeIncome;
 33  
         private final boolean includeSplit; //True for calls from transaction editor; false for calls from split editor.
 34  
         
 35  
         private final Source ignoredSource; //An array of sources which will not be added to the list. 
 36  
         
 37  2433
         private final List<Account> accounts = new ArrayList<Account>();
 38  2433
         private final List<BudgetCategory> budgetCategories = new ArrayList<BudgetCategory>();
 39  
         
 40  2433
         private final Map<Object, Integer> levelMappings = new HashMap<Object, Integer>();
 41  
         
 42  
         private final DefaultComboBoxModel comboBoxModel;
 43  
         
 44  
         private final DocumentChangeListener listener;
 45  
 
 46  2433
         public SourceComboBoxModel(Document model, boolean includeIncome, boolean includeSplit, Source ignoredSource) {
 47  2433
                 this.model = model;
 48  2433
                 this.includeIncome = includeIncome;
 49  2433
                 this.includeSplit = includeSplit;
 50  2433
                 this.comboBoxModel = new DefaultComboBoxModel();
 51  2433
                 this.ignoredSource = ignoredSource;
 52  2433
                 updateComboBoxModel(null);
 53  2433
                 listener = new DocumentChangeListener(){
 54  
                         public void documentChange(DocumentChangeEvent event) {
 55  2
                                 updateComboBoxModel(null);        
 56  2
                         }
 57  
                 };
 58  2433
                 model.addDocumentChangeListener(listener);
 59  2433
         }
 60  
 
 61  
         public Object getSelectedItem() {
 62  12525
                 return getComboBoxModel().getSelectedItem();
 63  
         }
 64  
 
 65  
         public void setSelectedItem(Object anItem) {
 66  4872
                 getComboBoxModel().setSelectedItem(anItem);
 67  4872
         }
 68  
 
 69  
         public void addListDataListener(ListDataListener l) {
 70  7438
                 getComboBoxModel().addListDataListener(l);
 71  7438
         }
 72  
 
 73  
         public Object getElementAt(int index) {
 74  28648
                 return getComboBoxModel().getElementAt(index);
 75  
         }
 76  
 
 77  
         public int getSize() {
 78  14654
                 return getComboBoxModel().getSize();
 79  
         }
 80  
 
 81  
         public void removeListDataListener(ListDataListener l) {
 82  0
                 getComboBoxModel().removeListDataListener(l);
 83  0
         }
 84  
         
 85  
         private DefaultComboBoxModel getComboBoxModel(){
 86  94510
                 return comboBoxModel;
 87  
         }
 88  
         
 89  
         /**
 90  
          * Returns true if the given source is included in this 
 91  
          * combo box model, and false otherwise.
 92  
          * @param source
 93  
          * @return
 94  
          */
 95  
         public boolean contains(Source source){
 96  0
                 return (accounts.contains(source) || budgetCategories.contains(source));
 97  
         }
 98  
         
 99  
         public int getLevel(Object item){
 100  13651
                 if (levelMappings.containsKey(item))
 101  13651
                         return levelMappings.get(item);
 102  0
                 return 0;
 103  
         }
 104  
         
 105  
         /**
 106  
          * Updates the model, and optionally (if source is not null) forces it to include
 107  
          * the given source.  This is used to ensure that deleted accounts still show up 
 108  
          * for transactions which link to them, but not for others.
 109  
          * @param source
 110  
          */
 111  
         public void updateComboBoxModel(Source source){
 112  2435
                 Object selected = getSelectedItem(); 
 113  
                 
 114  2435
                 accounts.clear();
 115  
                 
 116  2435
                 for (Account a : model.getAccounts()) {
 117  0
                         if (!a.isDeleted() || PrefsModel.getInstance().isShowDeleted() || a.equals(source)){
 118  0
                                 if (!a.equals(ignoredSource))
 119  0
                                         accounts.add(a);
 120  
                         }
 121  
                 }
 122  2435
                 budgetCategories.clear();
 123  2435
                 for (BudgetCategory bc : model.getBudgetCategories()) {
 124  24350
                         if (!bc.isDeleted() || PrefsModel.getInstance().isShowDeleted() || bc.equals(source)){
 125  24350
                                 if (!bc.equals(ignoredSource))
 126  24350
                                         budgetCategories.add(bc);
 127  
                         }
 128  
                 }
 129  
                 
 130  2435
                 Collections.sort(accounts);
 131  2435
                 Collections.sort(budgetCategories);                
 132  
                 
 133  2435
                 getComboBoxModel().removeAllElements();
 134  2435
                 getComboBoxModel().addElement(TextFormatter.getTranslation(BuddiKeys.ACCOUNTS_COMBOBOX_HEADER));
 135  2435
                 for (Account a : accounts) {
 136  0
                         getComboBoxModel().addElement(a);
 137  
                 }
 138  2435
                 getComboBoxModel().addElement("&nbsp;");
 139  2435
                 getComboBoxModel().addElement(TextFormatter.getTranslation(BuddiKeys.BUDGET_CATEGORIES_COMBOBOX_HEADER));
 140  
 
 141  2435
                 addBudgetCategories(null, 0);
 142  
                 
 143  2435
                 if (includeSplit){
 144  2332
                         getComboBoxModel().addElement("&nbsp;");
 145  2332
                         getComboBoxModel().addElement(BuddiKeys.SPLITS.toString());
 146  
                 }
 147  
                 
 148  2435
                 setSelectedItem(selected);
 149  2435
         }
 150  
         
 151  
         private void addBudgetCategories(BudgetCategory parent, int level){
 152  
                 final List<BudgetCategory> siblings;
 153  14404
                 if (PrefsModel.getInstance().isShowFlatBudgetInSourceCombobox()) {
 154  0
                         siblings = budgetCategories;
 155  
                 }
 156  
                 else {
 157  14404
                         siblings = new FilteredLists.BudgetCategoryListFilteredByParent(model, budgetCategories, parent);
 158  
                 }
 159  14404
                 for (BudgetCategory bc : siblings) {
 160  24350
                         if (bc.isIncome() == includeIncome){
 161  11969
                                 getComboBoxModel().addElement(bc);
 162  11969
                                 levelMappings.put(bc, level);
 163  11969
                                 if (!PrefsModel.getInstance().isShowFlatBudgetInSourceCombobox()){
 164  11969
                                         addBudgetCategories(bc, level + 1);
 165  
                                 }
 166  
                         }
 167  
                 }                
 168  14404
         }
 169  
 }