/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Rectangle;
import org.whole.lang.bindings.BindingManagerFactory;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.iterators.IEntityIterator;
import org.whole.lang.iterators.IteratorFactory;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.AbstractFunctionLibraryDeployer;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.ui.editparts.IEntityPart;
import org.whole.lang.ui.editparts.IGraphicalEntityPart;
import org.whole.lang.ui.editparts.ITextualEntityPart;
import org.whole.lang.ui.editparts.ModelObserver;
import org.whole.lang.ui.figures.IEntityFigure;
import org.whole.lang.ui.util.FigureUtils;
import org.whole.lang.ui.viewers.IEntityPartViewer;
import org.whole.lang.util.DataTypeUtils;
import org.whole.lang.util.IDataTypeWrapper;
import org.whole.lang.util.IRunnable;
/**
* @author Enrico Persiani
*/
public class NotationsLibraryDeployer extends AbstractFunctionLibraryDeployer {
public static final String URI = "whole:org.whole.lang:NotationsLibrary";
@Override
public void deploy(ReflectionFactory platform) {
putFunctionLibrary(URI);
putFunctionCode("entityPart", entityPartIterator());
putFunctionCode("entityPartIsGraphical", entityPartIsGraphicalIterator());
putFunctionCode("entityPartIsTextual", entityPartIsTextualIterator());
putFunctionCode("entityPartParent", entityPartParentIterator());
putFunctionCode("entityPartChildren", entityPartChildrenIterator());
putFunctionCode("entityPartClosestAbove", entityPartClosestAboveIterator());
putFunctionCode("entityPartClosestBelow", entityPartClosestBelowIterator());
putFunctionCode("entityPartNorthwards", entityPartNorthwardsIterator());
putFunctionCode("entityPartSouthwards", entityPartSouthwardsIterator());
putFunctionCode("entityPartWestwards", entityPartWestwardsIterator());
putFunctionCode("entityPartEastwards", entityPartEastwardsIterator());
putFunctionCode("modelEntity", modelEntityIterator());
putFunctionCode("parentModelEntity", parentModelEntityIterator());
putFunctionCode("caretLeftText", caretLeftTextIterator());
putFunctionCode("caretSelectedText", caretSelectedTextIterator());
putFunctionCode("caretRightText", caretRightTextIterator());
putFunctionCode("caretPositions", caretPositionsIterator());
putFunctionCode("caretPosition", caretPositionIterator());
putFunctionCode("caretPositionStart", caretPositionStartIterator());
putFunctionCode("caretPositionEnd", caretPositionEndIterator());
putFunctionCode("entityFigure", entityFigureIterator());
putFunctionCode("entityFigureParent", entityFigureParentIterator());
putFunctionCode("entityFigureChildren", entityFigureChildrenIterator());
putFunctionCode("entityFigureIsVisible", entityFigureIsVisibleIterator());
putFunctionCode("entityFigureIsShowing", entityFigureIsShowingIterator());
putFunctionCode("entityFigureClosestAbove", entityFigureClosestAboveIterator());
putFunctionCode("entityFigureClosestBelow", entityFigureClosestBelowIterator());
putFunctionCode("entityFigureBounds", entityFigureBoundsIterator());
putFunctionCode("entityFigureBoundsClosestAbove", entityFigureBoundsClosestAboveIterator());
putFunctionCode("entityFigureBoundsClosestBelow", entityFigureBoundsClosestBelowIterator());
}
protected abstract static class EntityPartPropertyRunnable implements IRunnable {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IEntityPart entityPart = null;
if (DataTypeUtils.getDataKind(selfEntity).isObject() && selfEntity.wGetValue() instanceof IEntityPart)
entityPart = (IEntityPart) selfEntity.wGetValue();
else {
IEntityPartViewer viewer = (IEntityPartViewer) bm.wGetValue("viewer");
entityPart = ModelObserver.getObserver(selfEntity, viewer.getEditPartRegistry());
}
if (entityPart != null)
setResult(bm, entityPart);
else
bm.setResult(null);
}
protected abstract void setResult(IBindingManager bm, IEntityPart entityPart);
}
protected abstract static class EntityPartSingleValuedPropertyRunnable extends EntityPartPropertyRunnable {
protected void setResult(IBindingManager bm, IEntityPart entityPart) {
bm.setResult(getProperty((IEntityPartViewer) bm.wGetValue("viewer"), entityPart));
}
protected abstract IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart);
}
protected abstract static class EntityPartMultiValuedPropertyRunnable extends EntityPartPropertyRunnable {
protected void setResult(IBindingManager bm, IEntityPart entityPart) {
bm.setResultIterator(getPropertyIterator((IEntityPartViewer) bm.wGetValue("viewer"), entityPart));
}
protected abstract IEntityIterator<?> getPropertyIterator(IEntityPartViewer viewer, IEntityPart entityPart);
}
protected abstract static class TextualEntityPartSingleValuedPropertyRunnable extends EntityPartPropertyRunnable {
protected void setResult(IBindingManager bm, IEntityPart entityPart) {
if (entityPart instanceof ITextualEntityPart)
bm.setResult(getProperty((IEntityPartViewer) bm.wGetValue("viewer"), (ITextualEntityPart) entityPart));
}
protected abstract IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart);
}
protected abstract static class EntityFigurePropertyRunnable implements IRunnable {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
IFigure figure = null;
if (DataTypeUtils.getDataKind(selfEntity).isObject() && selfEntity.wGetValue() instanceof IFigure)
figure = (IFigure) selfEntity.wGetValue();
else {
IEntityPartViewer viewer = (IEntityPartViewer) bm.wGetValue("viewer");
IEntityPart entityPart = ModelObserver.getObserver(selfEntity, viewer.getEditPartRegistry());
if (entityPart instanceof IGraphicalEntityPart)
figure = ((IGraphicalEntityPart) entityPart).getFigure();
}
if (figure instanceof IEntityFigure)
setResult(bm, (IEntityFigure) figure);
else
bm.setResult(null);
}
protected abstract void setResult(IBindingManager bm, IEntityFigure entityFigure);
}
protected abstract static class EntityFigureSingleValuedPropertyRunnable extends EntityFigurePropertyRunnable {
protected void setResult(IBindingManager bm, IEntityFigure entityFigure) {
bm.setResult(getProperty((IEntityPartViewer) bm.wGetValue("viewer"), entityFigure));
}
protected abstract IEntity getProperty(IEntityPartViewer viewer, IEntityFigure entityFigure);
}
protected abstract static class EntityFigureMultiValuedPropertyRunnable extends EntityFigurePropertyRunnable {
protected void setResult(IBindingManager bm, IEntityFigure entityFigure) {
bm.setResultIterator(getPropertyIterator((IEntityPartViewer) bm.wGetValue("viewer"), entityFigure));
}
protected abstract IEntityIterator<?> getPropertyIterator(IEntityPartViewer viewer, IEntityFigure entityFigure);
}
protected abstract static class EntityFigureBoundsPropertyRunnable implements IRunnable {
public void run(IEntity selfEntity, IBindingManager bm, IEntity... arguments) {
Rectangle bounds = null;
if (DataTypeUtils.getDataKind(selfEntity).isObject() && selfEntity.wGetValue() instanceof Rectangle)
bounds = (Rectangle) selfEntity.wGetValue();
else {
IEntityPartViewer viewer = (IEntityPartViewer) bm.wGetValue("viewer");
IEntityPart entityPart = ModelObserver.getObserver(selfEntity, viewer.getEditPartRegistry());
if (entityPart instanceof IGraphicalEntityPart)
bounds = ((IGraphicalEntityPart) entityPart).getFigure().getBounds().getCopy();
}
if (bounds instanceof Rectangle)
setResult(bm, (Rectangle) bounds);
else
bm.setResult(null);
}
protected abstract void setResult(IBindingManager bm, Rectangle bounds);
}
protected abstract static class EntityFigureBoundsSingleValuedPropertyRunnable extends EntityFigureBoundsPropertyRunnable {
protected void setResult(IBindingManager bm, Rectangle bounds) {
bm.setResult(getProperty((IEntityPartViewer) bm.wGetValue("viewer"), bounds));
}
protected abstract IEntity getProperty(IEntityPartViewer viewer, Rectangle bounds);
}
public static IEntityIterator<IEntity> entityPartIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return BindingManagerFactory.instance.createValue(entityPart);
}
});
}
public static IEntityIterator<IEntity> entityPartIsGraphicalIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return BindingManagerFactory.instance.createValue(entityPart instanceof IGraphicalEntityPart);
}
});
}
public static IEntityIterator<IEntity> entityPartIsTextualIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return BindingManagerFactory.instance.createValue(entityPart instanceof ITextualEntityPart);
}
});
}
public static IEntityIterator<IEntity> entityPartParentIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
IEntityPart parent = (IEntityPart) entityPart.getParent();
return parent != null ? BindingManagerFactory.instance.createValue(parent) : null;
}
});
}
public static IEntityIterator<IEntity> entityPartChildrenIterator() {
return IteratorFactory.multiValuedRunnableIterator(new EntityPartMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(IEntityPartViewer viewer, IEntityPart entityPart) {
return IteratorFactory.collectionIterator(
entityPart.getChildren(),
IDataTypeWrapper.envObjectValue);
}
});
}
public static IEntityIterator<IEntity> entityPartClosestAboveIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart instanceof IGraphicalEntityPart ?
BindingManagerFactory.instance.createValue(
FigureUtils.getClosestAbove(viewer, (IGraphicalEntityPart) entityPart)) : null;
}
});
}
public static IEntityIterator<IEntity> entityPartClosestBelowIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart instanceof IGraphicalEntityPart ?
BindingManagerFactory.instance.createValue(
FigureUtils.getClosestBelow(viewer, (IGraphicalEntityPart) entityPart)) : null;
}
});
}
public static IEntityIterator<IEntity> entityPartNorthwardsIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart instanceof IGraphicalEntityPart ?
BindingManagerFactory.instance.createValue(
FigureUtils.getClosest(PositionConstants.NORTH, viewer, (IGraphicalEntityPart) entityPart)) : null;
}
});
}
public static IEntityIterator<IEntity> entityPartSouthwardsIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart instanceof IGraphicalEntityPart ?
BindingManagerFactory.instance.createValue(
FigureUtils.getClosest(PositionConstants.SOUTH, viewer, (IGraphicalEntityPart) entityPart)) : null;
}
});
}
public static IEntityIterator<IEntity> entityPartWestwardsIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart instanceof IGraphicalEntityPart ?
BindingManagerFactory.instance.createValue(
FigureUtils.getClosest(PositionConstants.WEST, viewer, (IGraphicalEntityPart) entityPart)) : null;
}
});
}
public static IEntityIterator<IEntity> entityPartEastwardsIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart instanceof IGraphicalEntityPart ?
BindingManagerFactory.instance.createValue(
FigureUtils.getClosest(PositionConstants.EAST, viewer, (IGraphicalEntityPart) entityPart)) : null;
}
});
}
public static IEntityIterator<IEntity> modelEntityIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart.getModelEntity();
}
});
}
public static IEntityIterator<IEntity> parentModelEntityIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityPart entityPart) {
return entityPart.getParentModelEntity();
}
});
}
public static IEntityIterator<IEntity> caretLeftTextIterator() {
return IteratorFactory.singleValuedRunnableIterator(new TextualEntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart) {
String textToSplit = DataTypeUtils.getAsPresentationString(entityPart.getModelEntity());
int selectionStart = entityPart.getSelectionStart();
if (selectionStart < 0)
selectionStart = entityPart.getCaretPosition();
String leftText = textToSplit.substring(0, selectionStart);
return BindingManagerFactory.instance.createValue(leftText);
}
});
}
public static IEntityIterator<IEntity> caretSelectedTextIterator() {
return IteratorFactory.singleValuedRunnableIterator(new TextualEntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart) {
String textToSplit = DataTypeUtils.getAsPresentationString(entityPart.getModelEntity());
int selectionStart = entityPart.getSelectionStart();
int selectionEnd = entityPart.getSelectionEnd();
if (selectionStart < 0 || selectionEnd < 0)
selectionStart = selectionEnd = entityPart.getCaretPosition();
String selectedText = textToSplit.substring(selectionStart, selectionEnd);
return BindingManagerFactory.instance.createValue(selectedText);
}
});
}
public static IEntityIterator<IEntity> caretRightTextIterator() {
return IteratorFactory.singleValuedRunnableIterator(new TextualEntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart) {
String textToSplit = DataTypeUtils.getAsPresentationString(entityPart.getModelEntity());
int selectionEnd = entityPart.getSelectionEnd();
if (selectionEnd < 0)
selectionEnd = entityPart.getCaretPosition();
String rightText = textToSplit.substring(selectionEnd);
return BindingManagerFactory.instance.createValue(rightText);
}
});
}
public static IEntityIterator<IEntity> caretPositionsIterator() {
return IteratorFactory.singleValuedRunnableIterator(new TextualEntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart) {
return BindingManagerFactory.instance.createValue(entityPart.getCaretPositions());
}
});
}
public static IEntityIterator<IEntity> caretPositionIterator() {
return IteratorFactory.singleValuedRunnableIterator(new TextualEntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart) {
return BindingManagerFactory.instance.createValue(entityPart.getCaretPosition());
}
});
}
public static IEntityIterator<IEntity> caretPositionStartIterator() {
return IteratorFactory.singleValuedRunnableIterator(new TextualEntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart) {
int selectionStart = entityPart.getSelectionStart();
if (selectionStart < 0)
selectionStart = entityPart.getCaretPosition();
return BindingManagerFactory.instance.createValue(selectionStart);
}
});
}
public static IEntityIterator<IEntity> caretPositionEndIterator() {
return IteratorFactory.singleValuedRunnableIterator(new TextualEntityPartSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, ITextualEntityPart entityPart) {
int selectionEnd = entityPart.getSelectionEnd();
if (selectionEnd < 0)
selectionEnd = entityPart.getCaretPosition();
return BindingManagerFactory.instance.createValue(selectionEnd);
}
});
}
public static IEntityIterator<IEntity> entityFigureIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityFigure entityFigure) {
return BindingManagerFactory.instance.createValue(entityFigure);
}
});
}
public static IEntityIterator<IEntity> entityFigureParentIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityFigure entityFigure) {
IEntityFigure parent = (IEntityFigure) entityFigure.getParent();
return parent != null ? BindingManagerFactory.instance.createValue(entityFigure) : null;
}
});
}
public static IEntityIterator<IEntity> entityFigureChildrenIterator() {
return IteratorFactory.multiValuedRunnableIterator(new EntityFigureMultiValuedPropertyRunnable() {
protected IEntityIterator<?> getPropertyIterator(IEntityPartViewer viewer, IEntityFigure entityFigure) {
return IteratorFactory.collectionIterator(
entityFigure.getChildren(),
IDataTypeWrapper.envObjectValue);
}
});
}
public static IEntityIterator<IEntity> entityFigureIsVisibleIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityFigure entityFigure) {
return BindingManagerFactory.instance.createValue(entityFigure.isVisible());
}
});
}
public static IEntityIterator<IEntity> entityFigureIsShowingIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityFigure entityFigure) {
return BindingManagerFactory.instance.createValue(entityFigure.isShowing());
}
});
}
public static IEntityIterator<IEntity> entityFigureClosestAboveIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityFigure entityFigure) {
return BindingManagerFactory.instance.createValue(FigureUtils.getClosestAbove(viewer, entityFigure));
}
});
}
public static IEntityIterator<IEntity> entityFigureClosestBelowIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, IEntityFigure entityFigure) {
return BindingManagerFactory.instance.createValue(FigureUtils.getClosestBelow(viewer, entityFigure));
}
});
}
public static IEntityIterator<IEntity> entityFigureBoundsIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureBoundsSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, Rectangle bounds) {
return BindingManagerFactory.instance.createValue(bounds);
}
});
}
public static IEntityIterator<IEntity> entityFigureBoundsClosestAboveIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureBoundsSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, Rectangle bounds) {
return BindingManagerFactory.instance.createValue(FigureUtils.getClosestAbove(viewer, bounds));
}
});
}
public static IEntityIterator<IEntity> entityFigureBoundsClosestBelowIterator() {
return IteratorFactory.singleValuedRunnableIterator(new EntityFigureBoundsSingleValuedPropertyRunnable() {
protected IEntity getProperty(IEntityPartViewer viewer, Rectangle bounds) {
return BindingManagerFactory.instance.createValue(FigureUtils.getClosestBelow(viewer, bounds));
}
});
}
}