diff options
author | Xavier Ducrohet <xav@android.com> | 2009-06-16 17:41:09 -0700 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2009-06-17 11:40:19 -0700 |
commit | 88f1127ee0b90d7fe91597d072ff6a2c693eff7c (patch) | |
tree | 687250026e77fc0660cd35513b21ac01455e7f82 /sdkmanager | |
parent | 5dafec27ae2cb37516d1b12c3dd0fbbcbe188e59 (diff) | |
download | sdk-88f1127ee0b90d7fe91597d072ff6a2c693eff7c.zip sdk-88f1127ee0b90d7fe91597d072ff6a2c693eff7c.tar.gz sdk-88f1127ee0b90d7fe91597d072ff6a2c693eff7c.tar.bz2 |
First step of a more standalone AvdSelector.
- New/Delete/Info/Refresh/Manager buttons.
- Ability to set any kind of AVD filter
- Self-refresh: Selector knows the AvdManager and can refresh itself.
- Manager mode or simple (selection or checkboxes)
- Manager mode displays broken AVDs.
Updated the SdkUpdate AVD page and the various use of the Selector in ADT.
Diffstat (limited to 'sdkmanager')
3 files changed, 256 insertions, 273 deletions
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java index da5e2df..d69ce5f 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java @@ -16,29 +16,19 @@ package com.android.sdkuilib.internal.repository;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.avd.AvdManager.AvdInfo;
import com.android.sdkuilib.internal.repository.UpdaterData.ISdkListener;
import com.android.sdkuilib.internal.widgets.AvdSelector;
-import com.android.sdkuilib.internal.widgets.AvdSelector.SelectionMode;
+import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-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.Label;
-import java.util.HashSet;
-
public class AvdManagerPage extends Composite implements ISdkListener {
- private Button mRefreshButton;
private AvdSelector mAvdSelector;
- private final HashSet<String> mKnownAvdNames = new HashSet<String>();
private final UpdaterData mUpdaterData;
/**
@@ -57,43 +47,12 @@ public class AvdManagerPage extends Composite implements ISdkListener { }
private void createContents(Composite parent) {
- parent.setLayout(new GridLayout(3, false));
+ parent.setLayout(new GridLayout(1, false));
Label label = new Label(parent, SWT.NONE);
label.setText("List of existing Android Virtual Devices:");
- label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false, 2, 1));
-
- mRefreshButton = new Button(parent, SWT.PUSH);
- mRefreshButton.setText("Refresh");
- mRefreshButton.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
- mRefreshButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onRefreshSelected(); //$hide$
- }
- });
-
- Composite group = new Composite(parent, SWT.NONE);
- group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
- GridLayout gl;
- group.setLayout(gl = new GridLayout(1, false /*makeColumnsEqualWidth*/));
- gl.marginHeight = gl.marginWidth = 0;
-
- mAvdSelector = new AvdSelector(group,
- SelectionMode.SELECT,
- new AvdSelector.IExtraAction() {
- public String label() {
- return "Delete AVD...";
- }
-
- public boolean isEnabled() {
- return mAvdSelector != null && mAvdSelector.getSelected() != null;
- }
-
- public void run() {
- //TODO onDelete();
- }
- });
+
+ mAvdSelector = new AvdSelector(parent, mUpdaterData.getAvdManager(), DisplayMode.MANAGER);
}
@Override
@@ -115,48 +74,11 @@ public class AvdManagerPage extends Composite implements ISdkListener { * Called by the constructor right after {@link #createContents(Composite)}.
*/
private void postCreate() {
- reloadAvdList();
- }
-
- /**
- * Reloads the AVD list in the AVD selector.
- * Tries to preserve the selection.
- */
- private void reloadAvdList() {
- AvdInfo selected = mAvdSelector.getSelected();
-
- AvdInfo[] avds = null;
-
- AvdManager manager = mUpdaterData.getAvdManager();
- if (manager != null) {
- avds = manager.getValidAvds();
- }
-
- mAvdSelector.setAvds(avds, null /*filter*/);
-
- // Keep the list of known AVD names to check if they exist quickly. however
- // use the list of all AVDs, including broken ones (unless we don't know their
- // name).
- mKnownAvdNames.clear();
- if (manager != null) {
- for (AvdInfo avd : manager.getAllAvds()) {
- String name = avd.getName();
- if (name != null) {
- mKnownAvdNames.add(name);
- }
- }
- }
-
- mAvdSelector.setSelection(selected);
+ // nothing to be done for now.
}
public void onSdkChange() {
- reloadAvdList();
- }
-
- private void onRefreshSelected() {
- mUpdaterData.reloadAvds();
- reloadAvdList();
+ mAvdSelector.refresh(false /*reload*/);
}
// End of hiding from SWT Designer
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java index 44316b6..51d09d5 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java @@ -18,7 +18,6 @@ package com.android.sdkuilib.internal.repository.icons; import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Display;
import java.io.InputStream;
@@ -74,7 +73,7 @@ public class ImageFactory { Iterator<Image> it = mImages.values().iterator();
while(it.hasNext()) {
Image img = it.next();
- if (img != null) {
+ if (img != null && img.isDisposed() == false) {
img.dispose();
}
it.remove();
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java index 2056008..39aea27 100644 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java @@ -16,24 +16,28 @@ package com.android.sdkuilib.internal.widgets; +import com.android.prefs.AndroidLocation.AndroidLocationException; import com.android.sdklib.IAndroidTarget; +import com.android.sdklib.internal.avd.AvdManager; import com.android.sdklib.internal.avd.AvdManager.AvdInfo; +import com.android.sdklib.internal.avd.AvdManager.AvdInfo.AvdStatus; +import com.android.sdkuilib.internal.repository.icons.ImageFactory; 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.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Image; 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.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; @@ -42,62 +46,96 @@ import org.eclipse.swt.widgets.TableItem; /** * The AVD selector is a table that is added to the given parent composite. * <p/> - * To use, create it using {@link #AvdSelector(Composite, SelectionMode, IExtraAction)} then + * To use, create it using {@link #AvdSelector(Composite, AvdManager, DisplayMode)} then * call {@link #setSelection(AvdInfo)}, {@link #setSelectionListener(SelectionListener)} * and finally use {@link #getSelected()} to retrieve the selection. */ public final class AvdSelector { - - private AvdInfo[] mAvds; private SelectionListener mSelectionListener; private Table mTable; - private Label mDescription; private static int NUM_COL = 2; - private final SelectionMode mSelectionMode; - private final IExtraAction mExtraAction; - private Button mExtraActionButton; + private final DisplayMode mDisplayMode; + private Button mManagerButton; + private IAvdFilter mTargetFilter; + private AvdManager mManager; + private Image mOkImage; + private Image mBrokenImage; + private ImageFactory mIconFactory; - /** The selection mode, either {@link #SELECT} or {@link #CHECK} */ - public enum SelectionMode { + /** + * The display mode of the AVD Selector. + */ + public static enum DisplayMode { /** + * Manager mode. Invalid AVDs are displayed. Buttons to create/delete AVDs + */ + MANAGER, + + /** + * Non manager mode. Only valid AVDs are displayed. Cannot create/delete AVDs, but + * there is a button to open the AVD Manager. * In the "check" selection mode, checkboxes are displayed on each line * and {@link AvdSelector#getSelected()} returns the line that is checked * even if it is not the currently selected line. Only one line can * be checked at once. */ - CHECK, + SIMPLE_CHECK, + /** + * Non manager mode. Only valid AVDs are displayed. Cannot create/delete AVDs, but + * there is a button to open the AVD Manager. * In the "select" selection mode, there are no checkboxes and * {@link AvdSelector#getSelected()} returns the line currently selected. * Only one line can be selected at once. */ - SELECT + SIMPLE_SELECTION, } /** - * Defines an "extra action" button that can be shown under the AVD Selector. + * A filter to control the whether or not an AVD should be displayed by the AVD Selector. */ - public interface IExtraAction { + public interface IAvdFilter { /** - * Label of the button that will be created. - * This is invoked once when the button is created and cannot be changed later. + * Called before {@link #accept(AvdInfo)} is called for any AVD. */ - public String label(); + void prepare(); /** - * This is invoked just after the selection has changed to update the "enabled" - * state of the action. Implementation should use {@link AvdSelector#getSelected()}. + * Called to decided whether an AVD should be displayed. + * @param avd the AVD to test. + * @return true if the AVD should be displayed. */ - public boolean isEnabled(); + boolean accept(AvdInfo avd); /** - * Run the action, invoked when the button is clicked. - * - * The caller's action is responsible for reloading the AVD list - * using {@link AvdSelector#setAvds(AvdInfo[], IAndroidTarget)}. + * Called after {@link #accept(AvdInfo)} has been called on all the AVDs. */ - public void run(); + void cleanup(); + } + + /** + * Internal implementation of {@link IAvdFilter} to filter out the AVDs that are not + * running an image compatible with a specific target. + */ + private final static class TargetBasedFilter implements IAvdFilter { + private final IAndroidTarget mTarget; + + TargetBasedFilter(IAndroidTarget target) { + mTarget = target; + } + + public void prepare() { + // nothing to prepare + } + + public boolean accept(AvdInfo avd) { + return mTarget.isCompatibleBaseFor(avd.getTarget()); + } + + public void cleanup() { + // nothing to clean up + } } /** @@ -107,20 +145,18 @@ public final class AvdSelector { * {@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. - * It can be null. - * @param filter When non-null, will display only the AVDs matching this target. + * @param manager the AVD manager. + * @param filter When non-null, will allow filtering the AVDs to display. * @param extraAction When non-null, displays an extra action button. - * @param selectionMode One of {@link SelectionMode#SELECT} or {@link SelectionMode#CHECK} + * @param displayMode The display mode ({@link DisplayMode}). */ public AvdSelector(Composite parent, - AvdInfo[] avds, - IAndroidTarget filter, - IExtraAction extraAction, - SelectionMode selectionMode) { - mAvds = avds; - mExtraAction = extraAction; - mSelectionMode = selectionMode; + AvdManager manager, + IAvdFilter filter, + DisplayMode displayMode) { + mManager = manager; + mTargetFilter = filter; + mDisplayMode = displayMode; // Layout has 2 columns Composite group = new Composite(parent, SWT.NONE); @@ -129,9 +165,14 @@ public final class AvdSelector { gl.marginHeight = gl.marginWidth = 0; group.setLayoutData(new GridData(GridData.FILL_BOTH)); group.setFont(parent.getFont()); + group.addDisposeListener(new DisposeListener() { + public void widgetDisposed(DisposeEvent arg0) { + mIconFactory.dispose(); + } + }); int style = SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER; - if (selectionMode == SelectionMode.CHECK) { + if (displayMode == DisplayMode.SIMPLE_CHECK) { style |= SWT.CHECK; } mTable = new Table(group, style); @@ -139,18 +180,53 @@ public final class AvdSelector { mTable.setLinesVisible(false); setTableHeightHint(0); - mDescription = new Label(group, SWT.WRAP); - mDescription.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + Composite buttons = new Composite(group, SWT.NONE); + buttons.setLayout(gl = new GridLayout(1, false /*makeColumnsEqualWidth*/)); + gl.marginHeight = gl.marginWidth = 0; + buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL)); + buttons.setFont(group.getFont()); + + if (displayMode == DisplayMode.MANAGER) { + Button newButton = new Button(buttons, SWT.PUSH | SWT.FLAT); + newButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + newButton.setText("New"); + // TODO: callback for button + + Button deleteButton = new Button(buttons, SWT.PUSH | SWT.FLAT); + deleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + deleteButton.setText("Delete"); + // TODO: callback for button + + Label l = new Label(buttons, SWT.SEPARATOR | SWT.HORIZONTAL); + l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + } + + Button infoButton = new Button(buttons, SWT.PUSH | SWT.FLAT); + infoButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + infoButton.setText("Info..."); + // TODO: callback for button - if (extraAction != null) { - mExtraActionButton = new Button(group, SWT.PUSH); - mExtraActionButton.setText(extraAction.label()); - mExtraActionButton.setEnabled(extraAction.isEnabled()); - mExtraActionButton.addSelectionListener(new SelectionAdapter() { + Composite padding = new Composite(buttons, SWT.NONE); + padding.setLayoutData(new GridData(GridData.FILL_VERTICAL)); + + Button refreshButton = new Button(buttons, SWT.PUSH | SWT.FLAT); + refreshButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + refreshButton.setText("Resfresh"); + refreshButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent arg0) { + refresh(true); + } + }); + + if (displayMode != DisplayMode.MANAGER) { + mManagerButton = new Button(buttons, SWT.PUSH | SWT.FLAT); + mManagerButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + mManagerButton.setText("Manager..."); + mManagerButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); - mExtraAction.run(); } }); } @@ -165,41 +241,45 @@ public final class AvdSelector { final TableColumn column3 = new TableColumn(mTable, SWT.NONE); column3.setText("API Level"); + // get some bitmaps. + mIconFactory = new ImageFactory(parent.getDisplay()); + mOkImage = mIconFactory.getImage("accept_icon16.png"); + mBrokenImage = mIconFactory.getImage("reject_icon16.png"); + adjustColumnsWidth(mTable, column0, column1, column2, column3); setupSelectionListener(mTable); - fillTable(mTable, filter); - setupTooltip(mTable); + fillTable(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. - * It can be null. - * @param extraAction When non-null, displays an extra action button. - * @param selectionMode One of {@link SelectionMode#SELECT} or {@link SelectionMode#CHECK} + * @param manager the AVD manager. + * @param displayMode The display mode ({@link DisplayMode}). */ - public AvdSelector(Composite parent, - AvdInfo[] avds, - IExtraAction extraAction, - SelectionMode selectionMode) { - this(parent, avds, null /* filter */, extraAction, selectionMode); + public AvdSelector(Composite parent, AvdManager manager, + DisplayMode displayMode) { + this(parent, manager, (IAvdFilter)null /* filter */, displayMode); } /** - * Creates a new SDK Target Selector, and fills it with a list of {@link AvdInfo}. + * Creates a new SDK Target Selector, and fills it with a list of {@link AvdInfo}, filtered + * by an {@link IAndroidTarget}. + * <p/>Only the {@link AvdInfo} able to run applications developed for the given + * {@link IAndroidTarget} will be displayed. * * @param parent The parent composite where the selector will be added. - * @param extraAction When non-null, displays an extra action button. - * @param selectionMode One of {@link SelectionMode#SELECT} or {@link SelectionMode#CHECK} + * @param manager the AVD manager. + * @param filter Only shows the AVDs matching this target (must not be null). + * @param displayMode The display mode ({@link DisplayMode}). */ public AvdSelector(Composite parent, - SelectionMode selectionMode, - IExtraAction extraAction) { - this(parent, null /*avds*/, null /* filter */, extraAction, selectionMode); + AvdManager manager, + IAndroidTarget filter, + DisplayMode displayMode) { + this(parent, manager, new TargetBasedFilter(filter), displayMode); } - /** * Sets the table grid layout data. * @@ -212,41 +292,70 @@ public final class AvdSelector { } data.grabExcessVerticalSpace = true; data.grabExcessHorizontalSpace = true; - data.horizontalSpan = NUM_COL; data.horizontalAlignment = GridData.FILL; data.verticalAlignment = GridData.FILL; mTable.setLayoutData(data); } /** - * Sets a new set of AVD, with an optional filter. + * Refresh the display of Android Virtual Devices. * Tries to keep the selection. * <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. - * It can be null. - * @param filter An IAndroidTarget. If non-null, only AVD whose target are compatible with the - * filter target will displayed an available for selection. + * @param reload if true, the AVD manager will reload the AVD from the disk. + * @throws AndroidLocationException if reload the AVD failed. + * @return false if the reloading failed. This is always true if <var>reload</var> is + * <code>false</code>. */ - public void setAvds(AvdInfo[] avds, IAndroidTarget filter) { + public boolean refresh(boolean reload) { + if (reload) { + try { + mManager.reloadAvds(); + } catch (AndroidLocationException e) { + return false; + } + } AvdInfo selected = getSelected(); - mAvds = avds; - fillTable(mTable, filter); + fillTable(mTable); setSelection(selected); + + return true; } /** - * Returns the list of known AVDs. - * <p/> - * This is not a copy. Callers must <em>not</em> modify this array. + * Sets a new AVD manager + * This does not refresh the display. Call {@link #refresh(boolean)} to do so. + * @param manager the AVD manager. + */ + public void setManager(AvdManager manager) { + mManager = manager; + } + + /** + * Sets a new AVD filter. + * This does not refresh the display. Call {@link #refresh(boolean)} to do so. + * @param filter An IAvdFilter. If non-null, this will filter out the AVD to not display. */ - public AvdInfo[] getAvds() { - return mAvds; + public void setFilter(IAvdFilter filter) { + mTargetFilter = filter; + } + + /** + * Sets a new Android Target-based AVD filter. + * This does not refresh the display. Call {@link #refresh(boolean)} to do so. + * @param target An IAndroidTarget. If non-null, only AVD whose target are compatible with the + * filter target will displayed an available for selection. + */ + public void setFilter(IAndroidTarget target) { + if (target != null) { + mTargetFilter = new TargetBasedFilter(target); + } else { + mTargetFilter = null; + } } /** @@ -281,19 +390,7 @@ public final class AvdSelector { int selIndex = mTable.getSelectionIndex(); int index = 0; for (TableItem i : mTable.getItems()) { - if (mSelectionMode == SelectionMode.SELECT) { - if ((AvdInfo) i.getData() == target) { - found = true; - if (index != selIndex) { - mTable.setSelection(index); - modified = true; - } - break; - } - - index++; - - } else if (mSelectionMode == SelectionMode.CHECK){ + if (mDisplayMode == DisplayMode.SIMPLE_CHECK) { if ((AvdInfo) i.getData() == target) { found = true; if (!i.getChecked()) { @@ -304,6 +401,17 @@ public final class AvdSelector { modified = true; i.setChecked(false); } + } else { + if ((AvdInfo) i.getData() == target) { + found = true; + if (index != selIndex) { + mTable.setSelection(index); + modified = true; + } + break; + } + + index++; } } @@ -311,10 +419,6 @@ public final class AvdSelector { mSelectionListener.widgetSelected(null); } - if (mExtraAction != null && mExtraActionButton != null) { - mExtraActionButton.setEnabled(mExtraAction.isEnabled()); - } - return found; } @@ -324,18 +428,17 @@ public final class AvdSelector { * @return The currently selected item or null. */ public AvdInfo getSelected() { - if (mSelectionMode == SelectionMode.SELECT) { - int selIndex = mTable.getSelectionIndex(); - if (selIndex >= 0) { - return (AvdInfo) mTable.getItem(selIndex).getData(); - } - - } else if (mSelectionMode == SelectionMode.CHECK) { + if (mDisplayMode == DisplayMode.SIMPLE_CHECK) { for (TableItem i : mTable.getItems()) { if (i.getChecked()) { return (AvdInfo) i.getData(); } } + } else { + int selIndex = mTable.getSelectionIndex(); + if (selIndex >= 0) { + return (AvdInfo) mTable.getItem(selIndex).getData(); + } } return null; } @@ -349,7 +452,6 @@ public final class AvdSelector { */ public void setEnabled(boolean enabled) { mTable.setEnabled(enabled); - mDescription.setEnabled(enabled); } /** @@ -368,15 +470,14 @@ public final class AvdSelector { @Override public void controlResized(ControlEvent e) { Rectangle r = table.getClientArea(); - column0.setWidth(r.width * 30 / 100); // 30% + column0.setWidth(r.width * 25 / 100); // 25% column1.setWidth(r.width * 45 / 100); // 45% - column2.setWidth(r.width * 10 / 100); // 10% + column2.setWidth(r.width * 15 / 100); // 15% column3.setWidth(r.width * 15 / 100); // 15% } }); } - /** * Creates a selection listener that will check or uncheck the whole line when * double-clicked (aka "the default selection"). @@ -393,16 +494,11 @@ public final class AvdSelector { if (e.item instanceof TableItem) { TableItem i = (TableItem) e.item; enforceSingleSelection(i); - updateDescription(i); } if (mSelectionListener != null) { mSelectionListener.widgetSelected(e); } - - if (mExtraAction != null && mExtraActionButton != null) { - mExtraActionButton.setEnabled(mExtraAction.isEnabled()); - } } /** @@ -416,20 +512,15 @@ public final class AvdSelector { public void widgetDefaultSelected(SelectionEvent e) { if (e.item instanceof TableItem) { TableItem i = (TableItem) e.item; - if (mSelectionMode == SelectionMode.CHECK) { + if (mDisplayMode == DisplayMode.SIMPLE_CHECK) { i.setChecked(true); } enforceSingleSelection(i); - updateDescription(i); } if (mSelectionListener != null) { mSelectionListener.widgetDefaultSelected(e); } - - if (mExtraAction != null && mExtraActionButton != null) { - mExtraActionButton.setEnabled(mExtraAction.isEnabled()); - } } /** @@ -437,10 +528,7 @@ public final class AvdSelector { * This makes the chekboxes act as radio buttons. */ private void enforceSingleSelection(TableItem item) { - if (mSelectionMode == SelectionMode.SELECT) { - // pass - - } else if (mSelectionMode == SelectionMode.CHECK) { + if (mDisplayMode == DisplayMode.SIMPLE_CHECK) { if (item.getChecked()) { Table parentTable = item.getParent(); for (TableItem i2 : parentTable.getItems()) { @@ -449,6 +537,8 @@ public final class AvdSelector { } } } + } else { + // pass } } }); @@ -464,21 +554,50 @@ public final class AvdSelector { * <li>column 3: sdk version * </ul> */ - private void fillTable(final Table table, IAndroidTarget filter) { + private void fillTable(final Table table) { table.removeAll(); - if (mAvds != null && mAvds.length > 0) { + + // get the AVDs + AvdInfo avds[] = null; + if (mManager != null) { + if (mDisplayMode == DisplayMode.MANAGER) { + avds = mManager.getAllAvds(); + } else { + avds = mManager.getValidAvds(); + } + } + + if (avds != null && avds.length > 0) { table.setEnabled(true); - for (AvdInfo avd : mAvds) { - if (filter == null || filter.isCompatibleBaseFor(avd.getTarget())) { + + if (mTargetFilter != null) { + mTargetFilter.prepare(); + } + + for (AvdInfo avd : avds) { + if (mTargetFilter == null || mTargetFilter.accept(avd)) { TableItem item = new TableItem(table, SWT.NONE); item.setData(avd); item.setText(0, avd.getName()); + if (mDisplayMode == DisplayMode.MANAGER) { + item.setImage(0, avd.getStatus() == AvdStatus.OK ? mOkImage : mBrokenImage); + } IAndroidTarget target = avd.getTarget(); - item.setText(1, target.getFullName()); - item.setText(2, target.getApiVersionName()); - item.setText(3, Integer.toString(target.getApiVersionNumber())); + if (target != null) { + item.setText(1, target.getFullName()); + item.setText(2, target.getApiVersionName()); + item.setText(3, Integer.toString(target.getApiVersionNumber())); + } else { + item.setText(1, "?"); + item.setText(2, "?"); + item.setText(3, "?"); + } } } + + if (mTargetFilter != null) { + mTargetFilter.cleanup(); + } } if (table.getItemCount() == 0) { @@ -491,61 +610,4 @@ public final class AvdSelector { 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$ - } - } - } } |