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 java.util.Collection ; 33 import javax.swing.event.DocumentEvent ; 34 import javax.swing.event.DocumentListener ; 35 36 import org.netbeans.modules.xml.schema.model.Element; 37 import org.netbeans.modules.xml.schema.model.LocalComplexType; 38 import org.netbeans.modules.xml.schema.model.LocalType; 39 import org.netbeans.modules.xml.schema.model.GlobalSimpleType; 40 import org.netbeans.modules.xml.schema.model.GlobalType; 41 import org.netbeans.modules.xml.schema.model.Sequence; 42 import org.netbeans.modules.xml.schema.model.SchemaComponent; 43 import org.netbeans.modules.xml.schema.model.SchemaComponentFactory; 44 import org.netbeans.modules.xml.schema.model.SchemaComponentReference; 45 import org.netbeans.modules.xml.schema.model.LocalSimpleType; 46 import org.netbeans.modules.xml.schema.model.SchemaModelFactory; 47 import org.netbeans.modules.xml.schema.model.SimpleTypeRestriction; 48 import org.netbeans.modules.xml.xam.dom.NamedComponentReference; 49 import org.netbeans.modules.xml.schema.ui.basic.editors.SchemaComponentSelectionPanel; 50 import org.netbeans.modules.xml.xam.ui.customizer.MessageDisplayer; 51 52 57 abstract class ElementCustomizer<T extends Element> 58 extends AbstractSchemaComponentCustomizer<T> 59 implements PropertyChangeListener { 60 61 static final long serialVersionUID = 1L; 62 63 66 public ElementCustomizer(SchemaComponentReference<T> reference, 67 SchemaComponent parent) { 68 super(reference, parent); 69 initComponents(); 70 reset(); 71 } 72 73 public void applyChanges() throws IOException { 74 saveName(); 75 if(_getType()!= getUIType() || _getStyle() != getUIStyle()) { 76 setModelType(); 77 } 78 } 79 80 public void reset() { 81 removeListeners(); 82 initializeModel(); 83 initializeUISelection(); 84 addListeners(); 85 if(hasParent()) { 86 setSaveEnabled(false); 87 } else { 88 setSaveEnabled(true); 89 } 90 setResetEnabled(false); 91 } 92 93 96 protected String _getName() { 97 String retValue = super._getName(); 98 return retValue==null?"":retValue; 99 } 100 101 104 private GlobalType _getType() { 105 return currentGlobalType; 106 } 107 108 111 private ElementTypeStyle _getStyle() { 112 return currentStyle; 113 } 114 115 118 protected void _setType(GlobalType type) { 119 currentGlobalType = type; 120 currentStyle = ElementTypeStyle.EXISTING; 121 } 122 123 126 protected void _setType(LocalType localType) { 127 currentGlobalType = null; 128 currentStyle = ElementTypeStyle.NO_TYPE; 129 if(localType instanceof LocalSimpleType) { 130 currentStyle = ElementTypeStyle.ANONYMOUS_SIMPLE; 131 } else if(localType instanceof LocalComplexType) { 132 currentStyle = ElementTypeStyle.ANONYMOUS_COMPLEX; 133 } 134 } 135 136 139 protected abstract void initializeModel(); 140 141 145 protected abstract void setModelType(); 146 147 150 private void selectModelNode() { 151 componentSelectionPanel.setInitialSelection(_getType()); 153 } 155 156 160 private void initializeTypeView() { 161 componentSelectionPanel = new SchemaComponentSelectionPanel<GlobalType>( 162 getReference().get().getModel(),GlobalType.class, null, null, true); 163 componentSelectionPanel.addPropertyChangeListener(this); 164 typePanel.add(componentSelectionPanel.getTypeSelectionPanel(), 165 java.awt.BorderLayout.CENTER); 166 componentSelectionPanel.getTypeSelectionPanel().getAccessibleContext(). 167 setAccessibleParent(typePanel); 168 } 169 170 private void initializeUISelection() { 171 getMessageDisplayer().clear(); 172 nameTextField.getDocument().removeDocumentListener(nameListener); 173 nameTextField.setText(_getName()); 174 if(!hasParent()) nameTextField.setSelectionStart(0); 175 nameTextField.getDocument().addDocumentListener(nameListener); 176 ElementTypeStyle style = _getStyle(); 177 ItemListener [] listeners; 178 switch(style) { 179 case NO_TYPE: 180 noTypeRadioButton.setSelected(true); 181 break; 182 case ANONYMOUS_COMPLEX: 183 anonymousComplexRadioButton.setSelected(true); 184 break; 185 case ANONYMOUS_SIMPLE: 186 anonymousSimpleRadioButton.setSelected(true); 187 break; 188 case EXISTING: 189 existingRadioButton.setSelected(true); 190 break; 191 } 192 enableDisableListView(); 193 if(style==ElementTypeStyle.EXISTING) { 194 selectModelNode(); 195 } 196 setPreviewText(); 197 } 198 199 protected LocalType createLocalType(SchemaComponentFactory factory, 200 ElementTypeStyle style, GlobalType reference) { 201 switch (style) { 202 case ANONYMOUS_COMPLEX : 203 LocalComplexType lct = factory.createLocalComplexType(); 204 Sequence sequence = factory.createSequence(); 205 lct.setDefinition(sequence); 206 return lct; 207 case ANONYMOUS_SIMPLE : 208 LocalSimpleType lst = factory.createLocalSimpleType(); 209 SimpleTypeRestriction str = factory.createSimpleTypeRestriction(); 210 str.setBase(ElementCustomizer.createStringTypeReference(factory,str)); 211 lst.setDefinition(str); 212 return lst; 213 } 214 return null; 215 } 216 217 222 protected String getUIName() { 223 return nameTextField.getText(); 224 } 225 226 231 protected GlobalType getUIType() { 232 ElementTypeStyle style = getUIStyle(); 233 if(style == ElementTypeStyle.NO_TYPE || 234 style == ElementTypeStyle.ANONYMOUS_COMPLEX || 235 style == ElementTypeStyle.ANONYMOUS_SIMPLE) { 236 return null; 237 } 238 return componentSelectionPanel.getCurrentSelection(); 239 } 240 241 245 protected ElementTypeStyle getUIStyle() { 246 if (noTypeRadioButton.isSelected()) 247 return ElementTypeStyle.NO_TYPE; 248 249 if (anonymousComplexRadioButton.isSelected()) 250 return ElementTypeStyle.ANONYMOUS_COMPLEX; 251 252 if (anonymousSimpleRadioButton.isSelected()) 253 return ElementTypeStyle.ANONYMOUS_SIMPLE; 254 255 if (existingRadioButton.isSelected()) 256 return ElementTypeStyle.EXISTING; 257 258 return null; 259 } 260 261 265 269 enum ElementTypeStyle { 270 NO_TYPE, ANONYMOUS_COMPLEX, ANONYMOUS_SIMPLE, EXISTING 271 } 272 273 279 private void initComponents() { 281 elementTypeButtonGroup = new javax.swing.ButtonGroup (); 282 previewLabel = new javax.swing.JLabel (); 283 jScrollPane1 = new javax.swing.JScrollPane (); 284 previewPane = new javax.swing.JEditorPane () { 285 static final long serialVersionUID = 1L; 286 protected void processMouseEvent(java.awt.event.MouseEvent e) { 288 e.consume(); 289 } 290 protected void processMouseMotionEvent(java.awt.event.MouseEvent e) { 291 e.consume(); 292 } 293 }; 294 typeLabel = new javax.swing.JLabel (); 295 anonymousComplexRadioButton = new javax.swing.JRadioButton (); 296 anonymousSimpleRadioButton = new javax.swing.JRadioButton (); 297 noTypeRadioButton = new javax.swing.JRadioButton (); 298 existingRadioButton = new javax.swing.JRadioButton (); 299 typePanel = new javax.swing.JPanel (); 300 mPanel = new javax.swing.JPanel (); 301 namePanel = new javax.swing.JPanel (); 302 nameLabel = new javax.swing.JLabel (); 303 nameTextField = new javax.swing.JTextField (); 304 305 previewLabel.setLabelFor(previewPane); 306 org.openide.awt.Mnemonics.setLocalizedText(previewLabel, org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "TITLE_CustomizerForm_Preview")); 307 previewLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "HINT_ElementForm_Preview")); 308 309 previewPane.setEditable(false); 310 previewPane.setContentType("text/xml"); 311 previewPane.setEnabled(false); 312 jScrollPane1.setViewportView(previewPane); 313 314 org.openide.awt.Mnemonics.setLocalizedText(typeLabel, org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "LBL_CustomizerForm_Type", new Object [] {})); 315 typeLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "HINT_ElementForm_Type")); 316 317 elementTypeButtonGroup.add(anonymousComplexRadioButton); 318 org.openide.awt.Mnemonics.setLocalizedText(anonymousComplexRadioButton, org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "LBL_ElementForm_AnonComplexType")); 319 anonymousComplexRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "HINT_ElementForm_ComplexType")); 320 anonymousComplexRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); 321 anonymousComplexRadioButton.setMargin(new java.awt.Insets (0, 0, 0, 0)); 322 323 elementTypeButtonGroup.add(anonymousSimpleRadioButton); 324 org.openide.awt.Mnemonics.setLocalizedText(anonymousSimpleRadioButton, org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "LBL_ElementForm_AnonSimpleType")); 325 anonymousSimpleRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "HINT_ElementForm_SimpleType")); 326 anonymousSimpleRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); 327 anonymousSimpleRadioButton.setMargin(new java.awt.Insets (0, 0, 0, 0)); 328 329 elementTypeButtonGroup.add(noTypeRadioButton); 330 org.openide.awt.Mnemonics.setLocalizedText(noTypeRadioButton, org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "LBL_ElementForm_NoType")); 331 noTypeRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "HINT_ElementForm_NoType")); 332 noTypeRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); 333 noTypeRadioButton.setMargin(new java.awt.Insets (0, 0, 0, 0)); 334 335 elementTypeButtonGroup.add(existingRadioButton); 336 org.openide.awt.Mnemonics.setLocalizedText(existingRadioButton, org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "LBL_ElementForm_ExistingType")); 337 existingRadioButton.setToolTipText(org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "HINT_ElementForm_ExistingType")); 338 existingRadioButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); 339 existingRadioButton.setMargin(new java.awt.Insets (0, 0, 0, 0)); 340 341 typePanel.setLayout(new java.awt.BorderLayout ()); 342 343 initializeTypeView(); 344 345 mPanel.setLayout(new java.awt.BorderLayout ()); 346 347 mPanel.add(getMessageDisplayer().getComponent(),java.awt.BorderLayout.CENTER); 348 349 nameLabel.setLabelFor(nameTextField); 350 org.openide.awt.Mnemonics.setLocalizedText(nameLabel, org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "LBL_CustomizerForm_Name")); 351 nameLabel.setToolTipText(org.openide.util.NbBundle.getMessage(ElementCustomizer.class, "HINT_ElementForm_Name")); 352 353 nameTextField.setEditable(!hasParent()); 354 355 org.jdesktop.layout.GroupLayout namePanelLayout = new org.jdesktop.layout.GroupLayout(namePanel); 356 namePanel.setLayout(namePanelLayout); 357 namePanelLayout.setHorizontalGroup( 358 namePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 359 .add(namePanelLayout.createSequentialGroup() 360 .addContainerGap() 361 .add(nameLabel) 362 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 363 .add(nameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 445, Short.MAX_VALUE) 364 .addContainerGap()) 365 ); 366 namePanelLayout.setVerticalGroup( 367 namePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 368 .add(namePanelLayout.createSequentialGroup() 369 .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 370 .add(namePanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) 371 .add(nameLabel) 372 .add(nameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) 373 ); 374 375 org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this); 376 this.setLayout(layout); 377 layout.setHorizontalGroup( 378 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 379 .add(layout.createSequentialGroup() 380 .addContainerGap() 381 .add(typeLabel) 382 .addContainerGap(462, Short.MAX_VALUE)) 383 .add(namePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 384 .add(layout.createSequentialGroup() 385 .addContainerGap() 386 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 387 .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) 388 .add(previewLabel) 389 .add(layout.createSequentialGroup() 390 .add(11, 11, 11) 391 .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 392 .add(anonymousSimpleRadioButton) 393 .add(anonymousComplexRadioButton) 394 .add(noTypeRadioButton) 395 .add(existingRadioButton)))) 396 .addContainerGap()) 397 .add(layout.createSequentialGroup() 398 .add(38, 38, 38) 399 .add(typePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 452, Short.MAX_VALUE) 400 .addContainerGap()) 401 .add(mPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE) 402 ); 403 layout.setVerticalGroup( 404 layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) 405 .add(layout.createSequentialGroup() 406 .add(namePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) 407 .add(11, 11, 11) 408 .add(typeLabel) 409 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 410 .add(anonymousComplexRadioButton) 411 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 412 .add(anonymousSimpleRadioButton) 413 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 414 .add(noTypeRadioButton) 415 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 416 .add(existingRadioButton) 417 .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) 418 .add(typePanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 217, Short.MAX_VALUE) 419 .add(11, 11, 11) 420 .add(previewLabel) 421 .add(5, 5, 5) 422 .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 97, Short.MAX_VALUE) 423 .add(0, 0, 0) 424 .add(mPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 60, Short.MAX_VALUE)) 425 ); 426 } 428 434 public void propertyChange(PropertyChangeEvent event) { 435 if (event.getPropertyName().equals(SchemaComponentSelectionPanel.PROPERTY_SELECTION)) { 436 setPreviewText(); 437 determineValidity(); 438 } 439 } 440 441 private void enableDisableListView() { 442 switch (getUIStyle()) { 443 case NO_TYPE: 444 case ANONYMOUS_COMPLEX: 445 case ANONYMOUS_SIMPLE: 446 componentSelectionPanel.setEnabled(false); 447 break; 448 case EXISTING: 449 componentSelectionPanel.setEnabled(true); 450 break; 451 } 452 } 453 454 455 459 private void determineValidity() { 460 getMessageDisplayer().clear(); 461 if(!isNameChanged() && 462 _getStyle() == getUIStyle() && 463 _getType() == getUIType()) { 464 if(hasParent()) { 465 setSaveEnabled(false); 466 } else { 467 setSaveEnabled(true); 468 } 469 setResetEnabled(false); 470 } else { 471 setResetEnabled(true); 472 boolean valid = false; 473 ElementTypeStyle style = getUIStyle(); 474 if(style == ElementTypeStyle.NO_TYPE || 475 style == ElementTypeStyle.ANONYMOUS_COMPLEX || 476 style == ElementTypeStyle.ANONYMOUS_SIMPLE) { 477 valid = true; 478 } else if (getUIType()!=null) { 479 valid = true; 480 } 481 setSaveEnabled(valid && (!isNameChanged() || isNameValid())); 482 if(!valid) 483 getMessageDisplayer().annotate(org.openide.util.NbBundle. 484 getMessage(ElementCustomizer.class, 485 "MSG_Type_Error"), 486 MessageDisplayer.Type.ERROR); 487 } 488 } 489 490 private void addListeners() { 491 if (nameListener == null) { 492 nameListener = new DocumentListener () { 493 public void changedUpdate(DocumentEvent e) { 494 setPreviewText(); 495 determineValidity(); 496 } 497 public void insertUpdate(DocumentEvent e) { 498 setPreviewText(); 499 determineValidity(); 500 } 501 public void removeUpdate(DocumentEvent e) { 502 setPreviewText(); 503 determineValidity(); 504 } 505 }; 506 } 507 nameTextField.getDocument().addDocumentListener(nameListener); 508 if(typeButtonsListener == null) { 509 typeButtonsListener = new ItemListener () { 510 public void itemStateChanged(java.awt.event.ItemEvent evt) { 511 if (evt.getStateChange() == java.awt.event.ItemEvent.SELECTED) { 512 enableDisableListView(); 513 setPreviewText(); 514 determineValidity(); 515 } 516 } 517 }; 518 } 519 noTypeRadioButton.addItemListener(typeButtonsListener); 520 anonymousComplexRadioButton.addItemListener(typeButtonsListener); 521 anonymousSimpleRadioButton.addItemListener(typeButtonsListener); 522 existingRadioButton.addItemListener(typeButtonsListener); 523 } 524 525 private void removeListeners() { 526 nameTextField.getDocument().removeDocumentListener(nameListener); 527 noTypeRadioButton.removeItemListener(typeButtonsListener); 528 anonymousComplexRadioButton.removeItemListener(typeButtonsListener); 529 anonymousSimpleRadioButton.removeItemListener(typeButtonsListener); 530 existingRadioButton.removeItemListener(typeButtonsListener); 531 } 532 533 534 private void setPreviewText() { 535 StringBuffer retValue = new StringBuffer ("<"); 536 String prefix = getReference().get().getPeer().getPrefix(); 537 if(prefix!=null) retValue.append(prefix+":"); 538 retValue.append("element name=\""); 539 retValue.append(getUIName()); 540 retValue.append("\""); 541 switch(getUIStyle()) { 542 case NO_TYPE: 543 retValue.append(">"); 544 break; 545 case EXISTING: 546 retValue.append(" type=\""); 547 GlobalType gt = getUIType(); 548 if(gt!=null) { 549 retValue.append(gt.getName()); 550 } 551 retValue.append("\">"); 552 break; 553 case ANONYMOUS_COMPLEX: 554 retValue.append(">"); 555 retValue.append("\n <"); 556 if(prefix!=null) retValue.append(prefix+":"); 557 retValue.append("complexType>"); 558 retValue.append("\n <"); 559 if(prefix!=null) retValue.append(prefix+":"); 560 retValue.append("sequence/>"); 561 retValue.append("\n </"); 562 if(prefix!=null) retValue.append(prefix+":"); 563 retValue.append("complexType>"); 564 break; 565 case ANONYMOUS_SIMPLE: 566 retValue.append(">"); 567 retValue.append("\n <"); 568 if(prefix!=null) retValue.append(prefix+":"); 569 retValue.append("simpleType>"); 570 retValue.append("\n <"); 571 if(prefix!=null) retValue.append(prefix+":"); 572 retValue.append("restriction base=\""); 573 if(prefix!=null) retValue.append(prefix+":"); 574 retValue.append("string\"/>"); 575 retValue.append("\n </"); 576 if(prefix!=null) retValue.append(prefix+":"); 577 retValue.append("simpleType>"); 578 break; 579 } 580 retValue.append("\n</"); 581 if(prefix!=null) retValue.append(prefix+":"); 582 retValue.append("element>\n"); 583 previewPane.setText(retValue.toString()); 584 } 585 586 public javax.swing.JRadioButton anonymousComplexRadioButton; 588 public javax.swing.JRadioButton anonymousSimpleRadioButton; 589 public javax.swing.ButtonGroup elementTypeButtonGroup; 590 public javax.swing.JRadioButton existingRadioButton; 591 public javax.swing.JScrollPane jScrollPane1; 592 public javax.swing.JPanel mPanel; 593 public javax.swing.JLabel nameLabel; 594 public javax.swing.JPanel namePanel; 595 public javax.swing.JTextField nameTextField; 596 public javax.swing.JRadioButton noTypeRadioButton; 597 public javax.swing.JLabel previewLabel; 598 public javax.swing.JEditorPane previewPane; 599 public javax.swing.JLabel typeLabel; 600 public javax.swing.JPanel typePanel; 601 603 static NamedComponentReference<GlobalSimpleType> 605 createStringTypeReference(SchemaComponentFactory factory, 606 SchemaComponent component) { 607 Collection <GlobalSimpleType> types = SchemaModelFactory.getDefault(). 608 getPrimitiveTypesModel().getSchema().getSimpleTypes(); 609 for (GlobalSimpleType type : types) { 610 if (type.getName().equals("string")) { 611 return factory.createGlobalReference(type, 612 GlobalSimpleType.class, component); 613 } 614 } 615 return null; 616 } 617 618 private DocumentListener nameListener; 619 private ItemListener typeButtonsListener; 620 private transient ElementTypeStyle currentStyle; 621 private transient GlobalType currentGlobalType; 622 private transient SchemaComponentSelectionPanel<GlobalType> 623 componentSelectionPanel; 624 } 625 | Popular Tags |