From 02665927836f790f1164eb5609c2d35dadd3e86d Mon Sep 17 00:00:00 2001 From: Raphael Date: Thu, 11 Jun 2009 15:34:24 -0700 Subject: [PATCH] SDK Updater: icons for packages in remote page. One of the rationales behind this was to show incompatible archives using some icon. This moves all SDK Updater icons in internal/repository/icons and create an ImageFactory available to the remote page via the UpdaterData. --- .../repository/RemotePackagesPage.java | 7 ++ .../repository/RepoSourcesAdapter.java | 45 +++++++++- .../internal/repository/UpdaterData.java | 12 +++ .../repository/UpdaterWindowImpl.java | 37 +++----- .../repository/icons/ImageFactory.java | 85 ++++++++++++++++++ .../{ => icons}/android_icon_128.png | Bin .../{ => icons}/android_icon_16.png | Bin .../repository/icons/archive_icon16.png | Bin 0 -> 493 bytes .../repository/icons/blue_ball_icon16.png | Bin 0 -> 376 bytes .../repository/icons/gray_ball_icon16.png | Bin 0 -> 396 bytes .../repository/icons/green_ball_icon16.png | Bin 0 -> 370 bytes .../repository/icons/incompat_icon16.png | Bin 0 -> 735 bytes .../repository/icons/purple_ball_icon16.png | Bin 0 -> 392 bytes .../repository/icons/red_ball_icon16.png | Bin 0 -> 380 bytes .../repository/icons/source_icon16.png | Bin 0 -> 879 bytes 15 files changed, 162 insertions(+), 24 deletions(-) create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java rename tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/{ => icons}/android_icon_128.png (100%) rename tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/{ => icons}/android_icon_16.png (100%) create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/archive_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/blue_ball_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/gray_ball_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/green_ball_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/incompat_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/purple_ball_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/red_ball_icon16.png create mode 100755 tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_icon16.png 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 0000000000000000000000000000000000000000..be5edd7966106feeab117e9d5cae021ae93ac478 GIT binary patch literal 493 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_0004iNklHEU?j7kddOXU^OdcV{bAntYoKTp_E2eSXf$#Vlyd1v9J*v zmTERq4DXpY_q}5=%*-=m6sK<8bMHC-`TOsGm5A`4@D(RFyYnuz&gi206+uK05ssI~ zOcQE4d=;r?(zT6@9(IF^BFn%K{87=}UCOp{KhO9p?j^8q-H1O5O29)EzETA%@H zD=<$cViJk3D<6Pu+ep^Px#24YJ`L;(K){{a7>y{D4^00AILL_t(I%f*v1PQySDMc-JKWkocgP;-FPF$drP zblW2C;A3!-GZt0lk}9~c%G{&e zezbrA)@bk0ehc2}=flgacWObFn>(boNZCYj185KGBe)KAM!z0+c?(ioWYHj3j4VKE zkP4_8C~Y+AqO@=8G1yD3{{o2kINMTY#Y?j41B(tc@JVYH<5Qy~2e;D~$ ztIQUT!yYt=)8ogEgbC*s)NfE>T WQ=pNjVxVjQ0000Px#24YJ`L;(K){{a7>y{D4^00A^fL_t(I%f*wualzF qyLaw>GqcIe%H?wT+sgm)8@~X$!3DDC5O?DM0000Px#24YJ`L;(K){{a7>y{D4^00A0FL_t(I%f*wyZG-#f*=A%S}M=ImN%2S8xTQ@)r zTp6$obT~2cGQLOLy#;mGPZSt(Dl%XO2Ech(X|dFD8-LOk3JfI`XV_2z1)u?~DsoJ6 z2I{UGaw;@XDmbgqg9tFuB?QE57y5*Vld#SqY~q-M&(jy0icGQPV3v@D z0kE|4IzFd!V5#Y8>4kt@7nT+mHV}2N9WHyWnYl7!ndq1>^7coR|K)G|1@O3o6SJG# Qw*UYD07*qoM6N<$f>AS)kN^Mx literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2a307e927a48543b6a805f470fc464c894c35e8c GIT binary patch literal 735 zcmV<50wDc~P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_0007VNklY%R#<_D2o_{e z1VI`G9U_y0@=%CUq@*@=saekD=JwzAI?PsG>fnQSd5`zy`~C91N<>&q839nr0eGjH z_xhKr%Fv6f0BqTJN&Oc=L=ZR{%{PlU93puoHvNs6mI z*gZa6bv|4v8=D7aalT)q{6`M&PBczuJcw;rhnzfs8Xkek8JPS6?YEG+%kW_gb^j@R zoPg{s$jJty`rAZ_3R;5`I-23|h4kjl5bF4O2!tUk3(RIP9WxScFcPo`x7BoYaT zgq1)2fv<{q-rC;)%L&o|u@ID4KmmFJC4!on zC$FIiTUR&zks!)!g1l;WH+QOx1YOrbkHW*((D4`y8e%db$s}570jY08%y+etXSMRg z-C%gseapm1P<`W+V7Qv+qi0Q6ivB}SBT zRBkPY!7eI9Ln$CNRVy7=#DCFgSpStYiTe04wmw-aoX@zA{XuQeX%{eIZnAgRTLH z#L_I^4kMZkCEx(OD>u&(8UHgYz1L1>;%W)Zvi?&Ll@h*Il(MVso>Hrg^H1D49z>nH Ru=@Z2002ovPDHLkV1lmhI~o80 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e317f5978158a08f2c2bc13657a2fc38b4ae63cc GIT binary patch literal 392 zcmV;30eAk1P)Px#24YJ`L;(K){{a7>y{D4^00A&bL_t(I%f*w;O~Wu4hMyQKjjZm#06ixRfH)&A zzM_g1ItGhi20)BJrK;kP0a(Jaz8Z%^;wWkYmmYZEoAvqe_vfPPIxdmoLg}T$&*HcP zEKm#L1!)7p-FA1+=ds1Kgky2Iu2?yZZWM|{LO2lyd;H$x?S1#~wU|N0${9>kQj!6I z06-!UiH#r*xS93fSR8g5-ISCV3~SaH3>6icD>NF_yLl~Mb~AuN*&zUp#$d)vdfqBK zD-VK)VERK;6HpM?lUZ zOgv0tz6bBc+eb;+Px#24YJ`L;(K){{a7>y{D4^00AUPL_t(I%f*wyO~gP9MW2%pElYZ!fIV+$fC4z> zjHn@HP|45$Esz6nNdeSAn9U}eHHUE^kVqW%fTgb)dF(Iy+as#VDHd^}B}>j%ky4;g z*!JK%sCVG5Rqubt%Cv=Nk;@ghGsq+02y{Se_<+hoaijXS*uo0j8uARtfD7O}_(=ou z1l*zqFCt|Ed1^@+u(ssH5C!B9BIS%gps)ZEOCFQr?-(Rpi7? zn;F5u5?Tw2&DR;GWW$mMd#GE$2eo;(yAN+)Bt}%vDrkec+rfgx#yA+k-l{V)x3~w7 zB2Ovgu@R^dbQ2N})vfB);vRS?8mJl*am3il4ytxCfmsEkxiIHKLrZ>ux(9dn*DC+Z aZ~O#{NPTk|3UY1$0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00095NklG! z&u^1;0EeIN`(xeOw_E4RT(f1}*e}yCHcg<@jCnzvF%Xj(Pb3Qm68-@b4;nGy=0%M$ z+z3V!IB+Bp2#YezwrXT^KXgE*l(Lq!rS01F{k8Y~dYDA!bAO(EE*~MK1b~W=v`A5~ zGE;wM%`+QiC29F;TR^zQu%<8E+&XaS;_=WmUO-4G_rw%%6yE+J>t)=kdMN%AxtdOw z*29xxJMKo#dncN{d;I9o>9NtV41mJt|B3)9xG@=1OJ{QmDc6Jam3!-W*cD zFC2bzJy*Mtx}S>e$sbC=;tN|+uc5biywe1dN#5#|L9ahq5uOx4yv(bLLO*_dq|?8C2C;aLGH1^hxBk?(|3 z7FqJ(Spm7#N^s{jEO~-}aA^sLXO;QwmoK+PeNWwW5&126nuA=8KsA6!PeV>c(V%C4PUyD1^SV-HZSt&9yV0dFk5_bm&dQT@ul9_$- zb3Xg(>#4!M&NIPaAX%^5ZHlC5gqs#xnvF~2ua57#