xsd2xml and xml2xsd functionality
[fedora-idea.git] / xml / impl / src / com / intellij / xml / actions / xmlbeans / GenerateInstanceDocumentFromSchemaDialog.java
blob2d162e5db491bb77c222947c89e82da6c9d62ab4
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;
18 import javax.swing.*;
19 import javax.swing.event.DocumentEvent;
20 import javax.swing.event.DocumentListener;
21 import java.awt.*;
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;
29 /**
30 * @author Konstantin Bulenkov
32 public class GenerateInstanceDocumentFromSchemaDialog extends DialogWrapper {
33 private JPanel panel;
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) {
49 super(project, true);
50 myProject = project;
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());
58 updateFile();
60 setTitle(XmlBundle.message("generate.instance.document.from.schema.dialog.title"));
62 init();
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) {
73 validateData();
76 public void removeUpdate(DocumentEvent e) {
77 validateData();
80 public void changedUpdate(DocumentEvent e) {
81 validateData();
83 });
84 } else if (component instanceof JComboBox) {
85 JComboBox jComboBox = ((JComboBox) component);
87 jComboBox.addActionListener(new ActionListener() {
88 public void actionPerformed(ActionEvent e) {
89 validateData();
91 });
93 ((JTextField)jComboBox.getEditor().getEditorComponent()).getDocument().addDocumentListener(new DocumentListener() {
94 public void insertUpdate(DocumentEvent e) {
95 validateData();
96 updateFile();
99 public void removeUpdate(DocumentEvent e) {
100 validateData();
101 updateFile();
104 public void changedUpdate(DocumentEvent e) {
105 validateData();
106 updateFile();
110 if (jComboBox.isEditable()) {
111 jComboBox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
112 public void keyTyped(KeyEvent e) {
113 validateData();
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);
139 return;
142 final XmlTag rootTag = getRootTag(psifile);
144 if (rootTag == null) {
145 configureComboBox(rootElementChooser, Collections.EMPTY_LIST);
146 rootElementChooser.setSelectedIndex(-1);
147 previousUri = uri;
148 return;
151 myRootValues = Xsd2InstanceUtils.addVariantsFromRootTag(rootTag);
153 Object selectedItem = rootElementChooser.getSelectedItem();
154 configureComboBox(rootElementChooser, myRootValues);
156 if (hasPrevious) {
157 rootElementChooser.setSelectedItem(selectedItem);
158 } else {
159 rootElementChooser.setSelectedIndex(myRootValues.size() > 0 ? 0:-1);
161 previousUri = uri;
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() {
178 updateFile();
179 return rootElementChooser.getSelectedItem() != null;
182 @Nullable
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);
192 if (tag != null) {
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");
205 return null;
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() {
223 return statusText;
226 protected JLabel getStatusField() {
227 return status;
230 protected JComponent createCenterPanel() {
231 return panel;
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;
250 @Override
251 protected void doOKAction() {
252 super.doOKAction();
253 if (myOkAction != null) {
254 myOkAction.run();