/*******************************************************************************
* Copyright (c) 2007, 2008 Symbian Software Limited 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:
* Bala Torati (Symbian) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.templateengine;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IProject;
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.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardPage;
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.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.ui.CElementLabelProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
public class ProjectSelectionPage extends WizardPage implements IWizardDataPage {
private static final String PAGE_NAME= "NewProjectSelectionWizardPage"; //$NON-NLS-1$
private static final String PAGE_TITLE = Messages.getString("ProjectSelectionPage.0"); //$NON-NLS-1$
private static final String PAGE_DESCRIPTION = Messages.getString("ProjectSelectionPage.1"); //$NON-NLS-1$
private Label projectNameLabel;
private Button projectBrowseButton;
private Text projectNameText;
private String projectName = ""; //$NON-NLS-1$
private IWorkspaceRoot workspaceRoot;
private ICProject currentCProject;
private IWizardPage next;
public ProjectSelectionPage() {
super(PAGE_NAME);
setTitle(PAGE_TITLE);
setDescription(PAGE_DESCRIPTION);
workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
setPageComplete(false);
}
public void init(IStructuredSelection selection) {
if (selection == null || selection.isEmpty()) {
setDefaultAttributes();
return;
}
Object selectedElement= selection.getFirstElement();
if (selectedElement == null) {
selectedElement= getActiveEditorCInput();
}
String projPath= null;
if (selectedElement instanceof IResource) {
IProject project= ((IResource)selectedElement).getProject();
if (project != null) {
projPath= project.getFullPath().makeRelative().toString();
}
} else if (selectedElement instanceof ICElement) {
ICProject cProject= ((ICElement)selectedElement).getCProject();
if (cProject != null) {
projPath= cProject.getProject().getFullPath().makeRelative().toString();
}
}
if (projPath != null) {
projectName = projPath;
} else {
setDefaultAttributes();
}
}
/**
* If the current active editor edits a c element return it, else
* return null
*/
private ICElement getActiveEditorCInput() {
IWorkbenchPage page= CUIPlugin.getActivePage();
if (page != null) {
IEditorPart part= page.getActiveEditor();
if (part != null) {
IEditorInput editorInput= part.getEditorInput();
if (editorInput != null) {
return (ICElement)editorInput.getAdapter(ICElement.class);
}
}
}
return null;
}
private void setDefaultAttributes() {
try {
// find the first C project
IProject[] projects= workspaceRoot.getProjects();
for (int i= 0; i < projects.length; i++) {
IProject project= projects[i];
if (project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) {
projectName = project.getFullPath().makeRelative().toString();
break;
}
}
} catch (CoreException e) {
// ignore here
}
}
private Map<String, String> data = new HashMap<String, String>(2);
public Map<String, String> getPageData() {
String cPojectName = currentCProject.getResource().getName().trim();
data.put("projectName", cPojectName); //$NON-NLS-1$
data.put("baseName", getBaseName(cPojectName)); //$NON-NLS-1$
return data;
}
private String getBaseName(String name) {
String baseName = name;
int dot = baseName.lastIndexOf('.');
if (dot != -1) {
baseName = baseName.substring(dot + 1);
}
dot = baseName.indexOf(' ');
if (dot != -1) {
baseName = baseName.substring(0, dot);
}
return baseName;
}
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginWidth= 0;
layout.marginHeight= 0;
layout.numColumns= 3;
composite.setLayout(layout);
createProjectFiled(composite);
setControl(composite);
Dialog.applyDialogFont(composite);
PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ICHelpContextIds.NEW_SRCFLDER_WIZARD_PAGE);
projectNameText.setFocus();
projectNameText.setSelection(0, projectNameText.getText().length());
setPageComplete(validatePage());
}
private void createProjectFiled(Composite parent) {
getLabelControl(parent);
GridData gdLabel = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gdLabel.horizontalSpan= 1;
projectNameLabel.setLayoutData(gdLabel);
getTextControl(parent);
GridData gdText = new GridData();
gdText.horizontalAlignment= GridData.FILL;
gdText.grabExcessHorizontalSpace= true;
gdText.horizontalSpan= 1;
gdText.widthHint = convertWidthInCharsToPixels(40);
projectNameText.setLayoutData(gdText);
getButtonControl(parent);
GridData gdButton = new GridData();
gdButton.horizontalAlignment= GridData.FILL;
gdButton.grabExcessHorizontalSpace= false;
gdButton.horizontalSpan= 1;
projectBrowseButton.setLayoutData(gdButton);
}
/**
* Creates or returns the created Label control.
* @param parent The parent composite
*/
private void getLabelControl(Composite parent) {
projectNameLabel = new Label(parent, SWT.LEFT | SWT.WRAP);
projectNameLabel.setText(Messages.getString("ProjectSelectionPage.4")); //$NON-NLS-1$
projectNameLabel.setFont(parent.getFont());
projectNameLabel.setEnabled(true);
}
/**
* Creates or returns the created text control.
* @param parent The parent composite
*/
private void getTextControl(Composite parent) {
projectNameText = new Text(parent, SWT.SINGLE | SWT.BORDER);
projectNameText.setText(projectName);
projectNameText.setFont(parent.getFont());
projectNameText.setEnabled(true);
projectNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
setPageComplete(validatePage());
}
});
}
/**
* Creates or returns the created buttom widget.
* @param parent The parent composite
*/
private void getButtonControl(Composite parent) {
projectBrowseButton = new Button(parent, SWT.PUSH);
projectBrowseButton.setText(Messages.getString("ProjectSelectionPage.5")); //$NON-NLS-1$
projectBrowseButton.setFont(parent.getFont());
projectBrowseButton.setEnabled(true);
projectBrowseButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
packRootChangeControlPressed();
}
public void widgetSelected(SelectionEvent e) {
packRootChangeControlPressed();
}
});
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
}
protected void packRootChangeControlPressed() {
ICProject cProject= chooseProject();
if (cProject != null) {
IPath path= cProject.getProject().getFullPath().makeRelative();
projectName = path.toOSString();
projectNameText.setText(projectName);
}
}
private boolean validatePage() {
currentCProject= null;
String projectName = projectNameText.getText();
if (projectName.length() == 0) {
setErrorMessage(Messages.getString("ProjectSelectionPage.6")); //$NON-NLS-1$
return false;
}
IPath path= new Path(projectName);
if (path.segmentCount() != 1) {
setErrorMessage(Messages.getString("ProjectSelectionPage.7")); //$NON-NLS-1$
return false;
}
IProject project= workspaceRoot.getProject(path.toString());
if (!project.exists()) {
setErrorMessage(Messages.getString("ProjectSelectionPage.8")); //$NON-NLS-1$
return false;
}
try {
if (project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)) {
currentCProject= CoreModel.getDefault().create(project);
setErrorMessage(null);
return true;
}
} catch (CoreException e) {
CUIPlugin.log(e);
currentCProject= null;
}
setErrorMessage(Messages.getString("ProjectSelectionPage.9")); //$NON-NLS-1$
return false;
}
private ICProject chooseProject() {
ICProject[] projects;
try {
projects= CoreModel.create(workspaceRoot).getCProjects();
} catch (CModelException e) {
CUIPlugin.log(e);
projects= new ICProject[0];
}
ILabelProvider labelProvider= new CElementLabelProvider(CElementLabelProvider.SHOW_DEFAULT);
ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider);
dialog.setTitle(Messages.getString("ProjectSelectionPage.10")); //$NON-NLS-1$
dialog.setMessage(Messages.getString("ProjectSelectionPage.11")); //$NON-NLS-1$
dialog.setElements(projects);
dialog.setInitialSelections(new Object[] { currentCProject });
if (dialog.open() == Window.OK) {
return (ICProject) dialog.getFirstResult();
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.cdt.ui.templateengine.IWizardDataPage#setNextPage(org.eclipse.jface.wizard.IWizardPage)
*/
public void setNextPage(IWizardPage next) {
this.next= next;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage#getNextPage()
*/
@Override
public IWizardPage getNextPage() {
if(next != null) {
return next;
}
return super.getNextPage();
}
}