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.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; 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.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; /** * 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)); String className = getClassName(fileName); try { InputStream stream; if (className == null) { stream = openContentStream(); } else { stream = openContentStreamClass(className); } 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); } /** * Check if the filename is like this anyname.class.php * @param fileName the filename * @return the anyname or null */ private static final String getClassName(final String fileName) { final int lastDot = fileName.lastIndexOf('.'); if (lastDot == -1) return null; final int precLastDot = fileName.lastIndexOf('.',lastDot-1); if (precLastDot == -1) return null; if (!fileName.substring(precLastDot+1,lastDot).toUpperCase().equals("CLASS")) return null; return fileName.substring(0,precLastDot-1); } /** * We will initialize file contents for a class * @param className the classname */ private InputStream openContentStreamClass(final String className) { StringBuffer contents = new StringBuffer(""); return new ByteArrayInputStream(contents.toString().getBytes()); } /** * We will initialize file contents with a sample text. */ private InputStream openContentStream() { 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; } }