/******************************************************************************
* Copyright (c) 2016 Oracle
* 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:
* Ling Hao - initial implementation and ongoing maintenance
******************************************************************************/
package org.eclipse.sapphire.ui.swt.gef.parts;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.sapphire.ui.def.HorizontalAlignment;
import org.eclipse.sapphire.ui.diagram.shape.def.LayoutConstraintDef;
import org.eclipse.sapphire.ui.diagram.shape.def.SequenceLayoutConstraintDef;
import org.eclipse.sapphire.ui.diagram.shape.def.SequenceLayoutDef;
import org.eclipse.sapphire.ui.diagram.shape.def.SequenceLayoutOrientation;
import org.eclipse.sapphire.ui.diagram.shape.def.ShapeLayoutDef;
import org.eclipse.sapphire.ui.swt.gef.DiagramConfigurationManager;
import org.eclipse.sapphire.ui.swt.gef.layout.SapphireSequenceLayoutConstraint;
import org.eclipse.sapphire.ui.swt.gef.layout.SapphireStackLayoutConstraint;
import org.eclipse.sapphire.ui.swt.gef.model.DiagramResourceCache;
import org.eclipse.sapphire.ui.swt.gef.presentation.ContainerShapePresentation;
import org.eclipse.sapphire.ui.swt.gef.presentation.ShapePresentation;
/**
* @author <a href="mailto:ling.hao@oracle.com">Ling Hao</a>
*/
public class ShapeUtil {
public static boolean updateFigureForShape(ShapePresentation updateShape, DiagramResourceCache resourceCache, DiagramConfigurationManager configManager)
{
if (updateShape == null || updateShape instanceof ContainerShapePresentation) {
return false;
}
IFigure updateFigure = updateShape.getFigure();
IFigure containerFigure = updateShape.getParentFigure();
if (updateShape.visible())
{
ContainerShapePresentation containerPresentation = (ContainerShapePresentation)updateShape.parent();
// find the parent figure
if (containerFigure != null)
{
int index = containerPresentation.getChildFigureIndex(updateShape);
if (updateFigure != null)
{
// first delete it
containerFigure.remove(updateFigure);
}
// add it
updateShape.render();
updateFigure = updateShape.getFigure();
if (updateFigure != null)
{
Object layoutConstraint = getLayoutConstraint(updateShape, containerPresentation.getLayout());
if (layoutConstraint != null)
{
containerFigure.add(updateFigure, layoutConstraint, index);
}
else
{
containerFigure.add(updateFigure, index);
}
}
containerFigure.revalidate();
}
}
else if (!updateShape.visible() && updateFigure != null)
{
// remove it
updateShape.removeFigure();
containerFigure.remove(updateFigure);
containerFigure.revalidate();
}
return true;
}
public static Object getLayoutConstraint(ShapePresentation childShapePresentation, ShapeLayoutDef layoutDef)
{
Object layoutConstraint = null;
if (layoutDef instanceof SequenceLayoutDef)
{
if (((SequenceLayoutDef)layoutDef).getOrientation().content() != SequenceLayoutOrientation.STACKED)
{
SequenceLayoutConstraintDef def = (SequenceLayoutConstraintDef)childShapePresentation.getLayoutConstraint();
layoutConstraint = new SapphireSequenceLayoutConstraint(def);
}
else
{
SapphireStackLayoutConstraint constraint = null;
if (childShapePresentation.getLayoutConstraint() != null)
{
SequenceLayoutConstraintDef constraintDef =
(SequenceLayoutConstraintDef)childShapePresentation.getLayoutConstraint();
if (constraintDef != null)
{
constraint = new SapphireStackLayoutConstraint(
constraintDef.getHorizontalAlignment().content(),
constraintDef.getVerticalAlignment().content(),
constraintDef.getMarginTop().content(),
constraintDef.getMarginBottom().content(),
constraintDef.getMarginLeft().content(),
constraintDef.getMarginRight().content());
}
}
layoutConstraint = constraint != null ? constraint : new SapphireStackLayoutConstraint();
}
}
return layoutConstraint;
}
public static int getTextAlignment(LayoutConstraintDef constraint)
{
int alignment = PositionConstants.CENTER;
HorizontalAlignment sapphireAlign = constraint.getHorizontalAlignment().content();
switch (sapphireAlign)
{
case LEFT:
alignment = PositionConstants.LEFT;
break;
case RIGHT:
alignment = PositionConstants.RIGHT;
break;
default:
break;
}
return alignment;
}
public static int getPresentationCount(ContainerShapePresentation parentPresentation, ShapePresentation shapePresentation) {
int count = 0;
for (ShapePresentation sp : parentPresentation.getChildren()) {
if (shapePresentation.equals(sp)) {
return count;
}
if (!(sp instanceof ContainerShapePresentation)) {
count++;
}
}
return count;
}
}