FileDocCategorySizeDatePackage
SdkTargetSelector.javaAPI DocAndroid 1.5 API14208Wed May 06 22:41:10 BST 2009com.android.sdkuilib

SdkTargetSelector

public 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.

param
parent The parent composite where the selector will be added.
param
targets The list of targets. This is not copied, the caller must not modify. Targets can be null or an empty array, in which case the table is disabled.

        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.

param
parent The parent composite where the selector will be added.
param
targets The list of targets. This is not 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.

        // 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 voidadjustColumnsWidth(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 voidfillTable(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.ObjectgetLayoutData()
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.IAndroidTargetgetSelected()
Returns the selected item.

return
The selected item or null.

        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 booleansetSelection(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.

param
target the target to be selection
return
true if the target could be selected, false otherwise.

        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 voidsetSelectionListener(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.

param
selectionListener The new listener or null to remove it.

        mSelectionListener = selectionListener;
    
public voidsetTargets(com.android.sdklib.IAndroidTarget[] targets)
Changes the targets of the SDK Target Selector.

param
targets The list of targets. This is not copied, the caller must not modify.

        mTargets = targets;
        fillTable(mTable);
    
private voidsetupSelectionListener(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 voidsetupTooltip(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 voidupdateDescription(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$
            }
        }