/*******************************************************************************
* Copyright (c) 2009, 2010 SAP AG 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:
* SAP AG - initial API and implementation
******************************************************************************/
package de.hpi.sam.bp2009.solution.oclToAst.ui;
import java.awt.Dialog;
import java.util.ArrayList;
import java.util.concurrent.CancellationException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import de.hpi.sam.bp2009.solution.oclToAst.EAnnotationOCLParser;
import de.hpi.sam.bp2009.solution.oclToAst.ErrorMessage;
import de.hpi.sam.bp2009.solution.oclToAst.OclToAstFactory;
/**
* Adds a context entry to ecore file, to offer the EAnnotationParser Functionality
* @author Philipp
*
*/
public class OclToAstAction implements org.eclipse.ui.IEditorActionDelegate{
private ArrayList<IFile> selectedFiles= new ArrayList<IFile>();
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
@Override
public void run(IAction action) {
StringBuilder bld = new StringBuilder();
bld.append("--");
boolean onePassed=false;
/*
* activate for all selected files
*/
for(IFile selectedFile : selectedFiles){
EAnnotationOCLParser p = OclToAstFactory.eINSTANCE.createEAnnotationOCLParser();
p.convertAnnotations(URI.createURI(selectedFile.getLocationURI()==null ?
"": selectedFile.getLocationURI().toString()));
String locString = selectedFile.getLocationURI().toString();
/*
* show error windows if necessary
*/
try{
boolean last = selectedFiles.indexOf(selectedFile)==selectedFiles.size()-1;
if(showErrorMessageIfNeeded(p, locString, last )){
bld.append(locString);
bld.append("--");
onePassed=true;
}
}catch(CancellationException e){
return;
}
/*
* refresh all selected resources
*/
try {
selectedFile.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
} catch (CoreException e) {
//ignore
}
}
/*
* show for all passed the passed message
*/
if(onePassed){
Shell shell = new Shell();
MessageDialog.openInformation(shell, "EAnnotation Parsing Complete",
"Succesfully parsed "+bld.toString());
}
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof IStructuredSelection) {
/*
* clear old selection
*/
selectedFiles.clear();
/*
* add all selected to selection
*/
for(Object s: ((IStructuredSelection) selection).toArray()){
if(s instanceof IFile){
selectedFiles.add((IFile)s);
}
}
}
}
@Override
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
// do nothing
}
/**
* Show an Error window for the given parser and location
* @param p the given EAnnotationParser, which hold all ErrorMessages
* @param location the location of the traversed resource
* @param last is this the last one?
* @return if error window was shown
* @throws CancellationException if the user cancels the parsing
*/
private boolean showErrorMessageIfNeeded(final EAnnotationOCLParser p, final String location, final boolean last) throws CancellationException {
if(p.getAllOccurredErrorMessages().size()>0){
org.eclipse.jface.dialogs.TitleAreaDialog dialog = new TitleAreaDialog(new Shell()){
@Override
protected Control createDialogArea(Composite parent) {
setTitle("EAnnotation Parsing Complete");
if(last){
setErrorMessage("Error occured during parsing of " + location);
}else{
setErrorMessage("Error occured during parsing of " + location +"\n Should the parsing process continue?");
}
Composite par=(Composite) super.createDialogArea(parent);
GridLayout lay = new GridLayout(3, false);
par.setLayout(lay);
parent.setSize(400, 400);
/*
* remove standard line
*/
par.getChildren()[0].dispose();
for(ErrorMessage e: p.getAllOccurredErrorMessages()){
Text l = new Text(par, SWT.READ_ONLY |SWT.WRAP);
GridData g= new GridData(SWT.BORDER);
g.widthHint=200;
l.setLayoutData(g);
if(e.getMessageString()!=null)
l.setText(e.getMessageString());
Text l1 = new Text(par, SWT.READ_ONLY|SWT.WRAP);
GridData g1= new GridData(SWT.BORDER);
g1.widthHint=200;
l1.setLayoutData(g1);
if(e.getException()!=null)
l1.setText(e.getException().toString());
Text l2 = new Text(par, SWT.READ_ONLY|SWT.WRAP);
GridData g2= new GridData(SWT.BORDER);
g2.widthHint=200;
l2.setLayoutData(g2);
if(e.getAffectedObject()!=null)
l2.setText(e.getAffectedObject().toString());
}
p.getAllOccurredErrorMessages().clear();
setDialogHelpAvailable(false);
par.update();
return par;
}
};
if(dialog.open()==Dialog.ABORT)
throw new CancellationException("User canceled parsing");
return false;
}else{
return true;
}
}
}