OSDN Git Service

SDK Updater: use tri-state icon for each potential
authorRaphael <raphael@google.com>
Tue, 16 Jun 2009 05:40:45 +0000 (22:40 -0700)
committerRaphael <raphael@google.com>
Tue, 16 Jun 2009 07:08:49 +0000 (00:08 -0700)
archive: accepted, refused or unknown.

tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdateChooserDialog.java
tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png [new file with mode: 0755]
tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png [new file with mode: 0755]
tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png [new file with mode: 0755]

index fd7449d..19d1e8c 100755 (executable)
 \r
 package com.android.sdkuilib.internal.repository;\r
 \r
+import com.android.sdklib.SdkConstants;\r
 import com.android.sdklib.internal.repository.Archive;\r
+import com.android.sdkuilib.internal.repository.icons.ImageFactory;\r
 \r
-import org.eclipse.jface.viewers.CheckStateChangedEvent;\r
-import org.eclipse.jface.viewers.CheckboxTableViewer;\r
-import org.eclipse.jface.viewers.ICheckStateListener;\r
 import org.eclipse.jface.viewers.ISelection;\r
 import org.eclipse.jface.viewers.IStructuredContentProvider;\r
 import org.eclipse.jface.viewers.IStructuredSelection;\r
 import org.eclipse.jface.viewers.LabelProvider;\r
-import org.eclipse.jface.viewers.StructuredSelection;\r
+import org.eclipse.jface.viewers.TableViewer;\r
 import org.eclipse.jface.viewers.Viewer;\r
 import org.eclipse.swt.SWT;\r
 import org.eclipse.swt.custom.SashForm;\r
@@ -54,6 +53,7 @@ import org.eclipse.swt.widgets.Text;
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.Comparator;\r
+import java.util.HashSet;\r
 import java.util.Map;\r
 import java.util.TreeMap;\r
 \r
