Example usage for org.eclipse.jface.viewers AbstractTreeViewer remove

List of usage examples for org.eclipse.jface.viewers AbstractTreeViewer remove

Introduction

In this page you can find the example usage for org.eclipse.jface.viewers AbstractTreeViewer remove.

Prototype

public void remove(Object elementsOrTreePaths) 

Source Link

Document

Removes the given element from the viewer.

Usage

From source file:ca.mcgill.cs.swevo.qualyzer.providers.NavigatorContentProvider.java

License:Open Source License

/**
 * Process a resource delta. Add any runnables
 *//*from www.  ja va 2  s. c  o  m*/
private void processDelta(IResourceDelta delta, Collection<Runnable> runnables) {
    // he widget may have been destroyed
    // by the time this is run. Check for this and do nothing if so.
    Control ctrl = fViewer.getControl();
    if (ctrl == null || ctrl.isDisposed()) {
        return;
    }

    if (QualyzerActivator.getDefault().isCreatingProject()) {
        return;
    }

    // Get the affected resource
    final IResource resource = delta.getResource();
    if (resource instanceof IProject) //This fixes the phantom label bug!
    {
        return;
    }

    // If any children have changed type, just do a full refresh of this
    // parent,
    // since a simple update on such children won't work,
    // and trying to map the change to a remove and add is too dicey.
    // The case is: folder A renamed to existing file B, answering yes to
    // overwrite B.
    IResourceDelta[] affectedChildren = delta.getAffectedChildren(IResourceDelta.CHANGED);
    for (int i = 0; i < affectedChildren.length; i++) {
        if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
            runnables.add(getRefreshRunnable(resource));
            return;
        }
    }

    // Check the flags for changes the Navigator cares about.
    // See ResourceLabelProvider for the aspects it cares about.
    // Notice we don't care about F_CONTENT or F_MARKERS currently.
    int changeFlags = delta.getFlags();
    if ((changeFlags & (IResourceDelta.OPEN | IResourceDelta.SYNC | IResourceDelta.TYPE
            | IResourceDelta.DESCRIPTION)) != 0) {
        // Runnable updateRunnable = new Runnable(){
        // public void run() {
        // ((StructuredViewer) viewer).update(resource, null);
        // }
        // };
        // runnables.add(updateRunnable);

        /*
         * support the Closed Projects filter; when a project is closed, it may need to be removed from the view.
         */
        runnables.add(getRefreshRunnable(resource.getParent()));
    }
    // Replacing a resource may affect its label and its children
    if ((changeFlags & IResourceDelta.REPLACED) != 0) {
        runnables.add(getRefreshRunnable(resource));
        return;
    }

    // Handle changed children .
    for (int i = 0; i < affectedChildren.length; i++) {
        processDelta(affectedChildren[i], runnables);
    }

    // @issue several problems here:
    // - should process removals before additions, to avoid multiple equal
    // elements in viewer
    // - Kim: processing removals before additions was the indirect cause of
    // 44081 and its varients
    // - Nick: no delta should have an add and a remove on the same element,
    // so processing adds first is probably OK
    // - using setRedraw will cause extra flashiness
    // - setRedraw is used even for simple changes
    // - to avoid seeing a rename in two stages, should turn redraw on/off
    // around combined removal and addition
    // - Kim: done, and only in the case of a rename (both remove and add
    // changes in one delta).

    IResourceDelta[] addedChildren = delta.getAffectedChildren(IResourceDelta.ADDED);
    IResourceDelta[] removedChildren = delta.getAffectedChildren(IResourceDelta.REMOVED);

    if (addedChildren.length == 0 && removedChildren.length == 0) {
        return;
    }

    final Object[] addedObjects;
    final Object[] removedObjects;

    // Process additions before removals as to not cause selection
    // preservation prior to new objects being added
    // Handle added children. Issue one update for all insertions.
    int numMovedFrom = 0;
    int numMovedTo = 0;
    if (addedChildren.length > 0) {
        addedObjects = new Object[addedChildren.length];
        for (int i = 0; i < addedChildren.length; i++) {
            addedObjects[i] = addedChildren[i].getResource();
            if ((addedChildren[i].getFlags() & IResourceDelta.MOVED_FROM) != 0) {
                ++numMovedFrom;
            }
        }
    } else {
        addedObjects = new Object[0];
    }

    // Handle removed children. Issue one update for all removals.
    if (removedChildren.length > 0) {
        removedObjects = new Object[removedChildren.length];
        for (int i = 0; i < removedChildren.length; i++) {
            removedObjects[i] = removedChildren[i].getResource();
            if ((removedChildren[i].getFlags() & IResourceDelta.MOVED_TO) != 0) {
                ++numMovedTo;
            }
        }
    } else {
        removedObjects = new Object[0];
    }
    // heuristic test for items moving within same folder (i.e. renames)
    final boolean hasRename = numMovedFrom > 0 && numMovedTo > 0;

    Runnable addAndRemove = new Runnable() {
        public void run() {
            if (fViewer instanceof AbstractTreeViewer) {
                AbstractTreeViewer treeViewer = (AbstractTreeViewer) fViewer;
                // Disable redraw until the operation is finished so we don't
                // get a flash of both the new and old item (in the case of
                // rename)
                // Only do this if we're both adding and removing files (the
                // rename case)
                if (hasRename) {
                    treeViewer.getControl().setRedraw(false);
                }
                try {
                    if (addedObjects.length > 0) {
                        treeViewer.add(resource, addedObjects);
                    }
                    if (removedObjects.length > 0) {
                        treeViewer.remove(removedObjects);
                    }
                } finally {
                    if (hasRename) {
                        treeViewer.getControl().setRedraw(true);
                    }
                }
            } else {
                ((StructuredViewer) fViewer).refresh(resource);
            }
        }
    };
    runnables.add(addAndRemove);
}

