KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > modeler > editor > ProcedureTab


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.editor;
57
58 import java.awt.BorderLayout JavaDoc;
59 import java.awt.event.ItemEvent JavaDoc;
60 import java.awt.event.ItemListener JavaDoc;
61 import java.util.EventObject JavaDoc;
62
63 import javax.swing.JCheckBox JavaDoc;
64 import javax.swing.JLabel JavaDoc;
65 import javax.swing.JPanel JavaDoc;
66 import javax.swing.JTextField JavaDoc;
67
68 import org.objectstyle.cayenne.map.Procedure;
69 import org.objectstyle.cayenne.map.event.ProcedureEvent;
70 import org.objectstyle.cayenne.modeler.ProjectController;
71 import org.objectstyle.cayenne.modeler.event.ProcedureDisplayEvent;
72 import org.objectstyle.cayenne.modeler.event.ProcedureDisplayListener;
73 import org.objectstyle.cayenne.modeler.util.CayenneWidgetFactory;
74 import org.objectstyle.cayenne.modeler.util.ProjectUtil;
75 import org.objectstyle.cayenne.modeler.util.TextAdapter;
76 import org.objectstyle.cayenne.util.Util;
77 import org.objectstyle.cayenne.validation.ValidationException;
78
79 import com.jgoodies.forms.builder.PanelBuilder;
80 import com.jgoodies.forms.layout.CellConstraints;
81 import com.jgoodies.forms.layout.FormLayout;
82
83 /**
84  * A panel for editing stored procedure general settings, such as name, schema, etc.
85  *
86  * @author Andrei Adamchik
87  */

88 public class ProcedureTab extends JPanel JavaDoc implements ProcedureDisplayListener,
89         ExistingSelectionProcessor {
90
91     protected ProjectController eventController;
92     protected TextAdapter name;
93     protected TextAdapter schema;
94     protected JCheckBox JavaDoc returnsValue;
95     protected boolean ignoreChange;
96
97     public ProcedureTab(ProjectController eventController) {
98         this.eventController = eventController;
99
100         initView();
101         initController();
102     }
103
104     private void initView() {
105         // create widgets
106

107         this.name = new TextAdapter(new JTextField JavaDoc()) {
108
109             protected void updateModel(String JavaDoc text) {
110                 setProcedureName(text);
111             }
112         };
113
114         this.schema = new TextAdapter(new JTextField JavaDoc()) {
115
116             protected void updateModel(String JavaDoc text) {
117                 setSchema(text);
118             }
119         };
120
121         this.returnsValue = new JCheckBox JavaDoc();
122
123         JLabel JavaDoc returnValueHelp = CayenneWidgetFactory
124                 .createLabel("(first parameter will be used as return value)");
125         returnValueHelp.setFont(returnValueHelp.getFont().deriveFont(10));
126
127         // assemble
128
FormLayout layout = new FormLayout(
129                 "right:max(50dlu;pref), 3dlu, left:max(20dlu;pref), 3dlu, fill:150dlu",
130                 "p, 3dlu, p, 3dlu, p, 3dlu, p");
131
132         CellConstraints cc = new CellConstraints();
133         PanelBuilder builder = new PanelBuilder(layout);
134         builder.setDefaultDialogBorder();
135
136         builder.addSeparator("Stored Procedure Configuration", cc.xywh(1, 1, 5, 1));
137         builder.addLabel("Procedure Name:", cc.xy(1, 3));
138         builder.add(name.getComponent(), cc.xywh(3, 3, 3, 1));
139         builder.addLabel("Schema:", cc.xy(1, 5));
140         builder.add(schema.getComponent(), cc.xywh(3, 5, 3, 1));
141         builder.addLabel("Returns Value:", cc.xy(1, 7));
142         builder.add(returnsValue, cc.xy(3, 7));
143         builder.add(returnValueHelp, cc.xy(5, 7));
144
145         this.setLayout(new BorderLayout JavaDoc());
146         this.add(builder.getPanel(), BorderLayout.CENTER);
147     }
148
149     private void initController() {
150         returnsValue.addItemListener(new ItemListener JavaDoc() {
151
152             public void itemStateChanged(ItemEvent JavaDoc e) {
153                 Procedure procedure = eventController.getCurrentProcedure();
154                 if (procedure != null && !ignoreChange) {
155                     procedure.setReturningValue(returnsValue.isSelected());
156                     eventController.fireProcedureEvent(new ProcedureEvent(
157                             ProcedureTab.this,
158                             procedure));
159                 }
160             }
161         });
162
163         eventController.addProcedureDisplayListener(this);
164     }
165     
166     public void processExistingSelection(EventObject JavaDoc e) {
167         ProcedureDisplayEvent pde = new ProcedureDisplayEvent(
168                 this,
169                 eventController.getCurrentProcedure(),
170                 eventController.getCurrentDataMap(),
171                 eventController.getCurrentDataDomain());
172         eventController.fireProcedureDisplayEvent(pde);
173     }
174
175     /**
176      * Invoked when currently selected Procedure object is changed.
177      */

178     public synchronized void currentProcedureChanged(ProcedureDisplayEvent e) {
179         Procedure procedure = e.getProcedure();
180         if (procedure == null || !e.isProcedureChanged()) {
181             return;
182         }
183
184         name.setText(procedure.getName());
185         schema.setText(procedure.getSchema());
186
187         ignoreChange = true;
188         returnsValue.setSelected(procedure.isReturningValue());
189         ignoreChange = false;
190     }
191
192     void setProcedureName(String JavaDoc newName) {
193         if (newName != null && newName.trim().length() == 0) {
194             newName = null;
195         }
196
197         Procedure procedure = eventController.getCurrentProcedure();
198
199         if (procedure == null || Util.nullSafeEquals(newName, procedure.getName())) {
200             return;
201         }
202
203         if (newName == null) {
204             throw new ValidationException("Procedure name is required.");
205         }
206         else if (procedure.getDataMap().getProcedure(newName) == null) {
207             // completely new name, set new name for entity
208
ProcedureEvent e = new ProcedureEvent(this, procedure, procedure.getName());
209             ProjectUtil.setProcedureName(procedure.getDataMap(), procedure, newName);
210             eventController.fireProcedureEvent(e);
211         }
212         else {
213             // there is an entity with the same name
214
throw new ValidationException("There is another procedure with name '"
215                     + newName
216                     + "'.");
217         }
218     }
219
220     void setSchema(String JavaDoc text) {
221         if (text != null && text.trim().length() == 0) {
222             text = null;
223         }
224
225         Procedure procedure = eventController.getCurrentProcedure();
226
227         if (procedure != null && !Util.nullSafeEquals(procedure.getSchema(), text)) {
228             procedure.setSchema(text);
229             eventController.fireProcedureEvent(new ProcedureEvent(this, procedure));
230         }
231     }
232 }
Popular Tags