[Pydev-cvs] org.python.pydev/src/org/python/pydev/ui/wizards/project CopiedWizardNewProjectNameAndLo
Brought to you by:
fabioz
From: Fabio Z. <fa...@us...> - 2006-01-02 19:10:36
|
Update of /cvsroot/pydev/org.python.pydev/src/org/python/pydev/ui/wizards/project In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3293/src/org/python/pydev/ui/wizards/project Added Files: CopiedWizardNewProjectNameAndLocationPage.java WelcomePage.java PythonProjectWizard.java Log Message: new python project --- NEW FILE: CopiedWizardNewProjectNameAndLocationPage.java --- /******************************************************************************* * Copyright (c) 2000, 2005 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 * Sebastian Davids <sd...@gm...> - Fix for bug 19346 - Dialog font should be * activated and used by other components. *******************************************************************************/ package org.python.pydev.ui.wizards.project; import java.io.File; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; 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.DirectoryDialog; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.ui.internal.ide.IIDEHelpContextIds; import org.python.pydev.ui.PyProjectPythonDetails; /** * First page for the new project creation wizard. This page * collects the name and location of the new project. * <p> * Example useage: * <pre> * mainPage = new WizardNewProjectNameAndLocationPage("wizardNewProjectNameAndLocationPage"); * mainPage.setTitle("Project"); * mainPage.setDescription("Create a new project."); * </pre> * </p> * * NOTE: COPIED FROM org.eclipse.ui.internal.ide.dialogs.WizardNewProjectNameAndLocationPage * Changed to add the details for the python project type */ public class CopiedWizardNewProjectNameAndLocationPage extends WizardPage { // Whether to use default or custom project location private boolean useDefaults = true; // initial value stores private String initialProjectFieldValue; private IPath initialLocationFieldValue; // the value the user has entered private String customLocationFieldValue; // widgets private Text projectNameField; private Text locationPathField; private Label locationLabel; private Button browseButton; private PyProjectPythonDetails.RadioController details; public String getProjectType(){ return details.getSelected(); } private Listener nameModifyListener = new Listener() { public void handleEvent(Event e) { setLocationForSelection(); setPageComplete(validatePage()); } }; private Listener locationModifyListener = new Listener() { public void handleEvent(Event e) { setPageComplete(validatePage()); } }; // constants private static final int SIZING_TEXT_FIELD_WIDTH = 250; /** * Creates a new project creation wizard page. * * @param pageName the name of this page */ public CopiedWizardNewProjectNameAndLocationPage(String pageName) { super(pageName); setPageComplete(false); initialLocationFieldValue = Platform.getLocation(); customLocationFieldValue = ""; //$NON-NLS-1$ } /* (non-Javadoc) * Method declared on IWizardPage */ public boolean canFlipToNextPage() { // Already know there is a next page... return isPageComplete(); } /* (non-Javadoc) * Method declared on IDialogPage. */ public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); composite.setFont(parent.getFont()); PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IIDEHelpContextIds.NEW_PROJECT_WIZARD_PAGE); createProjectNameGroup(composite); createProjectLocationGroup(composite); createProjectDetails(composite); validatePage(); // Show description on opening setErrorMessage(null); setMessage(null); setControl(composite); } /** * @param composite */ private void createProjectDetails(Composite parent) { Font font = parent.getFont(); Composite projectDetails = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 1; projectDetails.setLayout(layout); projectDetails.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); projectDetails.setFont(font); Label projectTypeLabel = new Label(projectDetails, SWT.NONE); projectTypeLabel.setFont(font); projectTypeLabel.setText("Project type"); //let him choose the type of the project details = new PyProjectPythonDetails.RadioController(); Control createdOn = details.doCreateContents(projectDetails); details.radioPy24.setSelection(true); GridData data=new GridData(GridData.FILL_HORIZONTAL); data.grabExcessHorizontalSpace = true; createdOn.setLayoutData(data); } /** * Creates the project location specification controls. * * @param parent the parent composite */ private final void createProjectLocationGroup(Composite parent) { Font font = parent.getFont(); // project specification group Composite projectGroup = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; projectGroup.setLayout(layout); projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); projectGroup.setFont(font); // new project label Label projectContentsLabel = new Label(projectGroup, SWT.NONE); projectContentsLabel.setFont(font); projectContentsLabel .setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectContentsLabel); GridData labelData = new GridData(); labelData.horizontalSpan = 3; projectContentsLabel.setLayoutData(labelData); final Button useDefaultsButton = new Button(projectGroup, SWT.CHECK | SWT.RIGHT); useDefaultsButton.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_useDefaultLabel); useDefaultsButton.setSelection(useDefaults); useDefaultsButton.setFont(font); GridData buttonData = new GridData(); buttonData.horizontalSpan = 3; useDefaultsButton.setLayoutData(buttonData); createUserSpecifiedProjectLocationGroup(projectGroup, !useDefaults); SelectionListener listener = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { useDefaults = useDefaultsButton.getSelection(); browseButton.setEnabled(!useDefaults); locationPathField.setEnabled(!useDefaults); locationLabel.setEnabled(!useDefaults); if (useDefaults) { customLocationFieldValue = locationPathField.getText(); setLocationForSelection(); } else { locationPathField.setText(customLocationFieldValue); } } }; useDefaultsButton.addSelectionListener(listener); } /** * Creates the project name specification controls. * * @param parent the parent composite */ private final void createProjectNameGroup(Composite parent) { Font font = parent.getFont(); // project specification group Composite projectGroup = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; projectGroup.setLayout(layout); projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // new project label Label projectLabel = new Label(projectGroup, SWT.NONE); projectLabel.setFont(font); projectLabel.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel); // new project name entry field projectNameField = new Text(projectGroup, SWT.BORDER); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = SIZING_TEXT_FIELD_WIDTH; projectNameField.setLayoutData(data); projectNameField.setFont(font); // Set the initial value first before listener // to avoid handling an event during the creation. if (initialProjectFieldValue != null) projectNameField.setText(initialProjectFieldValue); projectNameField.addListener(SWT.Modify, nameModifyListener); } /** * Creates the project location specification controls. * * @param projectGroup the parent composite * @param enabled the initial enabled state of the widgets created */ private void createUserSpecifiedProjectLocationGroup( Composite projectGroup, boolean enabled) { Font font = projectGroup.getFont(); // location label locationLabel = new Label(projectGroup, SWT.NONE); locationLabel.setFont(font); locationLabel.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_locationLabel); locationLabel.setEnabled(enabled); // project location entry field locationPathField = new Text(projectGroup, SWT.BORDER); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = SIZING_TEXT_FIELD_WIDTH; locationPathField.setLayoutData(data); locationPathField.setFont(font); locationPathField.setEnabled(enabled); // browse button browseButton = new Button(projectGroup, SWT.PUSH); browseButton.setFont(font); browseButton.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_browseLabel); browseButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { handleLocationBrowseButtonPressed(); } }); browseButton.setEnabled(enabled); // Set the initial value first before listener // to avoid handling an event during the creation. if (initialLocationFieldValue != null) locationPathField.setText(initialLocationFieldValue.toOSString()); locationPathField.addListener(SWT.Modify, locationModifyListener); } /** * Returns the current project location path as entered by * the user, or its anticipated initial value. * * @return the project location path, its anticipated initial value, or <code>null</code> * if no project location path is known */ /* package */IPath getLocationPath() { if (useDefaults) return initialLocationFieldValue; return new Path(getProjectLocationFieldValue()); } /** * Creates a project resource handle for the current project name field value. * <p> * This method does not create the project resource; this is the responsibility * of <code>IProject::create</code> invoked by the new project resource wizard. * </p> * * @return the new project resource handle */ /* package */IProject getProjectHandle() { return ResourcesPlugin.getWorkspace().getRoot().getProject( getProjectName()); } /** * Returns the current project name as entered by the user, or its anticipated * initial value. * * @return the project name, its anticipated initial value, or <code>null</code> * if no project name is known */ /* package */String getProjectName() { if (projectNameField == null) return initialProjectFieldValue; return getProjectNameFieldValue(); } /** * Returns the value of the project name field * with leading and trailing spaces removed. * * @return the project name in the field */ private String getProjectNameFieldValue() { if (projectNameField == null) return ""; //$NON-NLS-1$ else return projectNameField.getText().trim(); } /** * Returns the value of the project location field * with leading and trailing spaces removed. * * @return the project location directory in the field */ private String getProjectLocationFieldValue() { if (locationPathField == null) return ""; //$NON-NLS-1$ else return locationPathField.getText().trim(); } /** * Open an appropriate directory browser */ private void handleLocationBrowseButtonPressed() { DirectoryDialog dialog = new DirectoryDialog(locationPathField .getShell()); dialog.setMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_directoryLabel); String dirName = getProjectLocationFieldValue(); if (!dirName.equals("")) { //$NON-NLS-1$ File path = new File(dirName); if (path.exists()) dialog.setFilterPath(new Path(dirName).toOSString()); } String selectedDirectory = dialog.open(); if (selectedDirectory != null) { customLocationFieldValue = selectedDirectory; locationPathField.setText(customLocationFieldValue); } } /** * Returns whether the currently specified project * content directory points to an exising project */ private boolean isExistingProjectLocation() { IPath path = getLocationPath(); path = path.append(IProjectDescription.DESCRIPTION_FILE_NAME); return path.toFile().exists(); } /** * Sets the initial project name that this page will use when * created. The name is ignored if the createControl(Composite) * method has already been called. Leading and trailing spaces * in the name are ignored. * * @param name initial project name for this page */ /* package */void setInitialProjectName(String name) { if (name == null) initialProjectFieldValue = null; else initialProjectFieldValue = name.trim(); } /** * Set the location to the default location if we are set to useDefaults. */ private void setLocationForSelection() { if (useDefaults) { IPath defaultPath = Platform.getLocation().append( getProjectNameFieldValue()); locationPathField.setText(defaultPath.toOSString()); } } /** * Returns whether this page's controls currently all contain valid * values. * * @return <code>true</code> if all controls are valid, and * <code>false</code> if at least one is invalid */ private boolean validatePage() { IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace(); String projectFieldContents = getProjectNameFieldValue(); if (projectFieldContents.equals("")) { //$NON-NLS-1$ setErrorMessage(null); setMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectNameEmpty); return false; } IStatus nameStatus = workspace.validateName(projectFieldContents, IResource.PROJECT); if (!nameStatus.isOK()) { setErrorMessage(nameStatus.getMessage()); return false; } String locationFieldContents = getProjectLocationFieldValue(); if (locationFieldContents.equals("")) { //$NON-NLS-1$ setErrorMessage(null); setMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectLocationEmpty); return false; } IPath path = new Path(""); //$NON-NLS-1$ if (!path.isValidPath(locationFieldContents)) { setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_locationError); return false; } if (!useDefaults && Platform.getLocation().isPrefixOf( new Path(locationFieldContents))) { setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_defaultLocationError); return false; } if (getProjectHandle().exists()) { setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectExistsMessage); return false; } if (isExistingProjectLocation()) { setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectLocationExistsMessage); return false; } setErrorMessage(null); setMessage(null); return true; } /* * see @DialogPage.setVisible(boolean) */ public void setVisible(boolean visible) { super.setVisible(visible); if (visible) projectNameField.setFocus(); } } --- NEW FILE: WelcomePage.java --- package org.python.pydev.ui.wizards.project; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.wizard.WizardPage; 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.Text; /** * The first page in Project generation wizard * * Checks that Python interpreter is configured */ public class WelcomePage extends WizardPage { Composite mainContainer; Composite mainControl; public WelcomePage(String pageName) { super(pageName); } public WelcomePage(String pageName, String title, ImageDescriptor titleImage) { super(pageName, title, titleImage); } public void createControl(Composite parent) { setDescription("Python project creation requirements"); mainContainer=new Composite(parent, SWT.NONE); GridData data=new GridData(GridData.FILL_BOTH); mainContainer.setLayoutData(data); GridLayout layout=new GridLayout(1, false); mainContainer.setLayout(layout); setControl(mainContainer); mainControl=getDefaultMain(mainContainer); // Never finish this page because there is no interpreter setPageComplete(false); } protected Composite getDefaultMain(Composite parent) { Composite panel=new Composite(parent, SWT.NONE); GridLayout layout=new GridLayout(1, false); panel.setLayout(layout); Text interpreterNoteText = new Text(panel, SWT.MULTI); interpreterNoteText.setEditable(false); interpreterNoteText.setText("Please configure a Python interpreter in Window -> Preferences -> PyDev \nbefore creating a new Python project"); setErrorMessage(null); return panel; } } --- NEW FILE: PythonProjectWizard.java --- package org.python.pydev.ui.wizards.project; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceStatus; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.dialogs.WizardNewProjectReferencePage; import org.python.pydev.core.IPythonNature; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.nature.PythonNature; import org.python.pydev.ui.NotConfiguredInterpreterException; import org.python.pydev.ui.perspective.PythonPerspectiveFactory; /** * Python Project creation wizard * * <ul> * <li>Asks users information about Python project * <li>Launches another thread to create Python project. A progress monitor is shown in * UI thread * </ul> * * TODO: Add a checkbox asking should a skeleton of a Python program generated * * @author Mikko Ohtamaa */ public class PythonProjectWizard extends Wizard implements INewWizard { /** * The workbench. */ private IWorkbench workbench; /** * The current selection. */ protected IStructuredSelection selection; public static final String WIZARD_ID = "org.python.pydev.ui.wizards.project.PythonProjectWizard"; WelcomePage welcomePage = new WelcomePage("Creating a new modelled Python Project"); CopiedWizardNewProjectNameAndLocationPage projectPage = new CopiedWizardNewProjectNameAndLocationPage("Setting project properties"); WizardNewProjectReferencePage referencePage; Shell shell; /** Target project created by this wizard */ IProject generatedProject; /** Exception throw by generator thread */ Exception creationThreadException; public void init(IWorkbench workbench, IStructuredSelection currentSelection) { this.workbench = workbench; this.selection = currentSelection; initializeDefaultPageImageDescriptor(); } /** * Add wizard pages to the instance * * @see org.eclipse.jface.wizard.IWizard#addPages() */ public void addPages() { if(!isInterpreterConfigured()) { addPage(welcomePage); } addPage(projectPage); // only add page if there are already projects in the workspace if (ResourcesPlugin.getWorkspace().getRoot().getProjects().length > 0) { referencePage = new WizardNewProjectReferencePage("Reference Page"); referencePage.setTitle("Reference page"); referencePage.setDescription("Select referenced projects"); this.addPage(referencePage); } } /** * Creates a project resource given the project handle and description. * * @param description the project description to create a project resource for * @param projectHandle the project handle to create a project resource for * @param monitor the progress monitor to show visual progress with * @param projectType * * @exception CoreException if the operation fails * @exception OperationCanceledException if the operation is canceled */ private void createProject(IProjectDescription description, IProject projectHandle, IProgressMonitor monitor, String projectType) throws CoreException, OperationCanceledException { try { monitor.beginTask("", 2000); //$NON-NLS-1$ projectHandle.create(description, new SubProgressMonitor(monitor, 1000)); if (monitor.isCanceled()) throw new OperationCanceledException(); projectHandle.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 1000)); IPythonNature nature = PythonNature.addNature(projectHandle, null); nature.setVersion(projectType); } finally { monitor.done(); } } public String getProjectType(){ return projectPage.getProjectType(); } /** * Creates a new project resource with the entered name. * * @return the created project resource, or <code>null</code> if the project * was not created */ private IProject createNewProject() { // get a project handle final IProject newProjectHandle = projectPage.getProjectHandle(); // get a project descriptor IPath defaultPath = Platform.getLocation(); IPath newPath = projectPage.getLocationPath(); if (defaultPath.equals(newPath)) newPath = null; IWorkspace workspace = ResourcesPlugin.getWorkspace(); final IProjectDescription description = workspace .newProjectDescription(newProjectHandle.getName()); description.setLocation(newPath); // update the referenced project if provided if (referencePage != null) { IProject[] refProjects = referencePage.getReferencedProjects(); if (refProjects.length > 0) description.setReferencedProjects(refProjects); } final String projectType = getProjectType(); // define the operation to create a new project WorkspaceModifyOperation op = new WorkspaceModifyOperation() { protected void execute(IProgressMonitor monitor) throws CoreException { createProject(description, newProjectHandle, monitor, projectType); } }; // run the operation to create a new project try { getContainer().run(true, true, op); } catch (InterruptedException e) { return null; } catch (InvocationTargetException e) { Throwable t = e.getTargetException(); if (t instanceof CoreException) { if (((CoreException) t).getStatus().getCode() == IResourceStatus.CASE_VARIANT_EXISTS) { MessageDialog .openError( getShell(), "IDEWorkbenchMessages.CreateProjectWizard_errorTitle", "IDEWorkbenchMessages.CreateProjectWizard_caseVariantExistsError" ); } else { ErrorDialog.openError(getShell(), "IDEWorkbenchMessages.CreateProjectWizard_errorTitle", null, // no special message ((CoreException) t).getStatus()); } } else { // Unexpected runtime exceptions and errors may still occur. PydevPlugin.log(IStatus.ERROR, t.toString(), t); MessageDialog.openError( getShell(), "IDEWorkbenchMessages.CreateProjectWizard_errorTitle", t.getMessage()); } return null; } return newProjectHandle; } /** * The user clicked Finish button * * Launches another thread to create Python project. * A progress monitor is shown in the UI thread. */ public boolean performFinish() { createNewProject(); // Switch to default perspective IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); try { workbench.showPerspective(PythonPerspectiveFactory.PERSPECTIVE_ID, window); } catch(WorkbenchException we) { we.printStackTrace(); } // TODO: If initial program skeleton is generated, open default file /* if(generatedProject != null) { IFile defaultFile = generatedProject.getFile(new Path("__init__.py")); try { window.getActivePage().openEditor(new FileEditorInput(defaultFile), PyDevPlugin.EDITOR_ID); } catch(CoreException ce) { ce.printStackTrace(); } }*/ return true; } /** * Set Python logo to top bar */ protected void initializeDefaultPageImageDescriptor() { ImageDescriptor desc = PydevPlugin.imageDescriptorFromPlugin(PydevPlugin.getPluginID(), "icons/python-logo.png");//$NON-NLS-1$ setDefaultPageImageDescriptor(desc); } /** * Check thats user has set an Python interpreter in Preferences * @return */ boolean isInterpreterConfigured() { try { PydevPlugin.getPythonInterpreterManager().getDefaultInterpreter(); } catch(NotConfiguredInterpreterException ncie) { return false; } return true; } } |