/*****************************************************************************
* Copyright (c) 2009 CEA
*
*
* 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:
* Atos Origin - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.sequence.figures;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LayoutManager;
import org.eclipse.draw2d.TreeSearch;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure;
import org.eclipse.papyrus.uml.diagram.common.draw2d.LifelineDotLineFigure;
import org.eclipse.papyrus.uml.diagram.common.figure.node.NodeNamedElementFigure;
/**
* The figure of the LifelineDotLine
*/
public class LifelineDotLineCustomFigure extends LifelineDotLineFigure {
/**
* Layout manager for the inline mode
*/
private LayoutManager inlineModeManager;
/**
* Layout manager for the inline mode
*/
private LayoutManager normalModeManager;
/**
* True if the lifeline is in inline mode
*/
private boolean inlineMode;
/**
* Number of inner ConnectableElements
*/
private int innerConnectableElementsNumber;
/**
* Default constructor
*/
public LifelineDotLineCustomFigure() {
super();
normalModeManager = new XYLayout();
/*
inlineModeManager = new FlowLayout(true) {
{
majorSpacing = 10;
minorSpacing = 10;
fill = true;
}
@Override
protected Dimension getChildSize(IFigure child, int wHint, int hHint) {
wHint = getParent().getBounds().width;
hHint = getParent().getBounds().height;
if(innerConnectableElementsNumber > 0) {
wHint /= innerConnectableElementsNumber;
}
if(!child.getParent().getChildren().get(innerConnectableElementsNumber - 1).equals(child)) {
wHint = wHint - majorSpacing;
}
((Figure)child).setPreferredSize(wHint, hHint);
Dimension childSize = super.getChildSize(child, wHint, hHint);
return childSize;
}
@Override
protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) {
Dimension calculatePreferredSize = super.calculatePreferredSize(container, wHint, hHint);
calculatePreferredSize.width = wHint;
calculatePreferredSize.height = hHint;
return calculatePreferredSize;
}
};
*/
inlineModeManager = new XYLayout();
setLayoutManager(normalModeManager);
}
/**
* Configure the lifeline figure
*
* @param inlineMode
* true if inline mode enabled
* @param innerConnectableElementsNumber
* Number of children
*/
public void configure(boolean inlineMode, int innerConnectableElementsNumber) {
if(inlineMode) {
this.innerConnectableElementsNumber = innerConnectableElementsNumber;
}
if(this.inlineMode != inlineMode) {
this.inlineMode = inlineMode;
if(inlineMode) {
setLayoutManager(inlineModeManager);
} else {
setLayoutManager(normalModeManager);
}
}
}
/**
* Print lifeline if the edit part is not in inline mode
*/
protected void outlineShape(Graphics graphics) {
if(!inlineMode) {
super.outlineShape(graphics);
}
}
// fix bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=384616
public static class DefaultSizeNodeFigureEx extends DefaultSizeNodeFigure {
public DefaultSizeNodeFigureEx(int width, int height) {
super(width, height);
}
public IFigure findMouseEventTargetAt(int x, int y) {
// check children first instead of self
IFigure f = findMouseEventTargetInDescendantsAt(x, y);
if (f != null)
return f;
if (!containsPoint(x, y))
return null;
if (isMouseEventTarget())
return this;
return null;
}
public IFigure findFigureAt(int x, int y, TreeSearch search) {
if (search.prune(this))
return null;
IFigure child = findDescendantAtExcluding(x, y, search);
if (child != null)
return child;
if (!containsPoint(x, y))
return null;
if (search.accept(this))
return this;
return null;
}
};
public static class NodeNamedElementFigureEx extends NodeNamedElementFigure{
public IFigure findMouseEventTargetAt(int x, int y) {
// check children first instead of self
IFigure f = findMouseEventTargetInDescendantsAt(x, y);
if (f != null)
return f;
if (!containsPoint(x, y))
return null;
if (isMouseEventTarget())
return this;
return null;
}
public IFigure findFigureAt(int x, int y, TreeSearch search) {
if (search.prune(this))
return null;
IFigure child = findDescendantAtExcluding(x, y, search);
if (child != null)
return child;
if (!containsPoint(x, y))
return null;
if (search.accept(this))
return this;
return null;
}
}
}