2013-09-26 4 views
1

Я пытаюсь проиллюстрировать (и отредактировать) модель xml с графическим редактором GEF в eclipse. Моя xml-модель может иметь до пяти уровней в иерархии родитель-потомок. Каждый элемент в иерархии - это собственный EditPart (который выглядит как коробка). Детальные элементы будут представлены как «box» EditParts, содержащиеся в поле их родителя, и так далее ...GEF - дочерние элементы EditParts, которые рисуются ниже других фигур Parent?

В каждом из моих EditParts будет фигура draw2d, которая сама по себе будет иметь как минимум две или три (декоративные) draw2d собственные. Декоративные фигуры - это такие, как Header Rectangle, content Rectangles, label и т. Д. Я вижу, что эти декоративные фигуры рисуются над дочерним элементом 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 теперь обрабатывался над Parent EditPart, но в отношении Gef это было ниже - некоторые события Gef, такие как drop-слушатели и всплывающая подсказка, будут вести себя так, как если бы дочерний EditPart не существовал.

Edit:

облеченного EditPart в создается следующим образом

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

Где PageFigure является подклассом чертеж, который строит свои собственные декоративные фигурки ребенка.

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

См. Выше edit! – icyitscold

+0

Где находятся декоративные фигуры? – vainolo

ответ

2

Что происходит, что ГЭФ является добавление ребенку EditPart цифры в PageFigure, а также порядок оформления в ГЭФ, начиная с последней цифры добавлены и сверху цифры добавлены до, как стек. Вот почему цифры вашего ребенка EditPart s ниже дочерних показателей родителя EditPart.

Что вы можете сделать, это добавить содержимое панели фигуры, которая будет содержать дочерние фигуры, и сделать это первой цифрой, которая добавляется к фигуре EditPart «s. Затем переопределите цифру 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

Я принимаю ответ, потому что он показал мне правильный способ реализации контейнера EditParts. Многие причуды, которые я испытывал, были решены. Тем не менее, я по-прежнему вижу основную проблему (детали редактирования для детей рисуются сверху, но через них проходят GEF-события). Я бы предположил, что мне придется сделать много отладки, чтобы исправить это. – icyitscold

+0

Как FYI, я, наконец, исправил это - моя последняя проблема (события GEF-перетаскивания, проходящие через часть моего дочернего редактирования) была исправлена, добавив новую редактирующую команду CONTAINER_ROLE в мои части редактирования контейнера. Я обнаружил это, более внимательно рассмотрев код, расположенный в вашем блоге! еще раз спасибо – icyitscold

Смежные вопросы