From b85b9b3e3e881b39e55983fa59d3bac3705b3b83 Mon Sep 17 00:00:00 2001 From: Patrick Ziegler Date: Sat, 10 Oct 2026 21:25:13 +0200 Subject: [PATCH] [GEF] Remove `IPreferredSizeProvider` in `TopFigure` The preferred size of the TopFigure is determined by the size of children and which should be calculated using the `XYLayout`. Note that this requires the bounds of its children to be explicitly set as constraints, when refreshing the edit-part. Because this is not yet done for all edit-parts, the current implementation (setting the figure bounds directly) is kept for backwards-compatibility, in case no layout manager is used. --- .../gef/part/AbstractComponentEditPart.java | 10 ++++++- .../core/gef/part/DesignRootEditPart.java | 23 ++------------ .../draw2d/IPreferredSizeProvider.java | 28 ----------------- .../wb/internal/draw2d/RootFigure.java | 30 ++++--------------- .../swing/model/top/JFrameTopBoundsTest.java | 1 + .../swing/model/top/JPanelTopBoundsTest.java | 1 + .../model/widgets/CompositeTopBoundsTest.java | 1 + 7 files changed, 20 insertions(+), 74 deletions(-) delete mode 100644 org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/IPreferredSizeProvider.java diff --git a/org.eclipse.wb.core.java/src/org/eclipse/wb/core/gef/part/AbstractComponentEditPart.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/core/gef/part/AbstractComponentEditPart.java index 287707a0ab..94aff02fa0 100644 --- a/org.eclipse.wb.core.java/src/org/eclipse/wb/core/gef/part/AbstractComponentEditPart.java +++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/core/gef/part/AbstractComponentEditPart.java @@ -32,6 +32,7 @@ import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.LayoutManager; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; @@ -125,7 +126,14 @@ protected void refreshVisuals() { bounds = new Rectangle(0, 0, 0, 0); } // set bounds - getFigure().setBounds(bounds); + GraphicalEditPart parent = (GraphicalEditPart) getParent(); + LayoutManager layoutManager = parent == null ? null : parent.getFigure().getLayoutManager(); + if (layoutManager == null) { + // TODO ptziegler - for backwards compatibility; All designer figures should use the XYLayout + getFigure().setBounds(bounds); + } else { + parent.setLayoutConstraint(this, getFigure(), bounds); + } } /** diff --git a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/part/DesignRootEditPart.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/part/DesignRootEditPart.java index 5ce596d6c4..96c9f8ba5f 100644 --- a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/part/DesignRootEditPart.java +++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/part/DesignRootEditPart.java @@ -21,13 +21,12 @@ import org.eclipse.wb.internal.core.model.DesignRootObject; import org.eclipse.wb.internal.core.model.nonvisual.NonVisualBeanInfo; import org.eclipse.wb.internal.draw2d.FigureCanvas; -import org.eclipse.wb.internal.draw2d.IPreferredSizeProvider; import org.eclipse.draw2d.Border; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.MarginBorder; -import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.XYLayout; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; @@ -153,6 +152,7 @@ public EditPart getJavaRootEditPart() { @Override protected IFigure createFigure() { IFigure figure = new TopFigure(); + figure.setLayoutManager(new XYLayout()); figure.setBorder(DESIGN_MARGIN); return figure; } @@ -160,7 +160,7 @@ protected IFigure createFigure() { /** * Special {@link IFigure} that cover full area of parent. */ - private static final class TopFigure extends Figure implements IPreferredSizeProvider { + private static final class TopFigure extends Figure { //////////////////////////////////////////////////////////////////////////// // // Figure @@ -182,22 +182,5 @@ public boolean useLocalCoordinates() { // location as they are all relative to the root component. return true; } - - //////////////////////////////////////////////////////////////////////////// - // - // IPreferredSizeProvider - // - //////////////////////////////////////////////////////////////////////////// - @Override - public Dimension getPreferredSize(Dimension originalPreferredSize) { - Rectangle preferred = new Rectangle(); - for (IFigure figure : getChildren()) { - if (figure.isVisible()) { - preferred.union(figure.getBounds()); - } - } - preferred.expand(getInsets()); - return preferred.getSize(); - } } } \ No newline at end of file diff --git a/org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/IPreferredSizeProvider.java b/org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/IPreferredSizeProvider.java deleted file mode 100644 index 63c81188ee..0000000000 --- a/org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/IPreferredSizeProvider.java +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Google, Inc. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * https://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Google, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.wb.internal.draw2d; - -import org.eclipse.draw2d.geometry.Dimension; - -/** - * An interface to size providers for preferred-size-oriented figures. - * - * @author lobas_av - * @coverage gef.draw2d - */ -public interface IPreferredSizeProvider { - /** - * Calculate new preferred size use original preferred size. - */ - Dimension getPreferredSize(Dimension originalPreferredSize); -} \ No newline at end of file diff --git a/org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/RootFigure.java b/org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/RootFigure.java index c12f92fe49..08cb8aa6bc 100644 --- a/org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/RootFigure.java +++ b/org.eclipse.wb.core/src-draw2d/org/eclipse/wb/internal/draw2d/RootFigure.java @@ -17,6 +17,7 @@ import org.eclipse.draw2d.Layer; import org.eclipse.draw2d.StackLayout; import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import java.util.ArrayList; @@ -31,7 +32,6 @@ public class RootFigure extends Figure implements IRootFigure { private Dimension m_preferredSize; private Map m_nameToLayer = new HashMap<>(); - private IPreferredSizeProvider m_preferredSizeProvider; //////////////////////////////////////////////////////////////////////////// // @@ -43,19 +43,6 @@ public RootFigure() { setLayoutManager(new StackLayout()); } - //////////////////////////////////////////////////////////////////////////// - // - // Access - // - //////////////////////////////////////////////////////////////////////////// - - /** - * Sets figure preferred size provider. - */ - public void setPreferredSizeProvider(IPreferredSizeProvider provider) { - m_preferredSizeProvider = provider; - } - //////////////////////////////////////////////////////////////////////////// // // RootFigure @@ -76,21 +63,14 @@ public Dimension getPreferredSize(int wHint, int hHint) { // figure's loop for (IFigure figure : layer.getChildren()) { if (figure.isVisible()) { - if (figure instanceof IPreferredSizeProvider provider) { - Dimension figurePreferredSize = provider.getPreferredSize(null); - preferred.union(0, 0, figurePreferredSize.width, figurePreferredSize.height); - } else { - preferred.union(figure.getBounds()); - } + Point figureLocation = figure.getLocation(); + Dimension figurePreferredSize = figure.getPreferredSize(wHint, hHint); + preferred.union(figureLocation.x, figureLocation.y, figurePreferredSize.width, figurePreferredSize.height); } } } // set preferred size - if (m_preferredSizeProvider == null) { - m_preferredSize = preferred.getSize(); - } else { - m_preferredSize = m_preferredSizeProvider.getPreferredSize(preferred.getSize()); - } + m_preferredSize = preferred.getSize(); } return m_preferredSize; } diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JFrameTopBoundsTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JFrameTopBoundsTest.java index c824bf20cb..336506dce7 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JFrameTopBoundsTest.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JFrameTopBoundsTest.java @@ -293,6 +293,7 @@ public Test() { waitEventLoop(50); canvas.beginResize(frame, PositionConstants.SOUTH); canvas.dragTo(frame, 0, resizeSize.height).endDrag(); + waitEventLoop(50); // check new size assertEquals(newSize, canvas.getSize(frame)); assertEditor(""" diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JPanelTopBoundsTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JPanelTopBoundsTest.java index c03c46d140..96cabd7a4a 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JPanelTopBoundsTest.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swing/model/top/JPanelTopBoundsTest.java @@ -142,6 +142,7 @@ public Test() { canvas.dragTo(panel, newSize.width, 0).endDrag(); canvas.beginResize(panel, PositionConstants.SOUTH); canvas.dragTo(panel, 0, newSize.height).endDrag(); + waitEventLoop(50); // check new size assertEquals(newSize, canvas.getSize(panel)); assertEditor(""" diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTopBoundsTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTopBoundsTest.java index 830b84bb58..fccb9653ff 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTopBoundsTest.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/swt/model/widgets/CompositeTopBoundsTest.java @@ -133,6 +133,7 @@ public Test(Composite parent, int style) { canvas.dragTo(composite, resizeSize.width, 0).endDrag(); canvas.beginResize(composite, PositionConstants.SOUTH); canvas.dragTo(composite, 0, resizeSize.height).endDrag(); + waitEventLoop(50); // check new size assertEquals(newSize, canvas.getSize(composite)); assertEditor("""