/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.ui.util; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.expressions.EvaluationContext; import org.eclipse.core.expressions.IEvaluationContext; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.ISources; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.ICommonFilterDescriptor; import org.eclipse.ui.navigator.INavigatorFilterService; /** * @author Andy Wu */ public class ProjectExplorerLayoutUtil { private static String NEST_PARAMETER = "org.eclipse.ui.navigator.resources.nested.enabled"; public static void setNested( boolean nested ) { final String commandId = "org.eclipse.ui.navigator.resources.nested.changeProjectPresentation"; try { final ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService( ICommandService.class ); final Command command = commandService.getCommand( commandId ); final IHandler hanlder = command.getHandler(); final IViewPart projectExplorer = PlatformUI.getWorkbench().getWorkbenchWindows()[0].getActivePage().findView( IPageLayout.ID_PROJECT_EXPLORER ); if( hanlder != null && projectExplorer != null ) { final Map<String, String> map = new HashMap<String, String>(); map.put( NEST_PARAMETER, Boolean.toString( nested ) ); IEvaluationContext applicationContext = new EvaluationContext( null, new Object() ); applicationContext.addVariable( ISources.ACTIVE_PART_NAME, projectExplorer ); final ExecutionEvent event = new ExecutionEvent( command, map, null, applicationContext ); execute( event ); } } catch( ExecutionException e ) { // ignore errors this is best effort. } } // copy from org.eclipse.ui.internal.navigator.resources.nested.ProjectPresentationHandler (mars) private static void execute( ExecutionEvent event ) throws ExecutionException { IWorkbenchPart part = HandlerUtil.getActivePart( event ); String nestedProjectsContentProviderExtensionId = "org.eclipse.ui.navigator.resources.nested.nestedProjectContentProvider"; String hideTopLevelProjectIfNested = "org.eclipse.ui.navigator.resources.nested.HideTopLevelProjectIfNested"; String hideFolderWhenProjectIsShownAsNested = "org.eclipse.ui.navigator.resources.nested.HideFolderWhenProjectIsShownAsNested"; if( part instanceof CommonNavigator ) { CommonNavigator navigator = (CommonNavigator) part; boolean previousNest = navigator.getNavigatorContentService().getActivationService().isNavigatorExtensionActive( nestedProjectsContentProviderExtensionId ); String newNestParam = event.getParameter( NEST_PARAMETER ); boolean newNest = false; if( newNestParam != null ) { newNest = Boolean.parseBoolean( newNestParam ); } if( newNest != previousNest ) { ISelection initialSelection = navigator.getCommonViewer().getSelection(); INavigatorFilterService filterService = navigator.getNavigatorContentService().getFilterService(); Set<String> filters = new HashSet<String>(); for( ICommonFilterDescriptor desc : filterService.getVisibleFilterDescriptors() ) { if( filterService.isActive( desc.getId() ) ) { filters.add( desc.getId() ); } } if( newNest ) { navigator.getNavigatorContentService().getActivationService().activateExtensions( new String[] { nestedProjectsContentProviderExtensionId }, false ); filters.add( hideTopLevelProjectIfNested ); filters.add( hideFolderWhenProjectIsShownAsNested ); } else { navigator.getNavigatorContentService().getActivationService().deactivateExtensions( new String[] { nestedProjectsContentProviderExtensionId }, false ); filters.remove( hideTopLevelProjectIfNested ); filters.remove( hideFolderWhenProjectIsShownAsNested ); } filterService.activateFilterIdsAndUpdateViewer( filters.toArray( new String[filters.size()] ) ); navigator.getNavigatorContentService().getActivationService().persistExtensionActivations(); navigator.getCommonViewer().refresh(); navigator.getCommonViewer().setSelection( initialSelection ); } HandlerUtil.updateRadioState( event.getCommand(), Boolean.toString( newNest ) ); } } }