View Javadoc
1   package com.github.mygreen.cellformatter;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   import java.util.Locale;
6   import java.util.concurrent.CopyOnWriteArrayList;
7   
8   import com.github.mygreen.cellformatter.callback.Callback;
9   import com.github.mygreen.cellformatter.lang.MSColor;
10  import com.github.mygreen.cellformatter.lang.MSLocale;
11  
12  
13  /**
14   * Excelのユーザ定義の各条件式を表現するための抽象クラス。
15   * <p>区切り文字';'で区切られたもの。
16   * 
17   * @version 0.3
18   * @author T.TSUCHIE
19   *
20   */
21  public abstract class ConditionFormatter {
22      
23      /** 元の書式のパターン */
24      protected final String pattern;
25      
26      /** 一致する条件   */
27      protected ConditionOperator operator;
28      
29      /** ロケール  */
30      protected MSLocale locale;
31      
32      /** 条件の色 */
33      protected MSColor color;
34      
35      /** 全ての条件式 */
36      protected List<String> conditions = new CopyOnWriteArrayList<>();
37      
38      /** 処理後のコールバック */
39      protected List<Callback<?>> callbacks = new CopyOnWriteArrayList<>();
40      
41      public ConditionFormatter(final String pattern) {
42          this.pattern = pattern;
43      }
44      
45      /**
46       * フォーマッタの種類を取得する。
47       * @return
48       */
49      public abstract FormatterType getType();
50      
51      /**
52       * 値が条件に一致するかどうか。
53       * <p>{@link ConditionOperator}に一致するかどうか。
54       * @param cell 判定対象のセル。
55       * @return true:一致する。
56       */
57      public abstract boolean isMatch(CommonCell cell);
58      
59      /**
60       * 値をフォーマットする。
61       * @param cell フォーマット対象のセル。
62       * @return true:一致する。
63       */
64      public CellFormatResult format(CommonCell cell) {
65          return format(cell, Locale.getDefault());
66      }
67      
68      /**
69       * ロケールを指定して値フォーマットする。
70       * @param cell フォーマット対象のセル。
71       * @param runtimeLocale 実行時のロケール。nullの場合は、実行環境のロケールが指定される。
72       * @return フォーマット結果。
73       */
74      public abstract CellFormatResult format(CommonCell cell, Locale runtimeLocale);
75      
76      /**
77       * 種類が'日時'のフォーマッタかどうか。
78       * @return
79       */
80      public boolean isDateFormatter() {
81          return getType() == FormatterType.Date;
82      }
83      
84      /**
85       * 種類が'数値'のフォーマッタかどうか。
86       * @return
87       */
88      public boolean isNumberFormatter() {
89          return getType() == FormatterType.Number;
90      }
91      
92      /**
93       * 種類が'テキスト'のフォーマッタかどうか。
94       * @return
95       */
96      public boolean isTextFormatter() {
97          return getType() == FormatterType.Text;
98      }
99      
100     /**
101      * 書式のパターンを取得する。
102      * @return
103      */
104     public String getPattern() {
105         return pattern;
106     }
107     
108     /**
109      * 条件式を追加する。
110      * @param condition
111      */
112     public void addCondition(final String condition) {
113         this.conditions.add(condition);
114     }
115     
116     /**
117      * 複数の条件式を追加する。
118      * @param conditions
119      */
120     public void addAllCondition(final List<String> conditions) {
121         this.conditions.addAll(conditions);
122     }
123     
124     /**
125      * 全ての条件式を取得する
126      * @return
127      */
128     public List<String> getConditions() {
129         return conditions;
130     }
131     
132     /**
133      * 色を取得する。
134      * @return 値を持たない場合は、nullを返す。
135      */
136     public MSColor getColor() {
137         return color;
138     }
139     
140     /**
141      * 色を設定する。
142      */
143     public void setColor(MSColor color) {
144         this.color = color;
145     }
146     
147     /**
148      * 一致条件を取得する。
149      * @return
150      */
151     public ConditionOperator getOperator() {
152         return operator;
153     }
154     
155     /**
156      * 一致条件を設定する。
157      * @param operator 一致条件
158      */
159     public void setOperator(ConditionOperator operator) {
160         this.operator = operator;
161     }
162     
163     /**
164      * ロケールを取得する。
165      * @return 値を持たない場合は、nullを返す。
166      */
167     public MSLocale getLocale() {
168         return locale;
169     }
170     
171     /**
172      * ロケールを設定する。
173      * @param locale
174      */
175     public void setLocale(MSLocale locale) {
176         this.locale = locale;
177     }
178     
179     /**
180      * コールバック処理を追加する。
181      * @param callback
182      */
183     public void addCallback(final Callback<?> callback) {
184         this.callbacks.add(callback);
185     }
186     
187     /**
188      * コールバック処理を先頭に追加する。(優先度を高くする。)
189      */
190     public void addFirstCallcack(final Callback<?> callback) {
191         // 一旦他のリストにコピーする。
192         List<Callback<?>> list = new ArrayList<Callback<?>>();
193         list.add(callback);
194         list.addAll(callbacks);
195         
196         // 削除して、追加し直す。
197         callbacks.clear();
198         callbacks.addAll(list);
199     }
200     
201     /**
202      * コールバック処理を取得する
203      * @return
204      */
205     public List<Callback<?>> getCallbacks() {
206         return callbacks;
207     }
208 }