/*******************************************************************************
* Copyright (c) 2013, 2014 Red Hat, Inc.
* 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:
* Red Hat Inc. - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.thym.android.ui;
import static org.eclipse.thym.android.core.adt.AndroidLaunchConstants.ATTR_AVD_NAME;
import static org.eclipse.thym.android.core.adt.AndroidLaunchConstants.ATTR_LOGCAT_FILTER;
import static org.eclipse.thym.android.core.adt.AndroidLaunchConstants.VAL_DEFAULT_LOGCAT_FILTER;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.thym.android.core.AndroidConstants;
import org.eclipse.thym.android.core.AndroidCore;
import org.eclipse.thym.android.core.adt.AndroidAPILevelComparator;
import org.eclipse.thym.android.core.adt.AndroidAVD;
import org.eclipse.thym.android.core.adt.AndroidSDKManager;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.thym.core.HybridCore;
import org.eclipse.thym.core.HybridProject;
import org.eclipse.thym.core.HybridProjectLaunchConfigConstants;
public class AndroidSimOptionsTab extends AbstractLaunchConfigurationTab {
private Text textProject;
private Text logFilterTxt;
private Listener dirtyListener;
private Combo AVDCombo;
private List<AndroidAVD> avds;
private class DirtyListener implements Listener{
@Override
public void handleEvent(Event event) {
setDirty(true);
updateLaunchConfigurationDialog();
}
}
public AndroidSimOptionsTab() {
this.dirtyListener = new DirtyListener();
}
/**
* @wbp.parser.entryPoint
*/
@Override
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
setControl(comp);
comp.setLayout(new GridLayout(1, false));
Group grpProject = new Group(comp, SWT.NONE);
grpProject.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
grpProject.setText("Project");
grpProject.setLayout(new GridLayout(3, false));
Label lblProject = new Label(grpProject, SWT.NONE);
lblProject.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblProject.setText("Project:");
textProject = new Text(grpProject, SWT.BORDER);
textProject.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
textProject.addListener(SWT.Modify, dirtyListener);
Button btnProjectBrowse = new Button(grpProject, SWT.NONE);
btnProjectBrowse.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ElementListSelectionDialog es = new ElementListSelectionDialog(getShell(), WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider());
es.setTitle("Project Selection");
es.setMessage("Select a project to run");
es.setElements(HybridCore.getHybridProjects().toArray());
if (es.open() == Window.OK) {
HybridProject project = (HybridProject) es.getFirstResult();
textProject.setText(project.getProject().getName());
}
}
});
btnProjectBrowse.setText("Browse...");
Group grpEmulator = new Group(comp, SWT.NONE);
grpEmulator.setLayout(new GridLayout(2, false));
grpEmulator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
grpEmulator.setText("Emulator");
Label lblVirtualDeviceavd = new Label(grpEmulator, SWT.NONE);
lblVirtualDeviceavd.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblVirtualDeviceavd.setText("Virtual Device (AVD):");
AVDCombo = new Combo(grpEmulator, SWT.READ_ONLY);
AVDCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
AVDCombo.add("", 0);
AVDCombo.addListener(SWT.Selection, dirtyListener);
Label lblLogFilter = new Label(grpEmulator, SWT.NONE);
lblLogFilter.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblLogFilter.setText("Log Filter:");
logFilterTxt = new Text(grpEmulator, SWT.BORDER);
logFilterTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
logFilterTxt.addListener(SWT.Modify, dirtyListener);
try {
AndroidSDKManager sdk = AndroidSDKManager.getManager();
avds = sdk.listAVDs();
for (AndroidAVD avd : avds) {
AVDCombo.add(avd.getName());
}
} catch (CoreException e1) {
AVDCombo.removeAll();// let it fallback to default
}
}
@Override
public String getName() {
return "Emulator";
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
if(!SDKLocationHelper.defineSDKLocationIfNecessary()){
setErrorMessage("Android SDK location is not defined" );
}
String projectName =null;
try {
projectName = configuration.getAttribute(HybridProjectLaunchConfigConstants.ATTR_BUILD_SCOPE, (String)null);
} catch (CoreException e) {
//not handled
}
if(projectName != null){
textProject.setText(projectName);
}
try{
String filter = configuration.getAttribute(ATTR_LOGCAT_FILTER, VAL_DEFAULT_LOGCAT_FILTER);
logFilterTxt.setText(filter);
}catch(CoreException e){
logFilterTxt.setText("");
}
try{
String avd = configuration.getAttribute(ATTR_AVD_NAME, "");
int index = AVDCombo.indexOf(avd);
if(index <0)
index = 0;
AVDCombo.select(index);
}
catch(CoreException e){
}
setDirty(false);
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(HybridProjectLaunchConfigConstants.ATTR_BUILD_SCOPE, textProject.getText());
String avd = AVDCombo.getText();
if(avd != null && avd.isEmpty()){
avd = null;
}
configuration.setAttribute(ATTR_AVD_NAME, avd);
configuration.setAttribute(ATTR_LOGCAT_FILTER, logFilterTxt.getText());
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, true);
configuration.setAttribute(ATTR_LOGCAT_FILTER, VAL_DEFAULT_LOGCAT_FILTER);
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
return isTabValid() && AndroidCore.getSDKLocation()!=null && super.isValid(launchConfig);
}
private boolean isTabValid() {
setMessage(null);
setErrorMessage(null);
if(AndroidCore.getSDKLocation() == null){
setErrorMessage("Android SDK location is not defined" );
return false;
}
String avd = AVDCombo.getText();
if(avd != null && !avd.isEmpty()){
AndroidAPILevelComparator alc = new AndroidAPILevelComparator();
for (AndroidAVD androidAVD : avds) {
if(androidAVD.getName().equals(avd)
&& alc.compare(androidAVD.getApiLevel(), AndroidConstants.REQUIRED_MIN_API_LEVEL) <0){
setErrorMessage("Selected AVD does not satisfy the minimum required API level. Please select a different one");
return false;
}
}
}
return true;
}
@Override
public boolean canSave() {
return isTabValid();
}
}