001: /**
002: * Copyright 2006 Webmedia Group Ltd.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: **/package org.araneaframework.uilib.list.structure;
016:
017: import java.util.ArrayList;
018: import java.util.Comparator;
019: import java.util.Iterator;
020: import java.util.List;
021: import org.apache.commons.lang.Validate;
022: import org.araneaframework.Environment;
023: import org.araneaframework.core.Assert;
024: import org.araneaframework.uilib.list.TypeHelper;
025: import org.araneaframework.uilib.list.structure.filter.FieldFilter;
026: import org.araneaframework.uilib.list.structure.filter.composite.AndFilter;
027: import org.araneaframework.uilib.list.structure.order.FieldOrder;
028: import org.araneaframework.uilib.list.structure.order.MultiFieldOrder;
029: import org.araneaframework.uilib.list.structure.order.SimpleFieldOrder;
030: import org.araneaframework.uilib.util.Event;
031:
032: public class ListStructure extends BaseListStructure {
033:
034: private static final long serialVersionUID = 1L;
035:
036: private final TypeHelper typeHelper;
037:
038: private boolean orderableByDefault = false;
039:
040: private boolean initialized = false;
041: private List initEvents = null;
042:
043: public void init(Environment env) throws Exception {
044: if (initEvents != null) {
045: for (Iterator it = initEvents.iterator(); it.hasNext();) {
046: Runnable event = (Runnable) it.next();
047: event.run();
048: }
049: }
050: initialized = true;
051: initEvents = null;
052:
053: this .filter.init(env);
054: this .order.init(env);
055: }
056:
057: private boolean isInitialized() {
058: return this .initialized;
059: }
060:
061: private void addInitEvent(Event event) {
062: if (isInitialized()) {
063: event.run();
064: } else {
065: if (initEvents == null)
066: initEvents = new ArrayList();
067: initEvents.add(event);
068: }
069: }
070:
071: public void destroy() throws Exception {
072: this .filter.destroy();
073: this .order.destroy();
074: }
075:
076: public ListStructure(TypeHelper typeHelper) {
077: Assert.notNullParam(this , typeHelper, "typeHelper");
078: this .typeHelper = typeHelper;
079: this .filter = new AndFilter();
080: this .order = new MultiFieldOrder();
081: }
082:
083: protected TypeHelper getTypeHelper() {
084: return this .typeHelper;
085: }
086:
087: /*
088: * Fields
089: */
090:
091: public void addField(String id, String label) {
092: addField(id, label, getTypeHelper().getFieldType(id),
093: isOrderableByDefault());
094: }
095:
096: public void addField(String id, String label, boolean orderable) {
097: addField(id, label, getTypeHelper().getFieldType(id), orderable);
098: }
099:
100: public void addField(String id, String label, Class type) {
101: addField(id, label, type, isOrderableByDefault());
102: }
103:
104: public void addField(String id, String label, Class type,
105: boolean orderable) {
106: addField(new ListField(id, label));
107: if (type != null) {
108: getTypeHelper().addFieldType(id, type);
109: }
110: if (orderable) {
111: addFieldOrder(id);
112: }
113: }
114:
115: /*
116: * Orders
117: */
118:
119: public boolean isOrderableByDefault() {
120: return orderableByDefault;
121: }
122:
123: public void setOrderableByDefault(boolean orderableByDefault) {
124: this .orderableByDefault = orderableByDefault;
125: }
126:
127: protected void addFieldOrder(final String fieldId) {
128: final SimpleFieldOrder fieldOrder = new SimpleFieldOrder(
129: fieldId);
130: addInitEvent(new Event() {
131: public void run() {
132: Comparator comp = typeHelper
133: .getFieldComparator(fieldId);
134: Validate.notNull(comp,
135: "Could not get comparator for field '"
136: + fieldId + "'");
137: fieldOrder.setComparator(comp);
138: }
139: });
140: addOrder(fieldOrder);
141: }
142:
143: protected void addFieldOrder(String fieldId, Comparator comparator) {
144: addOrder(new SimpleFieldOrder(fieldId, comparator));
145: }
146:
147: protected MultiFieldOrder getMultiFieldOrder() {
148: return (MultiFieldOrder) this .order;
149: }
150:
151: public void addOrder(FieldOrder fieldOrder) {
152: getMultiFieldOrder().addFieldOrder(fieldOrder);
153: }
154:
155: public FieldOrder getFieldOrder(String field) {
156: return getMultiFieldOrder().getFieldOrder(field);
157: }
158:
159: public void clearOrders() {
160: getMultiFieldOrder().clearFieldOrders();
161: }
162:
163: /*
164: * Filters
165: */
166:
167: protected AndFilter getAndFilter() {
168: return (AndFilter) this .filter;
169: }
170:
171: public void addFilter(ListFilter filter) {
172: getAndFilter().addFilter(filter);
173: }
174:
175: public FieldFilter getFieldFilter(String field) {
176: Iterator i = getAndFilter().getFilters().iterator();
177: while (i.hasNext()) {
178: ListFilter listFilter = (ListFilter) i.next();
179: if (listFilter instanceof FieldFilter) {
180: FieldFilter columnFilter = (FieldFilter) listFilter;
181: if (columnFilter.getFieldId().equals(field)) {
182: return columnFilter;
183: }
184: }
185: }
186: return null;
187: }
188:
189: public void clearFilters() {
190: getAndFilter().clearFilters();
191: }
192: }
|