From source file:com.ebmwebsourcing.petals.common.internal.provisional.projectscnf.PetalsProjectContentProvider.java

License:Open Source License

@Override
public void resourcesRemoved(final Collection<IResource> resources) {

    if (!(this.viewer instanceof AbstractTreeViewer))
        return;/*  www.  j av a2  s.  c  o m*/

    // Compute as much things as possible outside the UI thread
    // Group elements to reduce the number of runnables
    Map<Object, List<IResource>> parentToResources = new HashMap<Object, List<IResource>>();
    for (final IResource res : resources) {
        final Object parent = getParent(res);
        List<IResource> list = parentToResources.get(parent);
        if (list == null)
            list = new ArrayList<IResource>();

        list.add(res);
        parentToResources.put(parent, list);
    }

    // Update the viewer
    final AbstractTreeViewer treeViewer = (AbstractTreeViewer) this.viewer;
    for (final Map.Entry<Object, List<IResource>> entry : parentToResources.entrySet()) {

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                treeViewer.getControl().setRedraw(false);
                if (entry.getKey() == null)
                    treeViewer.remove(entry.getValue().toArray());
                else
                    treeViewer.remove(entry.getKey(), entry.getValue().toArray());
                treeViewer.getControl().setRedraw(true);
            }
        };

        this.runnables.add(runnable);
    }
}

From source file:com.google.dart.tools.ui.internal.search.LevelTreeContentProvider.java

License:Open Source License

@Override
public synchronized void elementsChanged(Object[] updatedElements) {
    if (getSearchResult() == null) {
        return;//w  w w .  j a  v  a2 s  .  c o m
    }

    AbstractTreeViewer viewer = (AbstractTreeViewer) getPage().getViewer();

    Set<Object> toRemove = new HashSet<Object>();
    Set<Object> toUpdate = new HashSet<Object>();
    Map<Object, Set<Object>> toAdd = new HashMap<Object, Set<Object>>();
    for (int i = 0; i < updatedElements.length; i++) {
        if (getPage().getDisplayedMatchCount(updatedElements[i]) > 0) {
            insert(toAdd, toUpdate, updatedElements[i]);
        } else {
            remove(toRemove, toUpdate, updatedElements[i]);
        }
    }

    viewer.remove(toRemove.toArray());
    for (Iterator<Object> iter = toAdd.keySet().iterator(); iter.hasNext();) {
        Object parent = iter.next();
        Set<Object> children = toAdd.get(parent);
        viewer.add(parent, children.toArray());
    }
    for (Iterator<Object> elementsToUpdate = toUpdate.iterator(); elementsToUpdate.hasNext();) {
        viewer.refresh(elementsToUpdate.next());
    }

}

