diff --git a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/policy/OpenErrorLogEditPolicy.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/policy/OpenErrorLogEditPolicy.java
index a3bd31525..ad80f7089 100644
--- a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/policy/OpenErrorLogEditPolicy.java
+++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/policy/OpenErrorLogEditPolicy.java
@@ -15,6 +15,7 @@
import org.eclipse.wb.core.gef.part.AbstractComponentEditPart;
import org.eclipse.wb.core.model.JavaInfo;
import org.eclipse.wb.draw2d.FigureUtils;
+import org.eclipse.wb.gef.graphical.handles.DesignHandle;
import org.eclipse.wb.internal.core.DesignerPlugin;
import org.eclipse.wb.internal.core.editor.actions.errors.ErrorsAction;
import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils;
@@ -114,7 +115,7 @@ public void relocate(IFigure target) {
target.setBounds(new Rectangle(5, componentArea.bottom() - 5 - 16, 16, 16));
}
};
- m_figure = new org.eclipse.wb.gef.graphical.handles.Handle(m_editPart, locator) {
+ m_figure = new DesignHandle(m_editPart, locator) {
@Override
protected void paintClientArea(Graphics graphics) {
Image icon = DesignerPlugin.getImage("actions/errors/errors.gif");
diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/DesignHandle.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/DesignHandle.java
new file mode 100644
index 000000000..e4bd1f2e7
--- /dev/null
+++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/DesignHandle.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2026 Google, Inc. and others.
+ *
+ * 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.gef.graphical.handles;
+
+import org.eclipse.draw2d.Locator;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Tool;
+import org.eclipse.gef.handles.AbstractHandle;
+
+/**
+ * {@link Handle} will add an {@link IAncestorListener} to the owner's figure, and will
+ * automatically revalidate this handle whenever the owner's figure moves.
+ *
+ * @author lobas_av
+ * @coverage gef.graphical
+ */
+public abstract class DesignHandle extends AbstractHandle {
+
+ ////////////////////////////////////////////////////////////////////////////
+ //
+ // Constructor
+ //
+ ////////////////////////////////////////////////////////////////////////////
+ /**
+ * Creates a handle for the given {@link GraphicalEditPart} using the given
+ * {@link Locator}.
+ */
+ public DesignHandle(GraphicalEditPart owner, Locator locator) {
+ super(owner, locator);
+ }
+
+ /**
+ * Creates a new drag tracker {@link Tool} to be returned by {@link #getDragTracker()}.
+ */
+ @Override
+ protected final DragTracker createDragTracker() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/Handle.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/Handle.java
deleted file mode 100644
index b7e33cb93..000000000
--- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/Handle.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2026 Google, Inc. and others.
- *
- * 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.gef.graphical.handles;
-
-import org.eclipse.draw2d.AncestorListener;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Tool;
-
-/**
- * {@link Handle} will add an {@link IAncestorListener} to the owner's figure, and will
- * automatically revalidate this handle whenever the owner's figure moves.
- *
- * @author lobas_av
- * @coverage gef.graphical
- */
-public abstract class Handle extends Figure implements AncestorListener, org.eclipse.gef.Handle {
- private final GraphicalEditPart m_owner;
- private final Locator m_locator;
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // Constructor
- //
- ////////////////////////////////////////////////////////////////////////////
- /**
- * Creates a handle for the given {@link GraphicalEditPart} using the given
- * {@link Locator}.
- */
- public Handle(GraphicalEditPart owner, Locator locator) {
- m_owner = owner;
- m_locator = locator;
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // Figure
- //
- ////////////////////////////////////////////////////////////////////////////
- @Override
- public void addNotify() {
- super.addNotify();
- getOwnerFigure().addAncestorListener(this);
- revalidate();
- }
-
- @Override
- public void removeNotify() {
- getOwnerFigure().removeAncestorListener(this);
- super.removeNotify();
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // IAncestorListener
- //
- ////////////////////////////////////////////////////////////////////////////
- @Override
- public void ancestorMoved(IFigure ancestor) {
- revalidate();
- }
-
- @Override
- public void ancestorAdded(IFigure ancestor) {
- // unsupported
- }
-
- @Override
- public void ancestorRemoved(IFigure ancestor) {
- // unsupported
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // Revalidate
- //
- ////////////////////////////////////////////////////////////////////////////
- @Override
- public void revalidate() {
- getLocator().relocate(this);
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // Access
- //
- ////////////////////////////////////////////////////////////////////////////
- /**
- * Returns the {@link GraphicalEditPart} associated with this handle.
- */
- protected final GraphicalEditPart getOwner() {
- return m_owner;
- }
-
- /**
- * Convenience method to return the owner's figure.
- */
- protected final IFigure getOwnerFigure() {
- return getOwner().getFigure();
- }
-
- /**
- * Returns the {@link Locator} used to position this handle.
- */
- protected final Locator getLocator() {
- return m_locator;
- }
-
- ////////////////////////////////////////////////////////////////////////////
- //
- // DragTracker
- //
- ////////////////////////////////////////////////////////////////////////////
- private DragTracker m_dragTracker;
-
- /**
- * Returns the drag tracker {@link Tool} to use when the user clicks on this handle. If the drag
- * tracker has not been set, it will be lazily created by calling {@link #createDragTracker()}.
- */
- @Override
- public DragTracker getDragTracker() {
- if (m_dragTracker == null) {
- m_dragTracker = createDragTracker();
- }
- return m_dragTracker;
- }
-
- /**
- * Sets the drag tracker {@link Tool} for this handle.
- */
- public void setDragTracker(DragTracker dragTracker) {
- m_dragTracker = dragTracker;
- }
-
- /**
- * Creates a new drag tracker {@link Tool} to be returned by {@link #getDragTracker()}.
- */
- protected final DragTracker createDragTracker() {
- return null;
- }
-
- /**
- * By default, the center of the handle is returned.
- *
- * @see org.eclipse.gef.Handle#getAccessibleLocation()
- */
- @Override
- public Point getAccessibleLocation() {
- Point p = getBounds().getCenter();
- translateToAbsolute(p);
- return p;
- }
-
- @Override
- public String toString() {
- return "[%s] %s".formatted(getClass().getSimpleName(), getBounds());
- }
-}
\ No newline at end of file
diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/MoveHandle.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/MoveHandle.java
index 064514273..1b56367d4 100644
--- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/MoveHandle.java
+++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/MoveHandle.java
@@ -26,7 +26,7 @@
* @author lobas_av
* @coverage gef.graphical
*/
-public class MoveHandle extends Handle {
+public class MoveHandle extends DesignHandle {
////////////////////////////////////////////////////////////////////////////
//
// Constructors
diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SideResizeHandle.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SideResizeHandle.java
index 6640f39a3..9e6b6b47f 100644
--- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SideResizeHandle.java
+++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SideResizeHandle.java
@@ -27,7 +27,7 @@
* @author lobas_av
* @coverage gef.graphical
*/
-public class SideResizeHandle extends Handle {
+public class SideResizeHandle extends DesignHandle {
////////////////////////////////////////////////////////////////////////////
//
// Constructor
diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SquareHandle.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SquareHandle.java
index 7181e350b..6034b409c 100644
--- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SquareHandle.java
+++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/graphical/handles/SquareHandle.java
@@ -27,7 +27,7 @@
* @author lobas_av
* @coverage gef.graphical
*/
-public abstract class SquareHandle extends Handle {
+public abstract class SquareHandle extends DesignHandle {
/**
* The default size for square handles.
*/
diff --git a/org.eclipse.wb.rcp/src/org/eclipse/wb/internal/rcp/gef/policy/rcp/perspective/AbstractPartSelectionEditPolicy.java b/org.eclipse.wb.rcp/src/org/eclipse/wb/internal/rcp/gef/policy/rcp/perspective/AbstractPartSelectionEditPolicy.java
index 985ad8855..a4c40ffd7 100644
--- a/org.eclipse.wb.rcp/src/org/eclipse/wb/internal/rcp/gef/policy/rcp/perspective/AbstractPartSelectionEditPolicy.java
+++ b/org.eclipse.wb.rcp/src/org/eclipse/wb/internal/rcp/gef/policy/rcp/perspective/AbstractPartSelectionEditPolicy.java
@@ -14,6 +14,7 @@
import org.eclipse.wb.core.gef.command.EditCommand;
import org.eclipse.wb.draw2d.FigureUtils;
+import org.eclipse.wb.gef.graphical.handles.DesignHandle;
import org.eclipse.wb.gef.graphical.handles.MoveHandle;
import org.eclipse.wb.gef.graphical.policies.SelectionEditPolicy;
import org.eclipse.wb.gef.graphical.tools.ResizeTracker;
@@ -78,7 +79,7 @@ protected List createStaticHandles() {
return Collections.emptyList();
}
// prepare handle
- org.eclipse.wb.gef.graphical.handles.Handle resizeHandle = new org.eclipse.wb.gef.graphical.handles.Handle(getHost(), target -> {
+ DesignHandle resizeHandle = new DesignHandle(getHost(), target -> {
// prepare bounds (relative to page)
Rectangle bounds = m_line.getBounds().getCopy();
if (m_line.isHorizontal()) {
diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/DesignerEditorTestCase.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/DesignerEditorTestCase.java
index f5d7dd700..97d71d2b1 100644
--- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/DesignerEditorTestCase.java
+++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/DesignerEditorTestCase.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2011, 2025 Google, Inc. and others.
+ * Copyright (c) 2011, 2026 Google, Inc. and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
@@ -230,6 +230,10 @@ protected void fetchDesignViewers() {
ReflectionUtils.getFieldObject(designComposite, "m_viewersComposite");
m_viewerCanvas =
(GraphicalViewer) ReflectionUtils.getFieldObject(viewersComposite, "m_viewer");
+ m_viewerCanvas.addSelectionChangedListener(event -> {
+ // wait for handlers to update after selection
+ m_viewerCanvas.getControl().getLightweightSystem().getUpdateManager().performUpdate();
+ });
assertNotNull(m_viewerCanvas);
assertNotNull(m_viewerCanvas.getEditDomain());
// prepare sender
diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/GefCursorTestCase.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/GefCursorTestCase.java
index 2f0fd31ce..6ddd53cc4 100644
--- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/GefCursorTestCase.java
+++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/GefCursorTestCase.java
@@ -70,6 +70,10 @@ public void setUp() throws Exception {
m_actualLogger = new CursorLogger();
m_viewer = new TestGraphicalViewer(m_shell, m_actualLogger);
m_viewer.getControl().setSize(500, 400);
+ m_viewer.addSelectionChangedListener(event -> {
+ // wait for handlers to update after selection
+ m_viewer.getControl().getLightweightSystem().getUpdateManager().performUpdate();
+ });
// set edit domain
m_domain = new EditDomain() {
@Override
diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/SelectionToolTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/SelectionToolTest.java
index 7c9eb18a0..6b9c5a87d 100644
--- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/SelectionToolTest.java
+++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/SelectionToolTest.java
@@ -231,6 +231,7 @@ public void test_DragTracker_MoveHandle() throws Exception {
//
MoveHandle handle = new MoveHandle(childEditPart);
handle.setDragTracker(new RequestDragTracker(childEditPart));
+ handle.validate();
LayerManager.Helper.find(m_viewer).getLayer(LayerConstants.HANDLE_LAYER).add(handle);
//
RequestsLogger expectedLogger = new RequestsLogger();