package tk.eclipse.plugin.htmleditor.wizards; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import org.apache.xerces.impl.xs.SchemaGrammar; import org.apache.xerces.impl.xs.XMLSchemaLoader; import org.apache.xerces.xni.parser.XMLInputSource; import org.apache.xerces.xs.XSConstants; import org.apache.xerces.xs.XSElementDeclaration; import org.apache.xerces.xs.XSNamedMap; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import tk.eclipse.plugin.htmleditor.HTMLPlugin; import tk.eclipse.plugin.xmleditor.editors.DTDResolver; import tk.eclipse.plugin.xmleditor.editors.IDTDResolver; import com.wutka.dtd.DTD; import com.wutka.dtd.DTDElement; import com.wutka.dtd.DTDParser; public class XMLDTDWizardPage extends WizardPage { private Text textPublicID; private Combo comboSystemID; private Combo comboDocumentRoot; private Combo comboSchemaURI; private Button radioNone; private Button radioDTD; private Button radioXSD; private Button buttonLoadDTD; private XMLNewWizardPage page1; public XMLDTDWizardPage(String pageName, XMLNewWizardPage page1) { super(pageName); setTitle(HTMLPlugin.getResourceString("XMLDTDWizardPage.Title")); setDescription(HTMLPlugin.getResourceString("XMLDTDWizardPage.Description")); this.page1 = page1; } public void createControl(Composite parent) { Composite composite = new Composite(parent,SWT.NULL); composite.setLayout(new GridLayout(2,false)); composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.GRAB_HORIZONTAL)); Composite radios = new Composite(composite,SWT.NULL); radios.setLayout(new FillLayout(SWT.VERTICAL)); GridData gd = new GridData(); gd.horizontalSpan = 2; radios.setLayoutData(gd); radios.setLayoutData(gd); radioNone = new Button(radios,SWT.RADIO); radioNone.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.NoSchema")); radioNone.setSelection(true); radioNone.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ if(radioNone.getSelection()){ textPublicID.setEnabled(false); comboSystemID.setEnabled(false); comboSchemaURI.setEnabled(false); buttonLoadDTD.setEnabled(false); comboDocumentRoot.setEnabled(false); } setPageComplete(validatePage()); } }); radioDTD = new Button(radios,SWT.RADIO); radioDTD.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.UseDID")); radioDTD.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ if(radioDTD.getSelection()){ textPublicID.setEnabled(true); comboSystemID.setEnabled(true); comboSchemaURI.setEnabled(false); buttonLoadDTD.setEnabled(true); comboDocumentRoot.setEnabled(true); } setPageComplete(validatePage()); } }); radioXSD = new Button(radios,SWT.RADIO); radioXSD.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.UseXSD")); radioXSD.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ if(radioXSD.getSelection()){ textPublicID.setEnabled(false); comboSystemID.setEnabled(false); comboSchemaURI.setEnabled(true); buttonLoadDTD.setEnabled(true); comboDocumentRoot.setEnabled(true); } setPageComplete(validatePage()); } }); Label label = new Label(composite,SWT.NULL); label.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.PublicID")); textPublicID = new Text(composite,SWT.BORDER); textPublicID.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); textPublicID.addModifyListener(new ModifyListener(){ public void modifyText(ModifyEvent e){ setPageComplete(validatePage()); } }); label = new Label(composite,SWT.NULL); label.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.SystemID")); comboSystemID = new Combo(composite,SWT.DROP_DOWN); comboSystemID.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Load DTD / XSD Configuration from PreferenceStore IPreferenceStore store = HTMLPlugin.getDefault().getPreferenceStore(); String[] uri = store.getString(HTMLPlugin.PREF_DTD_URI).split("\n"); for(int i=0;i<uri.length;i++){ if(uri[i].endsWith(".dtd")){ comboSystemID.add(uri[i]); } } comboSystemID.addModifyListener(new ModifyListener(){ public void modifyText(ModifyEvent e){ setPageComplete(validatePage()); } }); label = new Label(composite,SWT.NULL); label.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.XMLSchema")); comboSchemaURI = new Combo(composite,SWT.DROP_DOWN); comboSchemaURI.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); for(int i=0;i<uri.length;i++){ if(uri[i].endsWith(".xsd")){ comboSchemaURI.add(uri[i]); } } comboSchemaURI.addModifyListener(new ModifyListener(){ public void modifyText(ModifyEvent e){ setPageComplete(validatePage()); } }); buttonLoadDTD = new Button(composite,SWT.PUSH); buttonLoadDTD.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.LoadDTD")); buttonLoadDTD.addSelectionListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ try { if(getUseDTD()){ // Load elements from DTD String systemID = comboSystemID.getText(); comboDocumentRoot.removeAll(); DTDResolver resolver = new DTDResolver(new IDTDResolver[0], page1.getFile().getLocation().makeAbsolute().toFile().getParentFile()); InputStream in = resolver.getInputStream(systemID); // if(in==null){ // URL url = new URL(systemID); // in = url.openStream(); // } if(in!=null){ Reader reader = new InputStreamReader(in); DTDParser parser = new DTDParser(reader); DTD dtd = parser.parse(); Object[] obj = dtd.getItems(); for(int i=0;i<obj.length;i++){ if(obj[i] instanceof DTDElement){ DTDElement element = (DTDElement)obj[i]; String name = element.getName(); comboDocumentRoot.add(name); } } comboDocumentRoot.select(0); } } if(getUseXSD()){ // Load elements from XML Schema comboDocumentRoot.removeAll(); DTDResolver resolver = new DTDResolver(new IDTDResolver[0], page1.getFile().getLocation().makeAbsolute().toFile().getParentFile()); InputStream in = resolver.getInputStream(getSchemaURI()); if(in!=null){ SchemaGrammar grammer = (SchemaGrammar)new XMLSchemaLoader().loadGrammar( new XMLInputSource(null,null,null,in,null)); XSNamedMap map = grammer.getComponents(XSConstants.ELEMENT_DECLARATION); for(int i=0;i<map.getLength();i++){ XSElementDeclaration element = (XSElementDeclaration)map.item(i); comboDocumentRoot.add(element.getName()); } } } } catch(Exception ex){ HTMLPlugin.openAlertDialog(ex.toString()); } } }); label = new Label(composite,SWT.NULL); label = new Label(composite,SWT.NULL); label.setText(HTMLPlugin.getResourceString("XMLDTDWizardPage.DocumentRoot")); comboDocumentRoot = new Combo(composite,SWT.READ_ONLY); comboDocumentRoot.addModifyListener(new ModifyListener(){ public void modifyText(ModifyEvent e){ setPageComplete(validatePage()); } }); // Disable all widgets at first textPublicID.setEnabled(false); comboSystemID.setEnabled(false); comboSchemaURI.setEnabled(false); buttonLoadDTD.setEnabled(false); comboDocumentRoot.setEnabled(false); setErrorMessage(null); setMessage(null); setControl(composite); } public boolean getUseDTD(){ return radioDTD.getSelection(); } public boolean getUseXSD(){ return radioXSD.getSelection(); } public String getSystemID(){ return comboSystemID.getText(); } public String getPublicID(){ return textPublicID.getText(); } public String getSchemaURI(){ return comboSchemaURI.getText(); } public String getDocumentRoot(){ return comboDocumentRoot.getText(); } private boolean validatePage(){ if(getUseDTD()){ if(getPublicID().equals("")){ setMessage(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{HTMLPlugin.getResourceString("XMLDTDWizardPage.Message.PublicID")}), DialogPage.ERROR); return false; } else if(getSystemID().equals("")){ setMessage(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{HTMLPlugin.getResourceString("XMLDTDWizardPage.Message.SystemID")}), DialogPage.ERROR); return false; } else if(getDocumentRoot().equals("")){ setMessage(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{HTMLPlugin.getResourceString("XMLDTDWizardPage.Message.DocumentRoot")}), DialogPage.ERROR); return false; } } if(getUseXSD()){ if(getSchemaURI().equals("")){ setMessage(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{HTMLPlugin.getResourceString("XMLDTDWizardPage.Message.XMLSchema")}), DialogPage.ERROR); return false; } else if(getDocumentRoot().equals("")){ setMessage(HTMLPlugin.createMessage( HTMLPlugin.getResourceString("Error.Required"), new String[]{HTMLPlugin.getResourceString("XMLDTDWizardPage.Message.DocumentRoot")}), DialogPage.ERROR); return false; } } setMessage(null); return true; } }