auto import from //depot/cupcake/@135843
This commit is contained in:
21
tools/sdkmanager/libs/sdkuilib/src/Android.mk
Normal file
21
tools/sdkmanager/libs/sdkuilib/src/Android.mk
Normal file
@@ -0,0 +1,21 @@
|
||||
# Copyright 2008 The Android Open Source Project
|
||||
#
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_SRC_FILES := $(call all-subdir-java-files)
|
||||
|
||||
# no resources yet.
|
||||
# LOCAL_JAVA_RESOURCE_DIRS := resources
|
||||
|
||||
LOCAL_JAVA_LIBRARIES := \
|
||||
sdklib \
|
||||
swt \
|
||||
org.eclipse.jface_3.2.0.I20060605-1400 \
|
||||
org.eclipse.equinox.common_3.2.0.v20060603 \
|
||||
org.eclipse.core.commands_3.2.0.I20060605-1400
|
||||
|
||||
LOCAL_MODULE := sdkuilib
|
||||
|
||||
include $(BUILD_HOST_JAVA_LIBRARY)
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
/*
|
||||
* Copyright (C) 2009 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.android.sdkuilib;
|
||||
|
||||
import org.eclipse.jface.dialogs.Dialog;
|
||||
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||
import org.eclipse.jface.window.Window;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.ModifyEvent;
|
||||
import org.eclipse.swt.events.ModifyListener;
|
||||
import org.eclipse.swt.events.VerifyEvent;
|
||||
import org.eclipse.swt.events.VerifyListener;
|
||||
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.Label;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.swt.widgets.Text;
|
||||
|
||||
/**
|
||||
* Edit dialog to create/edit APK configuration. The dialog displays 2 text fields for the config
|
||||
* name and its filter.
|
||||
*/
|
||||
class ApkConfigEditDialog extends Dialog implements ModifyListener, VerifyListener {
|
||||
|
||||
private String mName;
|
||||
private String mFilter;
|
||||
private Text mNameField;
|
||||
private Text mFilterField;
|
||||
private Button mOkButton;
|
||||
|
||||
/**
|
||||
* Creates an edit dialog with optional initial values for the name and filter.
|
||||
* @param name optional value for the name. Can be null.
|
||||
* @param filter optional value for the filter. Can be null.
|
||||
* @param parentShell the parent shell.
|
||||
*/
|
||||
protected ApkConfigEditDialog(String name, String filter, Shell parentShell) {
|
||||
super(parentShell);
|
||||
mName = name;
|
||||
mFilter = filter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the config. This is only valid if the user clicked OK and {@link #open()}
|
||||
* returned {@link Window#OK}
|
||||
*/
|
||||
public String getName() {
|
||||
return mName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the filter for the config. This is only valid if the user clicked OK and
|
||||
* {@link #open()} returned {@link Window#OK}
|
||||
*/
|
||||
public String getFilter() {
|
||||
return mFilter;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Control createContents(Composite parent) {
|
||||
Control control = super.createContents(parent);
|
||||
|
||||
mOkButton = getButton(IDialogConstants.OK_ID);
|
||||
validateButtons();
|
||||
|
||||
return control;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Control createDialogArea(Composite parent) {
|
||||
Composite composite = new Composite(parent, SWT.NONE);
|
||||
GridLayout layout;
|
||||
composite.setLayout(layout = new GridLayout(2, false));
|
||||
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
|
||||
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
|
||||
layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
|
||||
layout.horizontalSpacing = convertHorizontalDLUsToPixels(
|
||||
IDialogConstants.HORIZONTAL_SPACING);
|
||||
|
||||
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
|
||||
|
||||
Label l = new Label(composite, SWT.NONE);
|
||||
l.setText("Name");
|
||||
|
||||
mNameField = new Text(composite, SWT.BORDER);
|
||||
mNameField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
mNameField.addVerifyListener(this);
|
||||
if (mName != null) {
|
||||
mNameField.setText(mName);
|
||||
}
|
||||
mNameField.addModifyListener(this);
|
||||
|
||||
l = new Label(composite, SWT.NONE);
|
||||
l.setText("Filter");
|
||||
|
||||
mFilterField = new Text(composite, SWT.BORDER);
|
||||
mFilterField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
if (mFilter != null) {
|
||||
mFilterField.setText(mFilter);
|
||||
}
|
||||
mFilterField.addVerifyListener(this);
|
||||
mFilterField.addModifyListener(this);
|
||||
|
||||
applyDialogFont(composite);
|
||||
return composite;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the OK button based on the content of the 2 text fields.
|
||||
*/
|
||||
private void validateButtons() {
|
||||
mOkButton.setEnabled(mNameField.getText().trim().length() > 0 &&
|
||||
mFilterField.getText().trim().length() > 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void okPressed() {
|
||||
mName = mNameField.getText();
|
||||
mFilter = mFilterField.getText().trim();
|
||||
super.okPressed();
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for text modification in the 2 text fields.
|
||||
*/
|
||||
public void modifyText(ModifyEvent e) {
|
||||
validateButtons();
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback to ensure the content of the text field are proper.
|
||||
*/
|
||||
public void verifyText(VerifyEvent e) {
|
||||
Text source = ((Text)e.getSource());
|
||||
if (source == mNameField) {
|
||||
// check for a-zA-Z0-9.
|
||||
final String text = e.text;
|
||||
final int len = text.length();
|
||||
for (int i = 0 ; i < len; i++) {
|
||||
char letter = text.charAt(i);
|
||||
if (letter > 255 || Character.isLetterOrDigit(letter) == false) {
|
||||
e.doit = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if (source == mFilterField) {
|
||||
// we can't validate the content as its typed, but we can at least ensure the characters
|
||||
// are valid. Same as mNameFiled + the comma.
|
||||
final String text = e.text;
|
||||
final int len = text.length();
|
||||
for (int i = 0 ; i < len; i++) {
|
||||
char letter = text.charAt(i);
|
||||
if (letter > 255 || (Character.isLetterOrDigit(letter) == false && letter != ',')) {
|
||||
e.doit = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,211 @@
|
||||
/*
|
||||
* Copyright (C) 2009 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.android.sdkuilib;
|
||||
|
||||
import org.eclipse.jface.dialogs.Dialog;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.ControlAdapter;
|
||||
import org.eclipse.swt.events.ControlEvent;
|
||||
import org.eclipse.swt.events.SelectionAdapter;
|
||||
import org.eclipse.swt.events.SelectionEvent;
|
||||
import org.eclipse.swt.graphics.Rectangle;
|
||||
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.Table;
|
||||
import org.eclipse.swt.widgets.TableColumn;
|
||||
import org.eclipse.swt.widgets.TableItem;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* The APK Configuration widget is a table that is added to the given parent composite.
|
||||
* <p/>
|
||||
* To use, create it using {@link #ApkConfigWidget(Composite)} then
|
||||
* call {@link #fillTable(Map) to set the initial list of configurations.
|
||||
*/
|
||||
public class ApkConfigWidget {
|
||||
private final static int INDEX_NAME = 0;
|
||||
private final static int INDEX_FILTER = 1;
|
||||
|
||||
private Table mApkConfigTable;
|
||||
private Button mEditButton;
|
||||
private Button mDelButton;
|
||||
|
||||
public ApkConfigWidget(final Composite parent) {
|
||||
final Composite apkConfigComp = new Composite(parent, SWT.NONE);
|
||||
apkConfigComp.setLayoutData(new GridData(GridData.FILL_BOTH));
|
||||
apkConfigComp.setLayout(new GridLayout(2, false));
|
||||
|
||||
mApkConfigTable = new Table(apkConfigComp, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
|
||||
mApkConfigTable.setHeaderVisible(true);
|
||||
mApkConfigTable.setLinesVisible(true);
|
||||
|
||||
GridData data = new GridData();
|
||||
data.grabExcessVerticalSpace = true;
|
||||
data.grabExcessHorizontalSpace = true;
|
||||
data.horizontalAlignment = GridData.FILL;
|
||||
data.verticalAlignment = GridData.FILL;
|
||||
mApkConfigTable.setLayoutData(data);
|
||||
|
||||
// create the table columns
|
||||
final TableColumn column0 = new TableColumn(mApkConfigTable, SWT.NONE);
|
||||
column0.setText("Name");
|
||||
column0.setWidth(100);
|
||||
final TableColumn column1 = new TableColumn(mApkConfigTable, SWT.NONE);
|
||||
column1.setText("Configuration");
|
||||
column1.setWidth(100);
|
||||
|
||||
Composite buttonComp = new Composite(apkConfigComp, SWT.NONE);
|
||||
buttonComp.setLayoutData(new GridData(GridData.FILL_VERTICAL));
|
||||
GridLayout gl;
|
||||
buttonComp.setLayout(gl = new GridLayout(1, false));
|
||||
gl.marginHeight = gl.marginWidth = 0;
|
||||
|
||||
Button newButton = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
|
||||
newButton.setText("New...");
|
||||
newButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
|
||||
mEditButton = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
|
||||
mEditButton.setText("Edit...");
|
||||
mEditButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
|
||||
mDelButton = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
|
||||
mDelButton.setText("Delete");
|
||||
mDelButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
|
||||
newButton.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
ApkConfigEditDialog dlg = new ApkConfigEditDialog(null /*name*/, null /*filter*/,
|
||||
apkConfigComp.getShell());
|
||||
if (dlg.open() == Dialog.OK) {
|
||||
TableItem item = new TableItem(mApkConfigTable, SWT.NONE);
|
||||
item.setText(INDEX_NAME, dlg.getName());
|
||||
item.setText(INDEX_FILTER, dlg.getFilter());
|
||||
|
||||
onSelectionChanged();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mEditButton.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
// get the current selection (single mode so we don't care about any item beyond
|
||||
// index 0).
|
||||
TableItem[] items = mApkConfigTable.getSelection();
|
||||
if (items.length != 0) {
|
||||
ApkConfigEditDialog dlg = new ApkConfigEditDialog(
|
||||
items[0].getText(INDEX_NAME), items[0].getText(INDEX_FILTER),
|
||||
apkConfigComp.getShell());
|
||||
if (dlg.open() == Dialog.OK) {
|
||||
items[0].setText(INDEX_NAME, dlg.getName());
|
||||
items[0].setText(INDEX_FILTER, dlg.getFilter());
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
mDelButton.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
// get the current selection (single mode so we don't care about any item beyond
|
||||
// index 0).
|
||||
int[] indices = mApkConfigTable.getSelectionIndices();
|
||||
if (indices.length != 0) {
|
||||
TableItem item = mApkConfigTable.getItem(indices[0]);
|
||||
if (MessageDialog.openQuestion(parent.getShell(),
|
||||
"Apk Configuration deletion",
|
||||
String.format(
|
||||
"Are you sure you want to delete configuration '%1$s'?",
|
||||
item.getText(INDEX_NAME)))) {
|
||||
// delete the item.
|
||||
mApkConfigTable.remove(indices[0]);
|
||||
|
||||
onSelectionChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Add a listener to resize the column to the full width of the table
|
||||
mApkConfigTable.addControlListener(new ControlAdapter() {
|
||||
@Override
|
||||
public void controlResized(ControlEvent e) {
|
||||
Rectangle r = mApkConfigTable.getClientArea();
|
||||
column0.setWidth(r.width * 30 / 100); // 30%
|
||||
column1.setWidth(r.width * 70 / 100); // 70%
|
||||
}
|
||||
});
|
||||
|
||||
// add a selection listener on the table, to enable/disable buttons.
|
||||
mApkConfigTable.addSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
onSelectionChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void fillTable(Map<String, String> apkConfigMap) {
|
||||
// get the names in a list so that we can sort them.
|
||||
if (apkConfigMap != null) {
|
||||
Set<String> keys = apkConfigMap.keySet();
|
||||
String[] keyArray = keys.toArray(new String[keys.size()]);
|
||||
Arrays.sort(keyArray);
|
||||
|
||||
for (String key : keyArray) {
|
||||
TableItem item = new TableItem(mApkConfigTable, SWT.NONE);
|
||||
item.setText(INDEX_NAME, key);
|
||||
item.setText(INDEX_FILTER, apkConfigMap.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
onSelectionChanged();
|
||||
}
|
||||
|
||||
public Map<String, String> getApkConfigs() {
|
||||
// go through all the items from the table and fill a new map
|
||||
HashMap<String, String> map = new HashMap<String, String>();
|
||||
|
||||
TableItem[] items = mApkConfigTable.getItems();
|
||||
for (TableItem item : items) {
|
||||
map.put(item.getText(INDEX_NAME), item.getText(INDEX_FILTER));
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles table selection changes.
|
||||
*/
|
||||
private void onSelectionChanged() {
|
||||
if (mApkConfigTable.getSelectionCount() > 0) {
|
||||
mEditButton.setEnabled(true);
|
||||
mDelButton.setEnabled(true);
|
||||
} else {
|
||||
mEditButton.setEnabled(false);
|
||||
mDelButton.setEnabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,418 @@
|
||||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
|
||||
*
|
||||
* 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.android.sdkuilib;
|
||||
|
||||
import com.android.sdklib.IAndroidTarget;
|
||||
import com.android.sdklib.avd.AvdManager.AvdInfo;
|
||||
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.ControlAdapter;
|
||||
import org.eclipse.swt.events.ControlEvent;
|
||||
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 java.util.ArrayList;
|
||||
|
||||
|
||||
/**
|
||||
* The AVD selector is a table that is added to the given parent composite.
|
||||
* <p/>
|
||||
* To use, create it using {@link #AvdSelector(Composite, AvdInfo[], boolean)} then
|
||||
* call {@link #setSelection(AvdInfo)}, {@link #setSelectionListener(SelectionListener)}
|
||||
* and finally use {@link #getFirstSelected()} or {@link #getAllSelected()} to retrieve the
|
||||
* selection.
|
||||
*/
|
||||
public final class AvdSelector {
|
||||
|
||||
private AvdInfo[] mAvds;
|
||||
private final boolean mAllowMultipleSelection;
|
||||
private SelectionListener mSelectionListener;
|
||||
private Table mTable;
|
||||
private Label mDescription;
|
||||
|
||||
/**
|
||||
* Creates a new SDK Target Selector, and fills it with a list of {@link AvdInfo}, filtered
|
||||
* by a {@link IAndroidTarget}.
|
||||
* <p/>Only the {@link AvdInfo} able to run application developed for the given
|
||||
* {@link IAndroidTarget} will be displayed.
|
||||
*
|
||||
* @param parent The parent composite where the selector will be added.
|
||||
* @param avds The list of AVDs. This is <em>not</em> copied, the caller must not modify.
|
||||
* @param allowMultipleSelection True if more than one SDK target can be selected at the same
|
||||
* time.
|
||||
*/
|
||||
public AvdSelector(Composite parent, AvdInfo[] avds, IAndroidTarget filter,
|
||||
boolean allowMultipleSelection) {
|
||||
mAvds = avds;
|
||||
|
||||
// Layout has 1 column
|
||||
Composite group = new Composite(parent, SWT.NONE);
|
||||
group.setLayout(new GridLayout());
|
||||
group.setLayoutData(new GridData(GridData.FILL_BOTH));
|
||||
group.setFont(parent.getFont());
|
||||
|
||||
mAllowMultipleSelection = allowMultipleSelection;
|
||||
mTable = new Table(group, SWT.CHECK | SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
|
||||
mTable.setHeaderVisible(true);
|
||||
mTable.setLinesVisible(false);
|
||||
|
||||
GridData data = new GridData();
|
||||
data.grabExcessVerticalSpace = true;
|
||||
data.grabExcessHorizontalSpace = true;
|
||||
data.horizontalAlignment = GridData.FILL;
|
||||
data.verticalAlignment = GridData.FILL;
|
||||
mTable.setLayoutData(data);
|
||||
|
||||
mDescription = new Label(group, SWT.WRAP);
|
||||
mDescription.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
|
||||
// create the table columns
|
||||
final TableColumn column0 = new TableColumn(mTable, SWT.NONE);
|
||||
column0.setText("AVD Name");
|
||||
final TableColumn column1 = new TableColumn(mTable, SWT.NONE);
|
||||
column1.setText("Target Name");
|
||||
final TableColumn column2 = new TableColumn(mTable, SWT.NONE);
|
||||
column2.setText("API Level");
|
||||
final TableColumn column3 = new TableColumn(mTable, SWT.NONE);
|
||||
column3.setText("SDK");
|
||||
|
||||
adjustColumnsWidth(mTable, column0, column1, column2, column3);
|
||||
setupSelectionListener(mTable);
|
||||
fillTable(mTable, filter);
|
||||
setupTooltip(mTable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new SDK Target Selector, and fills it with a list of {@link AvdInfo}.
|
||||
*
|
||||
* @param parent The parent composite where the selector will be added.
|
||||
* @param avds The list of AVDs. This is <em>not</em> copied, the caller must not modify.
|
||||
* @param allowMultipleSelection True if more than one SDK target can be selected at the same
|
||||
* time.
|
||||
*/
|
||||
public AvdSelector(Composite parent, AvdInfo[] avds, boolean allowMultipleSelection) {
|
||||
this(parent, avds, null /* filter */, allowMultipleSelection);
|
||||
}
|
||||
|
||||
|
||||
public void setTableHeightHint(int heightHint) {
|
||||
GridData data = new GridData();
|
||||
data.heightHint = heightHint;
|
||||
data.grabExcessVerticalSpace = true;
|
||||
data.grabExcessHorizontalSpace = true;
|
||||
data.horizontalAlignment = GridData.FILL;
|
||||
data.verticalAlignment = GridData.FILL;
|
||||
mTable.setLayoutData(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a new set of AVD, with an optional filter.
|
||||
* <p/>This must be called from the UI thread.
|
||||
*
|
||||
* @param avds The list of AVDs. This is <em>not</em> copied, the caller must not modify.
|
||||
* @param filter An IAndroidTarget. If non-null, only AVD whose target are compatible with the
|
||||
* filter target will displayed an available for selection.
|
||||
*/
|
||||
public void setAvds(AvdInfo[] avds, IAndroidTarget filter) {
|
||||
mAvds = avds;
|
||||
fillTable(mTable, filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of known AVDs.
|
||||
* <p/>
|
||||
* This is not a copy. Callers must <em>not</em> modify this array.
|
||||
*/
|
||||
public AvdInfo[] getAvds() {
|
||||
return mAvds;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a selection listener. Set it to null to remove it.
|
||||
* The listener will be called <em>after</em> this table processed its selection
|
||||
* events so that the caller can see the updated state.
|
||||
* <p/>
|
||||
* The event's item contains a {@link TableItem}.
|
||||
* The {@link TableItem#getData()} contains an {@link IAndroidTarget}.
|
||||
* <p/>
|
||||
* It is recommended that the caller uses the {@link #getFirstSelected()} and
|
||||
* {@link #getAllSelected()} methods instead.
|
||||
*
|
||||
* @param selectionListener The new listener or null to remove it.
|
||||
*/
|
||||
public void setSelectionListener(SelectionListener selectionListener) {
|
||||
mSelectionListener = selectionListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current target selection.
|
||||
* <p/>
|
||||
* If the selection is actually changed, this will invoke the selection listener
|
||||
* (if any) with a null event.
|
||||
*
|
||||
* @param target the target to be selection
|
||||
* @return true if the target could be selected, false otherwise.
|
||||
*/
|
||||
public boolean setSelection(AvdInfo target) {
|
||||
boolean found = false;
|
||||
boolean modified = false;
|
||||
for (TableItem i : mTable.getItems()) {
|
||||
if ((AvdInfo) i.getData() == target) {
|
||||
found = true;
|
||||
if (!i.getChecked()) {
|
||||
modified = true;
|
||||
i.setChecked(true);
|
||||
}
|
||||
} else if (i.getChecked()) {
|
||||
modified = true;
|
||||
i.setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (modified && mSelectionListener != null) {
|
||||
mSelectionListener.widgetSelected(null);
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all selected items.
|
||||
* This is useful when the table is in multiple-selection mode.
|
||||
*
|
||||
* @see #getFirstSelected()
|
||||
* @return An array of selected items. The list can be empty but not null.
|
||||
*/
|
||||
public AvdInfo[] getAllSelected() {
|
||||
ArrayList<IAndroidTarget> list = new ArrayList<IAndroidTarget>();
|
||||
for (TableItem i : mTable.getItems()) {
|
||||
if (i.getChecked()) {
|
||||
list.add((IAndroidTarget) i.getData());
|
||||
}
|
||||
}
|
||||
return list.toArray(new AvdInfo[list.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first selected item.
|
||||
* This is useful when the table is in single-selection mode.
|
||||
*
|
||||
* @see #getAllSelected()
|
||||
* @return The first selected item or null.
|
||||
*/
|
||||
public AvdInfo getFirstSelected() {
|
||||
for (TableItem i : mTable.getItems()) {
|
||||
if (i.getChecked()) {
|
||||
return (AvdInfo) i.getData();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables the receiver if the argument is true, and disables it otherwise.
|
||||
* A disabled control is typically not selectable from the user interface
|
||||
* and draws with an inactive or "grayed" look.
|
||||
*
|
||||
* @param enabled the new enabled state.
|
||||
*/
|
||||
public void setEnabled(boolean enabled) {
|
||||
mTable.setEnabled(enabled);
|
||||
mDescription.setEnabled(enabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a listener to adjust the columns width when the parent is resized.
|
||||
* <p/>
|
||||
* If we need something more fancy, we might want to use this:
|
||||
* http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet77.java?view=co
|
||||
*/
|
||||
private void adjustColumnsWidth(final Table table,
|
||||
final TableColumn column0,
|
||||
final TableColumn column1,
|
||||
final TableColumn column2,
|
||||
final TableColumn column3) {
|
||||
// Add a listener to resize the column to the full width of the table
|
||||
table.addControlListener(new ControlAdapter() {
|
||||
@Override
|
||||
public void controlResized(ControlEvent e) {
|
||||
Rectangle r = table.getClientArea();
|
||||
column0.setWidth(r.width * 30 / 100); // 30%
|
||||
column1.setWidth(r.width * 45 / 100); // 45%
|
||||
column2.setWidth(r.width * 15 / 100); // 15%
|
||||
column3.setWidth(r.width * 10 / 100); // 10%
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a selection listener that will check or uncheck the whole line when
|
||||
* double-clicked (aka "the default selection").
|
||||
*/
|
||||
private void setupSelectionListener(final Table table) {
|
||||
// Add a selection listener that will check/uncheck items when they are double-clicked
|
||||
table.addSelectionListener(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);
|
||||
}
|
||||
|
||||
if (mSelectionListener != null) {
|
||||
mSelectionListener.widgetDefaultSelected(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
if (e.item instanceof TableItem) {
|
||||
TableItem i = (TableItem) e.item;
|
||||
enforceSingleSelection(i);
|
||||
updateDescription(i);
|
||||
}
|
||||
|
||||
if (mSelectionListener != null) {
|
||||
mSelectionListener.widgetSelected(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If we're not in multiple selection mode, uncheck all other
|
||||
* items when this one is selected.
|
||||
*/
|
||||
private void enforceSingleSelection(TableItem item) {
|
||||
if (!mAllowMultipleSelection && item.getChecked()) {
|
||||
Table parentTable = item.getParent();
|
||||
for (TableItem i2 : parentTable.getItems()) {
|
||||
if (i2 != item && i2.getChecked()) {
|
||||
i2.setChecked(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the table with all AVD.
|
||||
* The table columns are:
|
||||
* <ul>
|
||||
* <li>column 0: sdk name
|
||||
* <li>column 1: sdk vendor
|
||||
* <li>column 2: sdk api name
|
||||
* <li>column 3: sdk version
|
||||
* </ul>
|
||||
*/
|
||||
private void fillTable(final Table table, IAndroidTarget filter) {
|
||||
table.removeAll();
|
||||
if (mAvds != null && mAvds.length > 0) {
|
||||
table.setEnabled(true);
|
||||
for (AvdInfo avd : mAvds) {
|
||||
if (filter == null || filter.isCompatibleBaseFor(avd.getTarget())) {
|
||||
TableItem item = new TableItem(table, SWT.NONE);
|
||||
item.setData(avd);
|
||||
item.setText(0, avd.getName());
|
||||
IAndroidTarget target = avd.getTarget();
|
||||
item.setText(1, target.getFullName());
|
||||
item.setText(2, target.getApiVersionName());
|
||||
item.setText(3, Integer.toString(target.getApiVersionNumber()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (table.getItemCount() == 0) {
|
||||
table.setEnabled(false);
|
||||
TableItem item = new TableItem(table, SWT.NONE);
|
||||
item.setData(null);
|
||||
item.setText(0, "--");
|
||||
item.setText(1, "No AVD available");
|
||||
item.setText(2, "--");
|
||||
item.setText(3, "--");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up a tooltip that displays the current item description.
|
||||
* <p/>
|
||||
* Displaying a tooltip over the table looks kind of odd here. Instead we actually
|
||||
* display the description in a label under the table.
|
||||
*/
|
||||
private void setupTooltip(final Table table) {
|
||||
/*
|
||||
* Reference:
|
||||
* http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=markup
|
||||
*/
|
||||
|
||||
final Listener listener = new Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
|
||||
switch(event.type) {
|
||||
case SWT.KeyDown:
|
||||
case SWT.MouseExit:
|
||||
case SWT.MouseDown:
|
||||
return;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
table.addListener(SWT.Dispose, listener);
|
||||
table.addListener(SWT.KeyDown, listener);
|
||||
table.addListener(SWT.MouseMove, listener);
|
||||
table.addListener(SWT.MouseHover, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the description label with the path of the item's AVD, if any.
|
||||
*/
|
||||
private void updateDescription(TableItem item) {
|
||||
if (item != null) {
|
||||
Object data = item.getData();
|
||||
if (data instanceof AvdInfo) {
|
||||
String newTooltip = ((AvdInfo) data).getPath();
|
||||
mDescription.setText(newTooltip == null ? "" : newTooltip); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,418 @@
|
||||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
|
||||
*
|
||||
* 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.android.sdkuilib;
|
||||
|
||||
import com.android.sdklib.IAndroidTarget;
|
||||
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.events.ControlAdapter;
|
||||
import org.eclipse.swt.events.ControlEvent;
|
||||
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 java.util.ArrayList;
|
||||
|
||||
|
||||
/**
|
||||
* The SDK target selector is a table that is added to the given parent composite.
|
||||
* <p/>
|
||||
* To use, create it using {@link #SdkTargetSelector(Composite, IAndroidTarget[], boolean)} then
|
||||
* call {@link #setSelection(IAndroidTarget)}, {@link #setSelectionListener(SelectionListener)}
|
||||
* and finally use {@link #getFirstSelected()} or {@link #getAllSelected()} to retrieve the
|
||||
* selection.
|
||||
*/
|
||||
public class SdkTargetSelector {
|
||||
|
||||
private IAndroidTarget[] mTargets;
|
||||
private final boolean mAllowSelection;
|
||||
private final boolean mAllowMultipleSelection;
|
||||
private SelectionListener mSelectionListener;
|
||||
private Table mTable;
|
||||
private Label mDescription;
|
||||
private Composite mInnerGroup;
|
||||
|
||||
/**
|
||||
* Creates a new SDK Target Selector.
|
||||
*
|
||||
* @param parent The parent composite where the selector will be added.
|
||||
* @param targets The list of targets. This is <em>not</em> copied, the caller must not modify.
|
||||
* Targets can be null or an empty array, in which case the table is disabled.
|
||||
* @param allowMultipleSelection True if more than one SDK target can be selected at the same
|
||||
* time.
|
||||
*/
|
||||
public SdkTargetSelector(Composite parent, IAndroidTarget[] targets,
|
||||
boolean allowMultipleSelection) {
|
||||
this(parent, targets, true /*allowSelection*/, allowMultipleSelection);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new SDK Target Selector.
|
||||
*
|
||||
* @param parent The parent composite where the selector will be added.
|
||||
* @param targets The list of targets. This is <em>not</em> copied, the caller must not modify.
|
||||
* Targets can be null or an empty array, in which case the table is disabled.
|
||||
* @param allowSelection True if selection is enabled.
|
||||
* @param allowMultipleSelection True if more than one SDK target can be selected at the same
|
||||
* time. Used only if allowSelection is true.
|
||||
*/
|
||||
public SdkTargetSelector(Composite parent, IAndroidTarget[] targets,
|
||||
boolean allowSelection,
|
||||
boolean allowMultipleSelection) {
|
||||
// Layout has 1 column
|
||||
mInnerGroup = new Composite(parent, SWT.NONE);
|
||||
mInnerGroup.setLayout(new GridLayout());
|
||||
mInnerGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
|
||||
mInnerGroup.setFont(parent.getFont());
|
||||
|
||||
mAllowSelection = allowSelection;
|
||||
mAllowMultipleSelection = allowMultipleSelection;
|
||||
int style = SWT.BORDER;
|
||||
if (allowSelection) {
|
||||
style |= SWT.CHECK | SWT.FULL_SELECTION;
|
||||
}
|
||||
if (!mAllowMultipleSelection) {
|
||||
style |= SWT.SINGLE;
|
||||
}
|
||||
mTable = new Table(mInnerGroup, style);
|
||||
mTable.setHeaderVisible(true);
|
||||
mTable.setLinesVisible(false);
|
||||
|
||||
GridData data = new GridData();
|
||||
data.grabExcessVerticalSpace = true;
|
||||
data.grabExcessHorizontalSpace = true;
|
||||
data.horizontalAlignment = GridData.FILL;
|
||||
data.verticalAlignment = GridData.FILL;
|
||||
mTable.setLayoutData(data);
|
||||
|
||||
mDescription = new Label(mInnerGroup, SWT.WRAP);
|
||||
mDescription.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||
|
||||
// create the table columns
|
||||
final TableColumn column0 = new TableColumn(mTable, SWT.NONE);
|
||||
column0.setText("SDK Target");
|
||||
final TableColumn column1 = new TableColumn(mTable, SWT.NONE);
|
||||
column1.setText("Vendor");
|
||||
final TableColumn column2 = new TableColumn(mTable, SWT.NONE);
|
||||
column2.setText("Version");
|
||||
final TableColumn column3 = new TableColumn(mTable, SWT.NONE);
|
||||
column3.setText("API Level");
|
||||
|
||||
adjustColumnsWidth(mTable, column0, column1, column2, column3);
|
||||
setupSelectionListener(mTable);
|
||||
setTargets(targets);
|
||||
setupTooltip(mTable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the layout data of the inner composite widget that contains the target selector.
|
||||
* By default the layout data is set to a {@link GridData} with a {@link GridData#FILL_BOTH}
|
||||
* mode.
|
||||
* <p/>
|
||||
* This can be useful if you want to change the {@link GridData#horizontalSpan} for example.
|
||||
*/
|
||||
public Object getLayoutData() {
|
||||
return mInnerGroup.getLayoutData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of known targets.
|
||||
* <p/>
|
||||
* This is not a copy. Callers must <em>not</em> modify this array.
|
||||
*/
|
||||
public IAndroidTarget[] getTargets() {
|
||||
return mTargets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the targets of the SDK Target Selector.
|
||||
*
|
||||
* @param targets The list of targets. This is <em>not</em> copied, the caller must not modify.
|
||||
*/
|
||||
public void setTargets(IAndroidTarget[] targets) {
|
||||
mTargets = targets;
|
||||
fillTable(mTable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a selection listener. Set it to null to remove it.
|
||||
* The listener will be called <em>after</em> this table processed its selection
|
||||
* events so that the caller can see the updated state.
|
||||
* <p/>
|
||||
* The event's item contains a {@link TableItem}.
|
||||
* The {@link TableItem#getData()} contains an {@link IAndroidTarget}.
|
||||
* <p/>
|
||||
* It is recommended that the caller uses the {@link #getFirstSelected()} and
|
||||
* {@link #getAllSelected()} methods instead.
|
||||
*
|
||||
* @param selectionListener The new listener or null to remove it.
|
||||
*/
|
||||
public void setSelectionListener(SelectionListener selectionListener) {
|
||||
mSelectionListener = selectionListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current target selection.
|
||||
* <p/>
|
||||
* If the selection is actually changed, this will invoke the selection listener
|
||||
* (if any) with a null event.
|
||||
*
|
||||
* @param target the target to be selection
|
||||
* @return true if the target could be selected, false otherwise.
|
||||
*/
|
||||
public boolean setSelection(IAndroidTarget target) {
|
||||
if (!mAllowSelection) {
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
boolean modified = false;
|
||||
for (TableItem i : mTable.getItems()) {
|
||||
if ((IAndroidTarget) i.getData() == target) {
|
||||
found = true;
|
||||
if (!i.getChecked()) {
|
||||
modified = true;
|
||||
i.setChecked(true);
|
||||
}
|
||||
} else if (i.getChecked()) {
|
||||
modified = true;
|
||||
i.setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (modified && mSelectionListener != null) {
|
||||
mSelectionListener.widgetSelected(null);
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all selected items.
|
||||
* This is useful when the table is in multiple-selection mode.
|
||||
*
|
||||
* @see #getFirstSelected()
|
||||
* @return An array of selected items. The list can be empty but not null.
|
||||
*/
|
||||
public IAndroidTarget[] getAllSelected() {
|
||||
ArrayList<IAndroidTarget> list = new ArrayList<IAndroidTarget>();
|
||||
for (TableItem i : mTable.getItems()) {
|
||||
if (i.getChecked()) {
|
||||
list.add((IAndroidTarget) i.getData());
|
||||
}
|
||||
}
|
||||
return list.toArray(new IAndroidTarget[list.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first selected item.
|
||||
* This is useful when the table is in single-selection mode.
|
||||
*
|
||||
* @see #getAllSelected()
|
||||
* @return The first selected item or null.
|
||||
*/
|
||||
public IAndroidTarget getFirstSelected() {
|
||||
for (TableItem i : mTable.getItems()) {
|
||||
if (i.getChecked()) {
|
||||
return (IAndroidTarget) i.getData();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a listener to adjust the columns width when the parent is resized.
|
||||
* <p/>
|
||||
* If we need something more fancy, we might want to use this:
|
||||
* http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet77.java?view=co
|
||||
*/
|
||||
private void adjustColumnsWidth(final Table table,
|
||||
final TableColumn column0,
|
||||
final TableColumn column1,
|
||||
final TableColumn column2,
|
||||
final TableColumn column3) {
|
||||
// Add a listener to resize the column to the full width of the table
|
||||
table.addControlListener(new ControlAdapter() {
|
||||
@Override
|
||||
public void controlResized(ControlEvent e) {
|
||||
Rectangle r = table.getClientArea();
|
||||
column0.setWidth(r.width * 30 / 100); // 30%
|
||||
column1.setWidth(r.width * 45 / 100); // 45%
|
||||
column2.setWidth(r.width * 15 / 100); // 15%
|
||||
column3.setWidth(r.width * 10 / 100); // 10%
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a selection listener that will check or uncheck the whole line when
|
||||
* double-clicked (aka "the default selection").
|
||||
*/
|
||||
private void setupSelectionListener(final Table table) {
|
||||
if (!mAllowSelection) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add a selection listener that will check/uncheck items when they are double-clicked
|
||||
table.addSelectionListener(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);
|
||||
}
|
||||
|
||||
if (mSelectionListener != null) {
|
||||
mSelectionListener.widgetDefaultSelected(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
if (e.item instanceof TableItem) {
|
||||
TableItem i = (TableItem) e.item;
|
||||
enforceSingleSelection(i);
|
||||
updateDescription(i);
|
||||
}
|
||||
|
||||
if (mSelectionListener != null) {
|
||||
mSelectionListener.widgetSelected(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If we're not in multiple selection mode, uncheck all other
|
||||
* items when this one is selected.
|
||||
*/
|
||||
private void enforceSingleSelection(TableItem item) {
|
||||
if (!mAllowMultipleSelection && item.getChecked()) {
|
||||
Table parentTable = item.getParent();
|
||||
for (TableItem i2 : parentTable.getItems()) {
|
||||
if (i2 != item && i2.getChecked()) {
|
||||
i2.setChecked(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fills the table with all SDK targets.
|
||||
* The table columns are:
|
||||
* <ul>
|
||||
* <li>column 0: sdk name
|
||||
* <li>column 1: sdk vendor
|
||||
* <li>column 2: sdk api name
|
||||
* <li>column 3: sdk version
|
||||
* </ul>
|
||||
*/
|
||||
private void fillTable(final Table table) {
|
||||
|
||||
table.removeAll();
|
||||
|
||||
if (mTargets != null && mTargets.length > 0) {
|
||||
table.setEnabled(true);
|
||||
for (IAndroidTarget target : mTargets) {
|
||||
TableItem item = new TableItem(table, SWT.NONE);
|
||||
item.setData(target);
|
||||
item.setText(0, target.getName());
|
||||
item.setText(1, target.getVendor());
|
||||
item.setText(2, target.getApiVersionName());
|
||||
item.setText(3, Integer.toString(target.getApiVersionNumber()));
|
||||
}
|
||||
} else {
|
||||
table.setEnabled(false);
|
||||
TableItem item = new TableItem(table, SWT.NONE);
|
||||
item.setData(null);
|
||||
item.setText(0, "--");
|
||||
item.setText(1, "No target available");
|
||||
item.setText(2, "--");
|
||||
item.setText(3, "--");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up a tooltip that displays the current item description.
|
||||
* <p/>
|
||||
* Displaying a tooltip over the table looks kind of odd here. Instead we actually
|
||||
* display the description in a label under the table.
|
||||
*/
|
||||
private void setupTooltip(final Table table) {
|
||||
/*
|
||||
* Reference:
|
||||
* http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=markup
|
||||
*/
|
||||
|
||||
final Listener listener = new Listener() {
|
||||
public void handleEvent(Event event) {
|
||||
|
||||
switch(event.type) {
|
||||
case SWT.KeyDown:
|
||||
case SWT.MouseExit:
|
||||
case SWT.MouseDown:
|
||||
return;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
table.addListener(SWT.Dispose, listener);
|
||||
table.addListener(SWT.KeyDown, listener);
|
||||
table.addListener(SWT.MouseMove, listener);
|
||||
table.addListener(SWT.MouseHover, listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the description label with the description of the item's android target, if any.
|
||||
*/
|
||||
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$
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user