KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > modeler > util > CayenneTableModel


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.modeler.util;
57
58 import java.util.Collections JavaDoc;
59
60 import javax.swing.table.AbstractTableModel JavaDoc;
61
62 import org.objectstyle.cayenne.modeler.ProjectController;
63 import org.objectstyle.cayenne.util.PropertyComparator;
64 import org.objectstyle.cayenne.util.Util;
65
66 /**
67  * Superclass of CayenneModeler table model classes.
68  *
69  * @author Andrei Adamchik
70  */

71 public abstract class CayenneTableModel extends AbstractTableModel JavaDoc {
72     protected ProjectController mediator;
73     protected Object JavaDoc eventSource;
74     protected java.util.List JavaDoc objectList;
75
76     /**
77      * Constructor for CayenneTableModel.
78      */

79     public CayenneTableModel(
80         ProjectController mediator,
81         Object JavaDoc eventSource,
82         java.util.List JavaDoc objectList) {
83         super();
84         this.eventSource = eventSource;
85         this.mediator = mediator;
86         this.objectList = objectList;
87
88         orderList();
89     }
90
91     public void setValueAt(Object JavaDoc newVal, int row, int col) {
92         if (!Util.nullSafeEquals(newVal, getValueAt(row, col))) {
93             setUpdatedValueAt(newVal, row, col);
94         }
95     }
96
97     /**
98      * Sets a new value after it is already checked by the superclass
99      * and it is determined that the value has changed.
100      */

101     public abstract void setUpdatedValueAt(Object JavaDoc newVal, int row, int col);
102
103     /**
104      * Orders internal object list. Key returned by
105      * <code>getOrderingKey</code> is used for comparison.
106      */

107     protected void orderList() {
108         String JavaDoc key = getOrderingKey();
109         if (key != null) {
110             Collections.sort(
111                 objectList,
112                 new PropertyComparator(getOrderingKey(), getElementsClass()));
113         }
114     }
115
116     /**
117      * Returns Java class of the internal list elements.
118      */

119     public abstract Class JavaDoc getElementsClass();
120
121     /**
122      * Returns the key by which to order elements
123      * in the object list. Default value is "name".
124      */

125     public String JavaDoc getOrderingKey() {
126         return "name";
127     }
128
129     /**
130      * Returns the number of objects on the list.
131      */

132     public int getRowCount() {
133         return objectList.size();
134     }
135
136     /**
137      * Returns an object used as an event source.
138      */

139     public Object JavaDoc getEventSource() {
140         return eventSource;
141     }
142
143     /**
144      * Returns EventController object.
145      */

146     public ProjectController getMediator() {
147         return mediator;
148     }
149
150     /**
151      * Returns internal object list.
152      */

153     public java.util.List JavaDoc getObjectList() {
154         return objectList;
155     }
156
157     public void addRow(Object JavaDoc row) {
158         objectList.add(row);
159         fireTableDataChanged();
160     }
161
162     public void removeRow(Object JavaDoc row) {
163         objectList.remove(row);
164         fireTableDataChanged();
165     }
166
167     /**
168      * Moves a row up, jumping down if row is already at the top.
169      */

170     public int moveRowUp(Object JavaDoc row) {
171         int len = objectList.size();
172         if (len < 2) {
173             return -1;
174         }
175
176         int ind = objectList.indexOf(row);
177         if (ind <= 0) {
178             return -1;
179         }
180
181         int neighborIndex = ind - 1;
182         if (neighborIndex < 0) {
183             neighborIndex = len - 1;
184         }
185
186         swapRows(ind, neighborIndex);
187         return neighborIndex;
188     }
189
190     /**
191       * Moves a row down, jumping up if row is already at the bottom.
192       */

193     public int moveRowDown(Object JavaDoc row) {
194         int len = objectList.size();
195         if (len < 2) {
196             return -1;
197         }
198
199         int ind = objectList.indexOf(row);
200         // not valid if it is not found or it is at the end of the list
201
if (ind < 0 || (ind + 1) >= len) {
202             return -1;
203         }
204
205         int neighborIndex = ind + 1;
206
207         swapRows(ind, neighborIndex);
208         return neighborIndex;
209     }
210
211     protected void swapRows(int i, int j) {
212         Collections.swap(objectList, i, j);
213         fireTableDataChanged();
214     }
215 }
216
Popular Tags