blob: eaa90acf9e39af9da27ee54f64937ebab66f0a8e [file] [log] [blame]
/*
* 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 org.jetbrains.idea.devkit.dom.generator;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileChooser.FileTypeDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlDocument;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.util.ArrayUtil;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
/**
* @author Konstantin Bulenkov
*/
public class DomGenPanel {
private JPanel mainPanel;
private JTextField myNamespace;
private JTextField mySuperClass;
private TextFieldWithBrowseButton mySchemaLocation;
private JTextField myPackage;
private TextFieldWithBrowseButton myOutputDir;
private JTextArea mySkipSchemas;
private JTextField myAuthor;
private JBCheckBox myUseQualifiedClassNames;
private final Project myProject;
public DomGenPanel(Project project) {
myProject = project;
}
private void createUIComponents() {
mySchemaLocation = new TextFieldWithBrowseButton();
final String title = "Choose XSD or DTD schema";
mySchemaLocation.addBrowseFolderListener(title, "Make sure there are only necessary schemes in directory where your XSD or DTD schema is located", myProject, new FileTypeDescriptor(title, "xsd", "dtd"));
mySchemaLocation.getTextField().setEditable(false);
mySchemaLocation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final File file = new File(mySchemaLocation.getText());
if (file.exists() && file.getName().toLowerCase().endsWith(".xsd")) {
final VirtualFile vf = LocalFileSystem.getInstance().findFileByIoFile(file);
if (vf != null) {
final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(vf);
if (psiFile instanceof XmlFile) {
final XmlDocument xml = ((XmlFile)psiFile).getDocument();
if (xml != null) {
final XmlTag rootTag = xml.getRootTag();
if (rootTag != null) {
String target = null;
ArrayList<String> ns = new ArrayList<String>();
for (XmlAttribute attr : rootTag.getAttributes()) {
if ("targetNamespace".equals(attr.getName())) {
target = attr.getValue();
}
else if (attr.getName().startsWith("xmlns")) {
ns.add(attr.getValue());
}
}
ns.remove(target);
if (target != null) {
myNamespace.setText(target);
}
mySkipSchemas.setText(StringUtil.join(ArrayUtil.toStringArray(ns), "\n"));
}
}
}
}
}
}
});
myOutputDir = new TextFieldWithBrowseButton();
FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
myOutputDir.addBrowseFolderListener("Select Output Directory For Generated Files", "", myProject, descriptor);
}
public JComponent getComponent() {
return mainPanel;
}
public NamespaceDesc getNamespaceDescriptor() {
return new NamespaceDesc(myNamespace.getText().trim(), myPackage.getText().trim(), mySuperClass.getText().trim(), "", null, null, null, null);
}
public String getLocation() {
return mySchemaLocation.getText();
}
public String getOutputDir() {
return myOutputDir.getText();
}
private static final String PREFIX = "DomGenPanel.";
public void restore() {
myNamespace.setText(getValue("namespace", ""));
myPackage.setText(getValue("package", "com.intellij.myframework.model"));
mySchemaLocation.setText(getValue("schemaLocation", ""));
mySuperClass.setText(getValue("superClass", "com.intellij.util.xml.DomElement"));
myOutputDir.setText(getValue("output", ""));
mySkipSchemas.setText(getValue("skipSchemas", "http://www.w3.org/2001/XMLSchema\nhttp://www.w3.org/2001/XMLSchema-instance"));
myAuthor.setText(getValue("author", ""));
myUseQualifiedClassNames.setSelected(getValue("useFQNs", "false").equals("true"));
}
private static String getValue(String name, String defaultValue) {
return PropertiesComponent.getInstance().getOrInit(PREFIX + name, defaultValue);
}
private static void setValue(String name, String value) {
PropertiesComponent.getInstance().setValue(PREFIX + name, value);
}
public void saveAll() {
setValue("namespace", myNamespace.getText());
setValue("package", myPackage.getText());
setValue("schemaLocation", mySchemaLocation.getText());
setValue("superClass", mySuperClass.getText());
setValue("output", myOutputDir.getText());
setValue("skipSchemas", mySkipSchemas.getText());
setValue("author", myAuthor.getText());
setValue("useFQNs", myUseQualifiedClassNames.isSelected() ? "true" : "false");
}
public boolean validate() {
if (!new File(mySchemaLocation.getText()).exists()) {
Messages.showErrorDialog(myProject, "Schema location doesn't exist", "Error");
IdeFocusManager.getInstance(myProject).requestFocus(mySchemaLocation, true);
return false;
}
if (!new File(myOutputDir.getText()).exists()) {
Messages.showErrorDialog(myProject, "Output dir doesn't exist", "Error");
IdeFocusManager.getInstance(myProject).requestFocus(myOutputDir, true);
return false;
}
return true;
}
public String[] getSkippedSchemas() {
final String schemes = mySkipSchemas.getText().replaceAll("\r\n", "\n").trim();
if (schemes.length() > 0) {
return schemes.split("\n");
}
return new String[0];
}
public String getAuthor() {
return myAuthor.getText();
}
public boolean isUseQualifiedClassNames() {
return myUseQualifiedClassNames.isSelected();
}
}