From source file:eu.artist.postmigration.nfrvt.eval.run.ui.launch.WorkbenchContentProvider.java

License:Open Source License

/**
 * Process a resource delta. Add any runnables
 *//*w ww  .  j a  v  a 2s. com*/
private void processDelta(IResourceDelta delta, Collection<Runnable> runnables) {
    //he widget may have been destroyed
    // by the time this is run. Check for this and do nothing if so.
    Control ctrl = viewer.getControl();
    if (ctrl == null || ctrl.isDisposed()) {
        return;
    }

    // Get the affected resource
    final IResource resource = delta.getResource();

    // If any children have changed type, just do a full refresh of this
    // parent,
    // since a simple update on such children won't work,
    // and trying to map the change to a remove and add is too dicey.
    // The case is: folder A renamed to existing file B, answering yes to
    // overwrite B.
    IResourceDelta[] affectedChildren = delta.getAffectedChildren(IResourceDelta.CHANGED);
    for (int i = 0; i < affectedChildren.length; i++) {
        if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
            runnables.add(getRefreshRunnable(resource));
            return;
        }
    }

    // Opening a project just affects icon, but we need to refresh when
    // a project is closed because if child items have not yet been created
    // in the tree we still need to update the item's children
    int changeFlags = delta.getFlags();
    if ((changeFlags & IResourceDelta.OPEN) != 0) {
        if (resource.isAccessible()) {
            runnables.add(getUpdateRunnable(resource));
        } else {
            runnables.add(getRefreshRunnable(resource));
            return;
        }
    }
    // Check the flags for changes the Navigator cares about.
    // See ResourceLabelProvider for the aspects it cares about.
    // Notice we don't care about F_CONTENT or F_MARKERS currently.
    if ((changeFlags & (IResourceDelta.SYNC | IResourceDelta.TYPE | IResourceDelta.DESCRIPTION)) != 0) {
        runnables.add(getUpdateRunnable(resource));
    }
    // Replacing a resource may affect its label and its children
    if ((changeFlags & IResourceDelta.REPLACED) != 0) {
        runnables.add(getRefreshRunnable(resource));
        return;
    }

    // Handle changed children .
    for (int i = 0; i < affectedChildren.length; i++) {
        processDelta(affectedChildren[i], runnables);
    }

    // @issue several problems here:
    //  - should process removals before additions, to avoid multiple equal
    // elements in viewer
    //   - Kim: processing removals before additions was the indirect cause of
    // 44081 and its varients
    //   - Nick: no delta should have an add and a remove on the same element,
    // so processing adds first is probably OK
    //  - using setRedraw will cause extra flashiness
    //  - setRedraw is used even for simple changes
    //  - to avoid seeing a rename in two stages, should turn redraw on/off
    // around combined removal and addition
    //   - Kim: done, and only in the case of a rename (both remove and add
    // changes in one delta).

    IResourceDelta[] addedChildren = delta.getAffectedChildren(IResourceDelta.ADDED);
    IResourceDelta[] removedChildren = delta.getAffectedChildren(IResourceDelta.REMOVED);

    if (addedChildren.length == 0 && removedChildren.length == 0) {
        return;
    }

    final Object[] addedObjects;
    final Object[] removedObjects;

    // Process additions before removals as to not cause selection
    // preservation prior to new objects being added
    // Handle added children. Issue one update for all insertions.
    int numMovedFrom = 0;
    int numMovedTo = 0;
    if (addedChildren.length > 0) {
        addedObjects = new Object[addedChildren.length];
        for (int i = 0; i < addedChildren.length; i++) {
            addedObjects[i] = addedChildren[i].getResource();
            if ((addedChildren[i].getFlags() & IResourceDelta.MOVED_FROM) != 0) {
                ++numMovedFrom;
            }
        }
    } else {
        addedObjects = new Object[0];
    }

    // Handle removed children. Issue one update for all removals.
    if (removedChildren.length > 0) {
        removedObjects = new Object[removedChildren.length];
        for (int i = 0; i < removedChildren.length; i++) {
            removedObjects[i] = removedChildren[i].getResource();
            if ((removedChildren[i].getFlags() & IResourceDelta.MOVED_TO) != 0) {
                ++numMovedTo;
            }
        }
    } else {
        removedObjects = new Object[0];
    }
    // heuristic test for items moving within same folder (i.e. renames)
    final boolean hasRename = numMovedFrom > 0 && numMovedTo > 0;

    Runnable addAndRemove = new Runnable() {
        public void run() {
            if (viewer instanceof AbstractTreeViewer) {
                AbstractTreeViewer treeViewer = (AbstractTreeViewer) viewer;
                // Disable redraw until the operation is finished so we don't
                // get a flash of both the new and old item (in the case of
                // rename)
                // Only do this if we're both adding and removing files (the
                // rename case)
                if (hasRename) {
                    treeViewer.getControl().setRedraw(false);
                }
                try {
                    if (addedObjects.length > 0) {
                        treeViewer.add(resource, addedObjects);
                    }
                    if (removedObjects.length > 0) {
                        treeViewer.remove(removedObjects);
                    }
                } finally {
                    if (hasRename) {
                        treeViewer.getControl().setRedraw(true);
                    }
                }
            } else {
                ((StructuredViewer) viewer).refresh(resource);
            }
        }
    };
    runnables.add(addAndRemove);
}

