1 56 package org.objectstyle.cayenne.modeler.editor; 57 58 import java.awt.BorderLayout ; 59 import java.awt.event.ItemEvent ; 60 import java.awt.event.ItemListener ; 61 import java.util.EventObject ; 62 63 import javax.swing.JCheckBox ; 64 import javax.swing.JLabel ; 65 import javax.swing.JPanel ; 66 import javax.swing.JTextField ; 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 88 public class ProcedureTab extends JPanel implements ProcedureDisplayListener, 89 ExistingSelectionProcessor { 90 91 protected ProjectController eventController; 92 protected TextAdapter name; 93 protected TextAdapter schema; 94 protected JCheckBox 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 107 this.name = new TextAdapter(new JTextField ()) { 108 109 protected void updateModel(String text) { 110 setProcedureName(text); 111 } 112 }; 113 114 this.schema = new TextAdapter(new JTextField ()) { 115 116 protected void updateModel(String text) { 117 setSchema(text); 118 } 119 }; 120 121 this.returnsValue = new JCheckBox (); 122 123 JLabel returnValueHelp = CayenneWidgetFactory 124 .createLabel("(first parameter will be used as return value)"); 125 returnValueHelp.setFont(returnValueHelp.getFont().deriveFont(10)); 126 127 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 ()); 146 this.add(builder.getPanel(), BorderLayout.CENTER); 147 } 148 149 private void initController() { 150 returnsValue.addItemListener(new ItemListener () { 151 152 public void itemStateChanged(ItemEvent 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 e) { 167 ProcedureDisplayEvent pde = new ProcedureDisplayEvent( 168 this, 169 eventController.getCurrentProcedure(), 170 eventController.getCurrentDataMap(), 171 eventController.getCurrentDataDomain()); 172 eventController.fireProcedureDisplayEvent(pde); 173 } 174 175 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 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 ProcedureEvent e = new ProcedureEvent(this, procedure, procedure.getName()); 209 ProjectUtil.setProcedureName(procedure.getDataMap(), procedure, newName); 210 eventController.fireProcedureEvent(e); 211 } 212 else { 213 throw new ValidationException("There is another procedure with name '" 215 + newName 216 + "'."); 217 } 218 } 219 220 void setSchema(String 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 |