/******************************************************************************* * Copyright (C) 2003, 2004? 2007, 2008, 2013, Guillaume Brocker * Copyright (C) 2015-2016, Andre Bossert * * 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: * Guillaume Brocker - Initial API and implementation * Andre Bossert - Add ability to use Doxyfile not in project scope * ******************************************************************************/ package eclox.ui.action; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; import eclox.core.doxyfiles.Doxyfile; import eclox.core.doxyfiles.ResourceCollector; import eclox.ui.DoxyfileSelector; import eclox.ui.Plugin; /** * Implement a pop-up menu action delegate that will allow to * launch doxygen builds from resources' contextual menu. * * @author gbrocker */ public class BuildPopupActionDelegate implements IObjectActionDelegate { private IResource resource; ///< References the resource that is under the contextual menu. private IWorkbenchPart targetPart; ///< References the part where the action taks place. /** * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart) */ public void setActivePart(IAction action, IWorkbenchPart targetPart) { this.targetPart = targetPart; } /** * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) */ public void run(IAction action) { try { IFile doxyIFile = null; // If there is a resource, it is either a doxyfile // and if not, we prompt the user to get one. if( resource != null ) { doxyIFile = Doxyfile.isDoxyfile(resource) ? (IFile) resource : DoxyfileSelector.open(resource); } if( doxyIFile != null ) { Plugin.getDefault().getBuildManager().build( new Doxyfile(doxyIFile, null) ); } } catch(Throwable throwable) { MessageDialog.openError(targetPart.getSite().getShell(), "Unexpected Error", throwable.toString()); } } /** * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) */ public void selectionChanged(IAction action, ISelection selection) { boolean enabled = false; IStructuredSelection strSelection = (IStructuredSelection) selection; try { if( strSelection.size() == 1 ) { Object object = strSelection.getFirstElement(); IResource resource = (IResource) Platform.getAdapterManager().getAdapter(object, IResource.class); this.resource = resource; if( resource != null && resource.isAccessible() ) { ResourceCollector collector = ResourceCollector.run(resource); // If there is only one collected doxyfile, then assigns that doxyfile as the current resource. this.resource = collector.getSize() == 1 ? collector.getFirst() : this.resource; // Enables the action when a doxyfile has been found. enabled = collector.isEmpty() == false; } } } catch(Throwable throwable) { MessageDialog.openError(targetPart.getSite().getShell(), "Unexpected Error", throwable.toString()); } action.setEnabled(enabled); } }