/*******************************************************************************
* Copyright (c) 2008 Scott Stanchfield, based on ANTLR-Eclipse plugin
* by Torsten Juergeleit.
* 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
* Torsten Juergeleit - original ANTLR Eclipse plugin
* Scott Stanchfield - modifications for ANTXR
*******************************************************************************/
package com.javadude.antxr.eclipse.ui.actions;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.util.Assert;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import com.javadude.antxr.eclipse.core.builder.AntxrBuilder;
import com.javadude.antxr.eclipse.ui.AntxrUIPlugin;
/**
* A popup menu action to compile a java grammar
*/
public class CompileAction implements IObjectActionDelegate {
private IFile fGrammarFile;
/**
* @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
*/
public void setActivePart(IAction anAction, IWorkbenchPart aTargetPart) {
// nothing to do here...
}
/**
* @see IActionDelegate#selectionChanged(IAction, ISelection)
*/
public void selectionChanged(IAction anAction, ISelection aSelection) {
IFile file = null;
if (aSelection instanceof IStructuredSelection) {
Object obj = ((IStructuredSelection)aSelection).getFirstElement();
if (obj != null && obj instanceof IFile) {
file = (IFile)obj;
}
}
fGrammarFile = file;
}
/**
* @see IActionDelegate#run(IAction)
*/
public void run(IAction anAction) {
Assert.isNotNull(fGrammarFile);
Shell shell = AntxrUIPlugin.getActiveWorkbenchShell();
ProgressMonitorDialog pmd = new ProgressMonitorDialog(shell);
try {
pmd.run(true, false, new Operation(fGrammarFile)); // cancel button disabled
} catch (InterruptedException e) {
AntxrUIPlugin.log(e);
} catch (InvocationTargetException e) {
AntxrUIPlugin.log(e);
}
}
private class Operation extends WorkspaceModifyOperation {
IFile fFile;
/**
* Create an operation, holding a file
* @param aFile the file to hold
*/
public Operation(IFile aFile) {
fFile = aFile;
}
/**
* @see WorkspaceModifyOperation#execute(IProgressMonitor)
*/
protected void execute(IProgressMonitor aMonitor) throws CoreException,
InvocationTargetException, InterruptedException {
new AntxrBuilder().compileFile(fFile, aMonitor);
}
}
}