org.eclipse.jpt.jaxb.ui.internal.navigator.JaxbNavigatorContentProvider.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jpt.jaxb.ui.internal.navigator.JaxbNavigatorContentProvider.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2013 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jaxb.ui.internal.navigator;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jpt.common.core.internal.utility.PlatformTools;
import org.eclipse.jpt.common.ui.internal.WorkbenchTools;
import org.eclipse.jpt.common.ui.internal.jface.NavigatorContentProvider;
import org.eclipse.jpt.common.ui.jface.ItemExtendedLabelProvider;
import org.eclipse.jpt.common.ui.jface.ItemTreeContentProvider;
import org.eclipse.jpt.common.utility.model.event.CollectionAddEvent;
import org.eclipse.jpt.common.utility.model.event.CollectionChangeEvent;
import org.eclipse.jpt.common.utility.model.event.CollectionClearEvent;
import org.eclipse.jpt.common.utility.model.event.CollectionRemoveEvent;
import org.eclipse.jpt.common.utility.model.listener.CollectionChangeListener;
import org.eclipse.jpt.jaxb.core.JaxbProject;
import org.eclipse.jpt.jaxb.core.JaxbProjectManager;
import org.eclipse.jpt.jaxb.core.JaxbWorkspace;
import org.eclipse.jpt.jaxb.ui.JaxbWorkbench;
import org.eclipse.jpt.jaxb.ui.platform.JaxbPlatformUi;
import org.eclipse.ui.IWorkbench;

/**
 * This extension of navigator content provider delegates to the platform UI
 * (see the org.eclipse.jpt.jaxb.ui.jaxbPlatformUis extension point) for navigator content.
 * 
 * If there is a platform UI for the given project, this content provider will
 * provide a root "JAXB Content" node (child of the project), otherwise there
 * will be no content.  For children of the "JAXB Content" node (or for any other
 * sub-node), this provider will delegate to the content provider returned by the 
 * platform UI implementation.
 */
public class JaxbNavigatorContentProvider extends NavigatorContentProvider {
    private final JaxbProjectManager jaxbProjectManager;
    private final CollectionChangeListener jaxbProjectListener;

    private StructuredViewer viewer;

    public JaxbNavigatorContentProvider() {
        super();
        this.jaxbProjectListener = this.buildJaxbProjectListener();
        this.jaxbProjectManager = this.getJaxbProjectManager();
        if (this.jaxbProjectManager != null) {
            this.jaxbProjectManager.addCollectionChangeListener(JaxbProjectManager.JAXB_PROJECTS_COLLECTION,
                    this.jaxbProjectListener);
        }
    }

    protected CollectionChangeListener buildJaxbProjectListener() {
        return new JaxbProjectListener();
    }

    @Override
    protected ItemTreeContentProvider.Factory buildItemContentProviderFactory() {
        return new JaxbNavigatorTreeItemContentProviderFactory();
    }

    @Override
    protected ItemExtendedLabelProvider.Factory buildItemLabelProviderFactory() {
        return new JaxbNavigatorItemLabelProviderFactory();
    }

    @Override
    protected ResourceManager buildResourceManager() {
        return new LocalResourceManager(this.getParentResourceManager());
    }

    protected ResourceManager getParentResourceManager() {
        return JFaceResources.getResources();
    }

    @Override
    public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        super.inputChanged(v, oldInput, newInput);
        this.viewer = (StructuredViewer) v;
    }

    @Override
    protected boolean hasChildren_(Object element) {
        if (element instanceof IAdaptable) {
            IProject project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);

            if (project != null) {
                JaxbProject jaxbProject = this.getJaxbProject(project);
                if (jaxbProject != null) {
                    JaxbPlatformUi platformUi = (JaxbPlatformUi) jaxbProject.getPlatform()
                            .getAdapter(JaxbPlatformUi.class);
                    return platformUi != null;
                }
            }
        }
        return false;
    }

    protected JaxbProject getJaxbProject(IProject project) {
        return (this.jaxbProjectManager == null) ? null : this.jaxbProjectManager.getJaxbProject(project);
    }

    @Override
    protected Object[] getChildren_(Object parentElement) {
        if (parentElement instanceof IAdaptable) {
            IProject project = (IProject) ((IAdaptable) parentElement).getAdapter(IProject.class);

            if (project != null) {
                JaxbProject jaxbProject = this.getJaxbProject(project);
                if (jaxbProject != null) {
                    JaxbPlatformUi platformUi = (JaxbPlatformUi) jaxbProject.getPlatform()
                            .getAdapter(JaxbPlatformUi.class);
                    if (platformUi != null) {
                        return new Object[] { jaxbProject.getContextRoot() };
                    }
                }
            }
        }
        return null;
    }

    @Override
    public void dispose() {
        super.dispose();
        if (this.jaxbProjectManager != null) {
            this.jaxbProjectManager.removeCollectionChangeListener(JaxbProjectManager.JAXB_PROJECTS_COLLECTION,
                    this.jaxbProjectListener);
        }
    }

    private JaxbProjectManager getJaxbProjectManager() {
        JaxbWorkspace jaxbWorkspace = this.getJaxbWorkspace();
        return (jaxbWorkspace == null) ? null : jaxbWorkspace.getJaxbProjectManager();
    }

    private JaxbWorkspace getJaxbWorkspace() {
        JaxbWorkbench jaxbWorkbench = this.getJaxbWorkbench();
        return (jaxbWorkbench == null) ? null : jaxbWorkbench.getJaxbWorkspace();
    }

    private JaxbWorkbench getJaxbWorkbench() {
        return PlatformTools.getAdapter(WorkbenchTools.getWorkbench(), JaxbWorkbench.class);
    }

    // **************** member classes *****************************************

    /* CU private */ class JaxbProjectListener implements CollectionChangeListener {
        public void collectionChanged(CollectionChangeEvent event) {
            this.refreshViewer(null);
        }

        public void collectionCleared(CollectionClearEvent event) {
            this.refreshViewer(null);
        }

        public void itemsAdded(CollectionAddEvent event) {
            for (Object item : event.getItems()) {
                this.refreshViewer(((JaxbProject) item).getProject());
            }
        }

        public void itemsRemoved(CollectionRemoveEvent event) {
            for (Object item : event.getItems()) {
                this.refreshViewer(((JaxbProject) item).getProject());
            }
        }

        private void refreshViewer(final IProject project) {
            if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) {
                // Using job here so that project model update (which also uses
                //  a job) will complete first
                Job refreshJob = new Job("Refresh viewer") {
                    @Override
                    protected IStatus run(IProgressMonitor monitor) {
                        // Using runnable here so that refresh will go on correct thread
                        viewer.getControl().getDisplay().asyncExec(new Runnable() {
                            public void run() {
                                if (project != null) {
                                    viewer.refresh(project);
                                } else {
                                    viewer.refresh();
                                }
                            }
                        });
                        return Status.OK_STATUS;
                    }
                };
                refreshJob.setRule(project);
                refreshJob.schedule();
            }
        }
    }
}