From source file:ext.org.eclipse.jdt.internal.ui.search.LevelTreeContentProvider.java

License:Open Source License

@Override
public synchronized void elementsChanged(Object[] updatedElements) {
    if (getSearchResult() == null)
        return;//from  www  .j a va 2s.  c o m

    AbstractTreeViewer viewer = (AbstractTreeViewer) getPage().getViewer();

    Set<Object> toRemove = new HashSet<Object>();
    Set<Object> toUpdate = new HashSet<Object>();
    Map<Object, Set<Object>> toAdd = new HashMap<Object, Set<Object>>();
    for (int i = 0; i < updatedElements.length; i++) {
        if (getPage().getDisplayedMatchCount(updatedElements[i]) > 0)
            insert(toAdd, toUpdate, updatedElements[i]);
        else
            remove(toRemove, toUpdate, updatedElements[i]);
    }

    viewer.remove(toRemove.toArray());
    for (Iterator<Object> iter = toAdd.keySet().iterator(); iter.hasNext();) {
        Object parent = iter.next();
        HashSet<Object> children = (HashSet<Object>) toAdd.get(parent);
        viewer.add(parent, children.toArray());
    }
    for (Iterator<Object> elementsToUpdate = toUpdate.iterator(); elementsToUpdate.hasNext();) {
        viewer.refresh(elementsToUpdate.next());
    }

}

From source file:kr.co.apexsoft.stella.modeler.explorer.provider.ApexUMLContentProvider.java

License:Open Source License

/**
 * Process a resource delta. Add any runnables
 *//* www .  j a  v  a  2  s  .co m*/
