diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RemotePackagesPage.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RemotePackagesPage.java index 4f3314fd3..fe7740e87 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RemotePackagesPage.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RemotePackagesPage.java @@ -229,6 +229,13 @@ public class RemotePackagesPage extends Composite implements ISdkListener { mDescriptionLabel.setText(""); //$NON-NLS1-$ } + /** + * Handle checking and unchecking of the tree items. + * + * When unchecking, all sub-tree items checkboxes are cleared too. + * When checking a source, all of its packages are checked too. + * When checking a package, only its compatible archives are checked. + */ private void onTreeCheckStateChanged(CheckStateChangedEvent event) { boolean b = event.getChecked(); Object elem = event.getElement(); // Will be Archive or Package or RepoSource diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java index a17077507..4f8668014 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/RepoSourcesAdapter.java @@ -16,13 +16,18 @@ package com.android.sdkuilib.internal.repository; +import com.android.sdklib.internal.repository.AddonPackage; import com.android.sdklib.internal.repository.Archive; +import com.android.sdklib.internal.repository.DocPackage; import com.android.sdklib.internal.repository.IDescription; import com.android.sdklib.internal.repository.ITask; import com.android.sdklib.internal.repository.ITaskMonitor; import com.android.sdklib.internal.repository.Package; +import com.android.sdklib.internal.repository.PlatformPackage; import com.android.sdklib.internal.repository.RepoSource; import com.android.sdklib.internal.repository.RepoSources; +import com.android.sdklib.internal.repository.ToolPackage; +import com.android.sdkuilib.internal.repository.icons.ImageFactory; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelProvider; @@ -39,11 +44,19 @@ import org.eclipse.swt.graphics.Image; class RepoSourcesAdapter { private final RepoSources mRepoSources; + private ImageFactory mImageFactory; public RepoSourcesAdapter(RepoSources repoSources) { mRepoSources = repoSources; } + /** + * Set the image factory used by the label provider. + */ + public void setImageFactory(ImageFactory imageFactory) { + mImageFactory = imageFactory; + } + public ILabelProvider getLabelProvider() { return new ViewerLabelProvider(); } @@ -55,10 +68,40 @@ class RepoSourcesAdapter { // ------------ - public static class ViewerLabelProvider extends LabelProvider { + public class ViewerLabelProvider extends LabelProvider { + /** Returns null by default */ @Override public Image getImage(Object element) { + + if (mImageFactory != null) { + if (element instanceof RepoSource) { + return mImageFactory.getImage("source_icon16.png"); + + } else if (element instanceof PlatformPackage) { + return mImageFactory.getImage("red_ball_icon16.png"); + + } else if (element instanceof AddonPackage) { + return mImageFactory.getImage("green_ball_icon16.png"); + + } else if (element instanceof ToolPackage) { + return mImageFactory.getImage("blue_ball_icon16.png"); + + } else if (element instanceof DocPackage) { + return mImageFactory.getImage("purple_ball_icon16.png"); + + } else if (element instanceof Package) { + return mImageFactory.getImage("gray_ball_icon16.png"); + + } else if (element instanceof Archive) { + if (((Archive) element).isCompatible()) { + return mImageFactory.getImage("archive_icon16.png"); + } else { + return mImageFactory.getImage("incompat_icon16.png"); + } + } + } + return super.getImage(element); } diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java index 055fbd2b3..a945bda28 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java @@ -27,6 +27,7 @@ import com.android.sdklib.internal.repository.ITaskMonitor; import com.android.sdklib.internal.repository.LocalSdkParser; import com.android.sdklib.internal.repository.RepoSource; import com.android.sdklib.internal.repository.RepoSources; +import com.android.sdkuilib.internal.repository.icons.ImageFactory; import org.eclipse.swt.widgets.Display; @@ -52,6 +53,8 @@ class UpdaterData { private final LocalSdkAdapter mLocalSdkAdapter = new LocalSdkAdapter(this); private final RepoSourcesAdapter mSourcesAdapter = new RepoSourcesAdapter(mSources); + private ImageFactory mImageFactory; + private final ArrayList mListeners = new ArrayList(); public interface ISdkListener { @@ -116,6 +119,15 @@ class UpdaterData { return mSdkLog; } + public void setImageFactory(ImageFactory imageFactory) { + mImageFactory = imageFactory; + mSourcesAdapter.setImageFactory(imageFactory); + } + + public ImageFactory getImageFactory() { + return mImageFactory; + } + public SdkManager getSdkManager() { return mSdkManager; } diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java index 2740958ab..c3caad1a8 100755 --- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java @@ -21,17 +21,15 @@ import com.android.sdklib.ISdkLog; import com.android.sdklib.SdkConstants; import com.android.sdklib.internal.repository.RepoSource; import com.android.sdklib.repository.SdkRepository; +import com.android.sdkuilib.internal.repository.icons.ImageFactory; import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StackLayout; 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.graphics.Image; -import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; @@ -39,7 +37,6 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Shell; -import java.io.InputStream; import java.lang.reflect.Constructor; import java.util.ArrayList; @@ -71,7 +68,6 @@ public class UpdaterWindowImpl { private RemotePackagesPage mRemotePackagesPage; private AvdManagerPage mAvdManagerPage; private StackLayout mStackLayout; - private Image mIconImage; public UpdaterWindowImpl(ISdkLog sdkLog, String osSdkRoot, boolean userCanChangeSdkRoot) { mUpdaterData = new UpdaterData(osSdkRoot, sdkLog); @@ -174,33 +170,27 @@ public class UpdaterWindowImpl { * Callback called when the window shell is disposed. */ private void onAndroidSdkUpdaterDispose() { - if (mIconImage != null) { - mIconImage.dispose(); - mIconImage = null; + if (mUpdaterData != null) { + ImageFactory imgFactory = mUpdaterData.getImageFactory(); + if (imgFactory != null) { + imgFactory.dispose(); + } } } /** * Creates the icon of the window shell. - * The icon is disposed by {@link #onAndroidSdkUpdaterDispose()}. */ private void setWindowImage(Shell androidSdkUpdater) { - String image = "android_icon_16.png"; //$NON-NLS-1$ + String imageName = "android_icon_16.png"; //$NON-NLS-1$ if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) { - image = "android_icon_128.png"; //$NON-NLS-1$ + imageName = "android_icon_128.png"; //$NON-NLS-1$ } - InputStream stream = getClass().getResourceAsStream(image); - if (stream != null) { - try { - ImageData imgData = new ImageData(stream); - mIconImage = new Image(mAndroidSdkUpdater.getDisplay(), - imgData, - imgData.getTransparencyMask()); - mAndroidSdkUpdater.setImage(mIconImage); - } catch (SWTException e) { - mUpdaterData.getSdkLog().error(e, "Failed to set window icon"); //$NON-NLS-1$ - } catch (IllegalArgumentException e) { - mUpdaterData.getSdkLog().error(e, "Failed to set window icon"); //$NON-NLS-1$ + + if (mUpdaterData != null) { + ImageFactory imgFactory = mUpdaterData.getImageFactory(); + if (imgFactory != null) { + mAndroidSdkUpdater.setImage(imgFactory.getImage(imageName)); } } } @@ -212,6 +202,7 @@ public class UpdaterWindowImpl { private void firstInit() { mTaskFactory = new ProgressTaskFactory(getShell()); mUpdaterData.setTaskFactory(mTaskFactory); + mUpdaterData.setImageFactory(new ImageFactory(getShell().getDisplay())); addPage(mAvdManagerPage, "Virtual Devices"); addPage(mLocalPackagePage, "Installed Packages"); diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java new file mode 100755 index 000000000..a601b1aaa --- /dev/null +++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java @@ -0,0 +1,85 @@ +/* + * 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.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; +import java.util.HashMap; +import java.util.Iterator; + + +/** + * An utility class to serve {@link Image} correspond to the various icons + * present in this package and dispose of them correctly at the end. + */ +public class ImageFactory { + + private final Display mDisplay; + private final HashMap mImages = new HashMap(); + + public ImageFactory(Display display) { + mDisplay = display; + } + + /** + * Loads an image given its filename (with its extension). + * Might return null if the image cannot be loaded. + */ + public Image getImage(String imageName) { + + Image image = mImages.get(imageName); + if (image != null) { + return image; + } + + InputStream stream = getClass().getResourceAsStream(imageName); + if (stream != null) { + try { + ImageData imgData = new ImageData(stream); + image = new Image(mDisplay, imgData, imgData.getTransparencyMask()); + } catch (SWTException e) { + // ignore + } catch (IllegalArgumentException e) { + // ignore + } + } + + // Store the image in the hash, even if this failed. If it fails now, it will fail later. + mImages.put(imageName, image); + + return image; + } + + /** + * Dispose all the images created by this factory so far. + */ + public void dispose() { + Iterator it = mImages.values().iterator(); + while(it.hasNext()) { + Image img = it.next(); + if (img != null) { + img.dispose(); + } + it.remove(); + } + } + +} diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/android_icon_128.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_128.png similarity index 100% rename from tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/android_icon_128.png rename to tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_128.png diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/android_icon_16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_16.png similarity index 100% rename from tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/android_icon_16.png rename to tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_16.png diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/archive_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/archive_icon16.png new file mode 100755 index 000000000..be5edd796 Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/archive_icon16.png differ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/blue_ball_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/blue_ball_icon16.png new file mode 100755 index 000000000..2936a0ad4 Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/blue_ball_icon16.png differ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/gray_ball_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/gray_ball_icon16.png new file mode 100755 index 000000000..23ef0d2a3 Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/gray_ball_icon16.png differ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/green_ball_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/green_ball_icon16.png new file mode 100755 index 000000000..12a115779 Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/green_ball_icon16.png differ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/incompat_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/incompat_icon16.png new file mode 100755 index 000000000..2a307e927 Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/incompat_icon16.png differ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/purple_ball_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/purple_ball_icon16.png new file mode 100755 index 000000000..e317f5978 Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/purple_ball_icon16.png differ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/red_ball_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/red_ball_icon16.png new file mode 100755 index 000000000..a4c18d8ba Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/red_ball_icon16.png differ diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_icon16.png new file mode 100755 index 000000000..5eb1eade1 Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_icon16.png differ