Eclipse

GEF - Diagram 생성

_침묵_ 2007. 3. 31. 23:54

원을 줄이기 위해서는 에디터의 그려지는 영역을 담당한 Diagram이 필요하다. Diagram은 도화지의 역할을 한다고 생각하면 된다.그리고 원은 그 위에 특정 크기만큼 그리면 되는 것이다.

Diagram위에 그려지는 원은 Diagram에서 알고 있어야 한다. 그래야 새로고침이 되거나, 자식이 이동을 했을때, 다시 그려질 수 있다. 이 목록은 Diagram에서 List로 관리를 한다.

 

1.ShapesDiagram

Diagram의 가장 큰 역할은 그려지는 개체를 관리하는 것이다. List의 순서는 그려질때 중요하게 사용된다. 즉 원과 원이 겹칠때 어느 원이 아래로 오게 할지는 List의 순서에 따라 정해진다.

public class ShapesDiagram {
 private List shapes = new ArrayList();
 public List getChildren() {
  return shapes;
 }
 public void addChild(Shape s) {
  shapes.add(s);
 }
 public void removeChild(Shape s) {
  shapes.remove(s);
 }
}

 

2.DiagramEditPart

Diagram하고 매핑될 Editpart는 Shape와 마찬가지로 필요하다. 조금 틀린점은 화면에 보이지 않는 Figure를 사용한다는 점과 Layout을 지정하는 것이다. Layout은 SWT에서와 마찬가지로 화면에 보여질 Figure를 어떻게 배치를 할지를 정하게 된다. 즉 Diagram이 가지고 있는 Child Model들을 배치하는 방법을 Layout에서 정하게 된다.

public class DiagramEditPart extends AbstractGraphicalEditPart{
 protected IFigure createFigure() {
  Figure f = new FreeformLayer();
  f.setBorder(new MarginBorder(3));
  f.setLayoutManager(new FreeformLayout());
  return f;
 }

}

FreeFormLayout은 xyLayout을 상속받았다. 시작위치를 0,0으로 지정한 거외에는 사실 XYLayout하고 동일하다. XYLayout은 자유롭게 배치가 가능한 Layout이다. SWT처럼 여러 Layout이 있는데, 이는 다음에 다시 기술한다.

 

3.DiagramEditPart

Factory에서 Model과 Editpart를 연결시킨다.

private EditPart getPartForElement(Object model)
 {
  if (model instanceof Shape) {
   return new ShapeEditPart();
  }
  
  if (model instanceof ShapesDiagram) {
   return new DiagramEditPart();
  }
  
  throw new RuntimeException(
    "Can't create part for model element: "
    + ((model != null) ? model.getClass().getName() : "null"));
 }

 

4.ShapesEditor 수정

Editor에서 초기값으로 원을 지정을 했었다. 이부분을 Diagram으로 변경을 해주어야 한다.

즉 화면에 보여지는 Figure는 Diagram이 되는 것이다.

protected void initializeGraphicalViewer() {
  super.initializeGraphicalViewer();
  
  GraphicalViewer viewer = getGraphicalViewer();
  viewer.setContents(new ShapesDiagram());
 }

 

이제 다시 실행해서 보면 Diagram만이 그려져있기 때문에 에디터에 아무런 Figure가 보이지 않는다. Diagram에 원을 추가해 보도록 하자.

 

'Eclipse' 카테고리의 다른 글

GEF - 원그리기  (0) 2007.03.31
GEF - XYLayout  (0) 2007.03.31
상단에 탭이 있는 Dialog 만들기  (0) 2007.03.31