KickJava   Java API By Example, From Geeks To Geeks.

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


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.awt.Component JavaDoc;
59 import java.awt.event.FocusAdapter JavaDoc;
60 import java.awt.event.FocusEvent JavaDoc;
61 import java.util.EventObject JavaDoc;
62
63 import javax.swing.DefaultCellEditor JavaDoc;
64 import javax.swing.JTable JavaDoc;
65 import javax.swing.JTextField JavaDoc;
66 import javax.swing.event.ChangeEvent JavaDoc;
67 import javax.swing.table.TableCellEditor JavaDoc;
68 import javax.swing.text.JTextComponent JavaDoc;
69
70 /**
71  * Common superclass of tables used in Cayenne. Contains some common configuration
72  * settings and utility methods.
73  *
74  * @author Michael Misha Shengaout
75  * @author Andrei Adamchik
76  */

77 public class CayenneTable extends JTable JavaDoc {
78
79     public CayenneTable() {
80         super();
81         this.setRowHeight(25);
82         this.setRowMargin(3);
83     }
84
85     protected void createDefaultEditors() {
86         super.createDefaultEditors();
87         
88         JTextField JavaDoc textField = CayenneWidgetFactory.createTextField(0);
89         final DefaultCellEditor JavaDoc textEditor = new DefaultCellEditor JavaDoc(textField);
90         
91         // this takes care of cases like handling of "delete" button clicks
92
// that delete a row being currently edited....
93
textField.addFocusListener(new FocusAdapter JavaDoc() {
94             public void focusLost(FocusEvent JavaDoc e) {
95                 if (!e.isTemporary()) {
96                     textEditor.cancelCellEditing();
97                 }
98             }
99         });
100
101         setDefaultEditor(Object JavaDoc.class, textEditor);
102         setDefaultEditor(String JavaDoc.class, textEditor);
103     }
104
105     public CayenneTableModel getCayenneModel() {
106         return (CayenneTableModel) getModel();
107     }
108     
109     /**
110      * Cancels editing of any cells that maybe currently edited.
111      * This method should be called before updating any selections.
112      */

113     protected void cancelEditing() {
114         editingCanceled(new ChangeEvent JavaDoc(this));
115     }
116
117     public void select(Object JavaDoc row) {
118         if (row == null) {
119             return;
120         }
121         cancelEditing();
122         
123         CayenneTableModel model = getCayenneModel();
124         int ind = model.getObjectList().indexOf(row);
125
126         if (ind >= 0) {
127             getSelectionModel().setSelectionInterval(ind, ind);
128         }
129     }
130
131     public void select(int index) {
132         cancelEditing();
133         
134         CayenneTableModel model = getCayenneModel();
135         if (index >= model.getObjectList().size()) {
136             index = model.getObjectList().size() - 1;
137         }
138
139         if (index >= 0) {
140             getSelectionModel().setSelectionInterval(index, index);
141         }
142     }
143
144     /**
145      * @see javax.swing.event.CellEditorListener#editingStopped(ChangeEvent)
146      */

147     public void editingStopped(ChangeEvent JavaDoc e) {
148         super.editingStopped(e);
149
150         // only go down one row if we are editing text
151
int row = getSelectedRow();
152         if (row >= 0 && this.getRowCount() > 0 && getSelectedTextComponent() != null) {
153             row++;
154
155             if (row >= this.getRowCount()) {
156                 row = 0;
157             }
158             select(row);
159         }
160     }
161
162     public JTextComponent JavaDoc getSelectedTextComponent() {
163         int row = getSelectedRow();
164         int column = getSelectedColumn();
165         if (row < 0 || column < 0) {
166             return null;
167         }
168
169         TableCellEditor JavaDoc editor = this.getCellEditor(row, column);
170         if (editor instanceof DefaultCellEditor JavaDoc) {
171             Component JavaDoc comp = ((DefaultCellEditor JavaDoc) editor).getComponent();
172             if (comp instanceof JTextComponent JavaDoc) {
173                 return (JTextComponent JavaDoc) comp;
174             }
175         }
176         return null;
177     }
178
179     /**
180      * @see javax.swing.JTable#editCellAt(int, int, EventObject)
181      */

182     public boolean editCellAt(int row, int column, EventObject JavaDoc e) {
183         boolean edit = super.editCellAt(row, column, e);
184
185         if (edit) {
186             JTextComponent JavaDoc t = getSelectedTextComponent();
187             if (t != null) {
188                 if (!t.isFocusOwner()) {
189                     t.requestFocus();
190                 }
191
192                 t.setCaretPosition(t.getDocument().getLength());
193             }
194         }
195         return edit;
196     }
197 }
198
Popular Tags