content: /*******************************************************************************
   * Copyright (c) 2000, 2009 IBM Corporation 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:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  package org.eclipse.wst.jsdt.internal.ui.browsing;
  
  import java.util.Arrays;
  import java.util.List;
  
  import org.eclipse.core.runtime.Assert;
  import org.eclipse.jface.viewers.ISelection;
  import org.eclipse.jface.viewers.IStructuredSelection;
  import org.eclipse.jface.viewers.StructuredSelection;
  import org.eclipse.jface.viewers.StructuredViewer;
  import org.eclipse.jface.viewers.TableViewer;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.ui.IActionBars;
  import org.eclipse.ui.IPageLayout;
  import org.eclipse.ui.IWorkbenchPart;
  import org.eclipse.ui.actions.ActionFactory;
  import org.eclipse.ui.part.IShowInTargetList;
  import org.eclipse.wst.jsdt.core.IClassFile;
  import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
  import org.eclipse.wst.jsdt.core.IJavaScriptElement;
  import org.eclipse.wst.jsdt.core.IMember;
  import org.eclipse.wst.jsdt.core.IPackageFragment;
  import org.eclipse.wst.jsdt.core.IType;
  import org.eclipse.wst.jsdt.internal.ui.IJavaHelpContextIds;
  import org.eclipse.wst.jsdt.internal.ui.actions.SelectAllAction;
  import org.eclipse.wst.jsdt.internal.ui.filters.NonJavaElementFilter;
  import org.eclipse.wst.jsdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
  import org.eclipse.wst.jsdt.internal.ui.viewsupport.ColoredViewersManager;
  import org.eclipse.wst.jsdt.internal.ui.viewsupport.DecoratingJavaLabelProvider;
  import org.eclipse.wst.jsdt.internal.ui.viewsupport.JavaUILabelProvider;
  import org.eclipse.wst.jsdt.ui.JavaScriptElementLabels;
  import org.eclipse.wst.jsdt.ui.JavaScriptUI;
  import org.eclipse.wst.jsdt.ui.PreferenceConstants;
  
  public class TypesView extends JavaBrowsingPart {
  
  	private SelectAllAction fSelectAllAction;
  
  	/**
  	 * Creates and returns the label provider for this part.
  	 *
  	 * @return the label provider
  	 * @see org.eclipse.jface.viewers.ILabelProvider
  	 */
  	protected JavaUILabelProvider createLabelProvider() {
  		return new AppearanceAwareLabelProvider(
  						AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaScriptElementLabels.T_CATEGORY,
  						AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS);
  	}
  
  	protected StructuredViewer createViewer(Composite parent) {
  		StructuredViewer viewer= super.createViewer(parent);
  		ColoredViewersManager.install(viewer);
  		return viewer;
  	}
  	
  	
  	/* (non-Javadoc)
  	 * @see org.eclipse.wst.jsdt.internal.ui.browsing.JavaBrowsingPart#getAdapter(java.lang.Class)
  	 */
  	public Object getAdapter(Class key) {
  		if (key == IShowInTargetList.class) {
  			return new IShowInTargetList() {
  				public String[] getShowInTargetIds() {
  					return new String[] { JavaScriptUI.ID_PACKAGES, IPageLayout.ID_RES_NAV  };
  				}
  
  			};
  		}
  		return super.getAdapter(key);
  	}
  
  	/**
  	 * Adds filters the viewer of this part.
  	 */
  	protected void addFilters() {
  		super.addFilters();
  		getViewer().addFilter(new NonJavaElementFilter());
  	}
  
  	/**
  	 * Answers if the given <code>element</code> is a valid
  	 * input for this part.
  	 *
  	 * @param 	element	the object to test
  	 * @return	<true> if the given element is a valid input
  	 */
  	protected boolean isValidInput(Object element) {
  		return element instanceof IPackageFragment;
  	}
  
  	/**
  	 * Answers if the given <code>element</code> is a valid
  	 * element for this part.
  	 *
  	 * @param 	element	the object to test
  	 * @return	<true> if the given element is a valid element
  	 */
  	protected boolean isValidElement(Object element) {
  		if (element instanceof IJavaScriptUnit)
  			return super.isValidElement(((IJavaScriptUnit)element).getParent());
  		else if (element instanceof IType) {
  			IType type= (IType)element;
  			return type.getDeclaringType() == null && isValidElement(type.getJavaScriptUnit());
  		}
  		return false;
  	}
  
  	/**
  	 * Finds the element which has to be selected in this part.
  	 *
  	 * @param je	the Java element which has the focus
  	 * @return the element to select
  	 */
  	protected IJavaScriptElement findElementToSelect(IJavaScriptElement je) {
  		if (je == null)
  			return null;
  
  		switch (je.getElementType()) {
  			case IJavaScriptElement.TYPE:
  				IType type= ((IType)je).getDeclaringType();
  				if (type == null)
  					type= (IType)je;
  				return type;
  			case IJavaScriptElement.JAVASCRIPT_UNIT:
  				return getTypeForCU((IJavaScriptUnit)je);
  			case IJavaScriptElement.CLASS_FILE:
  				return findElementToSelect(((IClassFile)je).getType());
  			case IJavaScriptElement.IMPORT_CONTAINER:
  			case IJavaScriptElement.IMPORT_DECLARATION:
  				return findElementToSelect(je.getParent());
  			default:
  				if (je instanceof IMember)
  					return findElementToSelect(((IMember)je).getDeclaringType());
  				return null;
  
  		}
  	}
  
  	/**
  	 * Returns the context ID for the Help system
  	 *
  	 * @return	the string used as ID for the Help context
  	 */
  	protected String getHelpContextId() {
  		return IJavaHelpContextIds.TYPES_VIEW;
  	}
  
  	protected String getLinkToEditorKey() {
  		return PreferenceConstants.LINK_BROWSING_TYPES_TO_EDITOR;
  	}
  
  	protected void createActions() {
  		super.createActions();
  		fSelectAllAction= new SelectAllAction((TableViewer)getViewer());
  	}
  
  	protected void fillActionBars(IActionBars actionBars) {
  		super.fillActionBars(actionBars);
  
  		// Add selectAll action handlers.
  		actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), fSelectAllAction);
  	}
  
  	/**
  	 * Handles selection of LogicalPackage in Packages view.
  	 *
  	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
  	 * 
  	 */
  	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
  		if (!needsToProcessSelectionChanged(part, selection))
  			return;
  
  		if (selection instanceof IStructuredSelection) {
  			IStructuredSelection sel= (IStructuredSelection) selection;
  			Object selectedElement= sel.getFirstElement();
  			if (sel.size() == 1 && (selectedElement instanceof LogicalPackage)) {
  				IPackageFragment[] fragments= ((LogicalPackage)selectedElement).getFragments();
  				List selectedElements= Arrays.asList(fragments);
  				if (selectedElements.size() > 1) {
  					adjustInput(part, selectedElements);
  					fPreviousSelectedElement= selectedElements;
  					fPreviousSelectionProvider= part;
  				} else if (selectedElements.size() == 1)
  					super.selectionChanged(part, new StructuredSelection(selectedElements.get(0)));
  				else
  					Assert.isLegal(false);
  				return;
  			}
  		}
  		super.selectionChanged(part, selection);
  	}
  
  	private void adjustInput(IWorkbenchPart part, List selectedElements) {
  		Object currentInput= getViewer().getInput();
  		if (!selectedElements.equals(currentInput))
  			setInput(selectedElements);
  	}
  	/*
  	 * @see org.eclipse.wst.jsdt.internal.ui.browsing.JavaBrowsingPart#createDecoratingLabelProvider(org.eclipse.wst.jsdt.internal.ui.viewsupport.JavaUILabelProvider)
  	 */
  	protected DecoratingJavaLabelProvider createDecoratingLabelProvider(JavaUILabelProvider provider) {
  		DecoratingJavaLabelProvider decoratingLabelProvider= super.createDecoratingLabelProvider(provider);
  		provider.addLabelDecorator(new TopLevelTypeProblemsLabelDecorator(null));
  		return decoratingLabelProvider;
  	}
  
  }
  