/* * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.xml.actions.xmlbeans; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.JBColor; import com.intellij.util.ArrayUtil; import com.intellij.xml.XmlBundle; import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.Arrays; import java.util.List; /** * @author Konstantin Bulenkov */ public class GenerateSchemaFromInstanceDocumentDialog extends DialogWrapper { private JPanel panel; private TextFieldWithBrowseButton generateFromUrl; private JLabel status; private JLabel statusText; private JLabel generateFromUrlText; private JLabel designTypeText; private JTextField detectEnumerationsLimit; private ComboBox detectSimpleContentTypes; private ComboBox designType; private JLabel detectEnumerationsLimitText; private JLabel detectSimpleContentTypesText; private JLabel resultSchemaFileNameText; private JTextField resultSchemaFileName; static final String LOCAL_ELEMENTS_GLOBAL_COMPLEX_TYPES = XmlBundle.message("local.elements.global.complex.types.option.name"); static final String LOCAL_ELEMENTS_TYPES = XmlBundle.message("local.elements.types.option.name"); static final String GLOBAL_ELEMENTS_LOCAL_TYPES = XmlBundle.message("global.elements.local.types.option.name"); private static final List<String> designTypes = Arrays.asList( LOCAL_ELEMENTS_GLOBAL_COMPLEX_TYPES, LOCAL_ELEMENTS_TYPES, GLOBAL_ELEMENTS_LOCAL_TYPES ); static final String STRING_TYPE = "string"; static final String SMART_TYPE = "smart"; private static final List<String> simpleContentTypes = Arrays.asList(STRING_TYPE, SMART_TYPE); private Runnable myOkAction; public GenerateSchemaFromInstanceDocumentDialog(Project project, VirtualFile file) { super(project, true); setTitle(XmlBundle.message("generate.schema.from.instance.document.dialog.title")); doInitFor(designTypeText, designType); configureComboBox(designType,designTypes); doInitFor(detectSimpleContentTypesText, detectSimpleContentTypes); configureComboBox(detectSimpleContentTypes, simpleContentTypes); doInitFor(detectEnumerationsLimitText, detectEnumerationsLimit); detectEnumerationsLimit.setText("10"); UIUtils.configureBrowseButton(project, generateFromUrl, new String[] {"xml"}, XmlBundle.message("select.xml.document.dialog.title"), false); doInitFor(generateFromUrlText, generateFromUrl.getTextField()); doInitFor(resultSchemaFileNameText, resultSchemaFileName); init(); generateFromUrl.setText(file.getPresentableUrl()); resultSchemaFileName.setText(file.getNameWithoutExtension() + ".xsd"); } private void validateData() { String msg = doValidateWithData(); setOKActionEnabled(msg == null); status.setText(msg == null ? "" : msg); status.setForeground(JBColor.RED); } public static void configureComboBox(JComboBox combo, List<String> lastValues) { combo.setModel(new DefaultComboBoxModel(ArrayUtil.toStringArray(lastValues))); if (combo.getItemCount() != 0) { combo.setSelectedIndex(0); combo.getEditor().selectAll(); } } public void setFileUrl(String url) { generateFromUrl.setText(url); } @Override protected void doOKAction() { super.doOKAction(); if (myOkAction != null) { myOkAction.run(); } } public void setOkAction(Runnable okAction) { myOkAction = okAction; } public void doInitFor(JLabel textComponent, JComponent component) { textComponent.setLabelFor(component); if (component instanceof JTextField) { ((JTextField)component).getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { validateData(); } @Override public void removeUpdate(DocumentEvent e) { validateData(); } @Override public void changedUpdate(DocumentEvent e) { validateData(); } }); } else if (component instanceof JComboBox) { JComboBox jComboBox = ((JComboBox) component); jComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { validateData(); } }); if (jComboBox.isEditable()) { jComboBox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { validateData(); } }); } } } protected TextFieldWithBrowseButton getUrl() { return generateFromUrl; } protected JLabel getUrlText() { return generateFromUrlText; } protected JLabel getStatusTextField() { return statusText; } protected JLabel getStatusField() { return status; } @Override protected JComponent createCenterPanel() { return panel; } String getDesignType() { return (String) designType.getSelectedItem(); } String getSimpleContentType() { return (String) detectSimpleContentTypes.getSelectedItem(); } String getEnumerationsLimit() { return detectEnumerationsLimit.getText(); } public String getTargetSchemaName() { return resultSchemaFileName.getText(); } protected String doValidateWithData() { if (! new File(generateFromUrl.getText()).exists()) { return XmlBundle.message("instance.document.file.is.not.exist"); } try { int i = Integer.parseInt(getEnumerationsLimit()); if (i < 0) return XmlBundle.message("negative.number.validation.problem"); } catch(NumberFormatException ex) { return XmlBundle.message("invalid.number.validation.problem"); } if (getTargetSchemaName() == null || getTargetSchemaName().length() == 0) { return XmlBundle.message("result.schema.file.name.is.empty.validation.problem"); } return null; } @Override @NotNull protected String getHelpId() { return "webservices.GenerateSchemaFromInstanceDocument"; } }