1 /*
2 J-Bird net/sourceforge/jbird/CommonChooser.java
3
4 Copyright 2001, 2002, 2003 Dick Repasky
5 */
6 package net.sourceforge.jbird;
7
8 import java.awt.GridBagConstraints;
9 import java.text.DecimalFormat;
10 import java.text.Collator;
11 import java.text.CollationKey;
12 import java.text.RuleBasedCollator;
13 import java.text.ParseException;
14 import java.util.ResourceBundle;
15
16 import net.sourceforge.jbird.SpeciesNameIface;
17 import net.sourceforge.jbird.awt.LoggingILC;
18 import net.sourceforge.jbird.iface.IntarrayListener;
19 import net.sourceforge.jbird.iface.IntegerListener;
20 import net.sourceforge.jbird.iface.IntegerListenerList;
21 import net.sourceforge.jbird.iface.LogListener;
22 import net.sourceforge.jbird.iface.NullListener;
23 import net.sourceforge.jbird.util.IntStringArrays;
24
25 // FOR now grab default collator
26
27 public class CommonChooser extends LoggingILC
28 implements SpeciesNameIface {
29
30 DecimalFormat nformatter = new DecimalFormat();
31 RuleBasedCollator collator = null;
32 InternalSpeciesListener internalspecieslistener = new
33 InternalSpeciesListener();
34 int currentspecies = -1;
35
36 IntegerListenerList newspecieslisteners = new IntegerListenerList();
37
38 boolean alphabeticorder;
39
40 protected JbirdDB dbase;
41 protected ResourceBundle progres;
42 protected JBirdOptions jbirdoptions;
43
44 public CommonChooser (JbirdDB db, ResourceBundle rb,
45 JBirdOptions jo, LogListener logger) {
46 //super(logger, 6, false);
47 super(logger, 23, false);
48 dbase = db;
49 progres = rb;
50 jbirdoptions = jo;
51 cccommon();
52 }
53
54 public CommonChooser (JbirdDB db, ResourceBundle rb,
55 JBirdOptions jo, GridBagConstraints[] gbc,
56 LogListener logger) {
57 //super(logger, 6, false);
58 super(logger, 23, false, gbc);
59 dbase = db;
60 progres = rb;
61 jbirdoptions = jo;
62 cccommon();
63 }
64
65 protected final void cccommon() {
66 alphabeticorder = jbirdoptions.alphabeticorder;
67 nformatter.setGroupingUsed(false);
68 title.setText(progres.getString("Species_colon"));
69 typefield.setColumns(40);
70 addArrayActionListener(internalspecieslistener);
71
72 // Make dash a a respectable
73 // character
74 collator = (RuleBasedCollator)Collator.getInstance();
75 String rule = collator.getRules();
76 int dashat = rule.indexOf("'-'"); // locate dash
77 if (dashat >= 0) { // dash found
78 int leng = 4; // find previous operator
79 dashat --;
80 while (rule.charAt(dashat) == ' ') {
81 dashat --;
82 leng ++;
83 }
84 StringBuffer workarea = new StringBuffer(rule);
85 workarea.delete(dashat, dashat + leng);
86 rule = workarea.toString();
87 try {
88 collator = new RuleBasedCollator(rule + "& 9 < ' ' < '-'");
89 }
90 catch (ParseException e1) {
91 System.out.println("CommonChooser: RuleBasedCollator parse error " +
92 e1.getMessage());
93 }
94 }
95 buildSpeciesList();
96 setNameCompletion(jbirdoptions.namecompletion);
97 System.out.println("CommonChooser constructor returning");
98 }
99
100 private final void buildSpeciesList() {
101 System.out.println("buildSpeciesList: calling database");
102 IntStringArrays intstringlist = dbase.commonNamesNums
103 (jbirdoptions.commonnamelist,
104 jbirdoptions.alphabeticorder);
105 System.out.println("buildSpeciesList: returned from database");
106 setEnabledChoices(true);
107 setTypefieldTextNoNotice("");
108 if (jbirdoptions.alphabeticorder) {
109 // May be able to change boolean to true someday
110 // when commonNamesNums returns results using
111 // the Collator that counts.
112 buildIndexedList(intstringlist.stringa,
113 intstringlist.inta, collator, false);
114 } else {
115 buildIndexedList(intstringlist.stringa,
116 intstringlist.inta, collator, false);
117 }
118 if (intstringlist.stringa.length == 1) {
119 selectItem(0);
120 }
121
122 }
123
124 public void addSpeciesListener(IntegerListener item) {
125 newspecieslisteners.addListener(item);
126 }
127
128 public void removeSpeciesListener(IntegerListener item) {
129 newspecieslisteners.removeListener(item);
130 }
131
132 private void notifySpeciesListeners(int intval) {
133 newspecieslisteners.alertListeners(intval);
134 }
135
136 class InternalSpeciesListener implements IntarrayListener {
137 public void receiveIntarray(int[] values) {
138 int value;
139 if (values == null || values.length == 0) {
140 value = -1;
141 } else {
142 value = values[0];
143 }
144 if (value != currentspecies) {
145 currentspecies = value;
146 newspecieslisteners.alertListeners(currentspecies);
147 }
148 }
149 }
150
151 // listener not currently used, but
152 // I want it for possible future use.
153 class ChangedOptionListener implements NullListener {
154 public void receiveNull() {
155 checkOptions();
156 }
157 }
158
159 public NullListener passOptionListener() {
160 ChangedOptionListener listener = new ChangedOptionListener();
161 return (listener);
162 }
163 // WORK HERE - might be optimized to
164 // rebuild from current objects rather than
165 // reading all that data again. Reading
166 // everything again is very slow.
167
168 // Only one optionion is relevant
169 public void checkOptions() {
170 if (jbirdoptions.alphabeticorder != alphabeticorder) {
171 alphabeticorder = jbirdoptions.alphabeticorder;
172 int currentselection = currentspecies;
173 buildSpeciesList();
174 if (currentselection != -1) {
175 selectDataIndex(currentselection);
176 }
177 }
178 setNameCompletion(jbirdoptions.namecompletion);
179 }
180
181
182 public final String[] getSpeciesName () {
183 return getSelectedNames();
184 }
185 }