From c874cca93dcd42ab675469b20774595a5b75ace7 Mon Sep 17 00:00:00 2001 From: Thomas Wolf Date: Fri, 2 Sep 2016 23:23:53 +0200 Subject: More efficient label provider for the staging view The staging view's label provider was derived from DecoratingLabelProvider, which is an ITreePathLabelProvider. For these, the TreeViewer's WrappedViewerLabelProvider computes the tree path for each element, which then ultimately isn't used because the StagingViewLabelProvider is _not_ an ITreePathLabelProvider. This tree path computation is, at least on GTK, fairly expensive. By not deriving our label provider from DecoratingLabelProvider but wrapping it, we can ensure that the framework does not compute these tree paths that are then not used anyway, and decorations are significantly faster on GTK. Bug: 500106 Change-Id: If30bfbfeda6df2f89022995e8ba375be8c45ca3e Signed-off-by: Thomas Wolf --- .../egit/ui/internal/staging/StagingView.java | 58 ++++++++++++++++------ 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java index 8a0ee74561..999e6db6ad 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/staging/StagingView.java @@ -118,6 +118,7 @@ import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.AbstractTreeViewer; +import org.eclipse.jface.viewers.BaseLabelProvider; import org.eclipse.jface.viewers.ContentViewer; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.IBaseLabelProvider; @@ -469,33 +470,60 @@ public class StagingView extends ViewPart implements IShowInSource { } } - static class TreeDecoratingLabelProvider extends DecoratingLabelProvider { - - ILabelProvider provider; + /** + * A wrapped {@link DecoratingLabelProvider} to be used in the tree viewers + * of the staging view. We wrap it instead of deriving directly because a + * {@link DecoratingLabelProvider} is a + * {@link org.eclipse.jface.viewers.ITreePathLabelProvider + * ITreePathLabelProvider}, which makes the tree viewer compute a + * {@link org.eclipse.jface.viewers.TreePath TreePath} for each element, + * which is then ultimately unused because the + * {@link StagingViewLabelProvider} is not a + * {@link org.eclipse.jface.viewers.ITreePathLabelProvider + * ITreePathLabelProvider}. Computing the + * {@link org.eclipse.jface.viewers.TreePath TreePath} is a fairly expensive + * operation on GTK, and avoiding to compute it speeds up label updates + * significantly. + */ + private static class TreeDecoratingLabelProvider extends BaseLabelProvider + implements ILabelProvider { - ILabelDecorator decorator; + private final DecoratingLabelProvider provider; public TreeDecoratingLabelProvider(ILabelProvider provider, ILabelDecorator decorator) { - super(provider, decorator); - this.provider = provider; - this.decorator = decorator; + this.provider = new DecoratingLabelProvider(provider, decorator); } - public Image getColumnImage(Object element) { - Image image = provider.getImage(element); - if (image != null && decorator != null) { - Image decorated = decorator.decorateImage(image, element); - if (decorated != null) - return decorated; - } - return image; + @Override + public Image getImage(Object element) { + return provider.getImage(element); } @Override public String getText(Object element) { return provider.getText(element); } + + @Override + public void addListener(ILabelProviderListener listener) { + provider.addListener(listener); + } + + @Override + public void removeListener(ILabelProviderListener listener) { + provider.removeListener(listener); + } + + @Override + public void dispose() { + provider.dispose(); + } + + public ILabelProvider getLabelProvider() { + return provider.getLabelProvider(); + } + } static class StagingViewSearchThread extends Thread { -- cgit v1.2.3