private void processDelta(IResourceDelta delta, Collection runnables) {
    //he widget may have been destroyed
    // by the time this is run. Check for this and do nothing if so.
    Control ctrl = viewer.getControl();
    if (ctrl == null || ctrl.isDisposed()) {
        return;
    }

    // Get the affected resource
    final IResource resource = delta.getResource();

    // If any children have changed type, just do a full refresh of this
    // parent,
    // since a simple update on such children won't work,
    // and trying to map the change to a remove and add is too dicey.
    // The case is: folder A renamed to existing file B, answering yes to
    // overwrite B.
    IResourceDelta[] affectedChildren = delta.getAffectedChildren(IResourceDelta.CHANGED);
    for (int i = 0; i < affectedChildren.length; i++) {
        if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
            runnables.add(getRefreshRunnable(resource));
            return;
        }
    }

    // Opening a project just affects icon, but we need to refresh when
    // a project is closed because if child items have not yet been created
    // in the tree we still need to update the item's children
    int changeFlags = delta.getFlags();
    if ((changeFlags & IResourceDelta.OPEN) != 0) {
        if (resource.isAccessible()) {
            runnables.add(getUpdateRunnable(resource));
        } else {
            runnables.add(getRefreshRunnable(resource));
            return;
        }
    }
    // Check the flags for changes the Navigator cares about.
    // See ResourceLabelProvider for the aspects it cares about.
    // Notice we don't care about F_CONTENT or F_MARKERS currently.
    if ((changeFlags & (IResourceDelta.SYNC | IResourceDelta.TYPE | IResourceDelta.DESCRIPTION)) != 0) {
        runnables.add(getUpdateRunnable(resource));
    }
    // Replacing a resource may affect its label and its children
    if ((changeFlags & IResourceDelta.REPLACED) != 0) {
        runnables.add(getRefreshRunnable(resource));
        return;
    }

    // Handle changed children .
    for (int i = 0; i < affectedChildren.length; i++) {
        processDelta(affectedChildren[i], runnables);
    }

    // @issue several problems here:
    //  - should process removals before additions, to avoid multiple equal
    // elements in viewer
    //   - Kim: processing removals before additions was the indirect cause of
    // 44081 and its varients
    //   - Nick: no delta should have an add and a remove on the same element,
    // so processing adds first is probably OK
    //  - using setRedraw will cause extra flashiness
    //  - setRedraw is used even for simple changes
    //  - to avoid seeing a rename in two stages, should turn redraw on/off
    // around combined removal and addition
    //   - Kim: done, and only in the case of a rename (both remove and add
    // changes in one delta).

    IResourceDelta[] addedChildren = delta.getAffectedChildren(IResourceDelta.ADDED);
    IResourceDelta[] removedChildren = delta.getAffectedChildren(IResourceDelta.REMOVED);

    if (addedChildren.length == 0 && removedChildren.length == 0) {
        return;
    }

    List<Object> addedList = new ArrayList<>();
    List<Object> removedList = new ArrayList<>();

    // Process additions before removals as to not cause selection
    // preservation prior to new objects being added
    // Handle added children. Issue one update for all insertions.
    int numMovedFrom = 0;
    int numMovedTo = 0;
    for (int i = 0; i < addedChildren.length; i++) {
        IResource subRes = addedChildren[i].getResource();
        if (subRes instanceof IFile && !OneFileUtils.isDi(subRes)) {
            continue;
        }
        addedList.add(subRes);
        if ((addedChildren[i].getFlags() & IResourceDelta.MOVED_FROM) != 0) {
            ++numMovedFrom;
        }
    }

    // Handle removed children. Issue one update for all removals.
    for (int i = 0; i < removedChildren.length; i++) {
        IResource subRes = removedChildren[i].getResource();
        if (subRes instanceof IFile && !OneFileUtils.isDi(subRes)) {
            continue;
        }
        removedList.add(subRes);
        if ((removedChildren[i].getFlags() & IResourceDelta.MOVED_TO) != 0) {
            ++numMovedTo;
        }
    }

    final Object[] addedObjects = addedList.toArray();
    final Object[] removedObjects = removedList.toArray();

    // heuristic test for items moving within same folder (i.e. renames)
    final boolean hasRename = numMovedFrom > 0 && numMovedTo > 0;

    Runnable addAndRemove = new Runnable() {
        public void run() {
            if (viewer instanceof AbstractTreeViewer) {
                AbstractTreeViewer treeViewer = (AbstractTreeViewer) viewer;
                // Disable redraw until the operation is finished so we don't
                // get a flash of both the new and old item (in the case of
                // rename)
                // Only do this if we're both adding and removing files (the
                // rename case)
                if (hasRename) {
                    treeViewer.getControl().setRedraw(false);
                }
                try {
                    if (addedObjects.length > 0) {
                        treeViewer.add(resource, addedObjects);
                    }
                    if (removedObjects.length > 0) {
                        treeViewer.remove(removedObjects);
                    }
                } finally {
                    if (hasRename) {
                        treeViewer.getControl().setRedraw(true);
                    }
                }
            } else {
                ((StructuredViewer) viewer).refresh(resource);
            }
        }
    };
    runnables.add(addAndRemove);
}

From source file:name.neilbartlett.eclipse.bundlemonitor.views.config.ConfigView.java

License:Open Source License

