/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.model.ui; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.internal.debug.ui.jres.VMDetailsDialog; import org.eclipse.jdt.launching.LibraryLocation; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; /** * Provides the content for the JREs selection/edit viewer * * @see {@link ITreeContentProvider} * @see {@link VMDetailsDialog} * @see {@link VMLibraryBlock} * @see {@link LibraryLocation} * @see {@link LibraryStandin} */ public class LibraryContentProvider implements ITreeContentProvider { private Viewer fViewer; /** * Represents a subelement of a <code>LibraryStandin</code> */ public class SubElement { public static final int JAVADOC_URL = 1; public static final int SOURCE_PATH = 2; private LibraryStandin fParent; private int fType; public SubElement( LibraryStandin parent, int type ) { fParent = parent; fType = type; } public LibraryStandin getParent() { return fParent; } public int getType() { return fType; } public void remove() { switch( fType ) { case JAVADOC_URL: fParent.setJavadocLocation( null ); break; case SOURCE_PATH: fParent.setSystemLibrarySourcePath( Path.EMPTY ); break; } } } private HashMap fChildren = new HashMap(); private LibraryStandin[] fLibraries = new LibraryStandin[ 0 ]; /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { fChildren.clear(); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, * java.lang.Object) */ public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { fViewer = viewer; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements( Object inputElement ) { return fLibraries; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren( Object parentElement ) { if( parentElement instanceof LibraryStandin ) { LibraryStandin standin = (LibraryStandin) parentElement; Object[] children = (Object[]) fChildren.get( standin ); if( children == null ) { children = new Object[] { new SubElement( standin, SubElement.SOURCE_PATH ), new SubElement( standin, SubElement.JAVADOC_URL ) }; fChildren.put( standin, children ); } return children; } return null; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent( Object element ) { if( element instanceof SubElement ) { return ( (SubElement) element ).getParent(); } return null; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren( Object element ) { return element instanceof LibraryStandin; } /** * Sets the array of libraries to be the specified array of libraries * * @param libs * the new array of libraries to set */ public void setLibraries( LibraryLocation[] libs ) { fLibraries = new LibraryStandin[ libs.length ]; for( int i = 0; i < libs.length; i++ ) { fLibraries[ i ] = new LibraryStandin( libs[ i ] ); } if( fViewer != null ) { fViewer.refresh(); } } /** * Returns the listing of <code>LibraryLocation</code>s * * @return the listing of <code>LibraryLocation</code>s, or an empty array, never <code>null</code> */ public LibraryLocation[] getLibraries() { LibraryLocation[] locations = new LibraryLocation[ fLibraries.length ]; for( int i = 0; i < locations.length; i++ ) { locations[ i ] = fLibraries[ i ].toLibraryLocation(); } return locations; } /** * Returns the list of libraries in the given selection. SubElements are replaced by their parent libraries. * * @param selection * the current selection * * @return the current set of selected <code>LibraryStandin</code>s from the current viewer selection, or an empty set, never * <code>null</code> */ private Set getSelectedLibraries( IStructuredSelection selection ) { Set libraries = new HashSet(); for( Iterator iter = selection.iterator(); iter.hasNext(); ) { Object element = iter.next(); if( element instanceof LibraryStandin ) { libraries.add( element ); } else if( element instanceof SubElement ) { libraries.add( ( (SubElement) element ).getParent() ); } } return libraries; } /** * Move the libraries of the given selection up. * * @param selection * the current viewer selection */ public void up( IStructuredSelection selection ) { Set libraries = getSelectedLibraries( selection ); for( int i = 0; i < fLibraries.length - 1; i++ ) { if( libraries.contains( fLibraries[ i + 1 ] ) ) { LibraryStandin temp = fLibraries[ i ]; fLibraries[ i ] = fLibraries[ i + 1 ]; fLibraries[ i + 1 ] = temp; } } fViewer.refresh(); fViewer.setSelection( selection ); } /** * Move the libraries of the given selection down. * * @param selection * the current viewer selection */ public void down( IStructuredSelection selection ) { Set libraries = getSelectedLibraries( selection ); for( int i = fLibraries.length - 1; i > 0; i-- ) { if( libraries.contains( fLibraries[ i - 1 ] ) ) { LibraryStandin temp = fLibraries[ i ]; fLibraries[ i ] = fLibraries[ i - 1 ]; fLibraries[ i - 1 ] = temp; } } fViewer.refresh(); fViewer.setSelection( selection ); } /** * Remove the libraries contained in the given selection. * * @param selection * the current viewer selection */ public void remove( IStructuredSelection selection ) { List newLibraries = new ArrayList(); for( int i = 0; i < fLibraries.length; i++ ) { newLibraries.add( fLibraries[ i ] ); } Iterator iterator = selection.iterator(); while( iterator.hasNext() ) { Object element = iterator.next(); if( element instanceof LibraryStandin ) { newLibraries.remove( element ); } else { SubElement subElement = (SubElement) element; subElement.remove(); } } fLibraries = (LibraryStandin[]) newLibraries.toArray( new LibraryStandin[ newLibraries.size() ] ); fViewer.refresh(); } /** * Add the given libraries before the selection, or after the existing libraries if the selection is empty. * * @param libs * the array of <code>LibraryLocation</code>s to add * @param selection * the selection to add the new libraries before in the list, or after if the selection is empty. */ public void add( LibraryLocation[] libs, IStructuredSelection selection ) { List newLibraries = new ArrayList( fLibraries.length + libs.length ); for( int i = 0; i < fLibraries.length; i++ ) { newLibraries.add( fLibraries[ i ] ); } List toAdd = new ArrayList( libs.length ); for( int i = 0; i < libs.length; i++ ) { toAdd.add( new LibraryStandin( libs[ i ] ) ); } if( selection.isEmpty() ) { newLibraries.addAll( toAdd ); } else { Object element = selection.getFirstElement(); LibraryStandin firstLib; if( element instanceof LibraryStandin ) { firstLib = (LibraryStandin) element; } else { firstLib = ( (SubElement) element ).getParent(); } int index = newLibraries.indexOf( firstLib ); newLibraries.addAll( index, toAdd ); } fLibraries = (LibraryStandin[]) newLibraries.toArray( new LibraryStandin[ newLibraries.size() ] ); fViewer.refresh(); fViewer.setSelection( new StructuredSelection( libs ), true ); } /** * Set the given URL as the javadoc location for the libraries contained in the given selection. * * @param javadocLocation * the new java doc location to set * @param selection * the selection of libraries to set the new javadoc location for */ public void setJavadoc( URL javadocLocation, IStructuredSelection selection ) { Set libraries = getSelectedLibraries( selection ); Iterator iterator = libraries.iterator(); while( iterator.hasNext() ) { LibraryStandin standin = (LibraryStandin) iterator.next(); standin.setJavadocLocation( javadocLocation ); } fViewer.refresh(); } /** * Set the given paths as the source info for the libraries contained in the given selection. * * @param sourceAttachmentPath * the path of the new attachment * @param sourceAttachmentRootPath * the root path of the new attachment * @param selection * the selection of libraries to set the new paths in */ public void setSourcePath( IPath sourceAttachmentPath, IPath sourceAttachmentRootPath, IStructuredSelection selection ) { Set libraries = getSelectedLibraries( selection ); if( sourceAttachmentPath == null ) { sourceAttachmentPath = Path.EMPTY; } if( sourceAttachmentRootPath == null ) { sourceAttachmentRootPath = Path.EMPTY; } Iterator iterator = libraries.iterator(); while( iterator.hasNext() ) { LibraryStandin standin = (LibraryStandin) iterator.next(); standin.setSystemLibrarySourcePath( sourceAttachmentPath ); standin.setPackageRootPath( sourceAttachmentRootPath ); } fViewer.refresh(); } /** * Returns the standin libraries being edited. * * @return standins */ LibraryStandin[] getStandins() { return fLibraries; } }