package net.sourceforge.phpeclipse.wizards; /********************************************************************** Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html Contributors: IBM Corporation - Initial implementation Klaus Hartlage - www.eclipseproject.de **********************************************************************/ import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ContainerSelectionDialog; /** * The "New" wizard page allows setting the container for * the new file as well as the file name. The page * will only accept file name without the extension OR * with the extension that matches the expected one (cs). */ public class PHPFileWizardPage extends WizardPage { private Text containerText; private Text fileText; private ISelection selection; /** * Constructor for SampleNewWizardPage. * @param pageName */ public PHPFileWizardPage(ISelection selection) { super("wizardPage"); setTitle(PHPWizardMessages.getString("WizardPage.title")); setDescription(PHPWizardMessages.getString("WizardPage.description")); this.selection = selection; } /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 3; layout.verticalSpacing = 9; Label label = new Label(container, SWT.NULL); label.setText(PHPWizardMessages.getString("WizardPage.containerLabel")); containerText = new Text(container, SWT.BORDER | SWT.SINGLE); GridData gd = new GridData(GridData.FILL_HORIZONTAL); containerText.setLayoutData(gd); containerText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); Button button = new Button(container, SWT.PUSH); button.setText(PHPWizardMessages.getString("WizardPage.browseButtonText")); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleBrowse(); } }); label = new Label(container, SWT.NULL); label.setText(PHPWizardMessages.getString("WizardPage.fileLabel")); fileText = new Text(container, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); fileText.setLayoutData(gd); fileText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); initialize(); dialogChanged(); setControl(container); } /** * Tests if the current workbench selection is a suitable * container to use. */ private void initialize() { if (selection!=null && selection.isEmpty()==false && selection instanceof IStructuredSelection) { IStructuredSelection ssel = (IStructuredSelection)selection; if (ssel.size()>1) return; Object obj = ssel.getFirstElement(); if (obj instanceof IResource) { IContainer container; if (obj instanceof IContainer) container = (IContainer)obj; else container = ((IResource)obj).getParent(); containerText.setText(container.getFullPath().toString()); } } fileText.setText("index.php"); } /** * Uses the standard container selection dialog to * choose the new value for the container field. */ private void handleBrowse() { ContainerSelectionDialog dialog = new ContainerSelectionDialog( getShell(), ResourcesPlugin.getWorkspace().getRoot(), false, PHPWizardMessages.getString("WizardPage.selectNewFileContainer")); if (dialog.open() == ContainerSelectionDialog.OK) { Object[] result = dialog.getResult(); if (result.length == 1) { IContainer container = (IContainer) result[0]; containerText.setText(container.getFullPath().toString()); } } } /** * Ensures that both text fields are set. */ private void dialogChanged() { String container = getContainerName(); String fileName = getFileName(); if (container.length() == 0) { updateStatus(PHPWizardMessages.getString("WizardPage.containerMustBeSpecified")); return; } if (fileName.length() == 0) { updateStatus("WizardPage.nameMustBeSpecified"); return; } int dotLoc = fileName.lastIndexOf('.'); if (dotLoc != -1) { String ext = fileName.substring(dotLoc + 1); if (!ext.equalsIgnoreCase("php") && !ext.equalsIgnoreCase("php3") && !ext.equalsIgnoreCase("php4") && !ext.equalsIgnoreCase("php5") && !ext.equalsIgnoreCase("phtml") && !ext.equalsIgnoreCase("inc")) { updateStatus(PHPWizardMessages.getString("WizardPage.mustBePHP")); return; } } updateStatus(null); } private void updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null); } public String getContainerName() { return containerText.getText(); } public String getFileName() { return fileText.getText(); } /** * @see WizardPage#isPageComplete() */ public boolean isPageComplete() { return !checkFolderForExistingFile() && super.isPageComplete(); } /** * Finds the current directory where the file should be created */ protected boolean checkFolderForExistingFile() { boolean result = false; if (containerText.getText() != null) { IPath containerPath = new Path(containerText.getText().trim()); if (containerPath.segmentCount() > 1) { IFolder container = ResourcesPlugin.getWorkspace().getRoot().getFolder(containerPath); if (container != null && container.exists()) { IResource file = container.getFile(fileText.getText().trim()); if (file != null && file.exists()) { this.setErrorMessage(PHPWizardMessages.getString("WizardPage.fileAlreadyExists")); result = true; } } } else { // this is a project IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(containerText.getText().trim()); if (project != null && project.exists()) { IResource file = project.getFile(fileText.getText().trim()); if (file != null && file.exists()) { this.setErrorMessage(PHPWizardMessages.getString("WizardPage.fileAlreadyExists")); result = true; } } } } if (!result) ((PHPFileWizard) this.getWizard()).setFileName(fileText.getText().trim()); return result; } }