blob: 11d30a07aa09867eb0d1c05b5ff1de2a78425a10 [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 org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import com.android.sdklib.IAndroidTarget;
import com.motorola.studio.android.AndroidPlugin;
import com.motorola.studio.android.adt.SdkUtils;
import com.motorola.studio.android.i18n.AndroidNLS;
import com.motorola.studio.android.model.AndroidProject;
import com.motorola.studio.android.model.IWizardModel;
/**
* SDK Selector for New Android Project Wizards
*/
public class SdkTargetSelector extends Composite
{
private Table table;
private Label mDescription;
final private AndroidProject project;
private IAndroidTarget selection = null;
/**
* A selection listener that will check/uncheck items when they are double-clicked
*/
private final SelectionListener listener = new SelectionListener()
{
/** Default selection means double-click on "most" platforms */
public void widgetDefaultSelected(SelectionEvent e)
{
if (e.item instanceof TableItem)
{
TableItem i = (TableItem) e.item;
i.setChecked(!i.getChecked());
enforceSingleSelection(i);
updateDescription(i);
IAndroidTarget newSelection = getSelection();
project.setSdkTarget(newSelection);
if (newSelection != null)
{
project.setMinSdkVersion(getSelection().getVersion().getApiString());
}
notifyListeners(IWizardModel.MODIFIED, new Event());
}
}
public void widgetSelected(SelectionEvent e)
{
if (e.item instanceof TableItem)
{
TableItem i = (TableItem) e.item;
enforceSingleSelection(i);
updateDescription(i);
IAndroidTarget newSelection = getSelection();
project.setSdkTarget(newSelection);
selection = newSelection;
project.setSample(null);
/*if ((newSelection != null)
&& !selection.getFullName().equals(newSelection.getFullName()))
{
}*/
notifyListeners(IWizardModel.MODIFIED, new Event());
}
}
/**
* If we're not in multiple selection mode, uncheck all other
* items when this one is selected.
*/
private void enforceSingleSelection(TableItem item)
{
if (item.getChecked())
{
Table parentTable = item.getParent();
for (TableItem i2 : parentTable.getItems())
{
if ((i2 != item) && i2.getChecked())
{
i2.setChecked(false);
}
}
}
}
};
/**
* Table Tool Tip Listener
*/
private final Listener toolTipListener = new Listener()
{
public void handleEvent(Event event)
{
switch (event.type)
{
case SWT.MouseHover:
updateDescription(table.getItem(new Point(event.x, event.y)));
break;
case SWT.Selection:
if (event.item instanceof TableItem)
{
updateDescription((TableItem) event.item);
}
break;
default:
return;
}
}
};
/**
* Creates a new SDK Target Selector.
*
* @param parent The parent composite where the selector will be added.
* @param project the android project
*/
public SdkTargetSelector(Composite parent, AndroidProject project)
{
super(parent, SWT.NONE);
this.project = project;
createContents(parent);
}
/**
* Create Contents
* @param parent
*/
private void createContents(Composite parent)
{
setLayout(new GridLayout());
setLayoutData(new GridData(GridData.FILL_BOTH));
setFont(parent.getFont());
table = new Table(this, SWT.CHECK | SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
table.setHeaderVisible(true);
table.setLinesVisible(false);
table.setLayoutData(new GridData(GridData.FILL_BOTH));
mDescription = new Label(this, SWT.WRAP);
mDescription.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createColumns(table);
table.addSelectionListener(listener);
fillTable();
setupTooltip(table);
}
/**
* Create Table Columns
* @param table
*/
private void createColumns(final Table table)
{
// create the table columns
final TableColumn nameColumn = new TableColumn(table, SWT.NONE);
nameColumn.setText(AndroidNLS.UI_SdkTargetSelector_SdkTargetNameColumn);
final TableColumn vendorColumn = new TableColumn(table, SWT.NONE);
vendorColumn.setText(AndroidNLS.UI_SdkTargetSelector_VendorNameColumn);
final TableColumn apiColumn = new TableColumn(table, SWT.NONE);
apiColumn.setText(AndroidNLS.UI_SdkTargetSelector_APILevelColumn);
final TableColumn sdkColumn = new TableColumn(table, SWT.NONE);
sdkColumn.setText(AndroidNLS.UI_SdkTargetSelector_SDKVersionColumn);
table.addControlListener(new ControlAdapter()
{
@Override
public void controlResized(ControlEvent e)
{
Rectangle r = table.getClientArea();
nameColumn.setWidth((r.width * 25) / 100); // 25%
vendorColumn.setWidth((r.width * 50) / 100); // 50%
apiColumn.setWidth((r.width * 15) / 100); // 15%
sdkColumn.setWidth((r.width * 10) / 100); // 10%
}
});
}
/**
* Return table selection.
* @return
*/
protected IAndroidTarget getSelection()
{
IAndroidTarget selectedItem = null;
for (TableItem item : table.getItems())
{
Object data = item.getData();
if (item.getChecked() && (data instanceof IAndroidTarget))
{
selectedItem = (IAndroidTarget) data;
break;
}
}
return selectedItem;
}
/**
* Fills the table with all SDK targets.
*/
private void fillTable()
{
// get the targets from the sdk
IAndroidTarget[] targets = null;
if (SdkUtils.getCurrentSdk() != null)
{
targets = SdkUtils.getAllTargets();
}
else
{
final Runnable listener = new Runnable()
{
public void run()
{
table.getDisplay().asyncExec(new Runnable()
{
public void run()
{
table.removeAll();
fillTable();
AndroidPlugin.getDefault().removeSDKLoaderListener(this);
}
});
}
};
AndroidPlugin.getDefault().addSDKLoaderListener(listener);
table.addDisposeListener(new DisposeListener()
{
public void widgetDisposed(DisposeEvent e)
{
AndroidPlugin.getDefault().removeSDKLoaderListener(listener);
}
});
}
if ((targets != null) && (targets.length > 0))
{
table.setEnabled(true);
for (IAndroidTarget target : targets)
{
TableItem item = new TableItem(table, SWT.NONE);
item.setData(target);
item.setText(0, target.getName());
item.setText(1, target.getVendor());
item.setText(2, target.getVersion().getApiString());
item.setText(3, target.getVersionName());
if (target == project.getSdkTarget())
{
item.setChecked(true);
selection = target;
}
}
}
else
{
table.setEnabled(false);
TableItem item = new TableItem(table, SWT.NONE);
item.setData(null);
item.setText(0, AndroidNLS.UI_SdkTargetSelector_EmptyValue);
item.setText(1, AndroidNLS.UI_SdkTargetSelector_NoTargetAvailable);
item.setText(2, AndroidNLS.UI_SdkTargetSelector_EmptyValue);
item.setText(3, AndroidNLS.UI_SdkTargetSelector_EmptyValue);
}
}
/**
* Add Tool tip for table
* @param table
*/
private void setupTooltip(final Table table)
{
table.addListener(SWT.Dispose, toolTipListener);
table.addListener(SWT.MouseHover, toolTipListener);
table.addListener(SWT.MouseMove, toolTipListener);
table.addListener(SWT.KeyDown, toolTipListener);
}
/**
* Updates the description label
*/
private void updateDescription(TableItem item)
{
if (item != null)
{
Object data = item.getData();
if (data instanceof IAndroidTarget)
{
String newTooltip = ((IAndroidTarget) data).getDescription();
mDescription.setText(newTooltip == null ? "" : newTooltip); //$NON-NLS-1$
}
}
else
{
mDescription.setText("");
}
}
@Override
public void setEnabled(boolean enabled)
{
if (this.getEnabled() != enabled)
{
table.setEnabled(enabled);
mDescription.setEnabled(enabled);
super.setEnabled(enabled);
}
}
}