/**
* Copyright (c) 2012 itemis AG (http://www.itemis.eu) 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
*/
package org.xtext.tortoiseshell.lib.view;
import com.google.common.base.Objects;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.FreeformLayeredPane;
import org.eclipse.draw2d.FreeformViewport;
import org.eclipse.draw2d.Polyline;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.resource.IResourceServiceProvider;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.model.IXtextDocument;
import org.eclipse.xtext.ui.util.DisplayRunHelper;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.xtext.tortoiseshell.lib.ITortoiseEvent;
import org.xtext.tortoiseshell.lib.ITortoiseInterpreter;
import org.xtext.tortoiseshell.lib.MoveEvent;
import org.xtext.tortoiseshell.lib.Tortoise;
import org.xtext.tortoiseshell.lib.TurnEvent;
import org.xtext.tortoiseshell.lib.view.Animation;
import org.xtext.tortoiseshell.lib.view.Animator;
import org.xtext.tortoiseshell.lib.view.RootLayer;
import org.xtext.tortoiseshell.lib.view.ToggleStopModeAction;
import org.xtext.tortoiseshell.lib.view.TortoiseFigure;
import org.xtext.tortoiseshell.lib.view.TortoisePartListener;
@Singleton
@SuppressWarnings("all")
public class TortoiseView extends ViewPart implements ITortoiseEvent.Listener {
private final static Logger LOGGER = Logger.getLogger(TortoiseView.class);
private FigureCanvas canvas;
@Inject
private ToggleStopModeAction action;
@Inject
private RootLayer rootFigure;
@Inject
private TortoiseFigure tortoiseFigure;
@Inject
private TortoisePartListener listener;
@Inject
private Animator animator;
public void createPartControl(final Composite parent) {
FigureCanvas _figureCanvas = new FigureCanvas(parent, SWT.DOUBLE_BUFFERED);
this.canvas = _figureCanvas;
FreeformViewport _freeformViewport = new FreeformViewport();
this.canvas.setViewport(_freeformViewport);
this.canvas.setBackground(ColorConstants.white);
final FreeformLayeredPane pane = new FreeformLayeredPane();
Font _font = parent.getFont();
pane.setFont(_font);
this.canvas.setContents(pane);
pane.add(this.rootFigure, "primary");
this.reset();
IWorkbenchPartSite _site = this.getSite();
IWorkbenchPage _page = _site.getPage();
_page.addPartListener(this.listener);
IWorkbenchPartSite _site_1 = this.getSite();
IActionBars _actionBars = ((IViewSite) _site_1).getActionBars();
IToolBarManager _toolBarManager = _actionBars.getToolBarManager();
_toolBarManager.add(this.action);
}
public void setFocus() {
this.canvas.setFocus();
}
public TortoiseFigure getTortoiseFigure() {
return this.tortoiseFigure;
}
public TortoisePartListener getTortoisePartListener() {
return this.listener;
}
public void reset() {
this.rootFigure.removeAll();
this.rootFigure.add(this.tortoiseFigure);
Point _point = new Point(0, 0);
this.tortoiseFigure.setTortoiseLocation(_point);
this.tortoiseFigure.setAngle(0);
final org.eclipse.swt.graphics.Point viewportSize = this.canvas.getSize();
this.canvas.scrollTo(((-viewportSize.x) / 2), ((-viewportSize.y) / 2));
}
public Boolean show(final XtextEditor tortoiseEditor, final int stopAtLine) {
Boolean _xblockexpression = null;
{
this.animator.setAnimated((stopAtLine < 0));
final Runnable _function = new Runnable() {
public void run() {
TortoiseView.this.reset();
}
};
DisplayRunHelper.runSyncInDisplayThread(_function);
IXtextDocument _document = tortoiseEditor.getDocument();
final IUnitOfWork<Boolean, XtextResource> _function_1 = new IUnitOfWork<Boolean, XtextResource>() {
public Boolean exec(final XtextResource it) throws Exception {
boolean _xifexpression = false;
boolean _and = false;
boolean _notEquals = (!Objects.equal(it, null));
if (!_notEquals) {
_and = false;
} else {
boolean _hasError = TortoiseView.this.hasError(tortoiseEditor);
boolean _not = (!_hasError);
_and = _not;
}
if (_and) {
boolean _xblockexpression = false;
{
final Tortoise tortoise = new Tortoise();
tortoise.addListener(TortoiseView.this);
IResourceServiceProvider _resourceServiceProvider = it.getResourceServiceProvider();
final ITortoiseInterpreter interpreter = _resourceServiceProvider.<ITortoiseInterpreter>get(ITortoiseInterpreter.class);
boolean _and_1 = false;
boolean _notEquals_1 = (!Objects.equal(interpreter, null));
if (!_notEquals_1) {
_and_1 = false;
} else {
EList<EObject> _contents = it.getContents();
boolean _isEmpty = _contents.isEmpty();
boolean _not_1 = (!_isEmpty);
_and_1 = _not_1;
}
if (_and_1) {
try {
EList<EObject> _contents_1 = it.getContents();
EObject _get = _contents_1.get(0);
interpreter.run(tortoise, _get, stopAtLine);
} catch (final Throwable _t) {
if (_t instanceof Exception) {
final Exception e = (Exception)_t;
IWorkbenchPartSite _site = TortoiseView.this.getSite();
Shell _shell = _site.getShell();
StringConcatenation _builder = new StringConcatenation();
_builder.append("Error during execution:");
_builder.newLine();
_builder.append(" ");
String _message = e.getMessage();
_builder.append(_message, " ");
_builder.newLineIfNotEmpty();
_builder.append("See log for details");
MessageDialog.openError(_shell, "Error during Execution", _builder.toString());
TortoiseView.LOGGER.error("Error executing TortoiseScript", e);
} else {
throw Exceptions.sneakyThrow(_t);
}
}
}
_xblockexpression = tortoise.removeListener(TortoiseView.this);
}
_xifexpression = _xblockexpression;
}
return Boolean.valueOf(_xifexpression);
}
};
_xblockexpression = _document.<Boolean>readOnly(_function_1);
}
return _xblockexpression;
}
public boolean hasError(final XtextEditor tortoiseEditor) {
boolean _xblockexpression = false;
{
IDocumentProvider _documentProvider = tortoiseEditor.getDocumentProvider();
IAnnotationModel _annotationModel = null;
if (_documentProvider!=null) {
IEditorInput _editorInput = tortoiseEditor.getEditorInput();
_annotationModel=_documentProvider.getAnnotationModel(_editorInput);
}
Iterator _annotationIterator = null;
if (_annotationModel!=null) {
_annotationIterator=_annotationModel.getAnnotationIterator();
}
final Iterator annotations = _annotationIterator;
while (((!Objects.equal(annotations, null)) && annotations.hasNext())) {
{
final Object annotation = annotations.next();
boolean _and = false;
if (!(annotation instanceof Annotation)) {
_and = false;
} else {
String _type = ((Annotation) annotation).getType();
boolean _equals = Objects.equal(_type, XtextEditor.ERROR_ANNOTATION_TYPE);
_and = _equals;
}
if (_and) {
return true;
}
}
}
_xblockexpression = false;
}
return _xblockexpression;
}
public void handleTortoiseEvent(final ITortoiseEvent event) {
boolean _matched = false;
if (!_matched) {
if (event instanceof MoveEvent) {
_matched=true;
Tortoise _tortoise = ((MoveEvent)event).getTortoise();
boolean _isPaint = _tortoise.isPaint();
if (_isPaint) {
final Polyline line = new Polyline();
Tortoise _tortoise_1 = ((MoveEvent)event).getTortoise();
Color _lineColor = _tortoise_1.getLineColor();
line.setForegroundColor(_lineColor);
Tortoise _tortoise_2 = ((MoveEvent)event).getTortoise();
int _lineWidth = _tortoise_2.getLineWidth();
line.setLineWidth(_lineWidth);
Point _oldPosition = ((MoveEvent)event).getOldPosition();
Point _oldPosition_1 = ((MoveEvent)event).getOldPosition();
line.setEndpoints(_oldPosition, _oldPosition_1);
Point _oldPosition_2 = ((MoveEvent)event).getOldPosition();
Tortoise _tortoise_3 = ((MoveEvent)event).getTortoise();
Point _position = _tortoise_3.getPosition();
Tortoise _tortoise_4 = ((MoveEvent)event).getTortoise();
int _delay = _tortoise_4.getDelay();
Animation _animation = new Animation(_oldPosition_2, _position, line, _delay);
this.animator.addAnimation(_animation);
} else {
Point _oldPosition_3 = ((MoveEvent)event).getOldPosition();
Tortoise _tortoise_5 = ((MoveEvent)event).getTortoise();
Point _position_1 = _tortoise_5.getPosition();
Tortoise _tortoise_6 = ((MoveEvent)event).getTortoise();
int _delay_1 = _tortoise_6.getDelay();
Animation _animation_1 = new Animation(_oldPosition_3, _position_1, _delay_1);
this.animator.addAnimation(_animation_1);
}
}
}
if (!_matched) {
if (event instanceof TurnEvent) {
_matched=true;
double _oldAngle = ((TurnEvent)event).getOldAngle();
Tortoise _tortoise = ((TurnEvent)event).getTortoise();
double _angleInRadians = _tortoise.getAngleInRadians();
Tortoise _tortoise_1 = ((TurnEvent)event).getTortoise();
int _delay = _tortoise_1.getDelay();
Animation _animation = new Animation(_oldAngle, _angleInRadians, _delay);
this.animator.addAnimation(_animation);
}
}
}
}