SdkTargetSelectorpublic class SdkTargetSelector extends Object The SDK target selector is a table that is added to the given parent composite.
To use, create it using {@link #SdkTargetSelector(Composite, IAndroidTarget[], boolean)} then
call {@link #setSelection(IAndroidTarget)}, {@link #setSelectionListener(SelectionListener)}
and finally use {@link #getSelected()} to retrieve the
selection. |
Fields Summary |
---|
private com.android.sdklib.IAndroidTarget[] | mTargets | private final boolean | mAllowSelection | private org.eclipse.swt.events.SelectionListener | mSelectionListener | private org.eclipse.swt.widgets.Table | mTable | private org.eclipse.swt.widgets.Label | mDescription | private org.eclipse.swt.widgets.Composite | mInnerGroup |
Constructors Summary |
---|
public SdkTargetSelector(org.eclipse.swt.widgets.Composite parent, com.android.sdklib.IAndroidTarget[] targets)Creates a new SDK Target Selector.
this(parent, targets, true /*allowSelection*/);
| public SdkTargetSelector(org.eclipse.swt.widgets.Composite parent, com.android.sdklib.IAndroidTarget[] targets, boolean allowSelection)Creates a new SDK Target Selector.
// 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;
int style = SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION;
if (allowSelection) {
style |= SWT.CHECK;
}
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("Target Name");
final TableColumn column1 = new TableColumn(mTable, SWT.NONE);
column1.setText("Vendor");
final TableColumn column2 = new TableColumn(mTable, SWT.NONE);
column2.setText("Platform");
final TableColumn column3 = new TableColumn(mTable, SWT.NONE);
column3.setText("API Level");
adjustColumnsWidth(mTable, column0, column1, column2, column3);
setupSelectionListener(mTable);
setTargets(targets);
setupTooltip(mTable);
|
Methods Summary |
---|
private void | adjustColumnsWidth(org.eclipse.swt.widgets.Table table, org.eclipse.swt.widgets.TableColumn column0, org.eclipse.swt.widgets.TableColumn column1, org.eclipse.swt.widgets.TableColumn column2, org.eclipse.swt.widgets.TableColumn column3)Adds a listener to adjust the columns width when the parent is resized.
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
// 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%
}
});
| private void | fillTable(org.eclipse.swt.widgets.Table table)Fills the table with all SDK targets.
The table columns are:
- column 0: sdk name
- column 1: sdk vendor
- column 2: sdk api name
- column 3: sdk version
if (table == null || table.isDisposed()) {
return;
}
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, "--");
}
| public java.lang.Object | getLayoutData()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.
This can be useful if you want to change the {@link GridData#horizontalSpan} for example.
return mInnerGroup.getLayoutData();
| public com.android.sdklib.IAndroidTarget | getSelected()Returns the selected item.
if (mTable == null || mTable.isDisposed()) {
return null;
}
for (TableItem i : mTable.getItems()) {
if (i.getChecked()) {
return (IAndroidTarget) i.getData();
}
}
return null;
| public com.android.sdklib.IAndroidTarget[] | getTargets()Returns the list of known targets.
This is not a copy. Callers must not modify this array.
return mTargets;
| public boolean | setSelection(com.android.sdklib.IAndroidTarget target)Sets the current target selection.
If the selection is actually changed, this will invoke the selection listener
(if any) with a null event.
if (!mAllowSelection) {
return false;
}
boolean found = false;
boolean modified = false;
if (mTable != null && !mTable.isDisposed()) {
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;
| public void | setSelectionListener(org.eclipse.swt.events.SelectionListener selectionListener)Sets a selection listener. Set it to null to remove it.
The listener will be called after this table processed its selection
events so that the caller can see the updated state.
The event's item contains a {@link TableItem}.
The {@link TableItem#getData()} contains an {@link IAndroidTarget}.
It is recommended that the caller uses the {@link #getSelected()} method instead.
mSelectionListener = selectionListener;
| public void | setTargets(com.android.sdklib.IAndroidTarget[] targets)Changes the targets of the SDK Target Selector.
mTargets = targets;
fillTable(mTable);
| private void | setupSelectionListener(org.eclipse.swt.widgets.Table table)Creates a selection listener that will check or uncheck the whole line when
double-clicked (aka "the default selection").
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 (item.getChecked()) {
Table parentTable = item.getParent();
for (TableItem i2 : parentTable.getItems()) {
if (i2 != item && i2.getChecked()) {
i2.setChecked(false);
}
}
}
}
});
| private void | setupTooltip(org.eclipse.swt.widgets.Table table)Sets up a tooltip that displays the current item description.
Displaying a tooltip over the table looks kind of odd here. Instead we actually
display the description in a label under the table.
if (table == null || table.isDisposed()) {
return;
}
/*
* 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);
| private void | updateDescription(org.eclipse.swt.widgets.TableItem item)Updates the description label with the description of the item's android target, if any.
if (item != null) {
Object data = item.getData();
if (data instanceof IAndroidTarget) {
String newTooltip = ((IAndroidTarget) data).getDescription();
mDescription.setText(newTooltip == null ? "" : newTooltip); //$NON-NLS-1$
}
}
|
|