/*******************************************************************************
* Copyright (c) 2017 Rogue Wave Software Inc. 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:
* Rogue Wave Software Inc. - initial implementation
*******************************************************************************/
package org.eclipse.php.internal.debug.ui.views.coverage;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.php.core.PHPToolkitUtil;
import org.eclipse.php.internal.debug.core.zend.communication.IRemoteFileContentRequestor;
import org.eclipse.php.internal.debug.core.zend.debugger.CodeCoverageData;
import org.eclipse.php.internal.debug.core.zend.debugger.RemoteDebugger;
import org.eclipse.php.internal.debug.ui.Logger;
import org.eclipse.php.internal.debug.ui.editor.OpenRemoteFileContentRequestor;
import org.eclipse.php.internal.ui.util.EditorUtility;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.ActionGroup;
/**
* Code coverage action group.
*/
public class CodeCoverageActionGroup extends ActionGroup implements IMenuListener {
private static final String COVERAGE_VIEW_ID = "org.eclipse.php.debug.ui.CodeCoverageView"; //$NON-NLS-1$
private OpenCoverageAction openCoverageAction;
private CodeCoverageViewer viewer;
public CodeCoverageActionGroup(final CodeCoverageViewer viewer) {
this.viewer = viewer;
openCoverageAction = new OpenCoverageAction(this);
createContextMenu();
}
private void createContextMenu() {
final MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuManager.setRemoveAllWhenShown(true);
menuManager.addMenuListener(this);
menuManager.createContextMenu(viewer.getTree());
viewer.getTree().setMenu(menuManager.createContextMenu(viewer.getTree()));
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.actions.ActionGroup#dispose()
*/
public void dispose() {
super.dispose();
}
public void doubleClickFile(final Object element) {
try {
if (element instanceof String) {
String remoteFile = (String) element;
final CodeCoverageData data = ((CodeCoverageContentProvider) viewer.getContentProvider())
.getCoverageData(remoteFile);
IEditorPart part = EditorUtility.openLocalFile(remoteFile, 0);
if (part == null) {
IRemoteFileContentRequestor requestor = new OpenRemoteFileContentRequestor();
RemoteDebugger.requestRemoteFile(requestor, remoteFile, 1, data.getURL());
}
} else if (element instanceof ISourceModule || element instanceof IFile) {
final IEditorPart part = org.eclipse.dltk.internal.ui.editor.EditorUtility.openInEditor(element, false);
if (part != null && element instanceof IModelElement && !(element instanceof ISourceModule))
org.eclipse.dltk.internal.ui.editor.EditorUtility.revealInEditor(part, (IModelElement) element);
} else
viewer.setExpandedState(element, !viewer.getExpandedState(element));
} catch (final CoreException e) {
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.
* action.IMenuManager)
*/
public void fillContextMenu(final IMenuManager menu) {
final ISelection selection = viewer.getSelection();
if (selection != null && selection instanceof IStructuredSelection) {
final Object element = ((IStructuredSelection) selection).getFirstElement();
if (element != null && PHPToolkitUtil.getSourceModule(element) != null) {
openCoverageAction.updateSelection(selection);
menu.add(openCoverageAction);
}
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.action.IMenuListener#menuAboutToShow(org.eclipse.jface
* .action.IMenuManager)
*/
public void menuAboutToShow(final IMenuManager manager) {
fillContextMenu(manager);
}
public void showCoverage(final CodeCoverageData coverageData) {
IWorkbench workbench = PlatformUI.getWorkbench();
if (workbench == null)
return;
final IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
if (activeWorkbenchWindow == null)
return;
final IWorkbenchPage page = activeWorkbenchWindow.getActivePage();
if (page == null)
return;
try {
final IViewPart part = page.showView(COVERAGE_VIEW_ID, coverageData.getFileName().replace(':', '_'),
IWorkbenchPage.VIEW_ACTIVATE);
if (part != null && part instanceof CodeCoverageView) {
final CodeCoverageView view = (CodeCoverageView) part;
view.setInput(coverageData);
}
} catch (final PartInitException e) {
Logger.logException(e);
}
}
public void showCoverage(final Object data) {
if (data == null)
return;
final CodeCoverageContentProvider provider = (CodeCoverageContentProvider) viewer.getContentProvider();
CodeCoverageData coverageData = null;
if (data instanceof ISourceModule) {
coverageData = provider.getCoverageData((ISourceModule) data);
} else if (data instanceof IFile) {
coverageData = provider.getCoverageData((IFile) data);
} else if (data instanceof String) {
coverageData = provider.getCoverageData((String) data);
}
if (coverageData != null)
showCoverage(coverageData);
}
}