[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[news.eclipse.tools.gef] Reparenting child figures to children from contentPane

Hi all,

I have a figure of type FigureA and I want its children of type Model1 and Model2 not to be placed in its contentPane but in two other Panels of type Panel1 or Panel2 that are children of the contentPane. I thought I could tell the editparts of type EditPart1 (and EditPart2, respectively) something like (in createFigure(), casts omitted)

  Figure1 figure1 = new Figure1();
  getParent().getFigure().getPanel1().add(figure1);
  return figure1;

but GEF reparents the figure to FigureA's contentPane. So I thought I say, in EditPart1::refreshVisuals():

  getParent().getFigure().remove(getFigure());
  getParent().getFigure().getPanel1().add(getFigure());

I tried it with the remove and without. For some objects it works and displays correctly, for some it throws an exception:

java.lang.IndexOutOfBoundsException: IWAG0001E Figure.add(...) invalid index
at org.eclipse.draw2d.Figure.add(Figure.java:101)
at org.eclipse.draw2d.Figure.add(Figure.java:148)
at org.eclipse.gef.editparts.AbstractGraphicalEditPart.addChildVisual(AbstractGraphicalEditPart.java:182)
at org.eclipse.gef.editparts.AbstractEditPart.addChild(AbstractEditPart.java:183)
at org.eclipse.gef.editparts.AbstractEditPart.refreshChildren(AbstractEditPart.java:742)
at org.eclipse.gef.editparts.AbstractEditPart.refresh(AbstractEditPart.java:694)
at org.eclipse.gef.editparts.AbstractGraphicalEditPart.refresh(AbstractGraphicalEditPart.java:538)
at org.eclipse.gef.editparts.AbstractEditPart.addNotify(AbstractEditPart.java:221)
at org.eclipse.gef.editparts.AbstractGraphicalEditPart.addNotify(AbstractGraphicalEditPart.java:196)
at org.eclipse.gef.editparts.AbstractEditPart.addChild(AbstractEditPart.java:184)
at org.eclipse.gef.editparts.AbstractEditPart.refreshChildren(AbstractEditPart.java:742)
at org.eclipse.gef.editparts.AbstractEditPart.refresh(AbstractEditPart.java:694)


I have skimmed some GEF methods and it seems to like to keep the indices for models, editparts and figures identical, so at org.eclipse.gef.editparts.AbstractGraphicalEditPart.addChildVisual there is

protected void addChildVisual(EditPart childEditPart, int index) {
	IFigure child = ((GraphicalEditPart)childEditPart).getFigure();
	getContentPane().add(child, index);
}

which leads to the IndexOutOfBoundsException later on in Figure.add(), because the children are "kidnapped" and there are less than GEF supposes.

It seems to me GEF does not like it when reparenting children this way. Is there another way to achieve it? From a user point of view I would have thought (and actually did) that when returning a figure from createFigure() that already has a parent, that might be respected and a new parent only set when it is null. Thoughts?

Thanks and regards, Thomas.

--
Thomas Maier <Thomas.Maier@xxxxxxxxxxxxx>