org.eclipse.emf.ecp.internal.ui.model.ECPContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.ecp.internal.ui.model.ECPContentProvider.java

Source

/********************************************************************************
 * Copyright (c) 2011 Eike Stepper (Berlin, Germany) and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Eike Stepper - initial API and implementation
 ********************************************************************************/
package org.eclipse.emf.ecp.internal.ui.model;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecp.core.util.ECPContainer;
import org.eclipse.emf.ecp.core.util.ECPModelContextProvider;
import org.eclipse.emf.ecp.spi.core.InternalProvider;
import org.eclipse.emf.ecp.spi.core.util.InternalChildrenList;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.IViewerNotification;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider.ViewerRefresh;
import org.eclipse.jface.viewers.TreeViewer;

/**
 * @author Eike Stepper
 * @param <INPUT> The type of input (root of the tree)
 */
public abstract class ECPContentProvider<INPUT> extends TreeContentProvider<INPUT>
        implements ECPModelContextProvider, INotifyChangedListener {
    private ViewerRefresh viewerRefresh;

    /**
     * Default constructor.
     */
    public ECPContentProvider() {
        InternalProvider.EMF_ADAPTER_FACTORY.addListener(this);
    }

    @Override
    public void dispose() {
        InternalProvider.EMF_ADAPTER_FACTORY.removeListener(this);
        super.dispose();
    }

    @Override
    protected void fillChildren(Object parent, InternalChildrenList childrenList) {
        final ECPContainer context = getModelContext(parent);
        if (context != null) {
            final InternalProvider provider = (InternalProvider) context.getProvider();
            provider.fillChildren(context, parent, childrenList);
        }
    }

    /** {@inheritDoc} */
    @Override
    public ECPContainer getModelContext(Object element) {
        while (element != null) {
            if (element instanceof ECPContainer) {
                break;
            }

            element = getParent(element);
        }

        return (ECPContainer) element;
    }

    /** {@inheritDoc} */
    @Override
    public void notifyChanged(Notification notification) {
        final TreeViewer viewer = getViewer();
        if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) {
            if (viewerRefresh == null) {
                viewerRefresh = new ViewerRefresh(viewer);
            }

            if (viewerRefresh.addNotification((IViewerNotification) notification)) {
                viewer.getControl().getDisplay().asyncExec(viewerRefresh);
            }
        }
    }
}