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