/*
* 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.launch.ui;
import java.util.Collection;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import com.motorola.studio.android.AndroidPlugin;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.emulator.core.devfrm.DeviceFrameworkManager;
import com.motorola.studio.android.emulator.core.model.IAndroidEmulatorInstance;
import com.motorola.studio.android.launch.ILaunchConfigurationConstants;
import com.motorola.studio.android.launch.LaunchPlugin;
import com.motorola.studio.android.launch.LaunchUtils;
import com.motorola.studio.android.launch.i18n.LaunchNLS;
/**
* This class shows a dialog to the user with online AVDs compatibles with prefferedAvd.
* The user can choose an online AVD and click Ok, ignore the dialog or abort the ongoing action.
*/
public class StartedInstancesDialog extends TitleAreaDialog
{
Collection<IAndroidEmulatorInstance> compatibleStartedInstances = null;
private TableViewer viewer;
private IAndroidEmulatorInstance selectedInstance;
private Button okButton;
private Button ignoreButton;
private Button abortButton;
private final IAndroidEmulatorInstance preferredAvd;
private IProject project = null;
private ILaunchConfiguration configuration = null;
private boolean isUpdateConfigurationSelected = false;
private static String DIALOG_IMAGE = "icons/choose_compatible_avd_instance.png";
private static final String STARTED_INSTANCES_HELP_ID = AndroidPlugin.PLUGIN_ID
+ ".started_instances_selection_dialog";
/**
* @param parentShell
* @throws CoreException
*/
public StartedInstancesDialog(Shell parentShell,
Collection<IAndroidEmulatorInstance> compatibleStartedInstances,
ILaunchConfiguration configuration, IProject project) throws CoreException
{
super(parentShell);
this.configuration = configuration;
this.compatibleStartedInstances = compatibleStartedInstances;
this.project = project;
final String instanceName =
configuration.getAttribute(ILaunchConfigurationConstants.ATTR_DEVICE_INSTANCE_NAME,
(String) null);
this.preferredAvd = DeviceFrameworkManager.getInstance().getInstanceByName(instanceName);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createContents(Composite parent)
{
Control control = super.createContents(parent);
getShell().setText(LaunchNLS.UI_StartedInstancesDialog_WindowTitle);
setTitle(NLS.bind(LaunchNLS.UI_StartedInstancesDialog_Title, preferredAvd.getName()));
setMessage(LaunchNLS.UI_StartedInstancesDialog_Message);
setTitleImage(AbstractUIPlugin.imageDescriptorFromPlugin(LaunchPlugin.PLUGIN_ID,
DIALOG_IMAGE).createImage());
enableOkButton();
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, STARTED_INSTANCES_HELP_ID);
PlatformUI.getWorkbench().getHelpSystem().setHelp(control, STARTED_INSTANCES_HELP_ID);
return control;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent)
{
// create OK, Ignore and Abort buttons
okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
ignoreButton =
createButton(parent, IDialogConstants.IGNORE_ID, IDialogConstants.IGNORE_LABEL,
false);
abortButton =
createButton(parent, IDialogConstants.ABORT_ID, IDialogConstants.ABORT_LABEL, false);
ignoreButton.addMouseListener(new MouseListener()
{
public void mouseUp(MouseEvent e)
{
setReturnCode(IDialogConstants.IGNORE_ID);
close();
}
public void mouseDown(MouseEvent e)
{
//do nothing
}
public void mouseDoubleClick(MouseEvent e)
{
//do nothing
}
});
abortButton.addMouseListener(new MouseListener()
{
public void mouseUp(MouseEvent e)
{
setReturnCode(IDialogConstants.ABORT_ID);
close();
}
public void mouseDown(MouseEvent e)
{
//do nothing
}
public void mouseDoubleClick(MouseEvent e)
{
//do nothing
}
});
}
/**
* Handles the enablement of the OK button.
*/
private void enableOkButton()
{
if (viewer.getTable().getSelectionCount() > 0)
{
okButton.setEnabled(true);
}
else
{
okButton.setEnabled(false);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent)
{
GridLayout layout = new GridLayout(1, false);
parent.setLayout(layout);
createTableArea(parent);
return parent;
}
/**
* @param parent
*/
private void createTableArea(Composite parent)
{
viewer =
new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.FULL_SELECTION | SWT.BORDER);
viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(false);
TableViewerColumn avds = new TableViewerColumn(viewer, SWT.NONE);
avds.getColumn().setText(LaunchNLS.UI_StartedInstancesDialog_CompatibleAvdsColumnName);
avds.getColumn().setResizable(true);
avds.getColumn().setWidth(480);
viewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
enableOkButton();
}
});
avds.setLabelProvider(new ColumnLabelProvider()
{
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element)
{
IAndroidEmulatorInstance instance = (IAndroidEmulatorInstance) element;
return instance.getName() + " (" + instance.getTarget() + ", "
+ LaunchNLS.UI_StartedInstancesDialog_ApiLevel + " "
+ instance.getAPILevel() + ")";
}
@Override
public Image getImage(Object element)
{
Image img = null;
IAndroidEmulatorInstance instance = (IAndroidEmulatorInstance) element;
IStatus compatible = LaunchUtils.isCompatible(project, instance.getName());
// notify the warning state
if (compatible.getSeverity() == IStatus.WARNING)
{
img =
PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
}
return img;
}
@Override
public String getToolTipText(Object element)
{
String toolTip = null;
IAndroidEmulatorInstance instance = (IAndroidEmulatorInstance) element;
IStatus compatible = LaunchUtils.isCompatible(project, instance.getName());
if (compatible.getSeverity() == IStatus.WARNING)
{
toolTip = LaunchNLS.UI_StartedInstancesDialog_Tooltip;
}
return toolTip;
}
@Override
public int getToolTipDisplayDelayTime(Object object)
{
return 500;
}
@Override
public int getToolTipTimeDisplayed(Object object)
{
return 5000;
}
});
ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE);
ArrayContentProvider provider = new ArrayContentProvider();
viewer.setContentProvider(provider);
viewer.setInput(compatibleStartedInstances);
Button checkBox = new Button(parent, SWT.CHECK);
GridData gridData = new GridData(SWT.LEFT, SWT.CENTER, false, false);
checkBox.setLayoutData(gridData);
checkBox.setText(LaunchNLS.UI_StartedInstancesDialog_UpdateRunConfigurarion);
checkBox.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
if (isUpdateConfigurationSelected)
{
isUpdateConfigurationSelected = false;
}
else
{
isUpdateConfigurationSelected = true;
}
}
});
}
public IAndroidEmulatorInstance getSelectedInstance()
{
return selectedInstance;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed()
{
selectedInstance = null;
if (viewer.getTable().getSelectionCount() > 0)
{
selectedInstance =
(IAndroidEmulatorInstance) viewer.getTable().getSelection()[0].getData();
}
if (isUpdateConfigurationSelected)
{
try
{
updateRunConfiguration();
}
catch (CoreException e)
{
StudioLogger.error(StartedInstancesDialog.class,
"It was not possible to update the current run configuration");
}
}
super.okPressed();
}
private void updateRunConfiguration() throws CoreException
{
ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
workingCopy.setAttribute(ILaunchConfigurationConstants.ATTR_DEVICE_INSTANCE_NAME,
selectedInstance.getName());
workingCopy.setAttribute(ILaunchConfigurationConstants.ATTR_ADT_DEVICE_INSTANCE_NAME,
selectedInstance.getName());
workingCopy.doSave();
}
}