1 package com
.intellij
.xml
.actions
.xmlbeans
;
4 import com
.intellij
.javaee
.ExternalResourceManager
;
5 import com
.intellij
.openapi
.project
.Project
;
6 import com
.intellij
.openapi
.ui
.DialogWrapper
;
7 import com
.intellij
.openapi
.ui
.TextFieldWithBrowseButton
;
8 import com
.intellij
.openapi
.vfs
.VfsUtil
;
9 import com
.intellij
.openapi
.vfs
.VirtualFile
;
10 import com
.intellij
.psi
.PsiFile
;
11 import com
.intellij
.psi
.PsiManager
;
12 import com
.intellij
.psi
.xml
.XmlFile
;
13 import com
.intellij
.psi
.xml
.XmlTag
;
14 import com
.intellij
.xml
.XmlBundle
;
15 import com
.intellij
.xml
.XmlElementDescriptor
;
16 import org
.jetbrains
.annotations
.Nullable
;
19 import javax
.swing
.event
.DocumentEvent
;
20 import javax
.swing
.event
.DocumentListener
;
22 import java
.awt
.event
.ActionEvent
;
23 import java
.awt
.event
.ActionListener
;
24 import java
.awt
.event
.KeyAdapter
;
25 import java
.awt
.event
.KeyEvent
;
26 import java
.util
.Collections
;
27 import java
.util
.List
;
30 * @author Konstantin Bulenkov
32 public class GenerateInstanceDocumentFromSchemaDialog
extends DialogWrapper
{
34 private TextFieldWithBrowseButton generateFromUrl
;
35 private JLabel status
;
36 private JLabel statusText
;
37 private JLabel generateFromUrlText
;
38 private JComboBox rootElementChooser
;
39 private JLabel rootElementChooserText
;
40 private JCheckBox enableRestrictionCheck
;
41 private JCheckBox enableUniqueCheck
;
42 private JTextField outputFileName
;
43 private JLabel outputFileNameText
;
44 private String previousUri
;
45 private Runnable myOkAction
;
46 private Project myProject
;
48 public GenerateInstanceDocumentFromSchemaDialog(Project project
, VirtualFile file
) {
52 UIUtils
.configureBrowseButton(project
, generateFromUrl
, new String
[] {"xsd"}, XmlBundle
.message("select.xsd.schema.dialog.title"), false);
54 doInitFor(rootElementChooserText
, rootElementChooser
);
55 doInitFor(generateFromUrlText
, generateFromUrl
.getTextField());
56 doInitFor(outputFileNameText
, outputFileName
);
57 generateFromUrl
.setText(file
.getPresentableUrl());
60 setTitle(XmlBundle
.message("generate.instance.document.from.schema.dialog.title"));
64 outputFileName
.setText(file
.getName()+ ".xml");
67 public void doInitFor(JLabel textComponent
, JComponent component
) {
68 textComponent
.setLabelFor(component
);
70 if (component
instanceof JTextField
) {
71 ((JTextField
)component
).getDocument().addDocumentListener(new DocumentListener() {
72 public void insertUpdate(DocumentEvent e
) {
76 public void removeUpdate(DocumentEvent e
) {
80 public void changedUpdate(DocumentEvent e
) {
84 } else if (component
instanceof JComboBox
) {
85 JComboBox jComboBox
= ((JComboBox
) component
);
87 jComboBox
.addActionListener(new ActionListener() {
88 public void actionPerformed(ActionEvent e
) {
93 ((JTextField
)jComboBox
.getEditor().getEditorComponent()).getDocument().addDocumentListener(new DocumentListener() {
94 public void insertUpdate(DocumentEvent e
) {
99 public void removeUpdate(DocumentEvent e
) {
104 public void changedUpdate(DocumentEvent e
) {
110 if (jComboBox
.isEditable()) {
111 jComboBox
.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
112 public void keyTyped(KeyEvent e
) {
120 private void validateData() {
121 String msg
= doValidateWithData();
122 setOKActionEnabled(msg
== null);
123 status
.setText(msg
== null ?
"" : msg
);
124 status
.setForeground(Color
.RED
);
127 public void configureComboBox(JComboBox combo
, List
<String
> lastValues
) { // without -editor.selectAll- no focus
128 combo
.setModel(new DefaultComboBoxModel(lastValues
.toArray(new String
[lastValues
.size()])));
131 private void updateFile() {
132 String uri
= generateFromUrl
.getText();
133 boolean hasPrevious
= (previousUri
!= null && previousUri
.equals(uri
));
134 final PsiFile psifile
= findFile(uri
);
135 List
<String
> myRootValues
;
137 if (psifile
== null) {
138 configureComboBox(rootElementChooser
, Collections
.EMPTY_LIST
);
142 final XmlTag rootTag
= getRootTag(psifile
);
144 if (rootTag
== null) {
145 configureComboBox(rootElementChooser
, Collections
.EMPTY_LIST
);
146 rootElementChooser
.setSelectedIndex(-1);
151 myRootValues
= Xsd2InstanceUtils
.addVariantsFromRootTag(rootTag
);
153 Object selectedItem
= rootElementChooser
.getSelectedItem();
154 configureComboBox(rootElementChooser
, myRootValues
);
157 rootElementChooser
.setSelectedItem(selectedItem
);
159 rootElementChooser
.setSelectedIndex(myRootValues
.size() > 0 ?
0:-1);
164 private XmlTag
getRootTag(PsiFile psifile
) {
165 return ((XmlFile
) psifile
).getDocument().getRootTag();
168 private PsiFile
findFile(String uri
) {
169 final VirtualFile file
= uri
!= null ? VfsUtil
.findRelativeFile(ExternalResourceManager
.getInstance().getResourceLocation(uri
), null):null;
170 return file
!= null ? PsiManager
.getInstance(myProject
).findFile(file
):null;
173 public String
getOutputFileName() {
174 return outputFileName
.getText();
177 public Boolean
areCurrentParametersStillValid() {
179 return rootElementChooser
.getSelectedItem() != null;
183 protected String
doValidateWithData() {
184 String rootElementName
= getElementName();
185 if (rootElementName
== null || rootElementName
.length() == 0) {
186 return XmlBundle
.message("schema2.instance.no.valid.root.element.name.validation.error");
189 final PsiFile psiFile
= findFile(getUrl().getText());
190 if (psiFile
instanceof XmlFile
) {
191 final XmlTag tag
= getRootTag(psiFile
);
193 final XmlElementDescriptor descriptor
= Xsd2InstanceUtils
.getDescriptor(tag
, rootElementName
);
195 if (descriptor
== null) {
196 return XmlBundle
.message("schema2.instance.no.valid.root.element.name.validation.error");
201 final String fileName
= getOutputFileName();
202 if (fileName
== null || fileName
.length() == 0) {
203 return XmlBundle
.message("schema2.instance.output.file.name.is.empty.validation.problem");
209 protected boolean isAcceptableFile(VirtualFile virtualFile
) {
210 return GenerateInstanceDocumentFromSchemaAction
.isAcceptableFileForGenerateSchemaFromInstanceDocument(virtualFile
);
214 protected TextFieldWithBrowseButton
getUrl() {
215 return generateFromUrl
;
218 protected JLabel
getUrlText() {
219 return generateFromUrlText
;
222 protected JLabel
getStatusTextField() {
226 protected JLabel
getStatusField() {
230 protected JComponent
createCenterPanel() {
234 boolean enableUniquenessCheck() {
235 return enableUniqueCheck
.isSelected();
238 boolean enableRestrictionCheck() {
239 return enableRestrictionCheck
.isSelected();
242 String
getElementName() {
243 return (String
)rootElementChooser
.getSelectedItem();
246 public void setOkAction(Runnable runnable
) {
247 myOkAction
= runnable
;
251 protected void doOKAction() {
253 if (myOkAction
!= null) {