Как реализовать `CompositeView`, чтобы он корректно отображал компоненты?

Я работаю над Markdown EditorKit (из javax.swing.text).
Парсер, похоже, работает нормально, но теперь мне нужно сделать ViewFactory.

Тестовая строка разбирается так, что получается следующая структура:

root
| - paragraph
| | - text
| - list
| | - paragraph
| | | - text
| | | - code span
| | | - text

Параграф преобразуется в BoxView(elem, X_AXIS), он работает отлично.
Текст преобразуется в мой собственный View, и это тоже работает.
Список преобразуется в мой CompositeView, и вот тут основная проблема.

У меня есть следующие классы:

class MDListView extends MarkdownContainerView {
public MDListView(MDList e, ViewFactory f) {
super(e);
}
public float getPreferredSpan(int axis) {
// Возвращает корректный непустой прямоугольник.
}
public Shape getChildAllocation(int index, Shape s) {
Rectangle r = s.getBounds();
return new Rectangle(r.x, r.y + (int)(index * getPreferredSpan(Y_AXIS) / getViewCount()), r.width, r.height / getViewCount());
}
public void replace(int offset, int length, View[] views) {
super.replace(offset, length, views);
// Некоторая дополнительная логика
}
protected void childAllocation(int index, Rectangle a) {
a.setBounds(getChildAllocation(index, a).getBounds());
}
}

и

static abstract class MarkdownContainerView extends CompositeView {
public MarkdownContainerView(Element e) {
super(e);
}
public void paint(Graphics g, Shape allocation) {
for (int i = 0; i < getViewCount(); ++i) {
Shape a = getChildAllocation(i, allocation);
if (a != null) getView(i).paint(g, a);
}
}
/**
* Заглушка, добавлена для совместимости.
* Не имеет смысла для документов только для чтения.
* @see View#modelToView(int, Shape, Bias)
/
public Shape modelToView(int pos, Shape a, Bias b) throws BadLocationException {
return new Rectangle();
}
/*
* Заглушка, добавлена для совместимости.
* Не имеет смысла для документов только для чтения.
* @see View#viewToModel(float, float, Shape, Bias[])
*/
public int viewToModel(float x, float y, Shape a, Bias[] biasReturn) {
return 0;
}
protected boolean isBefore(int x, int y, Rectangle alloc) {
return (alloc.outcode(x, y) & Rectangle.OUT_LEFT) != 0;
}
protected boolean isAfter(int x, int y, Rectangle alloc) {
return (alloc.outcode(x, y) & Rectangle.OUT_RIGHT) != 0;
}
protected View getViewAtPoint(int x, int y, Rectangle alloc) {
return null;
}
}

Я также выяснил, что childAllocation у параграфа внутри списка (то есть BoxView) — это пустой прямоугольник (через отладчик).

Что не так с моим кодом?


Ответы (0 шт):