From 957cef89d0474e51b80f3d0a23c2b8f0aaeb2011 Mon Sep 17 00:00:00 2001 From: Patrick Ziegler Date: Fri, 3 Apr 2026 19:34:51 +0200 Subject: [PATCH] [GEF] Fully migrate to the GEF TreeViewer This removes our copy of the `TreeViewerEditPart` and `TreeViewer` in favor of the upstream classes. In order to use the GEF viewer directly, a virtual `DesignComponent` edit part needs to be used as contents, holding the `Tree` widget. Otherwise the edit part of the first model is not shown. --- .../ui/BindingElementsComposite.java | 35 +- ...seClassAndPropertiesUiContentProvider.java | 3 +- .../internal/core/editor}/TreeTransfer.java | 6 +- .../internal/core/gef/tools/TabOrderTool.java | 5 +- .../core/gefTree/EditPartFactory2.java | 2 +- .../model/property/order/ReorderDialog.java | 4 +- org.eclipse.wb.core/META-INF/MANIFEST.MF | 2 - .../org/eclipse/wb/gef/core/tools/Tool.java | 9 +- .../wb/gef/tree/DesignTreeEditPart.java | 10 +- .../org/eclipse/wb/gef/tree/TreeEditPart.java | 132 ------- .../gef/tree/policies/LayoutEditPolicy.java | 2 +- .../wb/internal/gef/tree/RootEditPart.java | 92 ----- .../internal/gef/tree/TreeEventManager.java | 158 -------- .../wb/internal/gef/tree/TreeViewer.java | 210 ----------- .../gef/tree/dnd/TreeDropListener.java | 339 ------------------ .../internal/gef/tree/dnd/TreeTransfer.java | 59 --- .../tree/policies/AutoExpandEditPolicy.java | 2 +- .../wb/core/gefTree/part/ObjectEditPart.java | 16 +- .../core/editor/actions/SelectSupport.java | 6 +- .../structure/DesignComponentsComposite.java | 2 +- .../components/ComponentsTreePage.java | 4 +- .../components/ComponentsTreeWrapper.java | 2 +- .../structure/components/DesignComponent.java | 27 ++ .../core/gefTree/DesignComponentEditPart.java | 40 +++ .../core/gefTree/EditPartFactory.java | 6 +- .../editor/ComponentsTreePageTest.java | 10 +- .../editor/DesignerEditorTestCase.java | 4 +- .../wb/tests/gef/TreeCreateToolTest.java | 9 +- .../wb/tests/gef/TreeDragToolTest.java | 9 +- .../org/eclipse/wb/tests/gef/TreeRobot.java | 18 +- .../eclipse/wb/tests/gef/TreeToolTest.java | 11 +- 31 files changed, 157 insertions(+), 1077 deletions(-) rename {org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders => org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor}/TreeTransfer.java (88%) delete mode 100644 org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/TreeEditPart.java delete mode 100644 org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/RootEditPart.java delete mode 100644 org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeEventManager.java delete mode 100644 org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeViewer.java delete mode 100644 org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeDropListener.java delete mode 100644 org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeTransfer.java create mode 100644 org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/DesignComponent.java create mode 100644 org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/DesignComponentEditPart.java diff --git a/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/BindingElementsComposite.java b/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/BindingElementsComposite.java index aa04755b6..71ff85de8 100644 --- a/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/BindingElementsComposite.java +++ b/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/BindingElementsComposite.java @@ -19,20 +19,16 @@ import org.eclipse.wb.internal.core.databinding.Messages; import org.eclipse.wb.internal.core.databinding.model.IBindingInfo; import org.eclipse.wb.internal.core.databinding.model.IDatabindingsProvider; +import org.eclipse.wb.internal.core.editor.TreeTransfer; import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils; import org.eclipse.wb.internal.core.utils.ui.GridDataFactory; import org.eclipse.wb.internal.core.utils.ui.GridLayoutFactory; import org.eclipse.wb.internal.core.utils.ui.TableFactory; -import org.eclipse.wb.internal.gef.tree.dnd.TreeTransfer; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerDropAdapter; @@ -47,9 +43,7 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; @@ -144,27 +138,18 @@ public BindingElementsComposite(Composite parent, m_bindingViewer.setContentProvider(new ArrayContentProvider()); m_databindingsProvider.configureBindingViewer(settings, m_bindingViewer); // viewer events - m_bindingViewer.addPostSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection selection = (IStructuredSelection) event.getSelection(); - handleBindingSelection(selection); - } + m_bindingViewer.addPostSelectionChangedListener(event -> { + IStructuredSelection selection = (IStructuredSelection) event.getSelection(); + handleBindingSelection(selection); }); - m_bindingViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - if (m_editBindingListener != null && !UiUtils.isEmpty(m_bindingViewer.getSelection())) { - m_editBindingListener.widgetSelected(null); - } + m_bindingViewer.addDoubleClickListener(event -> { + if (m_editBindingListener != null && !UiUtils.isEmpty(m_bindingViewer.getSelection())) { + m_editBindingListener.widgetSelected(null); } }); - m_bindingViewer.getControl().addListener(SWT.KeyDown, new Listener() { - @Override - public void handleEvent(Event event) { - if (event.character == SWT.DEL && !UiUtils.isEmpty(m_bindingViewer.getSelection())) { - deleteBindind(); - } + m_bindingViewer.getControl().addListener(SWT.KeyDown, event -> { + if (event.character == SWT.DEL && !UiUtils.isEmpty(m_bindingViewer.getSelection())) { + deleteBindind(); } }); setupDragAndDrop(); diff --git a/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders/ChooseClassAndPropertiesUiContentProvider.java b/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders/ChooseClassAndPropertiesUiContentProvider.java index 614ed4bf8..cb071027a 100644 --- a/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders/ChooseClassAndPropertiesUiContentProvider.java +++ b/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders/ChooseClassAndPropertiesUiContentProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2024 Google, Inc. + * 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 @@ -14,6 +14,7 @@ import org.eclipse.wb.internal.core.databinding.Messages; import org.eclipse.wb.internal.core.databinding.ui.UiUtils; +import org.eclipse.wb.internal.core.editor.TreeTransfer; import org.eclipse.wb.internal.core.utils.ui.GridDataFactory; import org.eclipse.wb.internal.core.utils.ui.GridLayoutFactory; diff --git a/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders/TreeTransfer.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor/TreeTransfer.java similarity index 88% rename from org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders/TreeTransfer.java rename to org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor/TreeTransfer.java index c5940c034..ed4b3bcdf 100644 --- a/org.eclipse.wb.core.databinding/src/org/eclipse/wb/internal/core/databinding/ui/editor/contentproviders/TreeTransfer.java +++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor/TreeTransfer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Google, Inc. + * 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 @@ -10,7 +10,7 @@ * Contributors: * Google, Inc. - initial API and implementation *******************************************************************************/ -package org.eclipse.wb.internal.core.databinding.ui.editor.contentproviders; +package org.eclipse.wb.internal.core.editor; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.TransferData; @@ -23,7 +23,7 @@ * @author lobas_av * @coverage bindings.ui */ -final class TreeTransfer extends ByteArrayTransfer { +public final class TreeTransfer extends ByteArrayTransfer { public static final TreeTransfer INSTANCE = new TreeTransfer(); private static final String TYPE_NAME = "Tree content provider bindings tranfser"; private static final int TYPE_ID = registerType(TYPE_NAME); diff --git a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/tools/TabOrderTool.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/tools/TabOrderTool.java index 60e331a04..8e8248f66 100644 --- a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/tools/TabOrderTool.java +++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gef/tools/TabOrderTool.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 @@ -195,8 +195,7 @@ protected boolean handleButtonDown(int button) { @Override protected void updateTargetUnderMouse() { // find on clickable layer - EditPart editPart = - getCurrentViewer().findObjectAtExcluding( + EditPart editPart = ((IEditPartViewer) getCurrentViewer()).findObjectAtExcluding( getLocation(), getExclusionSet(), getTargetingConditional(), diff --git a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory2.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory2.java index d8999b882..892ecbb2c 100644 --- a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory2.java +++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory2.java @@ -19,9 +19,9 @@ import org.eclipse.wb.internal.core.gefTree.part.FlowContainerGroupEditPart; import org.eclipse.wb.internal.core.model.nonvisual.AbstractArrayObjectInfo; import org.eclipse.wb.internal.core.model.nonvisual.FlowContainerGroupInfo; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.gef.EditPart; +import org.eclipse.gef.ui.parts.TreeViewer; /** * Generic implementation of {@link IEditPartFactory} for {@link TreeViewer} that redirects diff --git a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/model/property/order/ReorderDialog.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/model/property/order/ReorderDialog.java index e7eec12c6..675be7af1 100644 --- a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/model/property/order/ReorderDialog.java +++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/model/property/order/ReorderDialog.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011, 2023 Google, Inc. + * 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 @@ -15,13 +15,13 @@ import org.eclipse.wb.core.model.AbstractComponentInfo; import org.eclipse.wb.core.model.JavaInfo; import org.eclipse.wb.internal.core.DesignerPlugin; +import org.eclipse.wb.internal.core.editor.TreeTransfer; import org.eclipse.wb.internal.core.model.ModelMessages; import org.eclipse.wb.internal.core.model.util.ObjectsLabelProvider; import org.eclipse.wb.internal.core.utils.ui.GridDataFactory; import org.eclipse.wb.internal.core.utils.ui.GridLayoutFactory; import org.eclipse.wb.internal.core.utils.ui.TableFactory; import org.eclipse.wb.internal.core.utils.ui.dialogs.ResizableDialog; -import org.eclipse.wb.internal.gef.tree.dnd.TreeTransfer; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckboxTableViewer; diff --git a/org.eclipse.wb.core/META-INF/MANIFEST.MF b/org.eclipse.wb.core/META-INF/MANIFEST.MF index 81f025aa1..9bc547f27 100644 --- a/org.eclipse.wb.core/META-INF/MANIFEST.MF +++ b/org.eclipse.wb.core/META-INF/MANIFEST.MF @@ -495,8 +495,6 @@ Export-Package: org.eclipse.wb.core.branding, org.eclipse.wb.swing, org.eclipse.wb.swt", org.eclipse.wb.internal.gef.graphical;x-friends:="org.eclipse.wb.tests,org.eclipse.wb.core.java", - org.eclipse.wb.internal.gef.tree;x-friends:="org.eclipse.wb.tests,org.eclipse.wb.core.java", - org.eclipse.wb.internal.gef.tree.dnd;x-friends:="org.eclipse.wb.core.databinding,org.eclipse.wb.core.java,org.eclipse.wb.tests", org.eclipse.wb.internal.gef.tree.policies;x-internal:=true, org.eclipse.wb.internal.gef.tree.tools;x-internal:=true Import-Package: org.apache.commons.collections4;version="[4.4.0,5.0.0)", diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/core/tools/Tool.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/core/tools/Tool.java index 1cf461de8..ba5e06bbd 100644 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/core/tools/Tool.java +++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/core/tools/Tool.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 @@ -69,13 +69,6 @@ public final boolean isActive() { return getFlag(FLAG_ACTIVE); } - /** - * Get {@link IEditPartViewer}. - */ - public final IEditPartViewer getCurrentViewer() { - return (IEditPartViewer) super.getCurrentViewer(); - } - /** * Returns the {@link EditDomain}. */ diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/DesignTreeEditPart.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/DesignTreeEditPart.java index 0259615d5..29636b6f0 100644 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/DesignTreeEditPart.java +++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/DesignTreeEditPart.java @@ -19,6 +19,8 @@ import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; +import org.eclipse.gef.editparts.AbstractTreeEditPart; +import org.eclipse.swt.widgets.TreeItem; import java.util.ArrayList; import java.util.List; @@ -28,8 +30,12 @@ * * @see {@link RequestProcessor} */ -@SuppressWarnings("removal") -public abstract class DesignTreeEditPart extends TreeEditPart { +public abstract class DesignTreeEditPart extends AbstractTreeEditPart { + + @Override + public TreeItem getWidget() { + return (TreeItem) super.getWidget(); + } //////////////////////////////////////////////////////////////////////////// // diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/TreeEditPart.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/TreeEditPart.java deleted file mode 100644 index 5210882d9..000000000 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/TreeEditPart.java +++ /dev/null @@ -1,132 +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.tree; - -import org.eclipse.wb.gef.core.tools.Tool; -import org.eclipse.wb.internal.gef.tree.tools.DoubleClickEditPartTracker; - -import org.eclipse.gef.EditPart; -import org.eclipse.gef.Request; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.widgets.TreeItem; -import org.eclipse.swt.widgets.Widget; - -import java.util.List; - -/** - * @author lobas_av - * @coverage gef.tree - * @deprecated Cast to {@link org.eclipse.gef.TreeEditPart TreeEditPart} - * directly or extend {@link AbstractTreeEditPart}. - */ -@SuppressWarnings("removal") -@Deprecated(forRemoval = true, since = "2026-06") -public abstract class TreeEditPart extends org.eclipse.wb.gef.core.EditPart implements org.eclipse.gef.TreeEditPart { - private TreeItem m_widget; - private boolean m_expandedShouldRestore; - private boolean m_expanded; - - //////////////////////////////////////////////////////////////////////////// - // - // Widget - // - //////////////////////////////////////////////////////////////////////////// - @Override - public TreeItem getWidget() { - return m_widget; - } - - @Override - public void setWidget(Widget widget) { - m_widget = (TreeItem) widget; - // - List children = getChildren(); - if (m_widget == null) { - for (EditPart editPart : children) { - TreeEditPart treePart = (TreeEditPart) editPart; - treePart.setWidget(null); - } - } else { - m_widget.setData(this); - m_widget.addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - m_expandedShouldRestore = true; - m_expanded = m_widget.getExpanded(); - } - }); - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // EditPart - // - //////////////////////////////////////////////////////////////////////////// - @Override - protected void addChildVisual(EditPart childPart, int index) { - TreeEditPart treePart = (TreeEditPart) childPart; - treePart.setWidget(new TreeItem(getWidget(), SWT.NONE, index)); - } - - @Override - protected void removeChildVisual(EditPart childPart) { - TreeEditPart treePart = (TreeEditPart) childPart; - if (treePart.getWidget() != null) { - treePart.getWidget().dispose(); - treePart.setWidget(null); - } - } - - @Override - protected void updateChildVisual(org.eclipse.wb.gef.core.EditPart childPart, int index) { - TreeEditPart treePart = (TreeEditPart) childPart; - if (treePart.getWidget() == null) { - treePart.setWidget(new TreeItem(getWidget(), SWT.NONE, index)); - } - } - - @Override - public void refresh() { - super.refresh(); - if (m_expandedShouldRestore) { - m_expandedShouldRestore = false; - TreeItem widget = getWidget(); - if (widget != null && !widget.isDisposed()) { - widget.setExpanded(m_expanded); - } - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // Policy - // - //////////////////////////////////////////////////////////////////////////// - @Override - protected void createEditPolicies() { - //installEditPolicy("TreeToolAdapterEditPolicy", new TreeToolAdapterEditPolicy()); - } - - //////////////////////////////////////////////////////////////////////////// - // - // DragTracking - // - //////////////////////////////////////////////////////////////////////////// - @Override - public Tool getDragTracker(Request request) { - return new DoubleClickEditPartTracker(this); - } -} \ No newline at end of file diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/policies/LayoutEditPolicy.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/policies/LayoutEditPolicy.java index 2d6593431..7e0e13c2c 100644 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/policies/LayoutEditPolicy.java +++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/gef/tree/policies/LayoutEditPolicy.java @@ -18,7 +18,6 @@ import org.eclipse.wb.gef.core.requests.CreateRequest; import org.eclipse.wb.gef.core.requests.PasteRequest; import org.eclipse.wb.internal.core.EnvironmentUtils; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; @@ -30,6 +29,7 @@ import org.eclipse.gef.commands.Command; import org.eclipse.gef.editpolicies.AbstractEditPolicy; import org.eclipse.gef.requests.DropRequest; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/RootEditPart.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/RootEditPart.java deleted file mode 100644 index c2cc6ec9d..000000000 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/RootEditPart.java +++ /dev/null @@ -1,92 +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.internal.gef.tree; - -import org.eclipse.wb.gef.core.IEditPartViewer; -import org.eclipse.wb.gef.tree.DesignTreeEditPart; - -import org.eclipse.gef.EditPart; -import org.eclipse.gef.EditPartViewer; -import org.eclipse.gef.TreeEditPart; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeItem; - -/** - * - * @author lobas_av - * @coverage gef.tree - */ -public class RootEditPart extends DesignTreeEditPart implements org.eclipse.gef.RootEditPart { - private IEditPartViewer m_viewer; - private TreeEditPart m_contentEditPart; - - //////////////////////////////////////////////////////////////////////////// - // - // EditPart - // - //////////////////////////////////////////////////////////////////////////// - /** - * Returns the root's {@link EditPartViewer}. - */ - @Override - public IEditPartViewer getViewer() { - return m_viewer; - } - - @Override - public void setViewer(EditPartViewer viewer) { - m_viewer = (IEditPartViewer) viewer; - } - - @Override - protected void addChildVisual(org.eclipse.gef.EditPart childPart, int index) { - m_contentEditPart.setWidget(new TreeItem(getTreeControl(), SWT.NONE)); - } - - private Tree getTreeControl() { - return (Tree) m_viewer.getControl(); - } - - //////////////////////////////////////////////////////////////////////////// - // - // IRootEditPart - // - //////////////////////////////////////////////////////////////////////////// - - /** - * Returns the content {@link EditPart}. - */ - @Override - public EditPart getContents() { - return m_contentEditPart; - } - - /** - * Sets the content {@link EditPart}. A IRootEditPart only has a single child, called its - * contents. - */ - @Override - public void setContents(org.eclipse.gef.EditPart contentEditPart) { - if (m_contentEditPart != null) { - // remove content - removeChild(m_contentEditPart); - } - // - m_contentEditPart = (TreeEditPart) contentEditPart; - // - if (m_contentEditPart != null) { - addChild(m_contentEditPart, -1); - } - } -} \ No newline at end of file diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeEventManager.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeEventManager.java deleted file mode 100644 index c16b0a058..000000000 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeEventManager.java +++ /dev/null @@ -1,158 +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.internal.gef.tree; - -import org.eclipse.wb.internal.gef.tree.dnd.TreeDropListener; -import org.eclipse.wb.internal.gef.tree.dnd.TreeTransfer; - -import org.eclipse.gef.EditDomain; -import org.eclipse.gef.EditPartViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DragSource; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.events.MouseTrackListener; -import org.eclipse.swt.widgets.Tree; - -/** - * @author lobas_av - * @coverage gef.tree - */ -final class TreeEventManager -implements -KeyListener, -MouseListener, -MouseMoveListener, -MouseTrackListener { - private final Tree m_tree; - private final EditPartViewer m_viewer; - private EditDomain m_domain; - final TreeDropListener m_dropListener; - - //////////////////////////////////////////////////////////////////////////// - // - // Constructor - // - //////////////////////////////////////////////////////////////////////////// - public TreeEventManager(Tree tree, EditPartViewer viewer) { - m_tree = tree; - m_viewer = viewer; - // add listeners - m_tree.addKeyListener(this); - m_tree.addMouseListener(this); - m_tree.addMouseMoveListener(this); - m_tree.addMouseTrackListener(this); - // add DND listeners - new DragSource(m_tree, DND.DROP_MOVE).setTransfer(new Transfer[]{TreeTransfer.INSTANCE}); - m_dropListener = new TreeDropListener(m_viewer); - } - - //////////////////////////////////////////////////////////////////////////// - // - // Access - // - //////////////////////////////////////////////////////////////////////////// - public void setDomain(EditDomain domain) { - m_domain = domain; - } - - //////////////////////////////////////////////////////////////////////////// - // - // KeyListener - // - //////////////////////////////////////////////////////////////////////////// - @Override - public void keyPressed(KeyEvent event) { - if (m_domain != null) { - m_domain.keyDown(event, m_viewer); - } - } - - @Override - public void keyReleased(KeyEvent event) { - if (m_domain != null) { - m_domain.keyUp(event, m_viewer); - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // MouseListener - // - //////////////////////////////////////////////////////////////////////////// - @Override - public void mouseDoubleClick(MouseEvent event) { - if (m_domain != null) { - m_domain.mouseDoubleClick(event, m_viewer); - } - } - - @Override - public void mouseDown(MouseEvent event) { - // OK, send to domain - if (m_domain != null) { - m_domain.mouseDown(event, m_viewer); - } - } - - @Override - public void mouseUp(MouseEvent event) { - if (m_domain != null) { - m_domain.mouseUp(event, m_viewer); - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // MouseMoveListener - // - //////////////////////////////////////////////////////////////////////////// - @Override - public void mouseMove(MouseEvent event) { - if (m_domain != null) { - if ((event.stateMask & SWT.BUTTON_MASK) != 0) { - m_domain.mouseDrag(event, m_viewer); - } else { - m_domain.mouseMove(event, m_viewer); - } - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // MouseTrackListener - // - //////////////////////////////////////////////////////////////////////////// - @Override - public void mouseEnter(MouseEvent event) { - if (m_domain != null) { - m_domain.viewerEntered(event, m_viewer); - } - } - - @Override - public void mouseExit(MouseEvent event) { - if (m_domain != null) { - m_domain.viewerExited(event, m_viewer); - } - } - - @Override - public void mouseHover(MouseEvent event) { - } -} \ No newline at end of file diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeViewer.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeViewer.java deleted file mode 100644 index 063993f41..000000000 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/TreeViewer.java +++ /dev/null @@ -1,210 +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.internal.gef.tree; - -import org.eclipse.wb.internal.gef.core.AbstractEditPartViewer; - -import org.eclipse.draw2d.geometry.Point; -import org.eclipse.gef.EditDomain; -import org.eclipse.gef.EditPart; -import org.eclipse.gef.TreeEditPart; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeItem; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * @author lobas_av - * @coverage gef.tree - */ -public class TreeViewer extends AbstractEditPartViewer { - private Tree m_tree; - private RootEditPart m_rootEditPart; - private TreeEventManager m_eventManager; - - @Override - public Control createControl(Composite parent) { - m_tree = new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); - // handle SWT events - m_eventManager = new TreeEventManager(m_tree, this); - // create root EditPart - m_rootEditPart = new RootEditPart(); - m_rootEditPart.setViewer(this); - m_rootEditPart.activate(); - setRootEditPart(m_rootEditPart); - // handle selection events - synchronizeSelection(); - return m_tree; - } - - //////////////////////////////////////////////////////////////////////////// - // - // Access - // - //////////////////////////////////////////////////////////////////////////// - - /** - * Returns the SWT Control for this viewer. - */ - @Override - public Tree getControl() { - return m_tree; - } - - /** - * Returns root {@link EditPart}. - */ - @Override - public RootEditPart getRootEditPart() { - return m_rootEditPart; - } - - /** - * Sets the {@link EditDomain} for this viewer. The Viewer will route all mouse and - * keyboard events to the {@link EditDomain}. - */ - @Override - public void setEditDomain(EditDomain domain) { - super.setEditDomain(domain); - m_eventManager.setDomain(domain); - } - - /** - * Set the Cursor. - */ - @Override - public void setCursor(Cursor cursor) { - m_tree.setCursor(cursor); - } - - //////////////////////////////////////////////////////////////////////////// - // - // Selection - // - //////////////////////////////////////////////////////////////////////////// - /** - * Adds listeners for synchronizing selection between this {@link TreeViewer} and underlying - * {@link Tree} widget. - */ - private void synchronizeSelection() { - final boolean[] inTreeSelectionListener = new boolean[1]; - // listener for Tree widget selection - m_tree.addSelectionListener(new SelectionListener() { - @Override - public void widgetSelected(SelectionEvent e) { - // prepare selected EditPart's - EditPart[] selection; - { - TreeItem[] items = m_tree.getSelection(); - selection = new EditPart[items.length]; - for (int i = 0; i < selection.length; i++) { - selection[i] = (EditPart) items[i].getData(); - } - } - // set selection in viewer - try { - inTreeSelectionListener[0] = true; - setSelection(new StructuredSelection(selection)); - } finally { - inTreeSelectionListener[0] = false; - } - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - widgetSelected(e); - } - }); - // listener for this viewer selection - addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - if (!inTreeSelectionListener[0]) { - setSelectionToTreeWidget(); - } - } - }); - } - - /** - * Applies existing selection from this {@link TreeViewer} to underlying {@link Tree} widget. - */ - public void setSelectionToTreeWidget() { - // prepare selected TreeItem's - List treeItems = new ArrayList<>(); - for (EditPart editPart : getSelectedEditParts()) { - TreeEditPart treeEditPart = (TreeEditPart) editPart; - treeItems.add((TreeItem) treeEditPart.getWidget()); - } - // set selection in tree - m_tree.setSelection(treeItems.toArray(new TreeItem[treeItems.size()])); - } - - //////////////////////////////////////////////////////////////////////////// - // - // Finding - // - //////////////////////////////////////////////////////////////////////////// - /** - * Returns null or the {@link EditPart} at the specified location, using - * the given exclusion set and conditional. - */ - @Override - public EditPart findObjectAtExcluding(Point location, - // TODO Draw2D - Typify once lower bound is 3.22 - @SuppressWarnings("rawtypes") Collection exclude, - Conditional conditional) { - // simple check location - Rectangle clientArea = m_tree.getClientArea(); - if (location.x < 0 || location.y < 0 || location.x > clientArea.width || location.y > clientArea.height) { - return null; - } - // find EditPart - EditPart result = null; - TreeItem item = m_tree.getItem(new org.eclipse.swt.graphics.Point(location.x, location.y)); - if (item == null) { - result = m_rootEditPart; - } else { - result = (EditPart) item.getData(); - } - // apply conditional - while (result != null) { - if (conditional == null || conditional.evaluate(result)) { - return result; - } - result = result.getParent(); - } - return null; - } - - @Override - public EditPart findObjectAtExcluding(Point location, - // TODO Draw2D - Typify once lower bound is 3.22 - @SuppressWarnings("rawtypes") Collection exclude, - Conditional conditional, - String layer) { - return null; - } -} \ No newline at end of file diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeDropListener.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeDropListener.java deleted file mode 100644 index 5fd2da607..000000000 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeDropListener.java +++ /dev/null @@ -1,339 +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.internal.gef.tree.dnd; - -import org.eclipse.wb.gef.core.requests.ChangeBoundsRequest; - -import org.eclipse.draw2d.geometry.Point; -import org.eclipse.gef.EditPart; -import org.eclipse.gef.EditPartViewer; -import org.eclipse.gef.EditPartViewer.Conditional; -import org.eclipse.gef.Request; -import org.eclipse.gef.RequestConstants; -import org.eclipse.gef.commands.Command; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DropTarget; -import org.eclipse.swt.dnd.DropTargetEvent; -import org.eclipse.swt.dnd.DropTargetListener; -import org.eclipse.swt.dnd.Transfer; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * @author lobas_av - * @coverage gef.tree - */ -public class TreeDropListener implements DropTargetListener { - private final EditPartViewer m_viewer; - private DropTargetEvent m_currentEvent; - private EditPart m_target; - - //////////////////////////////////////////////////////////////////////////// - // - // Constructor - // - //////////////////////////////////////////////////////////////////////////// - public TreeDropListener(EditPartViewer viewer) { - m_viewer = viewer; - // add DND listener - DropTarget target = new DropTarget(m_viewer.getControl(), DND.DROP_MOVE); - target.setTransfer(new Transfer[]{TreeTransfer.INSTANCE}); - target.addDropListener(this); - } - - //////////////////////////////////////////////////////////////////////////// - // - // DropTargetListener - // - //////////////////////////////////////////////////////////////////////////// - @Override - public void dragEnter(DropTargetEvent event) { - m_currentEvent = event; - } - - @Override - public void dropAccept(DropTargetEvent event) { - m_currentEvent = event; - } - - @Override - public void dragLeave(DropTargetEvent event) { - m_currentEvent = event; - clearState(); - } - - @Override - public void dragOperationChanged(DropTargetEvent event) { - m_currentEvent = event; - eraseTargetFeedback(); - updateTargetRequest(); - updateTargetEditPart(); - updateTargetRequestAfter(); - updateCommand(); - } - - @Override - public void dragOver(DropTargetEvent event) { - boolean needUpdateFeedback = - !m_isShowingFeedback || event.x != m_currentEvent.x || event.y != m_currentEvent.y; - m_currentEvent = event; - updateTargetRequest(); - updateTargetEditPart(); - updateTargetRequestAfter(); - updateCommand(); - if (needUpdateFeedback) { - showTargetFeedback(); - } - m_currentEvent.feedback = - DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL | getTargetRequest().getDNDFeedback(); - } - - @Override - public void drop(DropTargetEvent event) { - m_currentEvent = event; - List models = getModels(getDragSource()); - eraseTargetFeedback(); - updateTargetRequest(); - updateTargetEditPart(); - updateTargetRequestAfter(); - try { - executeCommand(); - } finally { - clearState(); - } - resetSelectionFromModels(models); - } - - private void clearState() { - eraseTargetFeedback(); - m_currentEvent = null; - m_request = null; - m_target = null; - } - - private List getDragSource() { - return m_viewer.getSelectedEditParts(); - } - - private List getModels(List editParts) { - List models = new ArrayList<>(); - for (EditPart editPart : editParts) { - models.add(editPart.getModel()); - } - return models; - } - - /** - * Selection {@link EditPart} by model's. - */ - private void resetSelectionFromModels(List models) { - if (!models.isEmpty()) { - // prepare new EditPart's - List newEditParts = new ArrayList<>(); - for (Object model : models) { - EditPart newEditPart = m_viewer.getEditPartRegistry().get(model); - newEditParts.add(newEditPart); - } - // set new selection - m_viewer.setSelection(new StructuredSelection(newEditParts)); - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // Request - // - //////////////////////////////////////////////////////////////////////////// - private ChangeBoundsRequest m_request; - - /** - * Lazily creates and returns the request used when communicating with the target editpart. - */ - private ChangeBoundsRequest getTargetRequest() { - if (m_request == null) { - m_request = new ChangeBoundsRequest(RequestConstants.REQ_MOVE); - m_request.setEditParts(getDragSource()); - } - return m_request; - } - - /** - * Sets the location of the request. - */ - private void updateTargetRequest() { - ChangeBoundsRequest request = getTargetRequest(); - request.setLocation(getDropLocation()); - } - - /** - * Sets the type of the request. - */ - private void updateTargetRequestAfter() { - ChangeBoundsRequest request = getTargetRequest(); - if (getDragSource().get(0).getParent() == m_target) { - request.setType(RequestConstants.REQ_MOVE); - } else { - request.setType(RequestConstants.REQ_ADD); - } - } - - //////////////////////////////////////////////////////////////////////////// - // - // Target - // - //////////////////////////////////////////////////////////////////////////// - /** - * Sets the target {@link EditPart}. - */ - private void setTargetEditPart(EditPart target) { - if (m_target != target) { - if (m_target != null) { - eraseTargetFeedback(); - } - m_target = target; - } - } - - /** - * Updates the target {@link EditPart}. The target is updated by using the target conditional and - * the target request. - */ - private void updateTargetEditPart() { - Point location = getDropLocation(); - Collection editParts = includeChildren(getDragSource()); - EditPart editPart = - m_viewer.findObjectAtExcluding( - location, - Collections.emptyList(), - getTargetingConditional(editParts)); - if (editPart != null) { - editPart = editPart.getTargetEditPart(getTargetRequest()); - } - setTargetEditPart(editPart); - } - - /** - * Returns the current x, y *absolute* position of the mouse cursor. - */ - private Point getDropLocation() { - DropTarget target = (DropTarget) m_currentEvent.widget; - org.eclipse.swt.graphics.Point location = - target.getControl().toControl(m_currentEvent.x, m_currentEvent.y); - return new Point(location); - } - - /** - * Returns the conditional object used for obtaining the target editpart from the viewer. By - * default, a conditional is returned that tests whether an editpart at the current mouse location - * indicates a target for the operation's request, using - * {@link EditPart#getTargetEditPart(Request)}. If null is returned, then the - * conditional fails, and the search continues. - */ - private Conditional getTargetingConditional(Collection exclude) { - return editPart -> !exclude.contains(editPart) && editPart.getTargetEditPart(getTargetRequest()) != null; - } - - private static Set includeChildren(List parts) { - Set result = new HashSet<>(); - for (EditPart editPart : parts) { - result.add(editPart); - result.addAll(includeChildren(editPart.getChildren())); - } - return result; - } - - //////////////////////////////////////////////////////////////////////////// - // - // Command - // - //////////////////////////////////////////////////////////////////////////// - private Command m_command; - - /** - * Execute the currently active command. - */ - private void executeCommand() { - if (m_command != null) { - try { - m_viewer.getEditDomain().getCommandStack().execute(m_command); - } finally { - setCommand(null); - } - } - } - - /** - * Sets the currently active command. - */ - private void setCommand(Command command) { - m_command = command; - m_currentEvent.detail = m_command == null ? DND.DROP_NONE : DND.DROP_MOVE; - } - - /** - * Updates currently command. - */ - private void updateCommand() { - setCommand(getCommand()); - } - - /** - * Returns a new, updated command based on the tools current properties. - */ - private Command getCommand() { - if (m_target != null) { - return m_target.getCommand(getTargetRequest()); - } - return null; - } - - //////////////////////////////////////////////////////////////////////////// - // - // Feedback - // - //////////////////////////////////////////////////////////////////////////// - private boolean m_isShowingFeedback; - - /** - * Asks the target editpart to show target feedback and sets the target feedback flag. - */ - private void showTargetFeedback() { - if (m_target != null) { - m_target.showTargetFeedback(getTargetRequest()); - } - // - m_isShowingFeedback = true; - } - - /** - * Asks the current target editpart to erase target feedback using the target request. If target - * feedback is not being shown, this method does nothing and returns. Otherwise, the target - * feedback flag is reset to false, and the target editpart is asked to erase target feedback. - * This methods should rarely be overridden. - */ - private void eraseTargetFeedback() { - if (m_isShowingFeedback) { - m_isShowingFeedback = false; - // - if (m_target != null) { - m_target.eraseTargetFeedback(getTargetRequest()); - } - } - } -} \ No newline at end of file diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeTransfer.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeTransfer.java deleted file mode 100644 index 4e12574ec..000000000 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/dnd/TreeTransfer.java +++ /dev/null @@ -1,59 +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.gef.tree.dnd; - -import org.eclipse.swt.dnd.ByteArrayTransfer; -import org.eclipse.swt.dnd.TransferData; - -import org.apache.commons.lang3.ArrayUtils; - -/** - * Implementation of {@link ByteArrayTransfer} for tree elements. - * - * @author lobas_av - * @coverafe gef.tree - */ -public final class TreeTransfer extends ByteArrayTransfer { - public static final TreeTransfer INSTANCE = new TreeTransfer(); - private static final String TYPE_NAME = "Tree GEF tranfser"; - private static final int TYPE_ID = registerType(TYPE_NAME); - - //////////////////////////////////////////////////////////////////////////// - // - // Transfer - // - //////////////////////////////////////////////////////////////////////////// - @Override - protected int[] getTypeIds() { - return new int[]{TYPE_ID}; - } - - @Override - protected String[] getTypeNames() { - return new String[]{TYPE_NAME}; - } - - //////////////////////////////////////////////////////////////////////////// - // - // ByteArrayTransfer - // - //////////////////////////////////////////////////////////////////////////// - @Override - protected void javaToNative(Object object, TransferData transferData) { - } - - @Override - protected Object nativeToJava(TransferData transferData) { - return ArrayUtils.EMPTY_BYTE_ARRAY; - } -} \ No newline at end of file diff --git a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/policies/AutoExpandEditPolicy.java b/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/policies/AutoExpandEditPolicy.java index 5b90e81b2..e802e9d51 100644 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/policies/AutoExpandEditPolicy.java +++ b/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/policies/AutoExpandEditPolicy.java @@ -14,7 +14,6 @@ import org.eclipse.wb.core.gef.policy.PolicyUtils; import org.eclipse.wb.gef.core.requests.PasteRequest; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; @@ -24,6 +23,7 @@ import org.eclipse.gef.TreeEditPart; import org.eclipse.gef.editpolicies.AbstractEditPolicy; import org.eclipse.gef.requests.DropRequest; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/core/gefTree/part/ObjectEditPart.java b/org.eclipse.wb.core/src/org/eclipse/wb/core/gefTree/part/ObjectEditPart.java index 2d0ca8d91..d1bf4b513 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/core/gefTree/part/ObjectEditPart.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/core/gefTree/part/ObjectEditPart.java @@ -18,7 +18,6 @@ import org.eclipse.wb.core.model.broadcast.ObjectEventListener; import org.eclipse.wb.gef.tree.DesignTreeEditPart; import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.wb.internal.gef.tree.policies.AutoExpandEditPolicy; import org.eclipse.wb.internal.gef.tree.policies.SelectionEditPolicy; @@ -26,6 +25,7 @@ import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.TreeEditPart; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; @@ -92,17 +92,19 @@ public void refreshed() throws Exception { // do in setRedraw(false) to avoid flashing after component moving tree.setRedraw(false); try { - refresh(); - { - setSelectionIfAllEditParts(m_delayedSelectionObjects); - m_delayedSelectionObjects = null; - } - viewer.setSelectionToTreeWidget(); + refresh(ObjectEditPart.this); } finally { tree.setRedraw(true); } } + private void refresh(EditPart editPart) { + editPart.refresh(); + for (EditPart child : editPart.getChildren()) { + refresh(child); + } + } + @Override public void select(List objects) throws Exception { m_delayedSelectionObjects = null; diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/actions/SelectSupport.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/actions/SelectSupport.java index 8d6cb7a4d..e5f766981 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/actions/SelectSupport.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/actions/SelectSupport.java @@ -108,7 +108,9 @@ public void handleEvent(Event event) { */ private void addKeyDownListener(EditPartViewer viewer) { Control control = viewer.getControl(); - control.addListener(SWT.KeyDown, m_keyListener); + if (control != null && !control.isDisposed()) { + control.addListener(SWT.KeyDown, m_keyListener); + } } /** @@ -116,7 +118,7 @@ private void addKeyDownListener(EditPartViewer viewer) { */ private void removeKeyDownListener(EditPartViewer viewer) { Control control = viewer.getControl(); - if (!control.isDisposed()) { + if (control != null && !control.isDisposed()) { control.removeListener(SWT.KeyDown, m_keyListener); } } diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/DesignComponentsComposite.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/DesignComponentsComposite.java index 8afeac9a5..60360a7fe 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/DesignComponentsComposite.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/DesignComponentsComposite.java @@ -18,9 +18,9 @@ import org.eclipse.wb.internal.core.editor.Messages; import org.eclipse.wb.internal.core.editor.structure.components.ComponentsTreePage; import org.eclipse.wb.internal.core.editor.structure.property.ComponentsPropertiesPage; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.gef.EditPartViewer; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreePage.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreePage.java index b0ae631dc..5377099c3 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreePage.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreePage.java @@ -25,10 +25,10 @@ import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils; import org.eclipse.wb.internal.core.utils.gef.EditPartsSelectionProvider; import org.eclipse.wb.internal.core.utils.ui.UiUtils; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; @@ -278,7 +278,7 @@ public void setInput(EditPartViewer editPartViewer, ObjectInfo rootObject) { // refresh objects viewer m_viewer.removeSelectionChangedListener(m_selectionListener_Tree); try { - m_viewer.setInput(m_rootObject); + m_viewer.setContents(m_rootObject == null ? null : new DesignComponent(m_rootObject)); } finally { m_viewer.addSelectionChangedListener(m_selectionListener_Tree); } diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreeWrapper.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreeWrapper.java index fced8b992..dcb1e35cb 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreeWrapper.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/ComponentsTreeWrapper.java @@ -15,9 +15,9 @@ import org.eclipse.wb.internal.core.utils.gef.EditPartsContentProvider; import org.eclipse.wb.internal.core.utils.gef.EditPartsSelectionProvider; import org.eclipse.wb.internal.core.utils.ui.UiUtils; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.gef.EditPart; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.swt.events.TreeEvent; diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/DesignComponent.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/DesignComponent.java new file mode 100644 index 000000000..328e56e29 --- /dev/null +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/editor/structure/components/DesignComponent.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2026 Patrick Ziegler 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: + * Patrick Ziegler - initial API and implementation + *******************************************************************************/ +package org.eclipse.wb.internal.core.editor.structure.components; + +import org.eclipse.wb.core.model.ObjectInfo; + +import org.eclipse.gef.TreeEditPart; +import org.eclipse.swt.widgets.Tree; + +/** + * Virtual root of the {@link TreeViewer}. The {@link TreeEditPart} of this + * object has the {@link Tree} as its widget and is not rendered. It is the + * parent of the root {@link ObjectInfo}. + */ +public record DesignComponent(ObjectInfo objectInfo) { + +} diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/DesignComponentEditPart.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/DesignComponentEditPart.java new file mode 100644 index 000000000..3e0da66bf --- /dev/null +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/DesignComponentEditPart.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2026 Patrick Ziegler 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: + * Patrick Ziegler - initial API and implementation + *******************************************************************************/ +package org.eclipse.wb.internal.core.gefTree; + +import org.eclipse.wb.internal.core.editor.structure.components.DesignComponent; + +import org.eclipse.gef.editparts.AbstractTreeEditPart; +import org.eclipse.swt.widgets.Tree; + +import java.util.List; + +/** + * The contents of the components {@link TreeViewer}. This edit part holds the + * {@link Tree} widget of this viewer and is not rendered. + */ +public class DesignComponentEditPart extends AbstractTreeEditPart { + public DesignComponentEditPart(DesignComponent model) { + setModel(model); + } + + @Override + public DesignComponent getModel() { + return (DesignComponent) super.getModel(); + } + + @Override + protected List getModelChildren() { + return List.of(getModel().objectInfo()); + } +} diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory.java index 9501a0087..daf39134a 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/EditPartFactory.java @@ -16,15 +16,16 @@ import org.eclipse.wb.core.gefTree.part.ObjectEditPart; import org.eclipse.wb.core.model.ObjectInfo; import org.eclipse.wb.gef.core.IEditPartFactory; +import org.eclipse.wb.internal.core.editor.structure.components.DesignComponent; import org.eclipse.wb.internal.core.gefTree.part.menu.MenuEditPart; import org.eclipse.wb.internal.core.gefTree.part.menu.MenuItemEditPart; import org.eclipse.wb.internal.core.model.menu.IMenuInfo; import org.eclipse.wb.internal.core.model.menu.IMenuItemInfo; import org.eclipse.wb.internal.core.model.menu.MenuObjectInfoUtils; import org.eclipse.wb.internal.core.utils.external.ExternalFactoriesHelper; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.gef.EditPart; +import org.eclipse.gef.ui.parts.TreeViewer; import java.util.List; @@ -104,6 +105,9 @@ private EditPart createEditPartPure(EditPart context, Object model) { if (model instanceof ObjectInfo) { return new ObjectEditPart((ObjectInfo) model); } + if (model instanceof DesignComponent) { + return new DesignComponentEditPart((DesignComponent) model); + } // no EditPart found return null; } diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/ComponentsTreePageTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/ComponentsTreePageTest.java index ced72dca5..14d38b1a1 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/ComponentsTreePageTest.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/designer/editor/ComponentsTreePageTest.java @@ -19,7 +19,6 @@ import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils; import org.eclipse.wb.internal.core.utils.execution.RunnableEx; import org.eclipse.wb.internal.gef.core.CancelOperationError; -import org.eclipse.wb.internal.gef.tree.dnd.TreeDropListener; import org.eclipse.wb.internal.swing.model.component.ComponentInfo; import org.eclipse.wb.internal.swing.model.component.ContainerInfo; import org.eclipse.wb.internal.swing.model.layout.FlowLayoutInfo; @@ -119,10 +118,11 @@ public void run() throws Exception { } /** - * There was problem: after some exception during drag operation {@link TreeDropListener} had - * state (list of {@link EditPart} to drag) remembered since last operation. So, when we reparse - * source again and try to perform some other drag this state was not updated - instead it was - * used to create {@link Command} and created weird effect during its execution. + * There was problem: after some exception during drag operation {@code + * TreeViewerTransferDropListener} had state (list of {@link EditPart} to drag) + * remembered since last operation. So, when we reparse source again and try to + * perform some other drag this state was not updated - instead it was used to + * create {@link Command} and created weird effect during its execution. */ @Test public void test_TreeDropListener_dragAfterException() throws Exception { 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..dc2bdf340 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 @@ -35,7 +35,6 @@ import org.eclipse.wb.internal.core.utils.reflect.ReflectionUtils; import org.eclipse.wb.internal.core.utils.state.EditorState; import org.eclipse.wb.internal.gef.graphical.GraphicalViewer; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.wb.internal.rcp.databinding.DatabindingsProvider; import org.eclipse.wb.internal.rcp.databinding.model.widgets.WidgetsObserveTypeContainer; import org.eclipse.wb.tests.designer.TestUtils; @@ -47,6 +46,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.gef.EditPart; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jface.action.IAction; diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeCreateToolTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeCreateToolTest.java index 9a133389f..2706c3aad 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeCreateToolTest.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeCreateToolTest.java @@ -66,7 +66,8 @@ public void test_Move_1() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart tree = addEditPart(m_viewer.getRootEditPart(), "tree", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(tree, "parent", actualLogger, ipolicy); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, ipolicy); TreeEditPart parent1 = addEditPart(parent, "parent1", actualLogger, ipolicy); TreeEditPart parent2 = addEditPart(parent, "parent2", actualLogger, ipolicy); @@ -157,7 +158,8 @@ public void test_Move_2() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart tree = addEditPart(m_viewer.getRootEditPart(), "tree", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(tree, "parent", actualLogger, ipolicy); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, null); addEditPart(parent, "parent1", actualLogger, ipolicy); // @@ -200,7 +202,8 @@ public void test_Move_3() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, (request, editPart) -> !"child1".equals(editPart.getModel())); + TreeEditPart tree = addEditPart(m_viewer.getRootEditPart(), "tree", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(tree, "parent", actualLogger, (request, editPart) -> !"child1".equals(editPart.getModel())); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, ipolicy); addEditPart(parent, "parent1", actualLogger, ipolicy); // diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeDragToolTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeDragToolTest.java index b432fcb23..e10655c1d 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeDragToolTest.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeDragToolTest.java @@ -94,7 +94,8 @@ public void test_Drag_1() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart tree = addEditPart(m_viewer.getRootEditPart(), "tree", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(tree, "parent", actualLogger, ipolicy); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, ipolicy); TreeEditPart child2 = addEditPart(parent, "child2", actualLogger, ipolicy); TreeEditPart child3 = addEditPart(parent, "child3", actualLogger, ipolicy); @@ -196,7 +197,8 @@ public void test_Drag_2() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart tree = addEditPart(m_viewer.getRootEditPart(), "tree", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(tree, "parent", actualLogger, ipolicy); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, null); addEditPart(parent, "child2", actualLogger, ipolicy); TreeEditPart child3 = addEditPart(parent, "child3", actualLogger, ipolicy); @@ -244,7 +246,8 @@ public void test_Drag_3() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, (request, editPart) -> !"child1".equals(editPart.getModel())); + TreeEditPart tree = addEditPart(m_viewer.getRootEditPart(), "tree", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(tree, "parent", actualLogger, (request, editPart) -> !"child1".equals(editPart.getModel())); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, ipolicy); addEditPart(parent, "child2", actualLogger, ipolicy); TreeEditPart child3 = addEditPart(parent, "child3", actualLogger, ipolicy); diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeRobot.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeRobot.java index e232717c3..aac2bad11 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeRobot.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeRobot.java @@ -13,22 +13,23 @@ package org.eclipse.wb.tests.gef; import org.eclipse.wb.core.model.ObjectInfo; -import org.eclipse.wb.gef.core.tools.Tool; import org.eclipse.wb.gef.graphical.tools.SelectionTool; import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils; import org.eclipse.wb.internal.core.utils.reflect.ReflectionUtils; import org.eclipse.wb.internal.core.utils.ui.UiUtils; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.wb.tests.designer.tests.DesignerTestCase; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; +import org.eclipse.gef.Tool; import org.eclipse.gef.TreeEditPart; import org.eclipse.gef.commands.Command; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; +import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Tree; @@ -200,11 +201,11 @@ private Event createDNDEvent(TreeEditPart dragPart, Point locationInTree) { private static Event createDNDEvent() { return ExecutionUtils.runObject(() -> { - Class dndClass = - ReflectionUtils.getClassByName( - TreeRobot.class.getClassLoader(), - "org.eclipse.swt.dnd.DNDEvent"); - return (Event) ReflectionUtils.newInstance(dndClass, "()"); + Class dndClass = ReflectionUtils.getClassByName(TreeRobot.class.getClassLoader(), + "org.eclipse.swt.dnd.DNDEvent"); + Event event = (Event) ReflectionUtils.newInstance(dndClass, "()"); + ReflectionUtils.setField(event, "dataTypes", new TransferData[0]); + return event; }); } @@ -307,8 +308,7 @@ public TreeEditPart[] getEditParts(Object[] models) { */ public void setExpanded(TreeEditPart editPart, boolean expanded) { TreeEditPart parentEditPart = (TreeEditPart) editPart.getParent(); - if (parentEditPart != null) { - TreeItem widget = (TreeItem) parentEditPart.getWidget(); + if (parentEditPart != null && parentEditPart.getWidget() instanceof TreeItem widget) { if (expanded) { setExpanded(parentEditPart, expanded); if (widget != null) { diff --git a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeToolTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeToolTest.java index 8ba3fe3e6..c61e69550 100644 --- a/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeToolTest.java +++ b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeToolTest.java @@ -19,7 +19,6 @@ import org.eclipse.wb.internal.core.utils.reflect.ReflectionUtils; import org.eclipse.wb.internal.core.utils.ui.UiUtils; import org.eclipse.wb.internal.gef.core.EditDomain; -import org.eclipse.wb.internal.gef.tree.TreeViewer; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; @@ -28,7 +27,9 @@ import org.eclipse.gef.Request; import org.eclipse.gef.TreeEditPart; import org.eclipse.gef.commands.Command; +import org.eclipse.gef.editparts.AbstractTreeEditPart; import org.eclipse.gef.requests.SelectionRequest; +import org.eclipse.gef.ui.parts.TreeViewer; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TreeItem; @@ -143,10 +144,12 @@ protected final TreeEditPart addEditPart(EditPart parentEditPart, String name, RequestsLogger actualLogger, ILayoutEditPolicy ipolicy) throws Exception { - RequestTreeEditPart editPart = new RequestTreeEditPart(name, actualLogger, ipolicy); + TreeEditPart editPart; if (m_viewer.getRootEditPart() == parentEditPart) { + editPart = new RequestTreeEditPartWrapper(); m_viewer.getRootEditPart().setContents(editPart); } else { + editPart = new RequestTreeEditPart(name, actualLogger, ipolicy); addChildEditPart(parentEditPart, editPart); } return editPart; @@ -168,6 +171,10 @@ protected static final void expandAll(TreeViewer viewer) { // EditPart implementation // //////////////////////////////////////////////////////////////////////////// + private static final class RequestTreeEditPartWrapper extends AbstractTreeEditPart { + // stub + } + private static final class RequestTreeEditPart extends DesignTreeEditPart { private final String m_name; private final RequestsLogger m_logger;