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();