/******************************************************************************* * Copyright (c) 2010 SAP AG. * 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: * Mathias Kinzler (SAP AG) - initial implementation *******************************************************************************/ package org.eclipse.egit.ui.internal.clone; import java.io.File; import java.io.FilenameFilter; 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.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.egit.ui.internal.UIText; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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; /** * Allows to import a directory in the local file system as "General" project * <p> * Asks the user to provide a project name and shows the directory to be shared. */ public class GitCreateGeneralProjectPage extends WizardPage { private File myDirectory; private Text projectText; private Text directoryText; private IProject[] wsProjects; private boolean defaultLocation; /** * Creates a new project creation wizard page. * * @param path * the path to a directory in the local file system */ public GitCreateGeneralProjectPage(String path) { super(GitCreateGeneralProjectPage.class.getName()); myDirectory = new File(path); setPageComplete(false); setTitle(UIText.WizardProjectsImportPage_ImportProjectsTitle); setDescription(UIText.WizardProjectsImportPage_ImportProjectsDescription); // check for default location: is workspace location parent of path? IPath parent = new Path(path).removeLastSegments(1); if(ResourcesPlugin.getWorkspace().getRoot().getLocation().equals(parent)) defaultLocation = true; else defaultLocation = false; } /** * The path must be initialized using setPath() */ public GitCreateGeneralProjectPage() { super(GitCreateGeneralProjectPage.class.getName()); setPageComplete(false); setTitle(UIText.WizardProjectsImportPage_ImportProjectsTitle); setDescription(UIText.WizardProjectsImportPage_ImportProjectsDescription); } /** * @param path */ public void setPath(String path) { if (path != null) myDirectory = new File(path); else myDirectory = null; } @Override public void createControl(Composite parent) { initializeDialogUnits(parent); Composite workArea = new Composite(parent, SWT.NONE); setControl(workArea); workArea.setLayout(new GridLayout(2, false)); workArea.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL)); new Label(workArea, SWT.NONE) .setText(UIText.GitCreateGeneralProjectPage_ProjectNameLabel); projectText = new Text(workArea, SWT.BORDER); GridDataFactory.fillDefaults().grab(true, false).applyTo(projectText); if(defaultLocation) projectText.setEnabled(false); else projectText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { checkPage(); } }); new Label(workArea, SWT.NONE) .setText(UIText.GitCreateGeneralProjectPage_DirLabel); directoryText = new Text(workArea, SWT.BORDER); directoryText.setEnabled(false); GridDataFactory.fillDefaults().grab(true, false).applyTo(directoryText); Dialog.applyDialogFont(workArea); } @Override public void setVisible(boolean visible) { if (visible) { projectText.setText(myDirectory.getName()); directoryText.setText(myDirectory.getPath()); checkPage(); } super.setVisible(visible); } /** * @return the project name */ public String getProjectName() { return projectText.getText(); } /** * @return true if the project has default location */ public boolean isDefaultLocation() { return defaultLocation; } private void checkPage() { String projectName = projectText.getText(); setErrorMessage(null); try { // make sure the directory exists if (!myDirectory.exists()) { setErrorMessage(NLS.bind( UIText.GitCreateGeneralProjectPage_DirNotExistMessage, myDirectory.getPath())); return; } // make sure we don't have a file if (!myDirectory.isDirectory()) { setErrorMessage(NLS.bind( UIText.GitCreateGeneralProjectPage_FileNotDirMessage, myDirectory.getPath())); return; } // make sure there is not already a .project file if (myDirectory.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { if (name.equals(".project")) //$NON-NLS-1$ return true; return false; } }).length > 0) { setErrorMessage(NLS .bind( UIText.GitCreateGeneralProjectPage_FileExistsInDirMessage, ".project", myDirectory.getPath())); //$NON-NLS-1$ return; } // project name empty if (projectName.length() == 0) { setErrorMessage(UIText.GitCreateGeneralProjectPage_EnterProjectNameMessage); return; } // project name valid (no strange chars...) IStatus result = ResourcesPlugin.getWorkspace().validateName( projectName, IResource.PROJECT); if (!result.isOK()) { setErrorMessage(result.getMessage()); return; } // project already exists if (isProjectInWorkspace(projectName)) { setErrorMessage(NLS .bind( UIText.GitCreateGeneralProjectPage_PorjectAlreadyExistsMessage, projectName)); return; } if(!defaultLocation) { IProject newProject = ResourcesPlugin.getWorkspace().getRoot() .getProject(projectName); IStatus locationResult = ResourcesPlugin.getWorkspace() .validateProjectLocation(newProject, new Path(myDirectory.getPath())); if (!locationResult.isOK()) { setErrorMessage(locationResult.getMessage()); return; } } } finally { setPageComplete(getErrorMessage() == null); } } private IProject[] getProjectsInWorkspace() { if (wsProjects == null) { wsProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); } return wsProjects; } private boolean isProjectInWorkspace(String projectName) { if (projectName == null) { return false; } IProject[] workspaceProjects = getProjectsInWorkspace(); for (int i = 0; i < workspaceProjects.length; i++) { if (projectName.equals(workspaceProjects[i].getName())) { return true; } } return false; } }