blob: 578e8a80502c75aab3aa0e9a41d664bba9b7b829 [file] [log] [blame]
/*******************************************************************************
* 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();
}
}