/******************************************************************************* * Copyright (c) 2000, 2007 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 * *******************************************************************************/ package org.eclipse.dltk.ui.wizards; import java.net.URI; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptFolder; import org.eclipse.dltk.internal.ui.dialogs.TextFieldNavigationHandler; import org.eclipse.dltk.internal.ui.wizards.NewWizardMessages; import org.eclipse.dltk.internal.ui.wizards.dialogfields.DialogField; import org.eclipse.dltk.internal.ui.wizards.dialogfields.IDialogFieldListener; import org.eclipse.dltk.internal.ui.wizards.dialogfields.LayoutUtil; import org.eclipse.dltk.internal.ui.wizards.dialogfields.StringDialogField; import org.eclipse.dltk.ui.DLTKUIPlugin; import org.eclipse.dltk.ui.dialogs.StatusInfo; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * Wizard page to create a new package. * * <p> * Note: This class is not intended to be subclassed, but clients can * instantiate. To implement a different kind of a new package wizard page, * extend <code>NewContainerWizardPage</code>. * </p> */ public abstract class NewPackageWizardPage extends NewContainerWizardPage { private static final String PAGE_NAME = "NewPackageWizardPage"; //$NON-NLS-1$ protected static final String PACKAGE = "NewPackageWizardPage.package"; //$NON-NLS-1$ private StringDialogField fPackageDialogField; // Status of last validation of the package field private IStatus fPackageStatus; protected IScriptFolder fCreatedScriptFolder; public NewPackageWizardPage() { super(PAGE_NAME); setTitle(NewWizardMessages.NewPackageWizardPage_title); setDescription(NewWizardMessages.NewPackageWizardPage_description); fCreatedScriptFolder = null; fPackageDialogField = new StringDialogField(); fPackageDialogField.setDialogFieldListener(new IDialogFieldListener() { public void dialogFieldChanged(DialogField field) { fPackageStatus = packageChanged(); // tell all others handleFieldChanged(PACKAGE); } }); fPackageDialogField .setLabelText(NewWizardMessages.NewPackageWizardPage_package_label); fPackageStatus = new StatusInfo(); } /** * The wizard owning this page is responsible for calling this method with * the current selection. The selection is used to initialize the fields of * the wizard page. * * @param selection * used to initialize the fields */ public void init(IStructuredSelection selection) { IModelElement element = getInitialScriptElement(selection); initContainerPage(element); String name = ""; //$NON-NLS-1$ if (element != null) { IScriptFolder sf = (IScriptFolder) element .getAncestor(IModelElement.SCRIPT_FOLDER); if (sf != null && !sf.isRootFolder()) name = sf.getElementName(); } setPackageText(name, true); updateStatus(new IStatus[] { containerStatus, fPackageStatus }); } /* * @see WizardPage#createControl */ public void createControl(Composite parent) { initializeDialogUnits(parent); final int nColumns = 3; Composite composite = new Composite(parent, SWT.NONE); composite.setFont(parent.getFont()); GridLayout layout = new GridLayout(); layout.numColumns = nColumns; composite.setLayout(layout); Label label = new Label(composite, SWT.WRAP); label.setText(NewWizardMessages.NewPackageWizardPage_info); GridData gd = new GridData(); gd.widthHint = convertWidthInCharsToPixels(60); gd.horizontalSpan = 3; label.setLayoutData(gd); createContainerControls(composite, nColumns); createPackageControls(composite, nColumns); setControl(composite); Dialog.applyDialogFont(composite); //TODO: Add help support here // PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, // IScriptHelpContextIds.NEW_PACKAGE_WIZARD_PAGE); } /** * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean) */ public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { setFocus(); } } /** * Sets the focus to the package name input field. */ protected void setFocus() { fPackageDialogField.setFocus(); } private void createPackageControls(Composite composite, int nColumns) { fPackageDialogField.doFillIntoGrid(composite, nColumns - 1); Text text = fPackageDialogField.getTextControl(null); LayoutUtil.setWidthHint(text, getMaxFieldWidth()); LayoutUtil.setHorizontalGrabbing(text); DialogField.createEmptySpace(composite); TextFieldNavigationHandler.install(text); } protected void handleFieldChanged(String fieldName) { super.handleFieldChanged(fieldName); if (fieldName == CONTAINER) { fPackageStatus = packageChanged(); } // do status line update updateStatus(new IStatus[] { containerStatus, fPackageStatus }); } // ----------- validation ---------- /* * Verifies the input for the package field. */ protected IStatus packageChanged() { StatusInfo status = new StatusInfo(); String packName = getPackageText(); if (packName.length() > 0) { if (DLTKCore.DEBUG) { System.err .println("TODO: Add correct package name checking here..."); //$NON-NLS-1$ } // IStatus val= ScriptConventions.validatePackageName(packName); // if( packName.indexOf("\\") != -1 || packName.indexOf("/") != -1 ) // { // //if (val.getSeverity() == IStatus.ERROR) { // status.setError(Messages.format(NewWizardMessages.NewPackageWizardPage_error_InvalidPackageName, // "Consist / of \\ symbols..." )); // return status; // } // else if (val.getSeverity() == IStatus.WARNING) { // status.setWarning(Messages.format(NewWizardMessages.NewPackageWizardPage_warning_DiscouragedPackageName, // val.getMessage())); // } } else { status .setError(NewWizardMessages.NewPackageWizardPage_error_EnterName); return status; } IProjectFragment root = getProjectFragment(); if (root != null && root.getScriptProject().exists()) { IScriptFolder pack = root.getScriptFolder(packName); try { // IPath rootPath = root.getPath(); if (pack.exists()) { if (pack.containsScriptResources() || !pack.hasSubfolders()) { status .setError(NewWizardMessages.NewPackageWizardPage_error_PackageExists); } else { status .setError(NewWizardMessages.NewPackageWizardPage_error_PackageNotShown); } } else { URI location = pack.getResource().getLocationURI(); if (location != null) { IFileStore store = EFS.getStore(location); if (store.fetchInfo().exists()) { status .setError(NewWizardMessages.NewPackageWizardPage_error_PackageExistsDifferentCase); } } } } catch (CoreException e) { DLTKUIPlugin.log(e); } } return status; } /** * Returns the content of the package input field. * * @return the content of the package input field */ public String getPackageText() { return fPackageDialogField.getText(); } /** * Sets the content of the package input field to the given value. * * @param str * the new package input field text * @param canBeModified * if <code>true</code> the package input field can be * modified; otherwise it is read-only. */ public void setPackageText(String str, boolean canBeModified) { fPackageDialogField.setText(str); fPackageDialogField.setEnabled(canBeModified); } /** * Returns the resource handle that corresponds to the element to was * created or will be created. * * @return A resource or null if the page contains illegal values. * */ public IResource getModifiedResource() { IProjectFragment root = getProjectFragment(); if (root != null) { return root.getScriptFolder(getPackageText()).getResource(); } return null; } // ---- creation ---------------- /** * Returns a runnable that creates a package using the current settings. * * @return the runnable that creates the new package */ // public IRunnableWithProgress getRunnable() { // return new IRunnableWithProgress() { // public void run(IProgressMonitor monitor) // throws InvocationTargetException, InterruptedException { // try { // createPackage(monitor); // } catch (CoreException e) { // throw new InvocationTargetException(e); // } // } // }; // } /** * Returns the created package fragment. This method only returns a valid * value after <code>getRunnable</code> or <code>createPackage</code> * have been executed. * * @return the created package fragment */ public IScriptFolder getNewScriptFolder() { return fCreatedScriptFolder; } /** * Creates the new package using the entered field values. * * @param monitor * a progress monitor to report progress. The progress monitor * must not be <code>null</code> * @throws CoreException * Thrown if creating the package failed. * @throws InterruptedException * Thrown when the operation has been canceled. * */ public void createPackage(IProgressMonitor monitor) throws CoreException, InterruptedException { if (monitor == null) { monitor = new NullProgressMonitor(); } IProjectFragment root = getProjectFragment(); String packName = getPackageText(); fCreatedScriptFolder = root.createScriptFolder(packName, true, monitor); if (monitor.isCanceled()) { throw new InterruptedException(); } } }