1 19 20 25 26 package org.netbeans.modules.xml.schema.ui.nodes.categorized.customizer; 27 28 import java.io.IOException ; 29 import java.awt.event.ItemListener ; 30 import java.beans.PropertyChangeEvent ; 31 import java.beans.PropertyChangeListener ; 32 import javax.swing.event.DocumentEvent ; 33 import javax.swing.event.DocumentListener ; 34 import org.netbeans.modules.xml.schema.model.SimpleType; 36 import org.netbeans.modules.xml.schema.model.Attribute; 37 import org.netbeans.modules.xml.schema.model.SimpleTypeRestriction; 38 import org.netbeans.modules.xml.schema.model.LocalSimpleType; 39 import org.netbeans.modules.xml.schema.model.GlobalSimpleType; 40 import org.netbeans.modules.xml.schema.model.SchemaComponent; 41 import org.netbeans.modules.xml.schema.model.SchemaComponentFactory; 42 import org.netbeans.modules.xml.schema.model.SchemaComponentReference; 43 import org.netbeans.modules.xml.schema.ui.basic.editors.SchemaComponentSelectionPanel; 44 import org.netbeans.modules.xml.xam.ui.customizer.MessageDisplayer; 45 46 51 abstract class AttributeCustomizer<T extends Attribute> 52 extends AbstractSchemaComponentCustomizer<T> 53 implements PropertyChangeListener { 54 55 static final long serialVersionUID = 1L; 56 57 60 public AttributeCustomizer(SchemaComponentReference<T> reference, 61 SchemaComponent parent, GlobalSimpleType currentGlobalSimpleType) { 62 super(reference, parent); 63 this.currentGlobalSimpleType = currentGlobalSimpleType; 64 initComponents(); 65 reset(); 66 } 67 68 public void applyChanges() throws IOException { 69 saveName(); 70 if(_getType()!= getUIType() || _getStyle() != getUIStyle()) { 71 setModelType(); 72 } 73 } 74 75 public void reset() { 76 removeListeners(); 77 initializeModel(); 78 initializeUISelection(); 79 addListeners(); 80 if(hasParent()) { 81 setSaveEnabled(false); 82 } else { 83 setSaveEnabled(true); 84 } 85 setResetEnabled(false); 86 } 87 88 91 protected String _getName() { 92 String retValue = super._getName(); 93 return retValue==null?"":retValue; 94 } 95 96 99 protected GlobalSimpleType _getType() { 100 return currentGlobalSimpleType; 101 } 102 103 106 private AttributeTypeStyle _getStyle() { 107 return currentStyle; 108 } 109 110 113 protected void _setType(SimpleType simpleType) { 114 if(simpleType instanceof GlobalSimpleType) { 115 currentGlobalSimpleType = (GlobalSimpleType)simpleType; 116 currentStyle = AttributeTypeStyle.EXISTING; 117 } else if(simpleType instanceof LocalSimpleType) { 118 currentStyle = AttributeTypeStyle.ANONYMOUS; 119 } 120 } 121 122 125 protected abstract void initializeModel(); 126 127 131 protected abstract void setModelType(); 132 133 136 private void selectModelNode() { 137 componentSelectionPanel.setInitialSelection(_getType()); 138 } 139 140 144 private void initializeTypeView() { 145 componentSelectionPanel = new SchemaComponentSelectionPanel<GlobalSimpleType>( 146 getReference().get().getModel(),GlobalSimpleType.class, 147 null, null, true); 148 componentSelectionPanel.addPropertyChangeListener(this); 149 typePanel.add(componentSelectionPanel.getTypeSelectionPanel(), 150 java.awt.BorderLayout.CENTER); 151 componentSelectionPanel.getTypeSelectionPanel().getAccessibleContext(). 152 setAccessibleParent(typePanel); 153 } 154 155 private void initializeUISelection() { 156 getMessageDisplayer().clear(); 157 nameTextField.getDocument().removeDocumentListener(nameListener); 158 nameTextField.setText(_getName()); 159 if(!hasParent()) nameTextField.setSelectionStart(0); 160 nameTextField.getDocument().addDocumentListener(nameListener); 161 AttributeTypeStyle style = _getStyle(); 162 ItemListener [] listeners; 163 if(style==AttributeTypeStyle.ANONYMOUS) { 164 anonymousSimpleRadioButton.setSelected(true); 165 } else if(style==AttributeTypeStyle.EXISTING) { 166 existingRadioButton.setSelected(true); 167 } 168 enableDisableListView(); 169 if(style!=AttributeTypeStyle.ANONYMOUS) { 170 selectModelNode(); 171 } 172 setPreviewText(); 173 } 174 175 protected LocalSimpleType createLocalType() { 176 SchemaComponentFactory factory = getReference().get().getModel().getFactory(); 177 GlobalSimpleType reference = getUIType(); 178 LocalSimpleType lst = factory.createLocalSimpleType(); 179 SimpleTypeRestriction str = factory.createSimpleTypeRestriction(); 180 str.setBase(ElementCustomizer.createStringTypeReference(factory,str)); 181 lst.setDefinition(str); 182 return lst; 183 } 184 185 190 protected String getUIName() { 191 return nameTextField.getText(); 192 } 193 194 199 protected GlobalSimpleType getUIType() { 200 AttributeTypeStyle style = getUIStyle(); 201 if(style == AttributeTypeStyle.ANONYMOUS) { 202 return null; 203 } 204 return componentSelectionPanel.getCurrentSelection(); 205 } 206 207 211 protected AttributeTypeStyle getUIStyle() { 212 if (anonymousSimpleRadioButton.isSelected()) 213 return AttributeTypeStyle.ANONYMOUS; 214 215 if (existingRadioButton.isSelected()) 216 return AttributeTypeStyle.EXISTING; 217 218 return null; 219 } 220 221 225 229 enum AttributeTypeStyle { 230 ANONYMOUS, EXISTING, 231 } 232 233 239 private void initComponents() { 241 elementTypeButtonGroup = new javax.swing.ButtonGroup (); 242 previewLabel = new javax.swing.JLabel (); 243 jScrollPane1 = new javax.swing.JScrollPane (); 244 previewPane = new javax.swing.JEditorPane () { 245 static final long serialVersionUID = 1L; 246 protected void processMouseEvent(java.awt.event.MouseEvent e) { 248 e.consume(); 249 } 250 protected void processMouseMotionEvent(java.awt.event.MouseEvent e) { 251 e.consume(); 252 } 253 }; 254 typeLabel = new javax.swing.JLabel (); 255 anonymousSimpleRadioButton = new javax.swing.JRadioButton (); 256 existingRadioButton = new javax.swing.JRadioButton (); 257 typePanel = new javax.swing.JPanel (); 258 mPanel = new javax.swing.JPanel (); 259 namePanel = new javax.swing.JPanel (); 260 nameLabel = new javax.swing.JLabel (); 261 nameTextField = new javax.swing.JTextField (); 262 263 previewLabel.setLabelFor(previewPane); 264 org.openide.awt.Mnemonics.setLocalizedText(previewLabel, org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "TITLE_CustomizerForm_Preview")); 265 previewLabel.setToolTipText(org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "HINT_AttributeForm_Preview")); 266 267 previewPane.setEditable(false); 268 previewPane.setContentType("text/xml"); 269 previewPane.setEnabled(false); 270 jScrollPane1.setViewportView(previewPane); 271 272 org.openide.awt.Mnemonics.setLocalizedText(typeLabel, org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "LBL_CustomizerForm_Type", new Object [] {})); 273 typeLabel.setToolTipText(org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "HINT_AttributeForm_Type")); 274 275 elementTypeButtonGroup.add(anonymousSimpleRadioButton); 276 org.openide.awt.Mnemonics.setLocalizedText(anonymousSimpleRadioButton, org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "LBL_AttributeForm_AnonType")); 277 anonymousSimpleRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "HINT_AttributeForm_AnonType")); 278 anonymousSimpleRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); 279 anonymousSimpleRadioButton.setMargin(new java.awt.Insets (0, 0, 0, 0)); 280 281 elementTypeButtonGroup.add(existingRadioButton); 282 org.openide.awt.Mnemonics.setLocalizedText(existingRadioButton, org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "LBL_AttributeForm_ExistingType")); 283 existingRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "HINT_AttributeForm_ExistingType")); 284 existingRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); 285 existingRadioButton.setMargin(new java.awt.Insets (0, 0, 0, 0)); 286 287 typePanel.setLayout(new java.awt.BorderLayout ()); 288 289 initializeTypeView(); 290 291 mPanel.setLayout(new java.awt.BorderLayout ()); 292 293 mPanel.add(getMessageDisplayer().getComponent(),java.awt.BorderLayout.CENTER); 294 295 nameLabel.setLabelFor(nameTextField); 296 org.openide.awt.Mnemonics.setLocalizedText(nameLabel, org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "LBL_CustomizerForm_Name")); 297 nameLabel.setToolTipText(org.openide.util.NbBundle.getMessage(AttributeCustomizer.class, "HINT_AttributeForm_Name")); 298 299 nameTextField.setEditable(!hasParent()); 300 301 org.jdesktop.layout.GroupLayout namePanelLayout = new org.jdesktop.layout.GroupLayout(namePanel); 302 namePanel.setLayout(namePanelLayout); 303 namePanelLayout.setHorizontalGroup( 304 namePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 305 .add(namePanelLayout.createSequentialGroup() 306 .addContainerGap() 307 .add(nameLabel) 308 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 309 .add(nameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 445, Short.MAX_VALUE) 310 .addContainerGap()) 311 ); 312 namePanelLayout.setVerticalGroup( 313 namePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 314 .add(namePanelLayout.createSequentialGroup() 315 .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 316 .add(namePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) 317 .add(nameLabel) 318 .add(nameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) 319 ); 320 321 org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); 322 this.setLayout(layout); 323 layout.setHorizontalGroup( 324 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 325 .add(layout.createSequentialGroup() 326 .addContainerGap() 327 .add(typeLabel) 328 .addContainerGap(462, Short.MAX_VALUE)) 329 .add(namePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 330 .add(org.jdesktop.layout.GroupLayout.TRAILING, mPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE) 331 .add(layout.createSequentialGroup() 332 .addContainerGap() 333 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 334 .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) 335 .add(previewLabel) 336 .add(layout.createSequentialGroup() 337 .add(11, 11, 11) 338 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 339 .add(existingRadioButton) 340 .add(anonymousSimpleRadioButton)))) 341 .addContainerGap()) 342 .add(layout.createSequentialGroup() 343 .add(38, 38, 38) 344 .add(typePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 452, Short.MAX_VALUE) 345 .addContainerGap()) 346 ); 347 layout.setVerticalGroup( 348 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 349 .add(layout.createSequentialGroup() 350 .add(namePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) 351 .add(11, 11, 11) 352 .add(typeLabel) 353 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 354 .add(anonymousSimpleRadioButton) 355 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 356 .add(existingRadioButton) 357 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 358 .add(typePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 256, Short.MAX_VALUE) 359 .add(11, 11, 11) 360 .add(previewLabel) 361 .add(5, 5, 5) 362 .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE) 363 .add(0, 0, 0) 364 .add(mPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE)) 365 ); 366 } 368 374 public void propertyChange(PropertyChangeEvent event) { 375 if (event.getPropertyName().equals(SchemaComponentSelectionPanel.PROPERTY_SELECTION)) { 376 setPreviewText(); 377 determineValidity(); 378 } 379 } 380 381 private void enableDisableListView() { 382 if(getUIStyle()==AttributeTypeStyle.EXISTING) { 383 componentSelectionPanel.setEnabled(true); 384 } else { 385 componentSelectionPanel.setEnabled(false); 386 } 387 } 388 389 393 private void determineValidity() { 394 getMessageDisplayer().clear(); 395 if(!isNameChanged() && 396 _getStyle() == getUIStyle() && 397 _getType() == getUIType()) { 398 if(hasParent()) { 399 setSaveEnabled(false); 400 } else { 401 setSaveEnabled(true); 402 } 403 setResetEnabled(false); 404 } else { 405 setResetEnabled(true); 406 boolean valid = false; 407 AttributeTypeStyle style = getUIStyle(); 408 if(style == AttributeTypeStyle.ANONYMOUS) { 409 valid = true; 410 } else if (getUIType()!=null) { 411 valid = true; 412 } 413 setSaveEnabled(valid && (!isNameChanged() || isNameValid())); 414 if(!valid) 415 getMessageDisplayer().annotate(org.openide.util.NbBundle. 416 getMessage(AttributeCustomizer.class, 417 "MSG_Type_Error"), 418 MessageDisplayer.Type.ERROR); 419 } 420 } 421 422 private void addListeners() { 423 if (nameListener == null) { 424 nameListener = new DocumentListener () { 425 public void changedUpdate(DocumentEvent e) { 426 setPreviewText(); 427 determineValidity(); 428 } 429 public void insertUpdate(DocumentEvent e) { 430 setPreviewText(); 431 determineValidity(); 432 } 433 public void removeUpdate(DocumentEvent e) { 434 setPreviewText(); 435 determineValidity(); 436 } 437 }; 438 } 439 nameTextField.getDocument().addDocumentListener(nameListener); 440 if(typeButtonsListener == null) { 441 typeButtonsListener = new ItemListener () { 442 public void itemStateChanged(java.awt.event.ItemEvent evt) { 443 if (evt.getStateChange() == java.awt.event.ItemEvent.SELECTED) { 444 enableDisableListView(); 445 setPreviewText(); 446 determineValidity(); 447 } 448 } 449 }; 450 } 451 anonymousSimpleRadioButton.addItemListener(typeButtonsListener); 452 existingRadioButton.addItemListener(typeButtonsListener); 453 } 454 455 private void removeListeners() { 456 nameTextField.getDocument().removeDocumentListener(nameListener); 457 anonymousSimpleRadioButton.removeItemListener(typeButtonsListener); 458 existingRadioButton.removeItemListener(typeButtonsListener); 459 } 460 461 private void setPreviewText() { 462 StringBuffer retValue = new StringBuffer ("<"); 463 String prefix = getReference().get().getPeer().getPrefix(); 464 if(prefix!=null) retValue.append(prefix+":"); 465 retValue.append("attribute name=\""); 466 retValue.append(getUIName()); 467 retValue.append("\""); 468 AttributeTypeStyle style = getUIStyle(); 469 if(style==AttributeTypeStyle.EXISTING) { 470 retValue.append(" type=\""); 471 GlobalSimpleType gt = getUIType(); 472 if(gt!=null) { 473 retValue.append(gt.getName()); 474 } 475 retValue.append("\">"); 476 } else if(style==AttributeTypeStyle.ANONYMOUS) { 477 retValue.append(">"); 478 retValue.append("\n <"); 479 if(prefix!=null) retValue.append(prefix+":"); 480 retValue.append("simpleType>"); 481 retValue.append("\n <"); 482 if(prefix!=null) retValue.append(prefix+":"); 483 retValue.append("restriction base=\""); 484 if(prefix!=null) retValue.append(prefix+":"); 485 retValue.append("string\"/>"); 486 retValue.append("\n </"); 487 if(prefix!=null) retValue.append(prefix+":"); 488 retValue.append("simpleType>"); 489 } 490 retValue.append("\n</"); 491 if(prefix!=null) retValue.append(prefix+":"); 492 retValue.append("attribute>\n"); 493 previewPane.setText(retValue.toString()); 494 } 495 496 public javax.swing.JRadioButton anonymousSimpleRadioButton; 498 public javax.swing.ButtonGroup elementTypeButtonGroup; 499 public javax.swing.JRadioButton existingRadioButton; 500 public javax.swing.JScrollPane jScrollPane1; 501 public javax.swing.JPanel mPanel; 502 public javax.swing.JLabel nameLabel; 503 public javax.swing.JPanel namePanel; 504 public javax.swing.JTextField nameTextField; 505 public javax.swing.JLabel previewLabel; 506 public javax.swing.JEditorPane previewPane; 507 public javax.swing.JLabel typeLabel; 508 public javax.swing.JPanel typePanel; 509 511 private DocumentListener nameListener; 512 private ItemListener typeButtonsListener; 513 private transient AttributeTypeStyle currentStyle; 514 private transient GlobalSimpleType currentGlobalSimpleType; 515 private transient SchemaComponentSelectionPanel<GlobalSimpleType> 516 componentSelectionPanel; 517 518 } 519 | Popular Tags |