Skip to content

Content of file NotifyChangedToViewerRefresh.java

/**
 * Copyright (c) 2002-2010 IBM Corporation and others.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * IBM - Initial API and implementation
 */
// REUSED CLASS
package org.eclipse.emf.edit.ui.provider;

import java.util.Collection;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Display;

/**
 * This class calls optimized refresh APIs for all the standard Viewer subclasses.
 */
public class NotifyChangedToViewerRefresh {
	public static void handleNotifyChanged(final Viewer viewer,
		final Object object,
		final int eventType,
		final Object feature,
		final Object oldValue,
		final Object newValue,
		final int index) {
		if (viewer.getControl() == null || viewer.getControl().isDisposed()) {
			return;
		}
		final Display d = viewer.getControl().getDisplay();
		if (d != Display.getCurrent()) {
			d.asyncExec(new Runnable() {
				@Override
				public void run() {
					if (viewer.getControl() != null && !viewer.getControl().isDisposed()) {
						new NotifyChangedToViewerRefresh().refresh(viewer, object, eventType, feature, oldValue,
							newValue, index);
					}
				}
			});
		} else {
			new NotifyChangedToViewerRefresh().refresh(viewer, object, eventType, feature, oldValue, newValue, index);
		}
	}

	public void refresh(Viewer viewer,
		Object object,
		int eventType,
		Object feature,
		Object oldValue,
		Object newValue,
		int index) {
		if (viewer instanceof TreeViewer) {
			refreshTreeViewer((TreeViewer) viewer, object, eventType, feature, oldValue, newValue, index);
		} else if (viewer instanceof TableViewer) {
			refreshTableViewer((TableViewer) viewer, object, eventType, feature, oldValue, newValue, index);
		} else if (viewer instanceof ListViewer) {
			refreshListViewer((ListViewer) viewer, object, eventType, feature, oldValue, newValue, index);
		} else {
			refreshViewer(viewer, object, eventType, feature, oldValue, newValue, index);
		}
	}

	public void refreshTreeViewer(TreeViewer viewer,
		Object object,
		int eventType,
		Object feature,
		Object oldValue,
		Object newValue,
		int index) {
		switch (eventType) {
		case Notification.ADD:
		case Notification.ADD_MANY:
		case Notification.REMOVE:
		case Notification.REMOVE_MANY:
		case Notification.MOVE:
		case Notification.UNSET:
		case Notification.SET:
		default: {
			refreshAbstractTreeViewer(viewer, object, eventType, feature, oldValue, newValue, index);
			break;
		}
		}
	}

	public void refreshListViewer(ListViewer viewer,
		Object object,
		int eventType,
		Object feature,
		Object oldValue,
		Object newValue,
		int index) {
		switch (eventType) {
		case Notification.ADD: {
			viewer.add(newValue);
			break;
		}
		case Notification.ADD_MANY: {
			viewer.add(((Collection<?>) newValue).toArray());
			break;
		}
		case Notification.REMOVE: {
			viewer.remove(oldValue);
			break;
		}
		case Notification.REMOVE_MANY: {
			viewer.remove(((Collection<?>) oldValue).toArray());
			break;
		}
		case Notification.MOVE: {
			viewer.refresh(); // ???
		}
		case Notification.UNSET:
case Notification.SET: default: { refreshStructuredViewer(viewer, object, eventType, feature, oldValue, newValue, index); break; } } } public void refreshTableViewer(TableViewer viewer, Object object, int eventType, Object feature, Object oldValue, Object newValue, int index) { switch (eventType) { case Notification.ADD: { viewer.insert(newValue, index); break; } case Notification.ADD_MANY: { if (index == -1) { viewer.add(((Collection<?>) newValue).toArray()); } else { for (final Object value : (Collection<?>) newValue) { viewer.insert(value, index++); } } break; } case Notification.REMOVE: { 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; } } } 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); } 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; } } } public void refreshStructuredViewer(StructuredViewer viewer, Object object, int eventType, Object feature, Object oldValue, Object newValue, int index) { switch (eventType) { case Notification.ADD: case Notification.ADD_MANY: case Notification.REMOVE: case Notification.REMOVE_MANY: case Notification.MOVE: { viewer.refresh(object); break; } case Notification.UNSET: case Notification.SET: { if (feature instanceof EReference) { viewer.refresh(object); } else { viewer.update(object, feature instanceof ENamedElement ? new String[] { ((ENamedElement) feature).getName() } : null); } break; } // case Notification.TOUCH: default: { refreshViewer(viewer, object, eventType, feature, oldValue, newValue, index); break; } } } public void refreshViewer(Viewer viewer, Object object, int eventType, Object feature, Object oldValue, Object newValue, int index) { switch (eventType) { case Notification.RESOLVE: { // We ignore non-changes for now. // break; } case Notification.ADD: case Notification.ADD_MANY: case Notification.REMOVE: case Notification.REMOVE_MANY: case Notification.MOVE: case Notification.UNSET: case Notification.SET: default: { viewer.refresh(); break; } } } }