2013-09-26 3 views
1

저는 Eclipse에서 GEF 기반의 그래픽 편집기를 사용하여 xml 모델을 설명 (및 편집)하려고합니다. 내 xml 모델은 상위 - 하위 계층 구조에서 최대 5 개의 레벨을 가질 수 있습니다. 계층 구조의 각 요소는 자체 EditPart (상자 모양)입니다. 하위 요소는 부모 상자 내에 포함 된 "상자"EditParts로 표시됩니다.GEF - 부모의 다른 그림 아래에 자식 EditPart가 그려져 있습니까?

내 EditPart의 각 자손은 draw2d Figure를 가지며, 그 자체로 적어도 두 개 또는 세 개의 (장식용) draw2d 수치 자체. 장식용 인물은 Header Rectangle, 내용 사각형, 레이블 등등입니다. EditPart의 하위 EditParts 위에 그려지는 이러한 장식 인물을보고 있습니다. 이는 어떤 EditParts 자식도 볼 수 없다는 것을 의미합니다.

나는 그림의 부모의의 EditPart의 스택의 최상위로 이동하는 내가 수동으로 아이의 EditPart의 그림을 강제 곳의 일을 주위했다 :
@Override 
protected void refreshVisuals() { 

    super.refreshVisuals(); 

    IFigure figure = getFigure(); 

    if(figure instanceof BaseElementFigure){ 
     //Refresh the figure... 
     ((BaseElementFigure) figure).refresh(this); 
    } 
    if (figure.getParent() != null) { 
     //This moves the figure to the top of its parent's stack so it is not drawn behind the parent's other (decorative) figures 
     figure.getParent().add(figure); 

     ((GraphicalEditPart) getParent()).setLayoutConstraint(this, figure, getBounds()); 
    } 

    refreshChildrenVisuals(); 
} 

그러나, 이것은 부분적으로 만했다. 하위 EditPart가 이제 부모 EditPart 위에 렌더링되었지만 Gef에 관한 한 그 아래에있었습니다. 드롭 리스너 및 툴팁과 같은 일부 Gef 이벤트는 하위 EditPart가없는 것처럼 동작합니다.

편집 :

의 EditPart의 그림이 PageFigure 그것이 자신의 장식 아이 그림의 구축 그림의 서브 클래스입니다

@Override 
protected IFigure createFigure() { 
    return new PageFigure(this); 
} 

를 다음과 같이 만들어집니다. 무슨 일이 일어나고 무엇

public class PageFigure extends Figure { 

    protected Label headerLabel; 
    protected RectangleFigure contentRectangle; 
    protected RectangleFigure headerRectangle; 

    private UiElementEditPart context; 


    public PageFigure(UiElementEditPart context) { 
     this.context = context; 
     setLayoutManager(new XYLayout()); 

     this.contentRectangle = new RectangleFigure(); 
     contentRectangle.setFill(false); 
     contentRectangle.setOpaque(false); 

     this.headerRectangle = new RectangleFigure(); 
     headerRectangle.setFill(false); 
     headerRectangle.setOpaque(false); 

     this.headerLabel = new Label(); 
     headerLabel.setForegroundColor(ColorConstants.black); 
     headerLabel.setBackgroundColor(ColorConstants.lightGray); 
     headerLabel.setOpaque(true); 
     headerLabel.setLabelAlignment(Label.LEFT); 
     headerLabel.setBorder(new MarginBorder(0, 5, 0, 0)); 

     headerRectangle.add(headerLabel); 

     add(contentRectangle); 
     add(headerRectangle); 

     //Initializing the bounds for these figures (including this one) 
     setBounds(context.getBounds()); 

     contentRectangle.setBounds(new Rectangle(this.getBounds().x, this.getBounds().y + 20, this.getBounds().width, this.getBounds().height - 20)); 


     Rectangle headerBounds = new Rectangle(this.getBounds().x, this.getBounds().y, this.getBounds().width, 20); 
     headerRectangle.setBounds(headerBounds); 

     headerLabel.setBounds(new Rectangle(headerBounds.x + 30, headerBounds.y, headerBounds.width - 30, 20)); 
    } 
} 
+0

어떻게'EditPart'의 그림이 생성됩니까? 여기에 간단한 버전을 게시 할 수 있습니까? – vainolo

+0

위 참조 편집! – icyitscold

+0

장식용 인물은 어디 있습니까? – vainolo

답변

2

은 GEF가 PageFigure에 아이에게 EditPart 수치를 추가하고, 마지막 그림에서 시작 GEF에서 그림의 순서를 추가하고 상단에있는 숫자는 스택처럼 이전에 추가 한 것입니다. 이것이 귀하의 자녀 EditPart의 수치가 학부모의 자녀 수치 인 EditPart보다 낮은 이유입니다.

할 수있는 일은 콘텐츠 창 그림을 추가하여 하위 그림이 포함될 그림을 만들고 EditPart의 그림에 추가 된 첫 번째 그림으로 만듭니다. 그런 다음 그림의 contentPane을 덮어 쓰면 모든 그림이이 그림에 추가됩니다.

이 방법이 도움이되지 않는다면이 주제에 대한 튜토리얼을 확인하십시오. 나는 세부 사항의 일부를 잊었을지도 모른다 : http://www.vainolo.com/2011/09/01/creating-an-opm-gef-editor-%E2%80%93-part-17-how-to-define-container-edit-parts/.

+0

고마워요! 나는 이것이 무슨 일이 벌어지고 있는지를 알았지 만 내용 창구에 대해서는 몰랐습니다. 나는 이것을 밖으로 시도하고 모든 것이 잘 풀린다면 대답을 받아 들일 것입니다! – icyitscold

+0

컨테이너 EditPart를 구현하는 올바른 방법을 보여 주었기 때문에 대답을 받아들입니다. 내가 경험 한 많은 단점들이 해결되었습니다. 그러나 여전히 주요 쟁점 (하위 편집 부분은 맨 위에 그려지지만 GEF 이벤트는 그 부분을 통과)이 표시됩니다. 나는 이것을 해결하기 위해 많은 디버깅을해야 할 것이라고 생각한다. – icyitscold

+0

FYI에서 마침내이 마지막 수정 (내 자식 편집 부분을 통과하는 GEF 끌기 이벤트)이 수정되었습니다. 컨테이너 수정 부분에 새 CONTAINER_ROLE editpolicy를 추가했습니다. 블로그에있는 코드를 자세히 검토하여이 사실을 발견했습니다. 다시 한 번 감사드립니다. – icyitscold