blob: b0f8d4e71771acba0bf617fbce5a6906904213ea [file] [log] [blame]
/*
* 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 java.io.File;
import org.eclipse.core.resources.ResourcesPlugin;
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.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.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 com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.i18n.AndroidNLS;
import com.motorola.studio.android.model.AndroidProject;
import com.motorola.studio.android.model.AndroidProject.SourceTypes;
import com.motorola.studio.android.model.IWizardModel;
import com.motorola.studio.android.wizards.project.NewAndroidProjectMainPage;
/**
* Class that implements the Location group to be used on the New Project Wizard
*/
public class LocationGroup extends Composite
{
final private AndroidProject project;
final private NewAndroidProjectMainPage page;
private String lastSourcePathValue = null;
/**
* Constructor
*
* @param parent
* @param project
* @param page
*/
public LocationGroup(Composite parent, AndroidProject project, NewAndroidProjectMainPage page)
{
super(parent, SWT.SHADOW_ETCHED_IN);
this.project = project;
this.page = page;
setLayout(new GridLayout());
setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createControl(this);
}
/**
* Create Controls
*
* @param parent
*/
private void createControl(Composite parent)
{
final Button createNewProjectRadio = new Button(this, SWT.RADIO);
createNewProjectRadio.setText(AndroidNLS.UI_LocationGroup_NewProjectRadioLabel);
createNewProjectRadio.setSelection(true);
final Button createSampleRadio = new Button(this, SWT.RADIO);
createSampleRadio.setText(AndroidNLS.UI_LocationGroup_NewFromSampleRadioLabel);
createSampleRadio.setSelection(false);
final Button existing_project_radio = new Button(this, SWT.RADIO);
existing_project_radio
.setText(AndroidNLS.UI_LocationGroup_NewFromExistentProjectRadioLabel);
existing_project_radio.setSelection(false);
final Button useDefaultLocation = new Button(this, SWT.CHECK);
useDefaultLocation.setText(AndroidNLS.UI_LocationGroup_UseDefaultLocationCheckLabel);
useDefaultLocation.setSelection(true);
Composite location_group = new Composite(this, SWT.NONE);
location_group.setLayout(new GridLayout(4, false));
location_group.setLayoutData(new GridData(GridData.FILL_BOTH));
location_group.setFont(parent.getFont());
Label locationLabel = new Label(location_group, SWT.NONE);
locationLabel.setText(AndroidNLS.UI_LocationGroup_LocationLabel);
final Text projectPath = new Text(location_group, SWT.BORDER);
GridData data = new GridData(GridData.FILL, GridData.BEGINNING, true, false, 2, 1);
projectPath.setLayoutData(data);
projectPath.setFont(parent.getFont());
projectPath.setText(ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString());
projectPath.setEnabled(false);
projectPath.addListener(SWT.Modify, new Listener()
{
public void handleEvent(Event event)
{
if (projectPath.isEnabled())
{
project.setLocation(projectPath.getText());
notifyListeners(IWizardModel.MODIFIED, new Event());
}
}
});
final Button browseButton = new Button(location_group, SWT.PUSH);
browseButton.setText(AndroidNLS.UI_General_BrowseButtonLabel);
browseButton.setEnabled(false);
page.setButtonLayoutData(browseButton);
browseButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
String existing_dir = project.getLocation();
// Disable the path if it doesn't exist
if (existing_dir != null
&& (existing_dir.length() == 0 || !new File(existing_dir).exists()))
{
existing_dir = null;
}
DirectoryDialog dd = new DirectoryDialog(projectPath.getShell());
dd.setMessage(AndroidNLS.UI_LocationGroup_BrowseDialogMessage);
dd.setFilterPath(existing_dir);
String customLocation = dd.open();
if (customLocation != null)
{
projectPath.setText(customLocation);
if (existing_project_radio.getSelection() && customLocation.length() > 0)
{
setLastSourcePath(customLocation);
}
}
}
});
SelectionListener location_listener = new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
boolean isNewProject = createNewProjectRadio.getSelection();
boolean existentProject = existing_project_radio.getSelection();
boolean fromSample = createSampleRadio.getSelection();
if (isNewProject ^ existentProject ^ fromSample)
{
// After this point We know that only one option is true
boolean useDefault = useDefaultLocation.getSelection();
useDefaultLocation.setEnabled(!existentProject);
String path;
if (existentProject)
{
path = getLastSourcePath();
useDefaultLocation.setSelection(false);
useDefault = false;
}
else if (useDefault)
{
path = project.getDefaultLocation();
}
else
{
path = project.getLocation();
}
boolean enablePath = !((isNewProject || fromSample) && useDefault);
projectPath.setEnabled(enablePath);
browseButton.setEnabled(enablePath);
project.setSourceType(isNewProject ? SourceTypes.NEW : existentProject
? SourceTypes.EXISTING : SourceTypes.SAMPLE);
project.setUseDefaultLocation(useDefault);
if (enablePath && (path == null || path.length() == 0))
{
projectPath.setText(""); //$NON-NLS-1$
projectPath.setFocus();
}
else
{
projectPath.setText(path);
}
notifyListeners(IWizardModel.MODIFIED, new Event());
}
else
{
StudioLogger.error(LocationGroup.class,
"Ilegal State with New Project radio buttons."); //$NON-NLS-1$
}
}
};
createNewProjectRadio.addSelectionListener(location_listener);
existing_project_radio.addSelectionListener(location_listener);
useDefaultLocation.addSelectionListener(location_listener);
}
/**
* Get last path value defined by the user for the
* "Create from existing source" case
*
* @return The last path value defined by the user.
*/
public String getLastSourcePath()
{
return this.lastSourcePathValue;
}
/**
* Set the last path value defined by the user for the
* "Create from existing source" case
*
* @param path
* - The last path defined by the user
*/
public void setLastSourcePath(String path)
{
this.lastSourcePathValue = path;
}
}