public void configurationEvent(final ConfigurationEvent event) {
    SWTConcurrencyUtils.safeAsyncUpdate(viewer, new ViewerUpdater() {
        public void updateViewer(Viewer viewer) {
            AbstractTreeViewer treeViewer = (AbstractTreeViewer) viewer;
            boolean found = false;
            if (event.getType() == ConfigurationEvent.CM_DELETED) {
                for (Iterator iter = configs.iterator(); iter.hasNext();) {
                    ConfigWrapper wrapper = (ConfigWrapper) iter.next();
                    if (event.getPid().equals(wrapper.getPid())) {
                        found = true;/*  ww w.  j ava2  s  .  co m*/
                        iter.remove();
                        treeViewer.remove(wrapper);
                    }
                }
            } else {
                for (Iterator iter = configs.iterator(); iter.hasNext();) {
                    ConfigWrapper wrapper = (ConfigWrapper) iter.next();
                    if (event.getPid().equals(wrapper.getPid())) {
                        found = true;
                        treeViewer.refresh(wrapper, true);
                    }
                }
            }
            if (!found) {
                ConfigurationAdmin cm = (ConfigurationAdmin) tracker.getService();
                if (cm != null) {
                    try {
                        Configuration config = cm.getConfiguration(event.getPid());
                        ConfigWrapper wrapper = new ConfigWrapper(config);
                        configs.add(wrapper);
                        treeViewer.add(configs, wrapper);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    updater.updateViewer(treeViewer);
                }
            }
        }
    });
}

From source file:org.eclipse.birt.report.designer.internal.ui.views.WorkbenchContentProvider.java

License:Open Source License

/**
 * Process a resource delta. Add any runnables
 *///from w  w  w .  ja va  2s .  c  o  m
private void processDelta(IResourceDelta delta, Collection runnables) {
    // he widget may have been destroyed
    // by the time this is run. Check for this and do nothing if so.
    Control ctrl = viewer.getControl();
    if (ctrl == null || ctrl.isDisposed())
        return;

    // Get the affected resource
    final IResource resource = delta.getResource();

    // If any children have changed type, just do a full refresh of this
    // parent,
    // since a simple update on such children won't work,
    // and trying to map the change to a remove and add is too dicey.
    // The case is: folder A renamed to existing file B, answering yes
    // to
    // overwrite B.
    IResourceDelta[] affectedChildren = delta.getAffectedChildren(IResourceDelta.CHANGED);
    for (int i = 0; i < affectedChildren.length; i++) {
        if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
            runnables.add(getRefreshRunnable(resource));
            return;
        }
    }

    // Check the flags for changes the Navigator cares about.
    // See ResourceLabelProvider for the aspects it cares about.
    // Notice we don't care about F_CONTENT or F_MARKERS currently.
    int changeFlags = delta.getFlags();
    if ((changeFlags & (IResourceDelta.OPEN | IResourceDelta.SYNC | IResourceDelta.TYPE
            | IResourceDelta.DESCRIPTION)) != 0) {
        Runnable updateRunnable = new Runnable() {

            public void run() {
                ((StructuredViewer) viewer).update(resource, null);
            }
        };
        runnables.add(updateRunnable);
    }
    // Replacing a resource may affect its label and its children
    if ((changeFlags & IResourceDelta.REPLACED) != 0) {
        runnables.add(getRefreshRunnable(resource));
        return;
    }

    // Handle changed children .
    for (int i = 0; i < affectedChildren.length; i++) {
        processDelta(affectedChildren[i], runnables);
    }

    // @issue several problems here:
    // - should process removals before additions, to avoid multiple
    // equal
    // elements in viewer
    // - Kim: processing removals before additions was the indirect
    // cause of
    // 44081 and its varients
    // - Nick: no delta should have an add and a remove on the same
    // element,
    // so processing adds first is probably OK
    // - using setRedraw will cause extra flashiness
    // - setRedraw is used even for simple changes
    // - to avoid seeing a rename in two stages, should turn redraw
    // on/off
    // around combined removal and addition
    // - Kim: done, and only in the case of a rename (both remove and
    // add
    // changes in one delta).

    IResourceDelta[] addedChildren = delta.getAffectedChildren(IResourceDelta.ADDED);
    IResourceDelta[] removedChildren = delta.getAffectedChildren(IResourceDelta.REMOVED);

    if (addedChildren.length == 0 && removedChildren.length == 0)
        return;

    final Object[] addedObjects;
    final Object[] removedObjects;

    // Process additions before removals as to not cause selection
    // preservation prior to new objects being added
    // Handle added children. Issue one update for all insertions.
    int numMovedFrom = 0;
    int numMovedTo = 0;
    if (addedChildren.length > 0) {
        addedObjects = new Object[addedChildren.length];
        for (int i = 0; i < addedChildren.length; i++) {
            addedObjects[i] = addedChildren[i].getResource();
            if ((addedChildren[i].getFlags() & IResourceDelta.MOVED_FROM) != 0) {
                ++numMovedFrom;
            }
        }
    } else
        addedObjects = new Object[0];

    // Handle removed children. Issue one update for all removals.
    if (removedChildren.length > 0) {
        removedObjects = new Object[removedChildren.length];
        for (int i = 0; i < removedChildren.length; i++) {
            removedObjects[i] = removedChildren[i].getResource();
            if ((removedChildren[i].getFlags() & IResourceDelta.MOVED_TO) != 0) {
                ++numMovedTo;
            }
        }
    } else {
        removedObjects = new Object[0];
    }
    // heuristic test for items moving within same folder (i.e. renames)
    final boolean hasRename = numMovedFrom > 0 && numMovedTo > 0;

    Runnable addAndRemove = new Runnable() {

        public void run() {
            if (viewer instanceof AbstractTreeViewer) {
                AbstractTreeViewer treeViewer = (AbstractTreeViewer) viewer;
                // Disable redraw until the operation is finished so we
                // don't
                // get a flash of both the new and old item (in the case
                // of
                // rename)
                // Only do this if we're both adding and removing files
                // (the
                // rename case)
                if (hasRename) {
                    treeViewer.getControl().setRedraw(false);
                }
                try {
                    if (addedObjects.length > 0)
                        treeViewer.add(resource, addedObjects);
                    if (removedObjects.length > 0)
                        treeViewer.remove(removedObjects);
                } finally {
                    if (hasRename) {
                        treeViewer.getControl().setRedraw(true);
                    }
                }
            } else {
                ((StructuredViewer) viewer).refresh(resource);
            }
        }
    };
    runnables.add(addAndRemove);
}

