| /* |
| * 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; |
| } |
| } |