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 2e7f2e176..000000000 --- a/org.eclipse.wb.core/src-gef/org/eclipse/wb/internal/gef/tree/RootEditPart.java +++ /dev/null @@ -1,40 +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.gef.TreeEditPart; -import org.eclipse.gef.editparts.RootTreeEditPart; -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 RootTreeEditPart { - @Override - protected void addChildVisual(org.eclipse.gef.EditPart childPart, int index) { - getContents().setWidget(new TreeItem(getWidget(), SWT.NONE)); - } - @Override - public Tree getWidget() { - return (Tree) getViewer().getControl(); - } - - @Override - public TreeEditPart getContents() { - return (TreeEditPart) super.getContents(); - } -} \ 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 index 6dd178b0e..78faeced3 100644 --- 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 @@ -17,7 +17,9 @@ import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditDomain; import org.eclipse.gef.EditPart; +import org.eclipse.gef.RootEditPart; import org.eclipse.gef.TreeEditPart; +import org.eclipse.gef.editparts.RootTreeEditPart; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; @@ -39,7 +41,7 @@ */ public class TreeViewer extends AbstractEditPartViewer { private Tree m_tree; - private RootEditPart m_rootEditPart; + private RootTreeEditPart m_rootEditPart; private TreeEventManager m_eventManager; @Override @@ -48,7 +50,8 @@ public Control createControl(Composite parent) { // handle SWT events m_eventManager = new TreeEventManager(m_tree, this); // create root EditPart - m_rootEditPart = new RootEditPart(); + m_rootEditPart = new RootTreeEditPart(); + m_rootEditPart.setWidget(m_tree); m_rootEditPart.setViewer(this); m_rootEditPart.activate(); setRootEditPart(m_rootEditPart); 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 e9761b893..eb48e8d93 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 @@ -20,6 +20,7 @@ import org.eclipse.wb.internal.core.editor.Messages; import org.eclipse.wb.internal.core.editor.structure.IPage; import org.eclipse.wb.internal.core.gefTree.EditPartFactory; +import org.eclipse.wb.internal.core.model.ObjectInfoContainer; import org.eclipse.wb.internal.core.model.ObjectReferenceInfo; import org.eclipse.wb.internal.core.preferences.IPreferenceConstants; import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils; @@ -265,7 +266,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.setInput(m_rootObject == null ? null : new ObjectInfoContainer(m_rootObject)); } finally { m_viewer.addSelectionChangedListener(m_selectionListener_Tree); } 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..4bab57d38 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,8 +16,10 @@ 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.gefTree.part.ObjectContainerEditPart; 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.ObjectInfoContainer; 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; @@ -104,6 +106,9 @@ private EditPart createEditPartPure(EditPart context, Object model) { if (model instanceof ObjectInfo) { return new ObjectEditPart((ObjectInfo) model); } + if (model instanceof ObjectInfoContainer) { + return new ObjectContainerEditPart((ObjectInfoContainer) model); + } // no EditPart found return null; } diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/part/ObjectContainerEditPart.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/part/ObjectContainerEditPart.java new file mode 100644 index 000000000..4b1783794 --- /dev/null +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/gefTree/part/ObjectContainerEditPart.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * 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.part; + +import org.eclipse.wb.internal.core.model.ObjectInfoContainer; +import org.eclipse.wb.internal.gef.tree.TreeViewer; + +import org.eclipse.gef.editparts.AbstractTreeEditPart; + +import java.util.Collections; +import java.util.List; + +/** + * Edit part for the {@link ObjectInfoContainer} which is used as input for the + * {@link TreeViewer}. This edit part is not shown. + */ +public class ObjectContainerEditPart extends AbstractTreeEditPart { + public ObjectContainerEditPart(ObjectInfoContainer model) { + setModel(model); + } + + @Override + protected List getModelChildren() { + return Collections.singletonList(getModel().objectInfo()); + } + + @Override + public ObjectInfoContainer getModel() { + return (ObjectInfoContainer) super.getModel(); + } +} diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/model/ObjectInfoContainer.java b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/model/ObjectInfoContainer.java new file mode 100644 index 000000000..483bbcefc --- /dev/null +++ b/org.eclipse.wb.core/src/org/eclipse/wb/internal/core/model/ObjectInfoContainer.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * 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.model; + +import org.eclipse.wb.core.model.ObjectInfo; +import org.eclipse.wb.internal.gef.tree.TreeViewer; + +/** + * Container for an {@link ObjectInfo} to be used as input for the + * {@link TreeViewer}. This container is not shown. + */ +public record ObjectInfoContainer(ObjectInfo objectInfo) { + // Accessors created automatically by Java +} 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..22db08283 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,7 @@ public void test_Move_1() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(m_contents, "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 +157,7 @@ public void test_Move_2() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(m_contents, "parent", actualLogger, ipolicy); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, null); addEditPart(parent, "parent1", actualLogger, ipolicy); // @@ -200,7 +200,7 @@ 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 parent = addEditPart(m_contents, "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..b04b0cd09 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 @@ -53,7 +53,7 @@ public void test_DoubleClick() throws Exception { RequestsLogger actualLogger = new RequestsLogger(); // ILayoutEditPolicy ipolicy = (request, editPart) -> true; - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(m_contents, "parent", actualLogger, ipolicy); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, ipolicy); // refreshTreeParst(parent); @@ -94,7 +94,7 @@ public void test_Drag_1() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(m_contents, "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 +196,7 @@ public void test_Drag_2() throws Exception { // ILayoutEditPolicy ipolicy = (request, editPart) -> true; // - TreeEditPart parent = addEditPart(m_viewer.getRootEditPart(), "parent", actualLogger, ipolicy); + TreeEditPart parent = addEditPart(m_contents, "parent", actualLogger, ipolicy); TreeEditPart child1 = addEditPart(parent, "child1", actualLogger, null); addEditPart(parent, "child2", actualLogger, ipolicy); TreeEditPart child3 = addEditPart(parent, "child3", actualLogger, ipolicy); @@ -244,7 +244,7 @@ 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 parent = addEditPart(m_contents, "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/TreeToolTest.java b/org.eclipse.wb.tests/src/org/eclipse/wb/tests/gef/TreeToolTest.java index b5c1ccf2e..a51f1aa53 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 @@ -28,6 +28,7 @@ import org.eclipse.gef.Tool; 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.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; @@ -47,6 +48,7 @@ public abstract class TreeToolTest extends GefTestCase { protected EditDomain m_domain; protected TreeViewer m_viewer; protected EventSender m_sender; + protected TreeEditPart m_contents; //////////////////////////////////////////////////////////////////////////// // @@ -66,11 +68,14 @@ public Tool getDefaultTool() { return null; } }; + // create contents + m_contents = new RequestContentsTreeEditPart(); // create viewer m_viewer = new TreeViewer(); m_viewer.createControl(m_shell); m_viewer.getControl().setSize(500, 400); m_viewer.setEditDomain(m_domain); + m_viewer.setContents(m_contents); // create sender m_sender = new EventSender(m_viewer.getControl()); } @@ -144,11 +149,7 @@ protected final TreeEditPart addEditPart(EditPart parentEditPart, RequestsLogger actualLogger, ILayoutEditPolicy ipolicy) throws Exception { RequestTreeEditPart editPart = new RequestTreeEditPart(name, actualLogger, ipolicy); - if (m_viewer.getRootEditPart() == parentEditPart) { - m_viewer.getRootEditPart().setContents(editPart); - } else { - addChildEditPart(parentEditPart, editPart); - } + addChildEditPart(parentEditPart, editPart); return editPart; } @@ -168,6 +169,10 @@ protected static final void expandAll(TreeViewer viewer) { // EditPart implementation // //////////////////////////////////////////////////////////////////////////// + private static final class RequestContentsTreeEditPart extends AbstractTreeEditPart { + // Stub + } + private static final class RequestTreeEditPart extends DesignTreeEditPart { private final String m_name; private final RequestsLogger m_logger;