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

Thomas,

It might also be achieved by setting a SPECIAL layout
manager for FigureA. In the layout() method, dispatch
all children figures into sub panels.

Ryan

Thomas Maier wrote on 2004-4-30 22:21:

> 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.
>