KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > schema > abe > wizard > SchemaTransformPatternSelection


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 package org.netbeans.modules.xml.schema.abe.wizard;
21
22 import java.awt.Component JavaDoc;
23 import java.util.HashMap JavaDoc;
24 import java.util.HashSet JavaDoc;
25 import java.util.Iterator JavaDoc;
26 import java.util.List JavaDoc;
27 import java.util.Set JavaDoc;
28 import javax.swing.event.ChangeEvent JavaDoc;
29 import javax.swing.event.ChangeListener JavaDoc;
30 import org.netbeans.modules.xml.axi.AXIModel;
31 import org.netbeans.modules.xml.axi.AXIModelFactory;
32 import org.netbeans.modules.xml.axi.Element;
33 import org.netbeans.modules.xml.axi.SchemaGenerator;
34 import org.netbeans.modules.xml.axi.SchemaGeneratorFactory;
35 import org.netbeans.modules.xml.schema.model.SchemaModel;
36 import org.openide.WizardDescriptor;
37 import org.openide.util.HelpCtx;
38 import org.openide.util.NbBundle;
39 import org.openide.util.RequestProcessor;
40
41 public class SchemaTransformPatternSelection implements WizardDescriptor.Panel, ChangeListener JavaDoc {
42     private static final long serialVersionUID = 1L;
43     
44     SchemaGenerator.Pattern inferedPattern;
45     
46     RequestProcessor.Task transformTask = null;
47     
48     //a cache to store previous hints
49
HashMap JavaDoc<SchemaGenerator.Pattern,SchemaGeneratorFactory.TransformHint> hintMap =
50             new HashMap JavaDoc<SchemaGenerator.Pattern,SchemaGeneratorFactory.TransformHint>();
51     
52     List JavaDoc<Element> ges = null;
53     
54     /**
55      * The visual component that displays this panel. If you need to access the
56      * component from this class, just use getComponent().
57      */

58     private SchemaTransformPatternSelectionUI component;
59     
60     private WizardDescriptor wizard = null;
61     
62     public SchemaTransformPatternSelection(SchemaGenerator.Pattern inferedPattern) {
63         this.inferedPattern = inferedPattern;
64     }
65     
66     // Get the visual component for the panel. In this template, the component
67
// is kept separate. This can be more efficient: if the wizard is created
68
// but never displayed, or not all panels are displayed, it is better to
69
// create only those which really need to be visible.
70
public Component JavaDoc getComponent() {
71         if (component == null) {
72             component = new SchemaTransformPatternSelectionUI(inferedPattern);
73             component.addChangeListener(this);
74             
75             //Error or Warnings that need to be shown on first time of
76
//invocation is not feasible due to NB code WizardDescriptor.java:548
77
//ie., wizardPanel is not yet initialized. So workaround is to try
78
//invoking isValid() after 200 msec.
79
transformTask = RequestProcessor.getDefault().create(new Runnable JavaDoc() {
80                 public void run() {
81                     try {
82                         isValid();
83                     } catch(Throwable JavaDoc th) {
84                         transformTask.schedule(300);
85                     }
86                 }
87             });
88             transformTask.schedule(200);
89         }
90         return component;
91     }
92     
93     public HelpCtx getHelp() {
94         return new HelpCtx(SchemaTransformPatternSelection.class); //NOI18n
95
}
96     
97     public boolean isValid() {
98         SchemaModel sm = (SchemaModel)
99         wizard.getProperty(SchemaTransformWizard.SCHEMA_MODEL_KEY);
100         SchemaGenerator.Pattern inferedPattern = (SchemaGenerator.Pattern)
101         wizard.getProperty(SchemaTransformWizard.INFERED_DESIGN_PATTERN_KEY);
102         SchemaGenerator.Pattern selectedPattern = (SchemaGenerator.Pattern)
103         wizard.getProperty(SchemaTransformWizard.SELECTED_DESIGN_PATTERN_KEY);
104         if(inferedPattern != null && selectedPattern != null) {
105             SchemaGeneratorFactory.TransformHint hint =
106                     SchemaGeneratorFactory.TransformHint.OK;
107             try {
108                 if(ges == null) //cache this for later use in this panel
109
ges = SchemaGeneratorFactory.getDefault().
110                             findMasterGlobalElements(
111                                 AXIModelFactory.getDefault().getModel(sm));
112                 hint = canTransformSchema(sm, inferedPattern, selectedPattern, ges);
113             }
114             catch(Throwable JavaDoc th) {
115                 hint = SchemaGeneratorFactory.TransformHint.INVALID_SCHEMA;
116             }
117             if(hint != SchemaGeneratorFactory.TransformHint.OK) {
118                 if(inferedPattern == selectedPattern ||
119                         hint == SchemaGeneratorFactory.TransformHint.INVALID_SCHEMA ||
120                         hint == SchemaGeneratorFactory.TransformHint.NO_GLOBAL_ELEMENTS ||
121                         hint == SchemaGeneratorFactory.TransformHint.
122                         GLOBAL_ELEMENTS_HAVE_NO_CHILD_ELEMENTS||
123                         hint == SchemaGeneratorFactory.TransformHint.
124                         GLOBAL_ELEMENTS_HAVE_NO_CHILD_ATTRIBUTES||
125                         hint == SchemaGeneratorFactory.TransformHint.
126                         GLOBAL_ELEMENTS_HAVE_NO_CHILD_ELEMENTS_AND_ATTRIBUTES||
127                         hint == SchemaGeneratorFactory.TransformHint.
128                         GLOBAL_ELEMENTS_HAVE_NO_GRAND_CHILDREN) {
129                     setErrorMessage("MSG_SchemaTransform_Error_"+hint.toString(),
130                             new Object JavaDoc[]{NbBundle.getMessage(
131                                     SchemaTransformPatternSelectionUI.class,
132                                     "LBL_SchemaTransform_"+selectedPattern.toString())});
133                     return false;
134                 } else if(hint == SchemaGeneratorFactory.TransformHint.
135                         CANNOT_REMOVE_GLOBAL_ELEMENTS) {
136                     SchemaGenerator.Pattern other = SchemaGenerator.Pattern.SALAMI_SLICE;
137                     if(inferedPattern == SchemaGenerator.Pattern.SALAMI_SLICE)
138                         other = SchemaGenerator.Pattern.GARDEN_OF_EDEN;
139                     setErrorMessage("MSG_SchemaTransform_Error_"+hint.toString(),
140                             new Object JavaDoc[]{NbBundle.getMessage(
141                                     SchemaTransformPatternSelectionUI.class,
142                                     "LBL_SchemaTransform_"+selectedPattern.toString()),
143                             NbBundle.getMessage(
144                                     SchemaTransformPatternSelectionUI.class,
145                                     "LBL_SchemaTransform_"+other.toString())});
146                     return false;
147                 } else {
148                     String JavaDoc warningMsgKey = "MSG_SchemaTransform_Warning_"+hint.toString();
149                     setErrorMessage(warningMsgKey,
150                             new Object JavaDoc[]{NbBundle.getMessage(
151                                     SchemaTransformPatternSelectionUI.class,
152                                     "LBL_SchemaTransform_"+selectedPattern.toString())});
153                     return true;
154                 }
155             }
156         }
157         setErrorMessage(null);
158         return true;
159         // If it depends on some condition (form filled out...), then:
160
// return someCondition();
161
// and when this condition changes (last form field filled in...) then:
162
// fireChangeEvent();
163
// and uncomment the complicated stuff below.
164
}
165     
166     private SchemaGeneratorFactory.TransformHint canTransformSchema(
167             final SchemaModel sm, final SchemaGenerator.Pattern inferedPattern,
168             final SchemaGenerator.Pattern selectedPattern, List JavaDoc<Element> ges) {
169         SchemaGeneratorFactory.TransformHint hint = hintMap.get(selectedPattern);
170         if(hint == null) {
171             hint = SchemaGeneratorFactory.getDefault().canTransformSchema(
172                     sm, inferedPattern, selectedPattern, ges);
173             hintMap.put(selectedPattern, hint);
174         }
175         return hint;
176     }
177     
178     private void setErrorMessage(String JavaDoc key) {
179         if ( key == null ) {
180             setLocalizedErrorMessage(""); // NOI18N
181
} else {
182             setLocalizedErrorMessage(
183                     NbBundle.getMessage(SchemaTransformPatternSelection.class, key)); // NOI18N
184
}
185     }
186     
187     private void setErrorMessage(String JavaDoc key, Object JavaDoc[] params) {
188         if ( key == null ) {
189             setLocalizedErrorMessage(""); // NOI18N
190
} else {
191             setLocalizedErrorMessage(
192                     NbBundle.getMessage(SchemaTransformPatternSelection.class, key, params)); // NOI18N
193
}
194     }
195     
196     private void setLocalizedErrorMessage(String JavaDoc message) {
197         wizard.putProperty("WizardPanel_errorMessage", message); // NOI18N
198
}
199     
200     private final Set JavaDoc<ChangeListener JavaDoc> listeners = new HashSet JavaDoc<ChangeListener JavaDoc>(1);
201     public final void addChangeListener(ChangeListener JavaDoc l) {
202         synchronized (listeners) {
203             listeners.add(l);
204         }
205     }
206     public final void removeChangeListener(ChangeListener JavaDoc l) {
207         synchronized (listeners) {
208             listeners.remove(l);
209         }
210     }
211     protected final void fireChangeEvent() {
212         Iterator JavaDoc<ChangeListener JavaDoc> it;
213         synchronized (listeners) {
214             it = new HashSet JavaDoc<ChangeListener JavaDoc>(listeners).iterator();
215         }
216         ChangeEvent JavaDoc ev = new ChangeEvent JavaDoc(this);
217         while (it.hasNext()) {
218             it.next().stateChanged(ev);
219         }
220     }
221     
222     // You can use a settings object to keep track of state. Normally the
223
// settings object will be the WizardDescriptor, so you can use
224
// WizardDescriptor.getProperty & putProperty to store information entered
225
// by the user.
226
public void readSettings(Object JavaDoc settings) {
227         wizard = (WizardDescriptor) settings;
228         Boolean JavaDoc isSingleGlobalElementSelected =
229                 (Boolean JavaDoc) wizard.getProperty(SchemaTransformWizard.SINGLE_GLOBAL_ELEMENT_KEY);
230         if(isSingleGlobalElementSelected != null)
231             component.setSingleGlobalElementSelected(
232                     isSingleGlobalElementSelected.booleanValue());
233         
234         Boolean JavaDoc isTypeReuseSelected =
235                 (Boolean JavaDoc) wizard.getProperty(SchemaTransformWizard.TYPE_REUSE_KEY);
236         if(isTypeReuseSelected != null)
237             component.setTypeReuseSelected(isTypeReuseSelected.booleanValue());
238     }
239     
240     public void storeSettings(Object JavaDoc settings) {
241         wizard = (WizardDescriptor) settings;
242         wizard.putProperty(SchemaTransformWizard.SINGLE_GLOBAL_ELEMENT_KEY,
243                 Boolean.valueOf(component.isSingleGlobalElementSelected()));
244         wizard.putProperty(SchemaTransformWizard.TYPE_REUSE_KEY,
245                 Boolean.valueOf(component.isTypeReuseSelected()));
246     }
247     
248     public void stateChanged(ChangeEvent JavaDoc e) {
249         if(wizard != null)
250             wizard.putProperty(SchemaTransformWizard.SELECTED_DESIGN_PATTERN_KEY,
251                     component.getSelectedDesignPattern());
252         fireChangeEvent();
253     }
254     
255 }
256
257
Popular Tags