package org.reuseware.air.ui.eclipse.actions; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Iterator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; import org.reuseware.air.comogen.CompositionSystemGenerator; import org.reuseware.air.comogen.ExtensionContext; import org.reuseware.air.comogen.ICompositionSystemContext; import org.reuseware.air.comogen.CompositionSystemContext; import org.reuseware.air.comogen.IExtensionContext; import org.reuseware.air.comogen.util.CMSLSpecificationLoader; import org.reuseware.air.ui.eclipse.resource.FileMarker; import org.reuseware.air.util.FileProcessingException; import org.reuseware.air.language.cmsl.ExtensionProgram; import org.reuseware.air.language.cmsl.ExtensionStatement; import org.reuseware.air.language.cmsl.GrammarExtension; public class GenerateComponentModelAction implements IObjectActionDelegate { private ISelection selection; private IWorkbenchPart part; /** * Process the file * * ... using a different IWorkbenchPart * * @param file */ public void process(final IFile file, final IWorkbenchPart part) { final ProgressMonitorDialog pmDialog = new ProgressMonitorDialog(part.getSite().getShell()); try { pmDialog.run(true, false, new IRunnableWithProgress(){ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("Generating Component model ", 10); monitor.worked(1); try { IExtensionContext extensionContext = new ExtensionContext((ExtensionProgram)CMSLSpecificationLoader.parseCMSLSpecification(file).getUnit()); ICompositionSystemContext systemContext = new CompositionSystemContext(extensionContext); CompositionSystemGenerator.processAll(systemContext, extensionContext); } catch (FileProcessingException e) { try { FileMarker.mark(e,file.getProject()); } catch (CoreException e1) { // TODO remove later... e1.printStackTrace(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } monitor.worked(1); monitor.done(); } }); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return; } /** * Process the file * * ...using the own IWorkbenchPart * * @param file * @param part */ public void process(final IFile file) { process(file, part); } /** * Run * */ @SuppressWarnings("unchecked") public void run(IAction action) { boolean autoBuildState = getAutoBuildingState(); setAutoBuildingState(false); if (selection instanceof IStructuredSelection) { for (Iterator i = ((IStructuredSelection)selection).iterator(); i.hasNext(); ) { Object o = i.next(); if (o instanceof IFile) { IFile file = (IFile) o; process(file); } } } setAutoBuildingState(autoBuildState); } /** * * @param state */ private void setAutoBuildingState(boolean state) { IWorkspaceDescription workspaceDesc = ResourcesPlugin.getWorkspace().getDescription(); workspaceDesc.setAutoBuilding(state); try { ResourcesPlugin.getWorkspace().setDescription(workspaceDesc); } catch (CoreException ex) { } } /** * * @return */ private boolean getAutoBuildingState() { return ResourcesPlugin.getWorkspace().getDescription().isAutoBuilding(); } /* * (non-Javadoc) * * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, * org.eclipse.jface.viewers.ISelection) */ public void selectionChanged(IAction action, ISelection selection) { this.selection = selection; } /* * (non-Javadoc) * * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, * org.eclipse.ui.IWorkbenchPart) */ public void setActivePart(IAction action, IWorkbenchPart targetPart) { this.part = targetPart; } }