From source file:org.eclipse.dltk.internal.ui.search.LevelTreeContentProvider.java

License:Open Source License

public synchronized void elementsChanged(Object[] updatedElements) {
    AbstractTreeViewer viewer = (AbstractTreeViewer) getPage().getViewer();
    if (fResult == null)
        return;// w w  w  . ja  va2  s.  c om
    Set toRemove = new HashSet();
    Set toUpdate = new HashSet();
    Map toAdd = new HashMap();
    for (int i = 0; i < updatedElements.length; i++) {
        if (getPage().getDisplayedMatchCount(updatedElements[i]) > 0)
            insert(toAdd, toUpdate, updatedElements[i]);
        else
            remove(toRemove, toUpdate, updatedElements[i]);
    }

    viewer.remove(toRemove.toArray());
    for (Iterator iter = toAdd.keySet().iterator(); iter.hasNext();) {
        Object parent = iter.next();
        HashSet children = (HashSet) toAdd.get(parent);
        viewer.add(parent, children.toArray());
    }
    for (Iterator elementsToUpdate = toUpdate.iterator(); elementsToUpdate.hasNext();) {
        viewer.refresh(elementsToUpdate.next());
    }

}

From source file:org.eclipse.e4mf.edit.ui.provider.NotifyChangedToViewerRefresh.java

License:Open Source License

public void refreshAbstractTreeViewer(AbstractTreeViewer viewer, Object object, int eventType, Object feature,
        Object oldValue, Object newValue, int index) {
    switch (eventType) {
    case Notification.ADD: {
        if (newValue == null) {
            viewer.refresh(object);/*from   www .java  2 s .  com*/
        } else {
            viewer.add(object, newValue);
        }
        break;
    }
    case Notification.ADD_MANY: {
        viewer.add(object, ((Collection<?>) newValue).toArray());
        break;
    }
    case Notification.REMOVE: {
        if (oldValue == null) {
            viewer.refresh(object);
        } else {
            viewer.remove(oldValue);
        }
        break;
    }
    case Notification.REMOVE_MANY: {
        viewer.remove(((Collection<?>) oldValue).toArray());
        break;
    }
    case Notification.MOVE:
    case Notification.UNSET:
    case Notification.SET:
    default: {
        refreshStructuredViewer(viewer, object, eventType, feature, oldValue, newValue, index);
        break;
    }
    }
}