KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > schema > ui > nodes > categorized > customizer > AttributeCustomizer


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 /*
21  * AttributeCustomizer.java
22  *
23  * Created on January 17, 2006, 10:26 PM
24  */

25
26 package org.netbeans.modules.xml.schema.ui.nodes.categorized.customizer;
27
28 import java.io.IOException JavaDoc;
29 import java.awt.event.ItemListener JavaDoc;
30 import java.beans.PropertyChangeEvent JavaDoc;
31 import java.beans.PropertyChangeListener JavaDoc;
32 import javax.swing.event.DocumentEvent JavaDoc;
33 import javax.swing.event.DocumentListener JavaDoc;
34 //local imports
35
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 /**
47  * Attribute customizer
48  *
49  * @author Ajit Bhate
50  */

51 abstract class AttributeCustomizer<T extends Attribute>
52         extends AbstractSchemaComponentCustomizer<T>
53         implements PropertyChangeListener JavaDoc {
54     
55     static final long serialVersionUID = 1L;
56     
57     /**
58      * Creates new form AttributeCustomizer
59      */

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 JavaDoc {
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     /**
89      * Returns current name of the element
90      */

91     protected String JavaDoc _getName() {
92         String JavaDoc retValue = super._getName();
93         return retValue==null?"":retValue;
94     }
95     
96     /**
97      * Returns current type of the element
98      */

99     protected GlobalSimpleType _getType() {
100         return currentGlobalSimpleType;
101     }
102     
103     /**
104      * Returns current style of the element
105      */

106     private AttributeTypeStyle _getStyle() {
107         return currentStyle;
108     }
109     
110     /**
111      * extracts type and style from type and initializes type and style variables
112      */

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     /**
123      * initializes non ui elements
124      */

125     protected abstract void initializeModel();
126     
127     /**
128      * Changes the type of element
129      *
130      */

131     protected abstract void setModelType();
132     
133     /**
134      * selects model node on ui
135      */

136     private void selectModelNode() {
137         componentSelectionPanel.setInitialSelection(_getType());
138     }
139     
140     /**
141      *
142      *
143      */

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 JavaDoc[] 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     /**
186      * Retrieve the selected name from the UI.
187      *
188      * @return name from UI(nameTextField).
189      */

190     protected String JavaDoc getUIName() {
191         return nameTextField.getText();
192     }
193     
194     /**
195      * Retrieve the selected type from the UI.
196      *
197      * @return global type from UI, either simple or complex.
198      */

199     protected GlobalSimpleType getUIType() {
200         AttributeTypeStyle style = getUIStyle();
201         if(style == AttributeTypeStyle.ANONYMOUS) {
202             return null;
203         }
204         return componentSelectionPanel.getCurrentSelection();
205     }
206     
207     /**
208      * Retrieve the selected style from the UI.
209      *
210      */

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     ////////////////////////////////////////////////////////////////////////////
222
// Enum
223
////////////////////////////////////////////////////////////////////////////
224

225     /**
226      *
227      *
228      */

229     enum AttributeTypeStyle {
230         ANONYMOUS, EXISTING,
231     }
232     
233     /**
234      * This method is called from within the constructor to
235      * initializeTypeView the form.
236      * WARNING: Do NOT modify this code. The content of this method is
237      * always regenerated by the Form Editor.
238      */

239     // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
240
private void initComponents() {
241         elementTypeButtonGroup = new javax.swing.ButtonGroup JavaDoc();
242         previewLabel = new javax.swing.JLabel JavaDoc();
243         jScrollPane1 = new javax.swing.JScrollPane JavaDoc();
244         previewPane = new javax.swing.JEditorPane JavaDoc() {
245             static final long serialVersionUID = 1L;
246             // disable mouse and mouse motion events
247
protected void processMouseEvent(java.awt.event.MouseEvent JavaDoc e) {
248                 e.consume();
249             }
250             protected void processMouseMotionEvent(java.awt.event.MouseEvent JavaDoc e) {
251                 e.consume();
252             }
253         };
254         typeLabel = new javax.swing.JLabel JavaDoc();
255         anonymousSimpleRadioButton = new javax.swing.JRadioButton JavaDoc();
256         existingRadioButton = new javax.swing.JRadioButton JavaDoc();
257         typePanel = new javax.swing.JPanel JavaDoc();
258         mPanel = new javax.swing.JPanel JavaDoc();
259         namePanel = new javax.swing.JPanel JavaDoc();
260         nameLabel = new javax.swing.JLabel JavaDoc();
261         nameTextField = new javax.swing.JTextField JavaDoc();
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 JavaDoc[] {}));
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 JavaDoc(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 JavaDoc(0, 0, 0, 0));
286
287         typePanel.setLayout(new java.awt.BorderLayout JavaDoc());
288
289         initializeTypeView();
290
291         mPanel.setLayout(new java.awt.BorderLayout JavaDoc());
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     }// </editor-fold>//GEN-END:initComponents
367

368     ////////////////////////
369
// event handling
370
////////////////////////
371
/**
372      * Since it implements PCL.
373      */

374     public void propertyChange(PropertyChangeEvent JavaDoc 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     /**
390      * Based on the current radio button status and node selections, decide
391      * if we are in a valid state for accepting the user's input.
392      */

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 JavaDoc() {
425                 public void changedUpdate(DocumentEvent JavaDoc e) {
426                     setPreviewText();
427                     determineValidity();
428                 }
429                 public void insertUpdate(DocumentEvent JavaDoc e) {
430                     setPreviewText();
431                     determineValidity();
432                 }
433                 public void removeUpdate(DocumentEvent JavaDoc e) {
434                     setPreviewText();
435                     determineValidity();
436                 }
437             };
438         }
439         nameTextField.getDocument().addDocumentListener(nameListener);
440         if(typeButtonsListener == null) {
441             typeButtonsListener = new ItemListener JavaDoc() {
442                 public void itemStateChanged(java.awt.event.ItemEvent JavaDoc 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 JavaDoc retValue = new StringBuffer JavaDoc("<");
463         String JavaDoc 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     // Variables declaration - do not modify//GEN-BEGIN:variables
497
public javax.swing.JRadioButton JavaDoc anonymousSimpleRadioButton;
498     public javax.swing.ButtonGroup JavaDoc elementTypeButtonGroup;
499     public javax.swing.JRadioButton JavaDoc existingRadioButton;
500     public javax.swing.JScrollPane JavaDoc jScrollPane1;
501     public javax.swing.JPanel JavaDoc mPanel;
502     public javax.swing.JLabel JavaDoc nameLabel;
503     public javax.swing.JPanel JavaDoc namePanel;
504     public javax.swing.JTextField JavaDoc nameTextField;
505     public javax.swing.JLabel JavaDoc previewLabel;
506     public javax.swing.JEditorPane JavaDoc previewPane;
507     public javax.swing.JLabel JavaDoc typeLabel;
508     public javax.swing.JPanel JavaDoc typePanel;
509     // End of variables declaration//GEN-END:variables
510

511     private DocumentListener JavaDoc nameListener;
512     private ItemListener JavaDoc typeButtonsListener;
513     private transient AttributeTypeStyle currentStyle;
514     private transient GlobalSimpleType currentGlobalSimpleType;
515     private transient SchemaComponentSelectionPanel<GlobalSimpleType>
516             componentSelectionPanel;
517     
518 }
519
Popular Tags