| /******************************************************************************* |
| * Copyright (c) 2002, 2010 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.xml.ui.internal.catalog; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.layout.FormAttachment; |
| import org.eclipse.swt.layout.FormData; |
| import org.eclipse.swt.layout.FormLayout; |
| 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.Control; |
| import org.eclipse.swt.widgets.FileDialog; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.swt.widgets.ToolBar; |
| import org.eclipse.swt.widgets.ToolItem; |
| import org.eclipse.swt.widgets.Widget; |
| import org.eclipse.ui.part.PageBook; |
| import org.eclipse.wst.common.ui.internal.dialogs.SelectSingleFileDialog; |
| import org.eclipse.wst.common.uriresolver.internal.URI; |
| import org.eclipse.wst.common.uriresolver.internal.util.URIHelper; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.IDelegateCatalog; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.IRewriteEntry; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ISuffixEntry; |
| |
| public class EditCatalogEntryDialog extends Dialog { |
| protected static Image borwseImage = ImageFactory.INSTANCE.getImage("icons/obj16/file_expand.gif"); //$NON-NLS-1$ |
| protected static Image catalogEntryToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/catalogEntry.gif"); //$NON-NLS-1$ |
| protected static Image nextCatalogToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/nextCatalog.gif"); //$NON-NLS-1$ |
| protected static Image delegateCatalogToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/delegateCatalog.gif"); //$NON-NLS-1$ |
| protected static Image rewriteToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/rewrite.gif"); //$NON-NLS-1$ |
| protected static Image prefixToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/prefix.gif"); //$NON-NLS-1$ |
| protected static Image suffixToolBarImage = ImageFactory.INSTANCE.getImage("icons/etool50/sufix.gif"); //$NON-NLS-1$ |
| |
| protected class CatalogEntryPage extends CatalogElementPage { |
| |
| protected Button browseWorkspaceButton; |
| |
| protected Button browseFileSystemButton; |
| |
| protected ICatalogEntry catalogEntry; |
| |
| protected Button checkboxButton; |
| |
| protected Label errorMessageLabel; |
| |
| protected Text keyField; |
| |
| protected Combo keyTypeCombo; |
| |
| protected Text resourceLocationField; |
| |
| protected Combo resourceTypeCombo; |
| |
| protected Text webAddressField; |
| |
| protected String key; |
| |
| protected int type; |
| |
| public void refresh() { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| |
| protected void computeErrorMessage() { |
| errorMessage = null; |
| warningMessage = null; |
| |
| String fileName = resourceLocationField.getText(); |
| if (fileName.trim().length() > 0) { |
| if ((fileName.indexOf("..") != -1) || (fileName.indexOf("./") != -1) || (fileName.indexOf("/.") != -1) || (fileName.indexOf(".\\") != -1) || (fileName.indexOf("\\.") != -1)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ |
| errorMessage = XMLCatalogMessages.UI_WARNING_URI_MUST_NOT_HAVE_DOTS; |
| } |
| |
| String uri = fileName; |
| if (!URIHelper.hasProtocol(uri)) { |
| URIHelper.isAbsolute(uri); |
| uri = (URIHelper.isAbsolute(uri)) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri); |
| } |
| |
| if ((errorMessage == null) && !URIHelper.isReadableURI(uri, false)) { |
| errorMessage = XMLCatalogMessages.UI_WARNING_URI_NOT_FOUND_COLON + fileName; |
| } |
| } |
| else { |
| // this an error that is not actaully |
| // reported ... OK is just disabled |
| errorMessage = ""; //$NON-NLS-1$ |
| } |
| |
| // Make sure the key is a fully qualified URI in the cases |
| // where the key type is "System ID" or "Schema location" |
| if ((keyField.getText().length() > 0) && (getKeyType() == ICatalogEntry.ENTRY_TYPE_SYSTEM)) { |
| URI uri = URI.createURI(keyField.getText()); |
| if (uri.scheme() == null) { |
| warningMessage = XMLCatalogMessages.UI_WARNING_SHOULD_BE_FULLY_QUALIFIED_URI; |
| } |
| } |
| |
| if ((errorMessage == null) && checkboxButton.getSelection() && (webAddressField.getText().trim().length() == 0)) { |
| // this an error that is not actaully |
| // reported ... OK is just disabled |
| errorMessage = ""; //$NON-NLS-1$ |
| } |
| |
| if ((errorMessage == null) && (keyField.getText().trim().length() == 0)) { |
| // this an error that is not actaully |
| // reported ... OK is just disabled |
| errorMessage = ""; //$NON-NLS-1$ |
| } |
| } |
| |
| protected Control createCatalogEntryPanel(Composite parent) { |
| |
| ModifyListener modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| if (e.widget == resourceLocationField) { |
| if (keyField.getText().length() == 0) { |
| String uri = resourceLocationField.getText(); |
| if (uri.endsWith("xsd") && !URIHelper.hasProtocol(uri)) { //$NON-NLS-1$ |
| uri = URIHelper.isAbsolute(uri) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri); |
| String namespaceURI = XMLQuickScan.getTargetNamespaceURIForSchema(uri); |
| if (namespaceURI != null) { |
| keyField.setText(namespaceURI); |
| } |
| } |
| } |
| } |
| updateWidgets(e.widget); |
| } |
| }; |
| |
| |
| Composite composite = new Composite(parent, SWT.NONE); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| composite.setLayoutData(gd); |
| |
| GridLayout layout = new GridLayout(); |
| composite.setLayout(layout); |
| |
| Composite group = new Composite(composite, SWT.NONE); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| group.setLayoutData(gd); |
| |
| layout = new GridLayout(2, false); |
| group.setLayout(layout); |
| |
| Label resourceLocationLabel = new Label(group, SWT.NONE); |
| resourceLocationLabel.setText(XMLCatalogMessages.UI_LABEL_LOCATION_COLON); |
| |
| resourceLocationField = new Text(group, SWT.SINGLE | SWT.BORDER); |
| gd = new GridData(); |
| gd.horizontalAlignment = SWT.FILL; |
| gd.grabExcessHorizontalSpace = true; |
| resourceLocationField.setLayoutData(gd); |
| |
| resourceLocationField.setText(getDisplayValue(URIUtils.convertURIToLocation(getEntry().getURI()))); |
| |
| // WorkbenchHelp.setHelp(resourceLocationField, |
| // XMLBuilderContextIds.XMLP_ENTRY_URI); |
| resourceLocationField.addModifyListener(modifyListener); |
| |
| // WorkbenchHelp.setHelp(browseButton, |
| // XMLBuilderContextIds.XMLP_ENTRY_BROWSE); |
| |
| Composite browseButtonsComposite = new Composite(group, SWT.NONE); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = 2; |
| gd.horizontalAlignment = GridData.END; |
| browseButtonsComposite.setLayoutData(gd); |
| |
| layout = new GridLayout(); |
| layout.numColumns = 2; |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| layout.marginBottom = 5; |
| browseButtonsComposite.setLayout(layout); |
| |
| browseWorkspaceButton = new Button(browseButtonsComposite, SWT.PUSH); |
| browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE); |
| browseWorkspaceButton.addSelectionListener(new SelectionListener(){ |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String value = invokeWorkspaceFileSelectionDialog(); |
| if(value != null) { |
| resourceLocationField.setText(value); |
| } |
| } |
| }); |
| |
| browseFileSystemButton = new Button(browseButtonsComposite, SWT.PUSH); |
| browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_FILE_SYSTEM); |
| browseFileSystemButton.addSelectionListener(new SelectionListener(){ |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String value = invokeFileSelectionDialog(); |
| if(value != null) { |
| resourceLocationField.setText(value); |
| } |
| } |
| }); |
| |
| // Key Type |
| // |
| Label keyTypeLabel = new Label(group, SWT.NONE); |
| keyTypeLabel.setText(XMLCatalogMessages.UI_KEY_TYPE_COLON); |
| |
| keyTypeCombo = new Combo(group, SWT.READ_ONLY); |
| gd = new GridData(); |
| gd.horizontalAlignment = SWT.FILL; |
| gd.grabExcessHorizontalSpace = true; |
| keyTypeCombo.setLayoutData(gd); |
| updateKeyTypeCombo(getEntry().getEntryType()); |
| keyTypeCombo.addModifyListener(modifyListener); |
| // WorkbenchHelp.setHelp(keyTypeCombo, |
| // XMLBuilderContextIds.XMLP_ENTRY_KEY_TYPE); |
| |
| // Key |
| // |
| Label keyValueLabel = new Label(group, SWT.NONE); |
| keyValueLabel.setText(XMLCatalogMessages.UI_LABEL_KEY_COLON); |
| keyField = new Text(group, SWT.SINGLE | SWT.BORDER); |
| // WorkbenchHelp.setHelp(keyField, |
| // XMLBuilderContextIds.XMLP_ENTRY_KEY); |
| keyField.setLayoutData(gd); |
| keyField.setText(getDisplayValue(getEntry().getKey())); |
| keyField.addModifyListener(modifyListener); |
| |
| Composite group2 = new Composite(composite, SWT.NONE); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| group2.setLayoutData(gd); |
| |
| layout = new GridLayout(); |
| group2.setLayout(layout); |
| |
| // checkbox -- note parent is dialogArea |
| // |
| checkboxButton = new Button(group2, SWT.CHECK); |
| // WorkbenchHelp.setHelp(checkboxButton, |
| // XMLBuilderContextIds.XMLP_ENTRY_SPECIFY_ALTERNATIVE); |
| checkboxButton.setText(XMLCatalogMessages.UI_LABEL_SPECIFY_ALTERNATIVE_WEB_URL); |
| checkboxButton.setLayoutData(new GridData()); |
| checkboxButton.setSelection(getEntry().getAttributeValue(ICatalogEntry.ATTR_WEB_URL) != null); |
| SelectionListener buttonListener = new SelectionListener() { |
| public void widgetDefaultSelected(SelectionEvent event) { |
| // no impl |
| } |
| |
| public void widgetSelected(SelectionEvent event) { |
| if (event.widget == checkboxButton) { |
| updateWidgets(checkboxButton); |
| } |
| } |
| }; |
| checkboxButton.addSelectionListener(buttonListener); |
| |
| // Web Address field |
| // |
| |
| ModifyListener webAddressFieldListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| }; |
| |
| webAddressField = new Text(group2, SWT.SINGLE | SWT.BORDER); |
| // WorkbenchHelp.setHelp(webAddressField, |
| // XMLBuilderContextIds.XMLP_ENTRY_WEB_ADDRESS); |
| webAddressField.setLayoutData(gd); |
| webAddressField.setText(getDisplayValue(getEntry().getAttributeValue(ICatalogEntry.ATTR_WEB_URL))); |
| webAddressField.setEnabled(false); |
| webAddressField.addModifyListener(webAddressFieldListener); |
| |
| |
| errorMessageLabel = new Label(group2, SWT.NONE); |
| errorMessageLabel.setForeground(color); |
| errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| |
| updateWidgets(null); |
| |
| key = getEntry().getKey(); |
| type = getEntry().getEntryType(); |
| |
| return composite; |
| } |
| |
| public Control createControl(Composite parent) { |
| |
| fControl = createCatalogEntryPanel(parent); |
| |
| return fControl; |
| } |
| |
| |
| public ICatalogElement getData() { |
| return getEntry(); |
| } |
| |
| protected ICatalogEntry getEntry() { |
| if (catalogEntry == null) { |
| if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_ENTRY)) { |
| catalogEntry = (ICatalogEntry) fCatalogElement; |
| } |
| else { |
| if (catalog != null) { |
| catalogEntry = (ICatalogEntry) catalog.createCatalogElement(ICatalogElement.TYPE_ENTRY); |
| } |
| } |
| } |
| return catalogEntry; |
| } |
| |
| protected int getKeyType() { |
| switch (keyTypeCombo.getSelectionIndex()) { |
| case 0 : |
| if ("schema".equals(keyTypeCombo.getData("keyType"))) { //$NON-NLS-1$ //$NON-NLS-2$ |
| return ICatalogEntry.ENTRY_TYPE_URI; // xsd |
| // namespace |
| // is URI type |
| // key |
| } |
| return ICatalogEntry.ENTRY_TYPE_PUBLIC; |
| case 1 : |
| return ICatalogEntry.ENTRY_TYPE_SYSTEM; |
| case 2 : |
| return ICatalogEntry.ENTRY_TYPE_URI; |
| default : |
| return ICatalogEntry.ENTRY_TYPE_PUBLIC; |
| } |
| } |
| |
| public void saveData() { |
| if (validateData()) { |
| getEntry().setURI(URIUtils.convertLocationToURI(resourceLocationField.getText())); |
| getEntry().setKey(keyField.getText()); |
| getEntry().setEntryType(getKeyType()); |
| getEntry().setAttributeValue(ICatalogEntry.ATTR_WEB_URL, checkboxButton.getSelection() ? webAddressField.getText() : null); |
| dataSaved = true; |
| } |
| else { |
| errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_ENTRY; |
| errorMessageLabel.setText(errorMessage); |
| updateOKButtonState(); |
| dataSaved = false; |
| } |
| } |
| |
| /** |
| * Validates that the data entered does not conflict with an existing entry in either catalog. |
| * @return True if validated, false otherwise. |
| */ |
| protected boolean validateData() { |
| |
| String result = null; |
| if (key == null || !key.equals(keyField.getText()) || type != getKeyType()) |
| { |
| try { |
| switch( getKeyType() ) |
| { |
| case ICatalogEntry.ENTRY_TYPE_PUBLIC: |
| result = catalog.resolvePublic(keyField.getText(), null); |
| break; |
| case ICatalogEntry.ENTRY_TYPE_SYSTEM: |
| result = catalog.resolveSystem(keyField.getText()); |
| break; |
| case ICatalogEntry.ENTRY_TYPE_URI: |
| result = catalog.resolveURI(keyField.getText()); |
| break; |
| } |
| } |
| catch (Exception e) { |
| } |
| } |
| |
| return (result == null); |
| } |
| |
| protected void updateKeyTypeCombo(int type) { |
| keyTypeCombo.removeAll(); |
| for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) { |
| XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next(); |
| if (theFileType.extensions != null) { |
| for (Iterator j = theFileType.extensions.iterator(); j.hasNext();) { |
| String extension = (String) j.next(); |
| if (resourceLocationField.getText().endsWith(extension)) { |
| if ("org.eclipse.wst.xml.core.ui.catalogFileType.xsd".equals(theFileType.id)) { //$NON-NLS-1$ |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM); |
| keyTypeCombo.setData("keyType", "schema"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| else if ("org.eclipse.wst.xml.core.ui.catalogFileType.dtd".equals(theFileType.id)) { //$NON-NLS-1$ |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| } |
| else { |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| } |
| } |
| |
| } |
| |
| } |
| } |
| if (keyTypeCombo.getItemCount() == 0) { |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| } |
| |
| switch (type) { |
| case ICatalogEntry.ENTRY_TYPE_PUBLIC : |
| keyTypeCombo.select(0); |
| break; |
| case ICatalogEntry.ENTRY_TYPE_SYSTEM : |
| keyTypeCombo.select(1); |
| break; |
| case ICatalogEntry.ENTRY_TYPE_URI : // handle XML Schema, |
| // where namespace name is |
| // mapped to URI situation |
| if ("schema".equals(keyTypeCombo.getData("keyType"))) { //$NON-NLS-1$ //$NON-NLS-2$ |
| keyTypeCombo.select(0); // namespace name as URI key |
| // type |
| } |
| else { |
| keyTypeCombo.select(2); // URI key type |
| } |
| break; |
| default : |
| if (keyTypeCombo.getItemCount() > 0) { |
| keyTypeCombo.select(0); |
| } |
| break; |
| } |
| |
| } |
| |
| protected void updateWebAddressWidgets(int keyType) { |
| boolean isPublicKeyType = (keyType == ICatalogEntry.ENTRY_TYPE_PUBLIC); |
| checkboxButton.setEnabled(isPublicKeyType); |
| webAddressField.setEnabled(isPublicKeyType && checkboxButton.getSelection()); |
| } |
| |
| protected void updateWidgets(Widget widget) { |
| if (widget != keyTypeCombo) { |
| updateKeyTypeCombo(getKeyType()); |
| } |
| updateWebAddressWidgets(getKeyType()); |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| |
| } |
| |
| protected class SuffixEntryPage extends CatalogElementPage { |
| |
| protected Button browseWorkspaceButton; |
| |
| protected Button browseFileSystemButton; |
| |
| protected ISuffixEntry catalogEntry; |
| |
| protected Label errorMessageLabel; |
| |
| protected Text suffixField; |
| |
| protected Combo keyTypeCombo; |
| |
| protected Text resourceLocationField; |
| |
| protected Combo resourceTypeCombo; |
| |
| protected String key; |
| |
| protected int type; |
| |
| public void refresh() { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| |
| protected void computeErrorMessage() { |
| errorMessage = null; |
| warningMessage = null; |
| |
| String fileName = resourceLocationField.getText(); |
| if (fileName.trim().length() > 0) { |
| if ((fileName.indexOf("..") != -1) || (fileName.indexOf("./") != -1) || (fileName.indexOf("/.") != -1) || (fileName.indexOf(".\\") != -1) || (fileName.indexOf("\\.") != -1)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ |
| errorMessage = XMLCatalogMessages.UI_WARNING_URI_MUST_NOT_HAVE_DOTS; |
| } |
| |
| String uri = fileName; |
| if (!URIHelper.hasProtocol(uri)) { |
| URIHelper.isAbsolute(uri); |
| uri = (URIHelper.isAbsolute(uri)) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri); |
| } |
| |
| if ((errorMessage == null) && !URIHelper.isReadableURI(uri, false)) { |
| errorMessage = XMLCatalogMessages.UI_WARNING_URI_NOT_FOUND_COLON + fileName; |
| } |
| } |
| else { |
| // this an error that is not actaully |
| // reported ... OK is just disabled |
| errorMessage = ""; //$NON-NLS-1$ |
| } |
| |
| |
| if ((errorMessage == null) && (suffixField.getText().trim().length() == 0)) { |
| // this an error that is not actaully |
| // reported ... OK is just disabled |
| errorMessage = ""; //$NON-NLS-1$ |
| } |
| } |
| |
| protected Control createSuffixEntryPanel(Composite parent) { |
| |
| ModifyListener modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| if (e.widget == resourceLocationField) { |
| if (suffixField.getText().length() == 0) { |
| String uri = resourceLocationField.getText(); |
| if (uri.endsWith("xsd") && !URIHelper.hasProtocol(uri)) { //$NON-NLS-1$ |
| uri = URIHelper.isAbsolute(uri) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri); |
| String namespaceURI = XMLQuickScan.getTargetNamespaceURIForSchema(uri); |
| if (namespaceURI != null) { |
| suffixField.setText(namespaceURI); |
| } |
| } |
| } |
| } |
| updateWidgets(e.widget); |
| } |
| }; |
| |
| Composite composite = new Composite(parent, SWT.NONE); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| composite.setLayoutData(gd); |
| |
| GridLayout layout = new GridLayout(); |
| composite.setLayout(layout); |
| |
| Composite group = new Composite(composite, SWT.NONE); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| group.setLayoutData(gd); |
| |
| layout = new GridLayout(2, false); |
| group.setLayout(layout); |
| |
| Label resourceLocationLabel = new Label(group, SWT.NONE); |
| resourceLocationLabel.setText(XMLCatalogMessages.UI_LABEL_LOCATION_COLON); |
| |
| resourceLocationField = new Text(group, SWT.SINGLE | SWT.BORDER); |
| gd = new GridData(); |
| gd.horizontalAlignment = SWT.FILL; |
| gd.grabExcessHorizontalSpace = true; |
| resourceLocationField.setLayoutData(gd); |
| |
| resourceLocationField.setText(getDisplayValue(URIUtils.convertURIToLocation(getEntry().getURI()))); |
| resourceLocationField.addModifyListener(modifyListener); |
| |
| Composite browseButtonsComposite = new Composite(group, SWT.NONE); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = 2; |
| gd.horizontalAlignment = GridData.END; |
| browseButtonsComposite.setLayoutData(gd); |
| |
| layout = new GridLayout(); |
| layout.numColumns = 2; |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| layout.marginBottom = 5; |
| browseButtonsComposite.setLayout(layout); |
| |
| browseWorkspaceButton = new Button(browseButtonsComposite, SWT.PUSH); |
| browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE); |
| browseWorkspaceButton.addSelectionListener(new SelectionListener(){ |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String value = invokeWorkspaceFileSelectionDialog(); |
| if(value != null) { |
| resourceLocationField.setText(value); |
| } |
| } |
| }); |
| |
| browseFileSystemButton = new Button(browseButtonsComposite, SWT.PUSH); |
| browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_FILE_SYSTEM); |
| browseFileSystemButton.addSelectionListener(new SelectionListener(){ |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String value = invokeFileSelectionDialog(); |
| if(value != null) { |
| resourceLocationField.setText(value); |
| } |
| } |
| }); |
| |
| // Key Type |
| // |
| Label keyTypeLabel = new Label(group, SWT.NONE); |
| keyTypeLabel.setText(XMLCatalogMessages.UI_KEY_TYPE_COLON); |
| |
| keyTypeCombo = new Combo(group, SWT.READ_ONLY); |
| gd = new GridData(); |
| gd.horizontalAlignment = SWT.FILL; |
| gd.grabExcessHorizontalSpace = true; |
| keyTypeCombo.setLayoutData(gd); |
| updateKeyTypeCombo(getEntry().getEntryType()); |
| keyTypeCombo.addModifyListener(modifyListener); |
| |
| // Suffix |
| // |
| Label suffixValueLabel = new Label(group, SWT.NONE); |
| suffixValueLabel.setText(XMLCatalogMessages.UI_LABEL_SUFFIX_COLON); |
| suffixField = new Text(group, SWT.SINGLE | SWT.BORDER); |
| |
| suffixField.setLayoutData(gd); |
| suffixField.setText(getDisplayValue(getEntry().getSuffix())); |
| suffixField.addModifyListener(modifyListener); |
| |
| errorMessageLabel = new Label(composite, SWT.NONE); |
| errorMessageLabel.setForeground(color); |
| errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| |
| updateWidgets(null); |
| |
| key = getEntry().getSuffix(); |
| type = getEntry().getEntryType(); |
| |
| return composite; |
| } |
| |
| public Control createControl(Composite parent) { |
| |
| fControl = createSuffixEntryPanel(parent); |
| |
| return fControl; |
| } |
| |
| |
| public ICatalogElement getData() { |
| return getEntry(); |
| } |
| |
| protected ISuffixEntry getEntry() { |
| if (catalogEntry == null) { |
| if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_SUFFIX)) { |
| catalogEntry = (ISuffixEntry) fCatalogElement; |
| } |
| else { |
| if (catalog != null) { |
| catalogEntry = (ISuffixEntry) catalog.createCatalogElement(ICatalogElement.TYPE_SUFFIX); |
| } |
| } |
| } |
| return catalogEntry; |
| } |
| |
| protected int getKeyType() { |
| switch (keyTypeCombo.getSelectionIndex()) { |
| case 0 : |
| return ISuffixEntry.SUFFIX_TYPE_URI; // xsd namespace is URI type key |
| case 1 : |
| return ISuffixEntry.SUFFIX_TYPE_SYSTEM; |
| default : |
| return ISuffixEntry.SUFFIX_TYPE_URI; |
| } |
| } |
| |
| public void saveData() { |
| if (validateData()) { |
| getEntry().setURI(URIUtils.convertLocationToURI(resourceLocationField.getText())); |
| getEntry().setSuffix(suffixField.getText()); |
| getEntry().setEntryType(getKeyType()); |
| dataSaved = true; |
| } |
| else { |
| errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_SUFFIX; |
| errorMessageLabel.setText(errorMessage); |
| updateOKButtonState(); |
| dataSaved = false; |
| } |
| } |
| |
| protected boolean validateData() { |
| ISuffixEntry entry = getEntry(); |
| String uri = URIUtils.convertLocationToURI(resourceLocationField.getText()); |
| if(entry.getEntryType() != getKeyType() || !entry.getSuffix().equals(suffixField.getText()) || !entry.getURI().equals(uri)) { |
| ISuffixEntry[] entries = catalog.getSuffixEntries(); |
| for (int i = 0; i < entries.length; i++) { |
| if (entries[i].getSuffix().equals(suffixField.getText()) && entries[i].getEntryType() == getKeyType()) return false; |
| } |
| } |
| return true; |
| } |
| |
| protected void updateKeyTypeCombo(int type) { |
| keyTypeCombo.removeAll(); |
| for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) { |
| XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next(); |
| if (theFileType.extensions != null) { |
| for (Iterator j = theFileType.extensions.iterator(); j.hasNext();) { |
| String extension = (String) j.next(); |
| if (resourceLocationField.getText().endsWith(extension)) { |
| if ("org.eclipse.wst.xml.core.ui.catalogFileType.xsd".equals(theFileType.id)) { //$NON-NLS-1$ |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_PUBLIC); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_XSD_SYSTEM); |
| } |
| else if ("org.eclipse.wst.xml.core.ui.catalogFileType.dtd".equals(theFileType.id)) { //$NON-NLS-1$ |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM); |
| } |
| else { |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| } |
| } |
| |
| } |
| |
| } |
| } |
| if (keyTypeCombo.getItemCount() == 0) { |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM); |
| } |
| |
| switch (type) { |
| case ISuffixEntry.SUFFIX_TYPE_URI: // handle XML Schema, |
| keyTypeCombo.select(0); // namespace name as URI key |
| break; |
| |
| case ISuffixEntry.SUFFIX_TYPE_SYSTEM : |
| keyTypeCombo.select(1); |
| break; |
| |
| default : |
| if (keyTypeCombo.getItemCount() > 0) { |
| keyTypeCombo.select(0); |
| } |
| break; |
| } |
| |
| } |
| |
| protected void updateWidgets(Widget widget) { |
| if (widget != keyTypeCombo) { |
| updateKeyTypeCombo(getKeyType()); |
| } |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| |
| } |
| |
| protected abstract class CatalogElementPage { |
| |
| Control fControl; |
| |
| public CatalogElementPage() { |
| super(); |
| |
| } |
| |
| public abstract void refresh(); |
| |
| public abstract Control createControl(Composite parent); |
| |
| public Control getControl() { |
| return fControl; |
| } |
| |
| public abstract ICatalogElement getData(); |
| |
| public abstract void saveData(); |
| } |
| |
| protected class FilterableSelectSingleFileDialog extends SelectSingleFileDialog implements SelectionListener { |
| protected Combo filterControl; |
| |
| public FilterableSelectSingleFileDialog(Shell parentShell) { |
| super(parentShell, null, true); |
| setFilters(null); |
| } |
| |
| public void createAndOpen() { |
| this.create(); |
| setBlockOnOpen(true); |
| getShell().setText(XMLCatalogMessages.UI_LABEL_FILE_SELECTION); |
| this.setTitle(XMLCatalogMessages.UI_LABEL_SELECT_FILE); |
| this.setMessage(XMLCatalogMessages.UI_LABEL_CHOOSE_FILE_TO_ADD_TO_CATALOG); |
| open(); |
| } |
| |
| public void createFilterControl(Composite composite) { |
| Label label = new Label(composite, SWT.NONE); |
| label.setText(XMLCatalogMessages.UI_LABEL_SELECT_FILE_FILTER_CONTROL); |
| |
| filterControl = new Combo(composite, SWT.READ_ONLY); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL); |
| filterControl.setLayoutData(gd); |
| |
| filterControl.setText(XMLCatalogMessages.UI_TEXT_SELECT_FILE_FILTER_CONTROL); |
| filterControl.add(XMLCatalogMessages.UI_TEXT_SELECT_FILE_FILTER_CONTROL); |
| |
| for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) { |
| XMLCatalogFileType fileType = (XMLCatalogFileType) i.next(); |
| if (fileType.description != null) { |
| filterControl.add(fileType.description); |
| } |
| } |
| |
| filterControl.select(0); |
| filterControl.addSelectionListener(this); |
| } |
| |
| protected void setFilters(XMLCatalogFileType fileType) { |
| if (fileType == null) { |
| // compute all the supported file extensions |
| List list = new ArrayList(); |
| for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) { |
| XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next(); |
| if (theFileType.extensions != null) { |
| list.addAll(theFileType.extensions); |
| } |
| } |
| // Any files are now supported with Resource URI |
| selectSingleFileView.setFilterExtensions(createStringArray(list)); |
| } |
| else { |
| if (fileType.extensions != null) { |
| selectSingleFileView.setFilterExtensions(createStringArray(fileType.extensions)); |
| } |
| } |
| } |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| // do nothing |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String text = filterControl.getText(); |
| XMLCatalogFileType fileType = getMatchingFileType(text); |
| setFilters(fileType); |
| } |
| } |
| |
| protected abstract class AbstractDelegatePage extends CatalogElementPage { |
| |
| |
| protected Button browseWorkspaceButton; |
| |
| protected Button browseFileSystemButton; |
| |
| protected Text catalogLocationField; |
| |
| protected Label errorMessageLabel; |
| |
| protected void computeErrorMessage() { |
| errorMessage = null; |
| String fileName = catalogLocationField.getText(); |
| if (fileName.trim().length() > 0) { |
| if ((fileName.indexOf("..") != -1) || (fileName.indexOf("./") != -1) || (fileName.indexOf("/.") != -1) || (fileName.indexOf(".\\") != -1) || (fileName.indexOf("\\.") != -1)) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ |
| errorMessage = XMLCatalogMessages.UI_WARNING_URI_MUST_NOT_HAVE_DOTS; |
| } |
| |
| String uri = fileName; |
| if (!URIHelper.hasProtocol(uri)) { |
| uri = URIHelper.isAbsolute(uri) ? URIHelper.prependFileProtocol(uri) : URIHelper.prependPlatformResourceProtocol(uri); |
| } |
| |
| if ((errorMessage == null) && !URIHelper.isReadableURI(uri, false)) { |
| errorMessage = XMLCatalogMessages.UI_WARNING_URI_NOT_FOUND_COLON + fileName; |
| } |
| } |
| else { |
| // this an error that is not actually |
| // reported ... OK is just disabled |
| errorMessage = ""; //$NON-NLS-1$ |
| } |
| } |
| |
| public abstract Control createControl(Composite parent); |
| |
| protected Control createNextCatalogPanel(Composite parent, String catalogUriLabel) { |
| ModifyListener modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| updateWidgets(e.widget); |
| } |
| }; |
| |
| Composite composite = new Composite(parent, SWT.NONE); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| composite.setLayoutData(gd); |
| |
| GridLayout layout = new GridLayout(); |
| composite.setLayout(layout); |
| |
| Composite group = new Composite(composite, SWT.NONE); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| group.setLayoutData(gd); |
| |
| layout = new GridLayout(); |
| group.setLayout(layout); |
| |
| createSpecificFields(group); |
| |
| Label resourceLocationLabel = new Label(group, SWT.NONE); |
| resourceLocationLabel.setText(catalogUriLabel); |
| |
| catalogLocationField = new Text(group, SWT.SINGLE | SWT.BORDER); |
| catalogLocationField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| catalogLocationField.setText(URIUtils.convertURIToLocation(getDisplayValue(getCatalogLocation()))); |
| // WorkbenchHelp.setHelp(resourceLocationField, |
| // XMLBuilderContextIds.XMLP_ENTRY_URI); |
| catalogLocationField.addModifyListener(modifyListener); |
| |
| Composite browseButtonsComposite = new Composite(group, SWT.FLAT); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| gd.horizontalSpan = 2; |
| gd.horizontalAlignment = GridData.END; |
| browseButtonsComposite.setLayoutData(gd); |
| |
| layout = new GridLayout(); |
| layout.numColumns = 2; |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| layout.marginBottom = 5; |
| browseButtonsComposite.setLayout(layout); |
| |
| browseWorkspaceButton = new Button(browseButtonsComposite, SWT.PUSH); |
| browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE); |
| browseWorkspaceButton.addSelectionListener(new SelectionListener(){ |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String value = invokeWorkspaceFileSelectionDialog(); |
| if(value != null) { |
| catalogLocationField.setText(value); |
| } |
| } |
| }); |
| |
| browseFileSystemButton = new Button(browseButtonsComposite, SWT.PUSH); |
| browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_FILE_SYSTEM); |
| browseFileSystemButton.addSelectionListener(new SelectionListener(){ |
| |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| String value = invokeFileSelectionDialog(); |
| if(value != null) { |
| catalogLocationField.setText(value); |
| } |
| } |
| }); |
| |
| errorMessageLabel = new Label(group, SWT.NONE); |
| errorMessageLabel.setForeground(color); |
| errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| updateWidgets(null); |
| return composite; |
| } |
| |
| protected void createSpecificFields(Composite group) { |
| } |
| |
| protected abstract String getCatalogLocation(); |
| |
| protected void updateWidgets(Widget widget) { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| } |
| |
| protected class NextCatalogPage extends AbstractDelegatePage { |
| protected INextCatalog nextCatalog; |
| |
| public ICatalogElement getData() { |
| return getNextCatalog(); |
| } |
| |
| public void refresh() { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| |
| protected INextCatalog getNextCatalog() { |
| if (nextCatalog == null) { |
| if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_NEXT_CATALOG)) { |
| nextCatalog = (INextCatalog) fCatalogElement; |
| } |
| else { |
| if (catalog != null) { |
| nextCatalog = (INextCatalog) catalog.createCatalogElement(ICatalogElement.TYPE_NEXT_CATALOG); |
| } |
| } |
| } |
| return nextCatalog; |
| } |
| |
| public void saveData() { |
| getNextCatalog().setCatalogLocation(URIUtils.convertLocationToURI(catalogLocationField.getText())); |
| dataSaved = true; |
| } |
| |
| protected String getCatalogLocation() { |
| return getNextCatalog().getCatalogLocation(); |
| } |
| |
| public Control createControl(Composite parent) { |
| fControl = createNextCatalogPanel(parent, XMLCatalogMessages.UI_LABEL_CATALOG_URI_COLON); |
| return fControl; |
| } |
| } |
| |
| protected class DelegateCatalogPage extends AbstractDelegatePage { |
| protected IDelegateCatalog delegateCatalog; |
| private Text prefixField; |
| private Combo keyTypeCombo; |
| |
| public void refresh() { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| |
| protected void computeErrorMessage() { |
| errorMessage = null; |
| String prefix = prefixField.getText(); |
| if(prefix.length() > 0) { |
| // good |
| } else { |
| errorMessage = ""; |
| } |
| } |
| |
| public ICatalogElement getData() { |
| return getDelegateCatalog(); |
| } |
| |
| protected void createSpecificFields(Composite group) { |
| |
| Composite prefixComposite = new Composite(group, SWT.NONE); |
| |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = 2; |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| layout.marginBottom = 5; |
| prefixComposite.setLayout(layout); |
| |
| // Key Type |
| // |
| Label keyTypeLabel = new Label(prefixComposite, SWT.NONE); |
| keyTypeLabel.setText(XMLCatalogMessages.UI_MATCH_KEY_TYPE_COLON); |
| |
| keyTypeCombo = new Combo(prefixComposite, SWT.READ_ONLY); |
| GridData gd = new GridData(); |
| gd.horizontalAlignment = SWT.FILL; |
| gd.grabExcessHorizontalSpace = true; |
| keyTypeCombo.setLayoutData(gd); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_PUBLIC); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| switch (getDelegateCatalog().getEntryType()) { |
| case IDelegateCatalog.DELEGATE_TYPE_PUBLIC: |
| keyTypeCombo.select(0); |
| break; |
| case IDelegateCatalog.DELEGATE_TYPE_SYSTEM: |
| keyTypeCombo.select(1); |
| break; |
| default: |
| case IDelegateCatalog.DELEGATE_TYPE_URI: |
| keyTypeCombo.select(2); |
| break; |
| } |
| |
| Label prefixLabel = new Label(prefixComposite, SWT.NONE); |
| prefixLabel.setText(XMLCatalogMessages.UI_LABEL_START_STRING_COLON); |
| |
| prefixField = new Text(prefixComposite, SWT.SINGLE | SWT.BORDER); |
| prefixField.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); |
| prefixField.setText(getDisplayValue(getDelegateCatalog().getStartString())); |
| ModifyListener modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| updateWidgets(e.widget); |
| } |
| }; |
| prefixField.addModifyListener(modifyListener); |
| prefixComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); |
| } |
| |
| protected IDelegateCatalog getDelegateCatalog() { |
| if (delegateCatalog == null) { |
| if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_DELEGATE)) { |
| delegateCatalog = (IDelegateCatalog) fCatalogElement; |
| } |
| else { |
| if (catalog != null) { |
| delegateCatalog = (IDelegateCatalog) catalog.createCatalogElement(IDelegateCatalog.DELEGATE_TYPE_URI); |
| } |
| } |
| } |
| return delegateCatalog; |
| } |
| |
| public void saveData() { |
| if (validateData()) |
| { |
| getDelegateCatalog().setCatalogLocation(URIUtils.convertLocationToURI(catalogLocationField.getText())); |
| getDelegateCatalog().setStartString(prefixField.getText()); |
| getDelegateCatalog().setEntryType(getDelegateType()); |
| dataSaved = true; |
| } |
| else { |
| errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_DELEGATE; |
| errorMessageLabel.setText(errorMessage); |
| updateOKButtonState(); |
| dataSaved = false; |
| } |
| } |
| |
| private int getDelegateType() { |
| switch (keyTypeCombo.getSelectionIndex()) { |
| case 0: |
| return IDelegateCatalog.DELEGATE_TYPE_PUBLIC; |
| |
| case 1: |
| return IDelegateCatalog.DELEGATE_TYPE_SYSTEM; |
| |
| case 2: |
| default: |
| return IDelegateCatalog.DELEGATE_TYPE_URI; |
| } |
| } |
| |
| protected boolean validateData() { |
| IDelegateCatalog entry = getDelegateCatalog(); |
| String prefix = prefixField.getText(); |
| if(entry.getEntryType() != getDelegateType() || !prefix.equals(entry.getStartString())) { |
| IDelegateCatalog[] entries = catalog.getDelegateCatalogs(); |
| for (int i = 0; i < entries.length; i++) { |
| if (entries[i].getStartString().equals(prefixField) && entries[i].getEntryType() == getDelegateType()) return false; |
| } |
| } |
| return true; |
| } |
| |
| protected String getCatalogLocation() { |
| return getDelegateCatalog().getCatalogLocation(); |
| } |
| |
| public Control createControl(Composite parent) { |
| fControl = createNextCatalogPanel(parent, XMLCatalogMessages.UI_LABEL_DELEGATE_CATALOG_URI_COLON); |
| return fControl; |
| } |
| } |
| |
| protected class RadioItemSelectionChangeListener implements SelectionListener { |
| public void widgetDefaultSelected(SelectionEvent e) { |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| Object selection = e.getSource(); |
| if (selection instanceof Button) { |
| Button button = (Button) selection; |
| if (button.getSelection()) { |
| if (!showPage((CatalogElementPage) button.getData())) { |
| // Page flipping wasn't successful |
| // handleError(); |
| } |
| } |
| } |
| } |
| |
| } |
| |
| protected class RewriteEntryPage extends CatalogElementPage { |
| protected IRewriteEntry rewriteEntry; |
| private Text startStringField; |
| private Text prefixField; |
| private Combo keyTypeCombo; |
| |
| public void refresh() { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| |
| public ICatalogElement getData() { |
| return getRewriteEntry(); |
| } |
| |
| protected Label errorMessageLabel; |
| |
| protected void computeErrorMessage() { |
| errorMessage = null; |
| |
| String start = startStringField.getText(); |
| String prefix = prefixField.getText(); |
| if (start.trim().length() > 0 && prefix.trim().length() > 0) { |
| // good |
| } |
| else { |
| // this an error that is not actually |
| // reported ... OK is just disabled |
| errorMessage = ""; //$NON-NLS-1$ |
| } |
| } |
| |
| protected IRewriteEntry getRewriteEntry() { |
| if (rewriteEntry == null) { |
| if ((fCatalogElement != null) && (fCatalogElement.getType() == ICatalogElement.TYPE_REWRITE)) { |
| rewriteEntry = (IRewriteEntry) fCatalogElement; |
| } |
| else { |
| if (catalog != null) { |
| rewriteEntry = (IRewriteEntry) catalog.createCatalogElement(IRewriteEntry.REWRITE_TYPE_SYSTEM); |
| } |
| } |
| } |
| return rewriteEntry; |
| } |
| |
| protected void updateWidgets(Widget widget) { |
| computeErrorMessage(); |
| updateErrorMessageLabel(errorMessageLabel); |
| updateOKButtonState(); |
| } |
| public void saveData() { |
| if (validateData()) { |
| getRewriteEntry().setRewritePrefix(prefixField.getText()); |
| getRewriteEntry().setStartString(startStringField.getText()); |
| getRewriteEntry().setEntryType(getEntryType()); |
| dataSaved = true; |
| } |
| else { |
| errorMessage = XMLCatalogMessages.UI_WARNING_DUPLICATE_REWRITE; |
| errorMessageLabel.setText(errorMessage); |
| updateOKButtonState(); |
| dataSaved = false; |
| } |
| } |
| |
| private int getEntryType() { |
| switch (keyTypeCombo.getSelectionIndex()) { |
| case 0: |
| return IRewriteEntry.REWRITE_TYPE_SYSTEM; |
| case 1: |
| default: |
| return IRewriteEntry.REWRITE_TYPE_URI; |
| } |
| } |
| |
| protected boolean validateData() { |
| IRewriteEntry entry = getRewriteEntry(); |
| String startString = startStringField.getText(); |
| if(entry.getEntryType() != getEntryType() || !entry.getStartString().equals(startString)) { |
| IRewriteEntry[] entries = catalog.getRewriteEntries(); |
| for (int i = 0; i < entries.length; i++) { |
| if (entries[i].getStartString().equals(startString) && entries[i].getEntryType() == getEntryType()) return false; |
| } |
| } |
| return true; |
| } |
| |
| public Control createControl(Composite parent) { |
| |
| fControl = createRewriteEntryPanel(parent); |
| |
| return fControl; |
| } |
| |
| public Control createRewriteEntryPanel(Composite parent) { |
| ModifyListener modifyListener = new ModifyListener() { |
| public void modifyText(ModifyEvent e) { |
| updateWidgets(e.widget); |
| } |
| }; |
| |
| Composite composite = new Composite(parent, SWT.NONE); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| composite.setLayoutData(gd); |
| |
| GridLayout layout = new GridLayout(); |
| composite.setLayout(layout); |
| |
| Composite group = new Composite(composite, SWT.NONE); |
| gd = new GridData(GridData.FILL_HORIZONTAL); |
| group.setLayoutData(gd); |
| |
| layout = new GridLayout(); |
| group.setLayout(layout); |
| |
| Composite prefixComposite = new Composite(group, SWT.NONE); |
| |
| layout = new GridLayout(); |
| layout.numColumns = 2; |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| layout.marginBottom = 5; |
| prefixComposite.setLayout(layout); |
| |
| // Key Type |
| // |
| Label keyTypeLabel = new Label(prefixComposite, SWT.NONE); |
| keyTypeLabel.setText(XMLCatalogMessages.UI_MATCH_KEY_TYPE_COLON); |
| |
| keyTypeCombo = new Combo(prefixComposite, SWT.READ_ONLY); |
| gd = new GridData(); |
| gd.horizontalAlignment = SWT.FILL; |
| gd.grabExcessHorizontalSpace = true; |
| keyTypeCombo.setLayoutData(gd); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_DTD_SYSTEM); |
| keyTypeCombo.add(XMLCatalogMessages.UI_KEY_TYPE_DESCRIPTION_URI); |
| switch (getRewriteEntry().getEntryType()) { |
| case IDelegateCatalog.DELEGATE_TYPE_SYSTEM: |
| keyTypeCombo.select(0); |
| break; |
| default: |
| case IDelegateCatalog.DELEGATE_TYPE_URI: |
| keyTypeCombo.select(1); |
| break; |
| } |
| Label startStringLabel = new Label(prefixComposite, SWT.NONE); |
| startStringLabel.setText(XMLCatalogMessages.UI_LABEL_START_STRING_COLON); |
| |
| startStringField = new Text(prefixComposite, SWT.SINGLE | SWT.BORDER); |
| startStringField.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); |
| startStringField.setText(getDisplayValue(getRewriteEntry().getStartString())); |
| startStringField.addModifyListener(modifyListener); |
| |
| Label prefixLabel = new Label(prefixComposite, SWT.NONE); |
| prefixLabel.setText(XMLCatalogMessages.UI_LABEL_REWRITE_PREFIX_COLON); |
| |
| prefixField = new Text(prefixComposite, SWT.SINGLE | SWT.BORDER); |
| prefixField.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); |
| prefixField.setText(getDisplayValue(getRewriteEntry().getRewritePrefix())); |
| prefixField.addModifyListener(modifyListener); |
| |
| prefixComposite.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); |
| |
| errorMessageLabel = new Label(group, SWT.NONE); |
| errorMessageLabel.setForeground(color); |
| errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| updateWidgets(null); |
| return composite; |
| } |
| } |
| |
| protected class ToolBarItemSelectionChangeListener implements SelectionListener { |
| public void widgetDefaultSelected(SelectionEvent e) {} |
| |
| public void widgetSelected(SelectionEvent e) { |
| Object selection = e.getSource(); |
| if (selection instanceof ToolItem) { |
| ToolItem toolItem = (ToolItem)selection; |
| ToolBar toolbar = toolItem.getParent(); |
| if(toolbar != null) { |
| ToolItem[] items = toolbar.getItems(); |
| for (int i = 0; i < items.length; i++) { |
| items[i].setSelection(items[i] == toolItem); |
| } |
| } |
| if (!showPage((CatalogElementPage) toolItem.getData())) { |
| // Page flipping wasn't successful |
| // handleError(); |
| } |
| } |
| } |
| } |
| |
| public static String[] createStringArray(List list) { |
| String[] stringArray = new String[list.size()]; |
| for (int i = 0; i < stringArray.length; i++) { |
| stringArray[i] = (String) list.get(i); |
| } |
| return stringArray; |
| } |
| |
| public static String removeLeadingSlash(String uri) { |
| // remove leading slash from the value to avoid the whole leading |
| // slash |
| // ambiguity problem |
| // |
| if (uri != null) { |
| while (uri.startsWith("/") || uri.startsWith("\\")) { //$NON-NLS-1$ //$NON-NLS-2$ |
| uri = uri.substring(1); |
| } |
| } |
| return uri; |
| } |
| |
| protected ICatalog catalog; |
| |
| protected ICatalogElement fCatalogElement; |
| |
| protected String errorMessage; |
| |
| protected String warningMessage; |
| |
| protected Button okButton; |
| |
| protected PageBook pageContainer; |
| |
| protected CatalogElementPage selectedPage; |
| |
| // protected TreeViewer treeViewer; |
| |
| protected ToolBar toolBar; |
| |
| protected Composite elementTypeComposite; |
| |
| protected Color color; |
| protected boolean dataSaved; |
| |
| public EditCatalogEntryDialog(Shell parentShell, ICatalog aCatalog) { |
| super(parentShell); |
| setShellStyle(getShellStyle() | SWT.RESIZE); |
| this.catalog = aCatalog; |
| } |
| |
| public EditCatalogEntryDialog(Shell parentShell, ICatalogElement catalogElement, ICatalog aCatalog) { |
| this(parentShell, aCatalog); |
| this.fCatalogElement = catalogElement; |
| // TODO EB: fix his |
| // entry.setURI(URIHelper.removePlatformResourceProtocol(entry.getURI())); |
| } |
| |
| protected void buttonPressed(int buttonId) { |
| if (buttonId == IDialogConstants.OK_ID) { |
| selectedPage.saveData(); |
| if (!dataSaved) { |
| // do not exit edit dialog |
| return; |
| } |
| } |
| super.buttonPressed(buttonId); |
| } |
| |
| |
| |
| protected void createButtonsForButtonBar(Composite parent) { |
| okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); |
| okButton.setEnabled(false); |
| createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); |
| updateOKButtonState(); |
| } |
| |
| |
| protected Control createDialogArea(Composite parent) { |
| Composite dialogAreaComposite = (Composite) super.createDialogArea(parent); |
| color = new Color(dialogAreaComposite.getDisplay(), 200, 0, 0); |
| GridLayout layout = new GridLayout(); |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| dialogAreaComposite.setLayout(layout); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| gd.widthHint = 550; |
| //gd.heightHint = 250; |
| dialogAreaComposite.setLayoutData(gd); |
| createMainComponent(dialogAreaComposite); |
| return this.dialogArea; |
| } |
| |
| public boolean close() { |
| if (color != null) { |
| color.dispose(); |
| } |
| return super.close(); |
| } |
| |
| protected Composite createMainComponent(Composite composite) { |
| if (fCatalogElement != null) // "edit" action |
| { |
| Composite composite1 = new Composite(composite, SWT.NONE); |
| GridData data = new GridData(GridData.FILL_BOTH); |
| composite1.setLayoutData(data); |
| GridLayout layout = new GridLayout(); |
| composite1.setLayout(layout); |
| |
| pageContainer = new PageBook(composite1, SWT.NONE); |
| pageContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| |
| if (fCatalogElement.getType() == ICatalogElement.TYPE_ENTRY) { |
| CatalogElementPage entryPage = new CatalogEntryPage(); |
| entryPage.createControl(pageContainer); |
| showPage(entryPage); |
| } |
| else if (fCatalogElement.getType() == ICatalogElement.TYPE_NEXT_CATALOG) { |
| CatalogElementPage nextCatalogPage = new NextCatalogPage(); |
| nextCatalogPage.createControl(pageContainer); |
| showPage(nextCatalogPage); |
| } |
| else if (fCatalogElement.getType() == ICatalogElement.TYPE_DELEGATE) { |
| DelegateCatalogPage delegateCatalogPage = new DelegateCatalogPage(); |
| delegateCatalogPage.createControl(pageContainer); |
| showPage(delegateCatalogPage); |
| } |
| else if (fCatalogElement.getType() == ICatalogElement.TYPE_SUFFIX) { |
| SuffixEntryPage suffixEntryPage = new SuffixEntryPage(); |
| suffixEntryPage.createControl(pageContainer); |
| showPage(suffixEntryPage); |
| } |
| else if (fCatalogElement.getType() == ICatalogElement.TYPE_REWRITE) { |
| RewriteEntryPage rewriteEntryPage = new RewriteEntryPage(); |
| rewriteEntryPage.createControl(pageContainer); |
| showPage(rewriteEntryPage); |
| } |
| |
| return composite1; |
| } |
| return createMainComponentWithToolbar(composite); |
| |
| } |
| |
| |
| protected Composite createMainComponentWithToolbar(Composite composite) { |
| |
| FormLayout formLayout = new FormLayout(); |
| formLayout.marginHeight = 5; |
| formLayout.marginWidth = 5; |
| composite.setLayout(formLayout); |
| |
| Label label = new Label(composite, SWT.NONE); |
| FormData data = new FormData(); |
| data.top = new FormAttachment(0, 0); |
| data.left = new FormAttachment(0, 0); |
| data.right = new FormAttachment(100, 0); |
| label.setLayoutData(data); |
| |
| toolBar = new ToolBar(composite, SWT.BORDER | SWT.FLAT | SWT.VERTICAL); |
| |
| |
| data = new FormData(); |
| data.top = new FormAttachment(label, 0); |
| data.left = new FormAttachment(0, 0); |
| data.bottom = new FormAttachment(100, 0); |
| // data.height = 250; |
| // data.width = 50; |
| toolBar.setLayoutData(data); |
| |
| Composite composite1 = new Composite(composite, SWT.BORDER); |
| data = new FormData(); |
| data.top = new FormAttachment(label, 0); |
| data.left = new FormAttachment(toolBar, 0, SWT.DEFAULT); |
| data.right = new FormAttachment(100, 0); |
| data.bottom = new FormAttachment(100, 0); |
| composite1.setLayoutData(data); |
| GridLayout layout = new GridLayout(); |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| composite1.setLayout(layout); |
| |
| // createPageBookPanel(composite1); |
| pageContainer = new PageBook(composite1, SWT.NONE); |
| pageContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| |
| // add pages for each type of catalog element |
| createCatalogEntryButton(); |
| createRewriteButton(); |
| createSuffixCatalogButton(); |
| createNextCatalogButton(); |
| createDelegateCatalogButton(); |
| if (toolBar.getItemCount() > 0) { |
| ToolItem item = toolBar.getItem(0); |
| showPage((CatalogElementPage) (item.getData())); |
| } |
| return composite1; |
| } |
| |
| protected void createCatalogEntryButton() { |
| CatalogElementPage page = new CatalogEntryPage(); |
| page.createControl(pageContainer); |
| ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK); |
| toolItem.setImage(catalogEntryToolBarImage); |
| toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_catalogEntryLabel); |
| toolItem.setData(page); |
| toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener()); |
| toolItem.setSelection(true); |
| } |
| |
| protected void createNextCatalogButton() { |
| CatalogElementPage page = new NextCatalogPage(); |
| page.createControl(pageContainer); |
| ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK); |
| toolItem.setImage(nextCatalogToolBarImage); |
| toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_nextCatalogLabel); |
| toolItem.setData(page); |
| toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener()); |
| |
| } |
| |
| protected void createRewriteButton() { |
| CatalogElementPage page = new RewriteEntryPage(); |
| page.createControl(pageContainer); |
| ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK); |
| toolItem.setImage(rewriteToolBarImage); |
| toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_rewriteEntryLabel); |
| toolItem.setData(page); |
| toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener()); |
| } |
| |
| protected void createDelegateCatalogButton() { |
| CatalogElementPage page = new DelegateCatalogPage(); |
| page.createControl(pageContainer); |
| ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK); |
| toolItem.setImage(delegateCatalogToolBarImage); |
| toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_delegateCatalogLabel); |
| toolItem.setData(page); |
| toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener()); |
| } |
| |
| protected void createSuffixCatalogButton() { |
| CatalogElementPage page = new SuffixEntryPage(); |
| page.createControl(pageContainer); |
| ToolItem toolItem = new ToolItem(toolBar, SWT.CHECK); |
| toolItem.setImage(suffixToolBarImage); |
| toolItem.setText(XMLCatalogMessages.EditCatalogEntryDialog_suffixEntryLabel); |
| toolItem.setData(page); |
| toolItem.addSelectionListener(new ToolBarItemSelectionChangeListener()); |
| } |
| |
| |
| |
| |
| |
| |
| // |
| // protected void createRewriteEntryButton() { |
| // CatalogElementPage page = new RewriteEntryPage(); |
| // page.createControl(pageContainer); |
| // Button radioButton = new Button(elementTypeComposite, SWT.RADIO); |
| // radioButton.setText(XMLCatalogMessages.EditCatalogEntryDialog_rewriteEntryLabel); |
| // radioButton.setData(page); |
| // radioButton.addSelectionListener(new RadioItemSelectionChangeListener()); |
| // } |
| // |
| // protected void createSuffixEntryButton() { |
| // CatalogElementPage page = new SuffixEntryPage(); |
| // page.createControl(pageContainer); |
| // Button radioButton = new Button(elementTypeComposite, SWT.RADIO); |
| // radioButton.setText(XMLCatalogMessages.EditCatalogEntryDialog_suffixEntryLabel); |
| // radioButton.setData(page); |
| // radioButton.addSelectionListener(new RadioItemSelectionChangeListener()); |
| // } |
| // |
| // protected void createDelegateCatalogButton() { |
| // CatalogElementPage page = new DelegateCatalogPage(); |
| // page.createControl(pageContainer); |
| // Button radioButton = new Button(elementTypeComposite, SWT.RADIO); |
| // radioButton.setText(XMLCatalogMessages.EditCatalogEntryDialog_delegateCatalogLabel); |
| // radioButton.setData(page); |
| // radioButton.addSelectionListener(new RadioItemSelectionChangeListener()); |
| // |
| // } |
| |
| protected ICatalogElement getCatalogElement() { |
| return fCatalogElement; |
| } |
| |
| protected String getDisplayValue(String string) { |
| return string != null ? string : ""; //$NON-NLS-1$ |
| } |
| |
| protected XMLCatalogFileType getMatchingFileType(String description) { |
| XMLCatalogFileType fileType = null; |
| for (Iterator i = CatalogFileTypeRegistryReader.getXMLCatalogFileTypes().iterator(); i.hasNext();) { |
| XMLCatalogFileType theFileType = (XMLCatalogFileType) i.next(); |
| if ((theFileType.description != null) && theFileType.description.equals(description)) { |
| fileType = theFileType; |
| } |
| } |
| return fileType; |
| } |
| |
| protected boolean showPage(CatalogElementPage page) { |
| if (pageContainer.isDisposed()) { |
| return false; |
| } |
| selectedPage = page; |
| pageContainer.setVisible(true); |
| pageContainer.showPage(selectedPage.getControl()); |
| fCatalogElement = selectedPage.getData(); |
| selectedPage.refresh(); |
| return true; |
| } |
| |
| protected void updateErrorMessageLabel(Label errorMessageLabel) { |
| if (errorMessage != null) { |
| errorMessageLabel.setText(errorMessage); |
| } |
| else if (warningMessage != null) { |
| errorMessageLabel.setText(warningMessage); |
| } |
| else { |
| errorMessageLabel.setText(""); |
| } |
| } |
| |
| protected void updateOKButtonState() { |
| if (okButton != null) { |
| okButton.setEnabled(errorMessage == null); |
| } |
| } |
| |
| protected Button createBrowseButton(Composite composite) { |
| Button browseButton = new Button(composite, SWT.PUSH); |
| // browseButton.setText(XMLCatalogMessages. |
| // UI_BUTTON_BROWSE")); |
| browseButton.setImage(borwseImage); |
| Rectangle r = borwseImage.getBounds(); |
| GridData gd = new GridData(); |
| int IMAGE_WIDTH_MARGIN = 6; |
| int IMAGE_HEIGHT_MARGIN = 6; |
| gd.heightHint = r.height + IMAGE_HEIGHT_MARGIN; |
| gd.widthHint = r.width + IMAGE_WIDTH_MARGIN; |
| browseButton.setLayoutData(gd); |
| |
| return browseButton; |
| |
| } |
| |
| protected Button createWorkspaceBrowseButton(Composite composite) { |
| Button browseWorkspaceButton = new Button(composite, SWT.PUSH); |
| browseWorkspaceButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE); |
| return browseWorkspaceButton; |
| } |
| |
| protected Button createFileSystemBrowseButton(Composite composite) { |
| Button browseFileSystemButton = new Button(composite, SWT.PUSH); |
| browseFileSystemButton.setText(XMLCatalogMessages.UI_BUTTON_MENU_BROWSE_WORKSPACE); |
| return browseFileSystemButton; |
| } |
| |
| |
| String invokeWorkspaceFileSelectionDialog() { |
| FilterableSelectSingleFileDialog dialog = new FilterableSelectSingleFileDialog(getShell()); |
| dialog.createAndOpen(); |
| IFile file = dialog.getFile(); |
| String uri = null; |
| if (file != null) { |
| // remove leading slash from the value to avoid the |
| // whole leading slash ambiguity problem |
| // |
| uri = file.getFullPath().toString(); |
| while (uri.startsWith("/") || uri.startsWith("\\")) { //$NON-NLS-1$ //$NON-NLS-2$ |
| uri = uri.substring(1); |
| } |
| } |
| return uri; |
| } |
| |
| String invokeFileSelectionDialog() { |
| FileDialog dialog = new FileDialog(getShell(), SWT.SINGLE); |
| return dialog.open(); |
| } |
| |
| } |