1   package counterWidgets;
2   
3   import javax.microedition.lcdui.StringItem;
4   
5   /**
6    * Luokka laskurille, joka osaa näyttää selitystekstiä ja laskurin arvoa.
7    * Laskurille voidaan asettaa etu- ja jälkiliite, jolloin tulos voi
8    * olla esim:  "Hinta: 3 €".
9    * Laskurille voidaan myös asettaa kuuntelija, jota kutsutaan aina arvon
10   * muuttuessa.
11   * <pre>
12   *   Counter counterHinta = new Counter("Hinta:"); form.append(counterHinta);
13   *   counterHinta.setPostfix(" €");
14   *   ...
15   *   counterHinta.setCount(7);  // Hinta: 7 €  
16   * </pre>
17   * @author vesal
18   * @version 17.3.2007
19   */
20  public class Counter extends StringItem  {
21    
22    /**
23     * Rajapinta joka täytyy toteuttaa jos haluaa kuulla laskurin muutoksista
24     */
25    public interface ChangeCommandListener {
26      /**
27       * Rajapinnna ainoa metodi, jota kutsutaan kun laskurin arvo muuttuu.
28       * @param it   laskuri jonka arvo muuttuu
29       * @param diff paljonko arvo muuttui
30       */
31      public void commandChange(Counter it, int diff);
32    }
33    
34    /**
35     * Laskurin sisäinen arvo
36     */
37    private int count = 0;
38    
39    /**
40     * Viite muutosten kuuntelijaan.
41     */
42    private ChangeCommandListener changeCommandListener = null;
43    
44    /**
45     * Etuliite joka tulostuu ennne laskurin arvoa selityksen jälkeen
46     */
47    private String prefix = " ";
48    
49    /**
50     * Jälkiliite, joka tulostuu laskurin arvon jälkeen.
51     */
52    private String postfix = " ";
53    
54    
55    /**
56     * Alustetaan laskuri selityksellä ja tyypillä.
57     * @param text Laskurin viereen tuleva selitys
58     * @param type Tyyppi jolla laskuri näytetään
59     */
60    public Counter(String text,int type) {
61      super(text," 0 ",type);
62      setLayout(LAYOUT_CENTER | LAYOUT_NEWLINE_BEFORE);
63    }
64    
65    /**
66     * Alustetaan tavallisen näköinen laskuri.
67     * @param text
68     */
69    public Counter(String text) {
70      this(text,StringItem.PLAIN);
71    }
72    
73    /**
74     * Palauttaa laskurin arvon merkkijonona
75     * @return laskurin arvo merkkijonona
76     */
77    public String toString() {
78      return prefix + count + postfix;
79    }
80    
81    /**
82     * Asetetaan kunntelija, joka kuuntelee laskurista tulevia muutoksia.
83     * @param listener Muutosten kuuntelija
84     */
85    public void setChangeCommandListener(ChangeCommandListener listener) {
86      changeCommandListener = listener;
87    }
88    
89    /**
90     * Asetatetaan laskurille uusia arvo.  Jos arvo muuttuu, niin silloin
91     * kutsutaan tarvittaessa muutosten kuuntelijaa.
92     * @param n laskurin uusi arvo
93     */
94    public void setCount(int n) {
95      int old_n = getCount();
96      int diff = n - old_n;
97      if ( diff == 0 ) return;
98      count = n;
99      super.setText(toString());       
100     if ( changeCommandListener != null )
101       changeCommandListener.commandChange(this,diff);
102   }
103   
104   /**
105    * Saantimetodi laskurin arvolle
106    * @return laskurin nykyinen arvo
107    */
108   public int  getCount() { 
109     return count;                        
110   }
111   
112   /**
113    * Kasvatetaan laskurin arvoa. 
114    * @param i paljollako arvoa kasvatetaan
115    */
116   public void inc(int i) {
117     setCount(getCount() + i);
118   }
119 
120   /** 
121    * Kasvatetaan laskurin arvoa yhdellä.
122    */
123   public void inc() {
124     inc(1);
125   }
126 
127   /**
128    * Nollataan laskurin arvo 
129    */
130   public void reset() {
131     setCount(0);
132   }
133 
134   /**
135    * Estetään tekstin muuttaminen
136    */
137   public void setText(String s) {
138   }
139   
140   /**
141    * Asettaa laskurin etuliitteen.
142    * Etuliite tulostetaan selityksen jälkeen ennen laskurin arvoa.
143    * @param s uusi etuliitteen arvo
144    */
145   public void setPrefix(String s) {
146     prefix = s;
147     super.setText(toString());
148   }
149   
150   /**
151    * Asettaa laskurin jälkiliitteen.
152    * Jälkiliite tulostetaan laskurin arvon jälkeen.
153    * @param s uusi jälkiliitteen arvo
154    */
155   public void setPostfix(String s) {
156     postfix = s;
157     super.setText(toString());
158   }
159   
160   /**
161    * Palauttaa nykyisen etuliitteen arvon
162    * @return nykyinen etuliite.
163    */
164   public String getPrefix() {
165     return prefix;
166   }
167   
168   /**
169    * Palauttaa nykyisen jälkiliitteen arvon
170    * @return nykyinen jälkiliite.
171    */
172   public String getPostfix() {
173     return postfix;
174   }
175   
176 }
177