@@ -69,6 +69,8 @@ final class UpdateChooserDialog extends Dialog {
     private final Map<Archive, Archive> mNewToOldArchiveMap;\r
     private boolean mLicenseAcceptAll;\r
     private boolean mInternalLicenseRadioUpdate;\r
+    private HashSet<Archive> mAccepted = new HashSet<Archive>();\r
+    private HashSet<Archive> mRejected = new HashSet<Archive>();\r
     private ArrayList<Archive> mResult = new ArrayList<Archive>();\r
 \r
     // UI fields\r
@@ -77,23 +79,26 @@ final class UpdateChooserDialog extends Dialog {
     private Composite mPackageRootComposite;\r
     private Button mCancelButton;\r
     private Button mInstallButton;\r
-    private CheckboxTableViewer mTableViewPackage;\r
+    private TableViewer mTableViewPackage;\r
     private Table mTablePackage;\r
     private TableColumn mTableColum;\r
     private Text mPackageText;\r
     private Button mLicenseRadioAccept;\r
-    private Button mLicenseRadioRefuse;\r
+    private Button mLicenseRadioReject;\r
     private Button mLicenseRadioAcceptAll;\r
     private Group mPackageTextGroup;\r
+    private final UpdaterData mUpdaterData;\r
+    private Group mTableGroup;\r
 \r
 \r
     /**\r
      * Create the dialog.\r
-     * @param parent Parent container\r
+     * @param updaterData The updater data\r
      * @param newToOldUpdates The map [new archive => old archive] of potential updates\r
      */\r
-    public UpdateChooserDialog(Shell parent, Map<Archive, Archive> newToOldUpdates) {\r
-        super(parent, SWT.APPLICATION_MODAL);\r
+    public UpdateChooserDialog(UpdaterData updaterData, Map<Archive, Archive> newToOldUpdates) {\r
+        super(updaterData.getWindowShell(), SWT.APPLICATION_MODAL);\r
+        mUpdaterData = updaterData;\r
 \r
         mNewToOldArchiveMap = new TreeMap<Archive, Archive>(new Comparator<Archive>() {\r
             public int compare(Archive a1, Archive a2) {\r
@@ -152,7 +157,7 @@ final class UpdateChooserDialog extends Dialog {
         });\r
         mDialogShell.setLayout(new GridLayout(3, false/*makeColumnsEqual*/));\r
         mDialogShell.setSize(600, 400);\r
-        mDialogShell.setText(getText());\r
+        mDialogShell.setText("Choose Packages to Install");\r
 \r
         // Sash form\r
         mSashForm = new SashForm(mDialogShell, SWT.NONE);\r
@@ -161,10 +166,14 @@ final class UpdateChooserDialog extends Dialog {
 \r
         // Left part of Sash Form\r
 \r
-        mTableViewPackage = CheckboxTableViewer.newCheckList(mSashForm,\r
-                SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE);\r
+        mTableGroup = new Group(mSashForm, SWT.NONE);\r
+        mTableGroup.setText("Packages");\r
+        mTableGroup.setLayout(new GridLayout(1, false/*makeColumnsEqual*/));\r
+\r
+        mTableViewPackage = new TableViewer(mTableGroup, SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE);\r
         mTablePackage = mTableViewPackage.getTable();\r
         mTablePackage.setHeaderVisible(false);\r
+        mTablePackage.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));\r
 \r
         mTablePackage.addSelectionListener(new SelectionAdapter() {\r
             @Override\r
@@ -177,12 +186,6 @@ final class UpdateChooserDialog extends Dialog {
             }\r
         });\r
 \r
-        mTableViewPackage.addCheckStateListener(new ICheckStateListener() {\r
-            public void checkStateChanged(CheckStateChangedEvent event) {\r
-                onPackageChecked(event);\r
-            }\r
-        });\r
-\r
         mTableColum = new TableColumn(mTablePackage, SWT.NONE);\r
         mTableColum.setWidth(100);\r
         mTableColum.setText("Packages");\r
@@ -191,6 +194,7 @@ final class UpdateChooserDialog extends Dialog {
         // Right part of Sash form\r
         mPackageRootComposite = new Composite(mSashForm, SWT.NONE);\r
         mPackageRootComposite.setLayout(new GridLayout(4, false/*makeColumnsEqual*/));\r
+        mPackageRootComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
 \r
         mPackageTextGroup = new Group(mPackageRootComposite, SWT.NONE);\r
         mPackageTextGroup.setText("Package Description && License");\r
@@ -211,10 +215,10 @@ final class UpdateChooserDialog extends Dialog {
             }\r
         });\r
 \r
-        mLicenseRadioRefuse = new Button(mPackageRootComposite, SWT.RADIO);\r
-        mLicenseRadioRefuse.setText("Refuse");\r
-        mLicenseRadioRefuse.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));\r
-        mLicenseRadioRefuse.addSelectionListener(new SelectionAdapter() {\r
+        mLicenseRadioReject = new Button(mPackageRootComposite, SWT.RADIO);\r
+        mLicenseRadioReject.setText("Reject");\r
+        mLicenseRadioReject.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));\r
+        mLicenseRadioReject.addSelectionListener(new SelectionAdapter() {\r
             @Override\r
             public void widgetSelected(SelectionEvent e) {\r
                 onLicenseRadioSelected();\r
@@ -243,7 +247,7 @@ final class UpdateChooserDialog extends Dialog {
 \r
         mInstallButton = new Button(mDialogShell, SWT.PUSH);\r
         mInstallButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));\r
-        mInstallButton.setText("Install Selected");\r
+        mInstallButton.setText("Install Accepted");\r
         mInstallButton.addSelectionListener(new SelectionAdapter() {\r
             @Override\r
             public void widgetSelected(SelectionEvent e) {\r
@@ -271,11 +275,15 @@ final class UpdateChooserDialog extends Dialog {
      * This is deferred till the UI is created.\r
      */\r
     private void postCreate() {\r
+        setWindowImage();\r
+\r
         // Fill the list with the replacement packages\r
         mTableViewPackage.setLabelProvider(new NewArchivesLabelProvider());\r
         mTableViewPackage.setContentProvider(new NewArchivesContentProvider());\r
         mTableViewPackage.setInput(mNewToOldArchiveMap);\r
 \r
+        // TODO automatically accept those with an empty license\r
+\r
         adjustColumnsWidth();\r
 \r
         // select first item\r
@@ -283,6 +291,24 @@ final class UpdateChooserDialog extends Dialog {
         onPackageSelected();\r
     }\r
 \r
+\r
+    /**\r
+     * Creates the icon of the window shell.\r
+     */\r
+    private void setWindowImage() {\r
+        String imageName = "android_icon_16.png"; //$NON-NLS-1$\r
+        if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) {\r
+            imageName = "android_icon_128.png"; //$NON-NLS-1$\r
+        }\r
+\r
+        if (mUpdaterData != null) {\r
+            ImageFactory imgFactory = mUpdaterData.getImageFactory();\r
+            if (imgFactory != null) {\r
+                mDialogShell.setImage(imgFactory.getImage(imageName));\r
+            }\r
+        }\r
+    }\r
+\r
     /**\r
      * Adds a listener to adjust the columns width when the parent is resized.\r
      * <p/>\r
@@ -343,16 +369,8 @@ final class UpdateChooserDialog extends Dialog {
      * completes the dialog.\r
      */\r
     private void onInstallSelected() {\r
-\r
-        // get list of checked items\r
-        Object[] checked = mTableViewPackage.getCheckedElements();\r
-\r
-        if (checked != null) {\r
-            for (Object obj : checked) {\r
-                mResult.add((Archive) obj);\r
-            }\r
-        }\r
-\r
+        // get list of accepted items\r
+        mResult.addAll(mAccepted);\r
         mCompleted = true;\r
     }\r
 \r
@@ -384,15 +402,6 @@ final class UpdateChooserDialog extends Dialog {
         return null;\r
     }\r
 \r
-    private void setSelectedAchive(Archive a) {\r
-        if (a == null) {\r
-            mTablePackage.deselectAll();\r
-        } else {\r
-            IStructuredSelection sel = new StructuredSelection(a);\r
-            mTableViewPackage.setSelection(sel, true /*reveal*/);\r
-        }\r
-    }\r
-\r
     private void displayInformation(Archive a) {\r
         if (a == null) {\r
             mPackageText.setText("Please select a package.");\r
@@ -428,15 +437,17 @@ final class UpdateChooserDialog extends Dialog {
         if (mLicenseAcceptAll) {\r
             mLicenseRadioAcceptAll.setSelection(true);\r
             mLicenseRadioAccept.setSelection(false);\r
-            mLicenseRadioRefuse.setSelection(false);\r
+            mLicenseRadioReject.setSelection(false);\r
         } else {\r
-            boolean accept = mTableViewPackage.getChecked(a);\r
-\r
             mLicenseRadioAcceptAll.setSelection(false);\r
-            mLicenseRadioAccept.setSelection(accept);\r
-            mLicenseRadioRefuse.setSelection(!accept);\r
+            mLicenseRadioAccept.setSelection(mAccepted.contains(a));\r
+            mLicenseRadioReject.setSelection(mRejected.contains(a));\r
         }\r
 \r
+        // The install button is enabled if there's at least one\r
+        // package accepted.\r
+        mInstallButton.setEnabled(mAccepted.size() > 0);\r
+\r
         mInternalLicenseRadioUpdate = false;\r
     }\r
 \r
@@ -453,21 +464,36 @@ final class UpdateChooserDialog extends Dialog {
         mInternalLicenseRadioUpdate = true;\r
 \r
         Archive a = getSelectedArchive();\r
+        boolean needUpdate = true;\r
 \r
         if (!mLicenseAcceptAll && mLicenseRadioAcceptAll.getSelection()) {\r
             // Accept all has been switched on. Mark all packages as accepted\r
             mLicenseAcceptAll = true;\r
-            mTableViewPackage.setAllChecked(true);\r
+            mAccepted.addAll(mNewToOldArchiveMap.keySet());\r
+            mRejected.clear();\r
 \r
         } else if (mLicenseRadioAccept.getSelection()) {\r
             // Accept only this one\r
             mLicenseAcceptAll = false;\r
-            mTableViewPackage.setChecked(a, true);\r
+            mAccepted.add(a);\r
+            mRejected.remove(a);\r
 \r
-        } else if (mLicenseRadioRefuse.getSelection()) {\r
-            // Refuse only this one\r
+        } else if (mLicenseRadioReject.getSelection()) {\r
+            // Reject only this one\r
             mLicenseAcceptAll = false;\r
-            mTableViewPackage.setChecked(a, false);\r
+            mAccepted.remove(a);\r
+            mRejected.add(a);\r
+\r
+        } else {\r
+            needUpdate = false;\r
+        }\r
+\r
+        if (needUpdate) {\r
+            if (mLicenseAcceptAll) {\r
+                mTableViewPackage.refresh();\r
+            } else {\r
+               mTableViewPackage.refresh(a);\r
+            }\r
         }\r
 \r
         mInternalLicenseRadioUpdate = false;\r
@@ -479,24 +505,34 @@ final class UpdateChooserDialog extends Dialog {
     private void onPackageDoubleClick() {\r
         Archive a = getSelectedArchive();\r
 \r
-        mTableViewPackage.setChecked(a, !mTableViewPackage.getChecked(a));\r
-    }\r
-\r
-    private void onPackageChecked(CheckStateChangedEvent event) {\r
-        Object e = event.getElement();\r
-        if (e instanceof Archive) {\r
-            Archive a = (Archive) e;\r
-\r
-            // select it\r
-            mLicenseAcceptAll = false;\r
-            setSelectedAchive(a);\r
-            updateLicenceRadios(a);\r
+        if (mAccepted.contains(a)) {\r
+            // toggle from accepted to rejected\r
+            mAccepted.remove(a);\r
+            mRejected.add(a);\r
+        } else {\r
+            // toggle from rejected or unknown to accepted\r
+            mAccepted.add(a);\r
+            mRejected.remove(a);\r
         }\r
+\r
+        // update state\r
+        mLicenseAcceptAll = false;\r
+        mTableViewPackage.refresh(a);\r
+        updateLicenceRadios(a);\r
     }\r
 \r
     private class NewArchivesLabelProvider extends LabelProvider {\r
         @Override\r
         public Image getImage(Object element) {\r
+            ImageFactory imgFactory = mUpdaterData.getImageFactory();\r
+            if (imgFactory != null) {\r
+                if (mAccepted.contains(element)) {\r
+                    return imgFactory.getImage("accept_icon16.png");\r
+                } else if (mRejected.contains(element)) {\r
+                    return imgFactory.getImage("reject_icon16.png");\r
+                }\r
+                return imgFactory.getImage("unknown_icon16.png");\r
+            }\r
             return super.getImage(element);\r
         }\r
 \r
index be769b2..64e23ac 100755 (executable)
@@ -328,7 +328,7 @@ class UpdaterData {
 \r
         final Map<Archive, Archive> updates = findUpdates();\r
 \r
-        UpdateChooserDialog dialog = new UpdateChooserDialog(getWindowShell(), updates);\r
+        UpdateChooserDialog dialog = new UpdateChooserDialog(this, updates);\r
         dialog.open();\r
 \r
         Collection<Archive> result = dialog.getResult();\r
diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png
new file mode 100755 (executable)
index 0000000..a9483fb
Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png differ
diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png
new file mode 100755 (executable)
index 0000000..b87bbc9
Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png differ
diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png
new file mode 100755 (executable)
index 0000000..1b97eb7
Binary files /dev/null and b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png differ