\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
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
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
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
});\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
\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
}\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
// 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
}\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
\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
* 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
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
* 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
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
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
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
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