From 4931897bff3de077a5641d316b29b0281b5c221e Mon Sep 17 00:00:00 2001 From: Raphael Moll Date: Mon, 25 Jul 2011 15:59:37 -0700 Subject: [PATCH] A few minor UI tweaks to SDK Manager 2. - Make the tree filter checkboxes (new, installed, obsolete) work again but this time by using a proper TreeViewer filter. - Fix missing name column icons in the TreeViewer. - Fix display of obsolete items, trimming the duplicated platform name when possible. Change-Id: I24f743788b01fe8c9c5f9a7f9b301f725e32f666 --- .../sdkuilib/internal/repository/PackagesPage.java | 63 ++++++++++++++++++---- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java index fd5f3c90a..9b0788dfb 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/PackagesPage.java @@ -49,6 +49,7 @@ import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeColumnViewerLabelProvider; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; @@ -189,6 +190,12 @@ public class PackagesPage extends UpdaterPage GridLayoutBuilder.create(mGroupPackages).columns(1); mTreeViewer = new CheckboxTreeViewer(mGroupPackages, SWT.BORDER); + mTreeViewer.addFilter(new ViewerFilter() { + @Override + public boolean select(Viewer viewer, Object parentElement, Object element) { + return filterViewerItem(element); + } + }); mTreeViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { @@ -522,6 +529,12 @@ public class PackagesPage extends UpdaterPage // disposed yet. Otherwise hilarity ensues. final boolean useSortByApi = isSortByApi(); + + if (!mTreeColumnName.isDisposed()) { + mTreeColumnName.setImage( + getImage(useSortByApi ? ICON_SORT_BY_API : ICON_SORT_BY_SOURCE)); + } + final UpdateOp op = mDiffLogic.updateStart(useSortByApi); mDiffLogic.mPackageLoader.loadPackages(new ISourceLoadedCallback() { boolean needsRefresh = mDiffLogic.isSortByApi() == useSortByApi; @@ -583,22 +596,42 @@ public class PackagesPage extends UpdaterPage /** * Decide whether to keep an item in the current tree based on user-chosen filter options. */ - private boolean keepItem(PkgItem item) { - if (!mCheckFilterObsolete.getSelection()) { - if (item.isObsolete()) { + private boolean filterViewerItem(Object treeElement) { + if (treeElement instanceof PkgCategory) { + PkgCategory cat = (PkgCategory) treeElement; + + if (!cat.getItems().isEmpty()) { + // A category is hidden if all of its content is hidden. + // However empty categories are always visible. + for (PkgItem item : cat.getItems()) { + if (filterViewerItem(item)) { + // We found at least one element that is visible. + return true; + } + } return false; } } - if (!mCheckFilterInstalled.getSelection()) { - if (item.getState() == PkgState.INSTALLED) { - return false; + if (treeElement instanceof PkgItem) { + PkgItem item = (PkgItem) treeElement; + + if (!mCheckFilterObsolete.getSelection()) { + if (item.isObsolete()) { + return false; + } } - } - if (!mCheckFilterNew.getSelection()) { - if (item.getState() == PkgState.NEW || item.hasUpdatePkg()) { - return false; + if (!mCheckFilterInstalled.getSelection()) { + if (item.getState() == PkgState.INSTALLED) { + return false; + } + } + + if (!mCheckFilterNew.getSelection()) { + if (item.getState() == PkgState.NEW || item.hasUpdatePkg()) { + return false; + } } } @@ -1009,7 +1042,6 @@ public class PackagesPage extends UpdaterPage // When sorting by API, the package name might contains the API number // or the platform name at the end. If we find it, cut it out since it's // redundant. - // TODO deal with obsolete packages PkgApiCategory cat = (PkgApiCategory) findCategoryForItem(item); String apiLabel = cat.getApiLabel(); @@ -1020,9 +1052,18 @@ public class PackagesPage extends UpdaterPage } else if (apiLabel != null && name.endsWith(apiLabel)) { return name.substring(0, name.length() - apiLabel.length()); + + } else if (platLabel != null && item.isObsolete() && name.indexOf(platLabel) > 0) { + // For obsolete items, the format is " (Obsolete)" + // so in this case only accept removing a platform name that is not at + // the end. + name = name.replace(platLabel, ""); //$NON-NLS-1$ } } + // Collapse potential duplicated spacing + name = name.replaceAll(" +", " "); //$NON-NLS-1$ //$NON-NLS-2$ + return name; } -- 2.11.0