/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.motorola.studio.android.wizards.elements;
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.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyListener;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
import com.motorola.studio.android.common.CommonPlugin;
import com.motorola.studio.android.common.utilities.i18n.UtilitiesNLS;
/**
* This widget displays a Project Chooser element.
*/
public class ProjectChooser extends Composite
{
private Label lblProject;
private Text txtProject;
private Button btnBrowseProject;
IProject project;
/**
* Get the selected Project.
*
* @return The selected Project
*/
public IProject getProject()
{
// get root workspace
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
// get projects
IProject[] projects = workspaceRoot.getProjects();
// iterate through the projects
if ((projects != null) && (projects.length > 0))
{
for (IProject innerProject : projects)
{
if (innerProject.getName().equals(txtProject.getText()))
{
// the project was found, set it
this.project = innerProject;
break;
}
}
}
// return the project
return project;
}
/**
* Get the text filled in the Project�s text field.
*
* @return The text filled in the Project�s text field
*/
public String getText()
{
return txtProject != null ? txtProject.getText() : ""; //$NON-NLS-1$
}
/**
* Set the text within this {@link ProjectChooser}.
*
* @param text The text to set
*/
public void setText(String text)
{
if (txtProject != null)
{
this.txtProject.setText(text);
}
}
/**
* Add a modify listener to the Project�s text field. This listener
* is called every time the text is modified.
*
* @param modifyListener Listener to be added
*
* @see Text#addModifyListener(ModifyListener)
*/
public void addModifyListener(ModifyListener modifyListener)
{
// add listener
txtProject.addModifyListener(modifyListener);
}
/**
* Enables or disables the text field.
*
* @param enabled <code>true</code> in case the Text Field is to
* be enabled, <code>false</code> otherwise.
*/
public void setTextFieldEnabled(boolean enabled)
{
// enables/disables the text field
txtProject.setEnabled(enabled);
}
/**
* Constructor holding the parent composite and the stile.
*
* @param parent Parent Composite
* @param style Style
*/
public ProjectChooser(Composite parent, int style)
{
// call super
super(parent, style);
// set up layout
setupLayout();
// add components
addComponents();
}
/**
* Set up this widget layout
*/
private void setupLayout()
{
GridLayout layout = new GridLayout(5, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
this.setLayout(layout);
this.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
}
/**
* Add components to this widget
*/
private void addComponents()
{
// add project label
lblProject = new Label(this, SWT.NONE);
lblProject.setText(UtilitiesNLS.UI_General_ProjectLabel);
lblProject.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false, 1, 1));
// add text field
txtProject = new Text(this, SWT.BORDER);
txtProject.setText(""); //$NON-NLS-1$
txtProject.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 3, 1));
// add browner button
btnBrowseProject = new Button(this, SWT.PUSH);
btnBrowseProject.setText(UtilitiesNLS.UI_General_BrowseButtonLabel);
btnBrowseProject.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false,
1, 1));
btnBrowseProject.addListener(SWT.Selection, new Listener()
{
/*
* (non-Javadoc)
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
*/
public void handleEvent(Event event)
{
// get the selected project
project = openProjectChooser();
// write the project in case there is one
if (project != null)
{
txtProject.setText(project.getName());
}
}
});
}
/**
* Opens dialog to choose a project
*
* @return Selected project
*/
private IProject openProjectChooser()
{
IProject selectedProject = null;
// get shell
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
// crate package dialog
final ElementTreeSelectionDialog packageDialog =
new ElementTreeSelectionDialog(shell, new WorkbenchLabelProvider(),
new WorkbenchContentProvider());
// set title and message
packageDialog.setTitle(UtilitiesNLS.ProjectChooser_UI_Selection);
packageDialog.setMessage(UtilitiesNLS.ProjectChooser_UI_ChooseAProject);
// set workspace as root
packageDialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
// set comparator
packageDialog.setComparator(new ResourceComparator(ResourceComparator.NAME));
//filter extensions
packageDialog.addFilter(new ViewerFilter()
{
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public boolean select(Viewer viewer, Object parentElement, Object element)
{
// the element must be a project
return element instanceof IProject;
}
});
//user can select only one PROJECT
packageDialog.setValidator(new ISelectionStatusValidator()
{
/*
* (non-Javadoc)
* @see org.eclipse.ui.dialogs.ISelectionStatusValidator#validate(java.lang.Object[])
*/
public IStatus validate(Object[] selection)
{
// by default the status is an error
IStatus valid = new Status(IStatus.ERROR, CommonPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
// one element must be selected
if (selection.length == 1)
{
// this element must be a project
if (selection[0] instanceof IProject)
{
// set status to valid because it is one element and a project
valid = new Status(IStatus.OK, CommonPlugin.PLUGIN_ID, ""); //$NON-NLS-1$
}
}
// return validation
return valid;
}
});
// open dialog
if (packageDialog.open() == IDialogConstants.OK_ID)
{
// get the first result
IResource resource = (IResource) packageDialog.getFirstResult();
// the resource must be a project
if (resource instanceof IProject)
{
// get the selected project
selectedProject = (IProject) resource;
}
}
// return the selected project
return selectedProject;
}
}