/******************************************************************************* * Copyright (c) 2001, 2008 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.dialogs; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver; import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin; import org.eclipse.wst.common.uriresolver.internal.util.URIHelper; import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument; import org.eclipse.wst.xml.core.internal.contentmodel.ContentModelManager; import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo; import org.eclipse.wst.xml.ui.internal.XMLUIMessages; import org.eclipse.wst.xml.ui.internal.util.XMLCommonUIContextIds; public class EditNamespaceInfoDialog extends Dialog { public static EditNamespaceInfoDialog invokeDialog(Shell shell, String title, NamespaceInfo info, IPath resourceLocation) { EditNamespaceInfoDialog dialog = new EditNamespaceInfoDialog(shell, info); dialog.create(); dialog.getShell().setText(title); dialog.setBlockOnOpen(true); dialog.setResourceLocation(resourceLocation); dialog.open(); return dialog; } protected Button browseButton; protected String errorMessage; protected Label errorMessageLabel; protected NamespaceInfo fInfo; protected Text locationHintField; protected Button okButton; protected Text prefixField; protected IPath resourceLocation; protected Text uriField; public EditNamespaceInfoDialog(Shell parentShell, NamespaceInfo info) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.fInfo = info; } protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.OK_ID) { fInfo.uri = uriField.getText(); fInfo.prefix = prefixField.getText(); fInfo.locationHint = locationHintField.getText(); } super.buttonPressed(buttonId); } protected void computeErrorMessage() { errorMessage = null; } 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); updateWidgets(); } protected Control createDialogArea(Composite parent) { Composite dialogsubArea = (Composite) super.createDialogArea(parent); PlatformUI.getWorkbench().getHelpSystem().setHelp(dialogsubArea, XMLCommonUIContextIds.XCUI_NAMESPACE_DIALOG); Composite composite = new Composite(dialogsubArea, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.marginWidth = 0; composite.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = 350; composite.setLayoutData(gd); ModifyListener modifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { updateWidgets(); } }; // row 1 // Label uriLabel = new Label(composite, SWT.NONE); uriLabel.setText(XMLUIMessages._UI_LABEL_NAMESPACE_NAME_COLON); uriField = new Text(composite, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; uriField.setLayoutData(gd); uriField.setText(getDisplayValue(fInfo.uri)); uriField.addModifyListener(modifyListener); uriField.setEnabled(fInfo.getProperty("uri-readOnly") == null); //$NON-NLS-1$ // never read Label placeHolder1 = new Label(composite, SWT.NONE); placeHolder1.setText(""); //$NON-NLS-1$ // row 2 // Label prefixLabel = new Label(composite, SWT.NONE); prefixLabel.setText(XMLUIMessages._UI_LABEL_PREFIX_COLON); prefixField = new Text(composite, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; prefixField.setLayoutData(gd); prefixField.setText(getDisplayValue(fInfo.prefix)); prefixField.addModifyListener(modifyListener); prefixField.setEnabled(fInfo.getProperty("prefix-readOnly") == null); //$NON-NLS-1$ // never read Label placeHolder2 = new Label(composite, SWT.NONE); placeHolder2.setText(""); //$NON-NLS-1$ // row 3 // Label locationHintLabel = new Label(composite, SWT.NONE); locationHintLabel.setText(XMLUIMessages._UI_LABEL_LOCATION_HINT_COLON); locationHintField = new Text(composite, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; locationHintField.setLayoutData(gd); locationHintField.setText(getDisplayValue(fInfo.locationHint)); locationHintField.addModifyListener(modifyListener); locationHintField.setEnabled(fInfo.getProperty("locationHint-readOnly") == null); //$NON-NLS-1$ SelectionListener selectionListener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { performBrowse(); } }; browseButton = new Button(composite, SWT.NONE); browseButton.setText(XMLUIMessages._UI_LABEL_BROWSE); browseButton.addSelectionListener(selectionListener); browseButton.setEnabled(locationHintField.getEnabled()); // error message errorMessageLabel = new Label(dialogsubArea, SWT.NONE); errorMessageLabel.setText(XMLUIMessages.error_message_goes_here); errorMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Color color = new Color(errorMessageLabel.getDisplay(), 200, 0, 0); errorMessageLabel.setForeground(color); return dialogsubArea; } protected String getDisplayValue(String string) { return string != null ? string : ""; //$NON-NLS-1$ } protected void performBrowse() { String[] extensions = {".xsd"}; //$NON-NLS-1$ SelectFileOrXMLCatalogIdDialog dialog = new SelectFileOrXMLCatalogIdDialog(getShell(), extensions); dialog.create(); dialog.getShell().setText(XMLUIMessages._UI_LABEL_SELECT_FILE); dialog.setBlockOnOpen(true); dialog.open(); if (dialog.getReturnCode() == Window.OK) { String grammarURI = null; IFile file = dialog.getFile(); String id = dialog.getId(); if (file != null) { String uri = null; if (resourceLocation != null) { IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(resourceLocation); if (resource != null) { IPath location = resource.getLocation(); if (location != null) { uri = URIHelper.getRelativeURI(file.getLocation(), location); } } else { uri = URIHelper.getRelativeURI(file.getLocation(), resourceLocation); } grammarURI = file.getLocation().toOSString(); } else { uri = file.getLocation().toOSString(); grammarURI = uri; } locationHintField.setText(uri); } else if (id != null) { locationHintField.setText(id); URIResolver resolver = URIResolverPlugin.createResolver(); grammarURI = resolver.resolve(null, id, id); } CMDocument document = ContentModelManager.getInstance().createCMDocument(URIHelper.getURIForFilePath(grammarURI), "xsd"); //$NON-NLS-1$ if(document != null) { List namespaceInfoList = (List) document.getProperty("http://org.eclipse.wst/cm/properties/namespaceInfo"); //$NON-NLS-1$ if(namespaceInfoList != null) { NamespaceInfo info = (NamespaceInfo) namespaceInfoList.get(0); if(info != null) { if ((uriField.getText().trim().length() == 0) && (info.uri != null)) { uriField.setText(info.uri); } if ((prefixField.getText().trim().length() == 0) && (info.prefix != null)) { prefixField.setText(info.prefix); } } } } } } public void setResourceLocation(IPath path) { resourceLocation = path; } protected void updateErrorMessageLabel() { errorMessageLabel.setText(errorMessage != null ? errorMessage : ""); //$NON-NLS-1$ } protected void updateOKButtonState() { if (okButton != null) { if ((uriField.getText().trim().length() == 0) && (prefixField.getText().trim().length() == 0) && (locationHintField.getText().trim().length() == 0)) { okButton.setEnabled(false); } else { okButton.setEnabled(errorMessage == null); } } } protected void updateWidgets() { computeErrorMessage(); updateErrorMessageLabel(); updateOKButtonState(); } }