Skip to main content
summaryrefslogblamecommitdiffstats
blob: e23922e219f6a132b11d405e4f98c676bc1dd10d (plain) (tree)
1
2
                                                                                
                                     

















                                                                                 




                                                                              
                                             
                                                    






                                                                  


                                                                            
                                                                                           

                                                                              

                                                                                 







                                                                                  
                                                                   





                                               

                                                                                                                                                         

         





                                                                       





                                                                                    


                                                                                                                                                            



                                                                                   

                                                                               














                                                                                    

                                                                











                                                                                                        
                                                                                                                  







                                                                                                                           

                                                                  











                                                                                                              
                                                                                                                  



                                                                                                                           
                                                                                                   




                                         

                                                                        



















                                                                                    
                                            
                                                                                                                                         

                                                                                           

                              
                                                                                           






                                                                                    

                                                   
         








                                                                                      
                         



                                                                                      














                                                                                                                





                                                                                                




                                                                        


                                                                    




                                                      
/*******************************************************************************
 *  Copyright (c) 2007, 2011 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.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
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.JptJaxbCorePlugin;
import org.eclipse.jpt.jaxb.core.platform.JaxbPlatformDescription;
import org.eclipse.jpt.jaxb.ui.JptJaxbUiPlugin;
import org.eclipse.jpt.jaxb.ui.platform.JaxbPlatformUi;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;

/**
 * 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
		implements ICommonContentProvider {
	
	private JaxbNavigatorContentAndLabelProvider delegate;
	
	private final CollectionChangeListener jaxbProjectListener;
	
	private StructuredViewer viewer;
	
	
	public JaxbNavigatorContentProvider() {
		super();
		this.jaxbProjectListener = this.buildJaxbProjectListener();
		JptJaxbCorePlugin.getProjectManager().addCollectionChangeListener(JaxbProjectManager.JAXB_PROJECTS_COLLECTION, this.jaxbProjectListener);
	}
	
	protected CollectionChangeListener buildJaxbProjectListener() {
		return new JaxbProjectListener();
	}

	public JaxbNavigatorContentAndLabelProvider getDelegate() {
		return this.delegate;
	}
	
	
	// **************** IContentProvider implementation ************************
	
	public void dispose() {
		JptJaxbCorePlugin.getProjectManager().removeCollectionChangeListener(JaxbProjectManager.JAXB_PROJECTS_COLLECTION, this.jaxbProjectListener);
		if (this.delegate != null) {
			this.delegate.dispose();
		}
	}
	
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		if (this.delegate != null) {
			this.delegate.inputChanged(viewer, oldInput, newInput);
		}
		this.viewer = (StructuredViewer) viewer;
	}
	
	
	// **************** IStructuredContentProvider implementation **************
	
	public Object[] getElements(Object inputElement) {
		return getChildren(inputElement);
	}
	
	
	// **************** ITreeContentProvider implementation ********************
	
	public Object getParent(Object element) {
		if (this.delegate != null) {
			return this.delegate.getParent(element);
		}
		
		return null;
	}
	
	public boolean hasChildren(Object element) {
		if (element instanceof IAdaptable) {
			IProject project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
			
			if (project != null) {
				JaxbProject jaxbProject = JptJaxbCorePlugin.getJaxbProject(project);
				if (jaxbProject != null) {
					JaxbPlatformDescription desc = jaxbProject.getPlatform().getDescription();
					JaxbPlatformUi platformUi = 
							JptJaxbUiPlugin.getJaxbPlatformUiManager().getJaxbPlatformUi(desc);
					
					return platformUi != null;
				}	
			}
		}
		
		if (this.delegate != null) {
			return this.delegate.hasChildren(element);
		}
		
		return false;
	}
	
	public Object[] getChildren(Object parentElement) {
		if (parentElement instanceof IAdaptable) {
			IProject project = (IProject) ((IAdaptable) parentElement).getAdapter(IProject.class);
			
			if (project != null) {
				JaxbProject jaxbProject = JptJaxbCorePlugin.getJaxbProject(project);
				if (jaxbProject != null) {
					JaxbPlatformDescription desc = jaxbProject.getPlatform().getDescription();
					JaxbPlatformUi platformUi = 
							JptJaxbUiPlugin.getJaxbPlatformUiManager().getJaxbPlatformUi(desc);
					
					if (platformUi != null) {
						return new Object[] {jaxbProject.getContextRoot()};
					}
				}	
			}
		}
		
		if (this.delegate != null) {
			return this.delegate.getChildren(parentElement);
		}
			
		return new Object[0];
	}
	
	
	// **************** IMementoAware implementation ***************************
	
	public void saveState(IMemento memento) {
		// no op
	}
	
	public void restoreState(IMemento memento) {
		// no op
	}
	
	
	// **************** ICommonContentProvider implementation ******************
	
	public void init(ICommonContentExtensionSite config) {
		if (this.delegate == null) {
			JaxbNavigatorLabelProvider labelProvider = (JaxbNavigatorLabelProvider) config.getExtension().getLabelProvider();
			if (labelProvider != null && labelProvider.getDelegate() != null) {
				this.delegate = labelProvider.getDelegate();
			}
			else {
				this.delegate = new JaxbNavigatorContentAndLabelProvider();
			}
		}
	}
	
	
	// **************** member classes *****************************************
	
	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;
					}
				};
				if (project != null) {
					refreshJob.setRule(project);
				}
				refreshJob.schedule();
			}
		}
	}
}

Back to the top