From f9efa701de8de9014489fc6bf0a30ad78e609090 Mon Sep 17 00:00:00 2001 From: khartlage Date: Wed, 13 Nov 2002 20:43:26 +0000 Subject: [PATCH 1/1] Simple PHP Page Wizard --- .../phpeclipse/wizards/PHPFileWizard.java | 168 ++++++++++++++ .../phpeclipse/wizards/PHPFileWizardPage.java | 230 ++++++++++++++++++++ .../phpeclipse/wizards/PHPWizardMessages.java | 34 +++ .../wizards/PHPWizardMessages.properties | 21 ++ 4 files changed, 453 insertions(+), 0 deletions(-) create mode 100644 net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java create mode 100644 net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizardPage.java create mode 100644 net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.java create mode 100644 net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.properties diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java new file mode 100644 index 0000000..a0e659d --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizard.java @@ -0,0 +1,168 @@ +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.jface.viewers.IStructuredSelection; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.ui.INewWizard; +import org.eclipse.ui.IWorkbench; +import org.eclipse.core.runtime.*; +import org.eclipse.jface.operation.*; +import java.lang.reflect.InvocationTargetException; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.CoreException; +import java.io.*; +import org.eclipse.ui.*; + +/** + * This wizard creates one file with the extension + * "php". + */ +public class PHPFileWizard extends Wizard implements INewWizard { + + private PHPFileWizardPage page; + private ISelection selection; + + // the name of the file to create + private String fileName; + + + public PHPFileWizard() { + super(); + setNeedsProgressMonitor(true); + } + + /** + * Adding the page to the wizard. + */ + public void addPages() { + page = new PHPFileWizardPage(selection); + addPage(page); + } + + /** + * This method is called when 'Finish' button is pressed in + * the wizard. + * We will create an operation and run it + * using wizard as execution context. + */ + public boolean performFinish() { + final String containerName = page.getContainerName(); + final String fileName = page.getFileName(); + IRunnableWithProgress op = new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) throws InvocationTargetException { + try { + doFinish(containerName, fileName, monitor); + } catch (CoreException e) { + throw new InvocationTargetException(e); + } finally { + monitor.done(); + } + } + }; + try { + getContainer().run(true, false, op); + } catch (InterruptedException e) { + return false; + } catch (InvocationTargetException e) { + Throwable realException = e.getTargetException(); + MessageDialog.openError(getShell(), PHPWizardMessages.getString("Wizard.error"), realException.getMessage()); + return false; + } + return true; + } + + /** + * The worker method. It will find the container, create the + * file if missing or just replace its contents, and open + * the editor on the newly created file. + */ + private void doFinish(String containerName, String fileName, IProgressMonitor monitor) throws CoreException { + // create a sample file + monitor.beginTask(PHPWizardMessages.getString("Wizard.Monitor.creating") + " " + fileName, 2); + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IResource resource = root.findMember(new Path(containerName)); + if (!resource.exists() || !(resource instanceof IContainer)) { + throwCoreException(PHPWizardMessages.getString("Wizard.Monitor.containerDoesNotExistException")); + } + IContainer container = (IContainer) resource; + final IFile file = container.getFile(new Path(fileName)); + try { + InputStream stream = openContentStream(); + if (file.exists()) { + file.setContents(stream, true, true, monitor); + } else { + file.create(stream, true, monitor); + } + stream.close(); + } catch (IOException e) { + } + monitor.worked(1); + monitor.setTaskName(PHPWizardMessages.getString("Wizard.Monitor.openingFile")); + getShell().getDisplay().asyncExec(new Runnable() { + public void run() { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + try { + page.openEditor(file); + } catch (PartInitException e) { + } + } + }); + monitor.worked(1); + } + + /** + * We will initialize file contents with a sample text. + */ + private InputStream openContentStream() { + String className = fileName.substring(0, fileName.length() - 3); + StringBuffer contents = new StringBuffer(""); + return new ByteArrayInputStream(contents.toString().getBytes()); + } + + private void throwCoreException(String message) throws CoreException { + IStatus status = new Status(IStatus.ERROR, "net.sourceforge.phpeclipse.wizards", IStatus.OK, message, null); + throw new CoreException(status); + } + + /** + * We will accept the selection in the workbench to see if + * we can initialize from it. + * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection) + */ + public void init(IWorkbench workbench, IStructuredSelection selection) { + this.selection = selection; + } + + /** + * Sets the name of the file to create + * (used to set the class name in the new file) + */ + public void setFileName(String name) { + fileName = name; + } +} \ No newline at end of file diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizardPage.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizardPage.java new file mode 100644 index 0000000..7785377 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPFileWizardPage.java @@ -0,0 +1,230 @@ +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.indexOf('.'); + if (dotLoc != -1) { + String ext = fileName.substring(dotLoc + 1); + if (ext.equalsIgnoreCase("php") == false) { + 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; + } + +} \ No newline at end of file diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.java new file mode 100644 index 0000000..3cbf8ed --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.java @@ -0,0 +1,34 @@ +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 java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class PHPWizardMessages { + + private static final String RESOURCE_BUNDLE= "net.sourceforge.phpeclipse.wizards.PHPWizardMessages";//$NON-NLS-1$ + + private static ResourceBundle fgResourceBundle= ResourceBundle.getBundle(RESOURCE_BUNDLE); + + private PHPWizardMessages() { + } + + public static String getString(String key) { + try { + return fgResourceBundle.getString(key); + } catch (MissingResourceException e) { + return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ + } + } +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.properties b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.properties new file mode 100644 index 0000000..23c9370 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/wizards/PHPWizardMessages.properties @@ -0,0 +1,21 @@ +################################### +## +## PHP wizard strings +## +################################### + +WizardPage.title=PHP New File +WizardPage.description=This wizard creates a new file with *.php extension that can be opened by the PHP editor. +WizardPage.containerLabel=&Container: +WizardPage.fileLabel=&File name: +WizardPage.browseButtonText=Browse... +WizardPage.fileAlreadyExists=This name is already used by an existing file. Please choose another one. +WizardPage.mustBePHP=File extension must be "php". +WizardPage.nameMustBeSpecified=File name must be specified. +WizardPage.containerMustBeSpecified=File container must be specified. +WizardPage.selectNewFileContainer=Select new file container. + +Wizard.error=An error occured +Wizard.Monitor.creating=Creating +Wizard.Monitor.openingFile=Opening file for editing... +Wizard.Monitor.containerDoesNotExistException=The given container does not exist. \ No newline at end of file -- 1.7.1