From 293a3123ebbfb6188f1ca63b97e7a091125e0667 Mon Sep 17 00:00:00 2001 From: Patrick Ziegler Date: Thu, 3 Oct 2024 22:02:12 +0200 Subject: [PATCH] PoC - Migration to PaletteViewer This re-implements the palette using the native GEF classes. Open topics: - Look & Feel - Dragging of categories - Tooltips --- .../core/editor/palette/DesignerPalette.java | 2 + .../palette/DefaultPalettePreferences.java | 2 + .../DesignerPaletteViewerPreferences.java | 19 ++++++ .../controls/palette/PaletteComposite.java | 63 +++++++++++-------- 4 files changed, 60 insertions(+), 26 deletions(-) create mode 100644 org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DesignerPaletteViewerPreferences.java diff --git a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor/palette/DesignerPalette.java b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor/palette/DesignerPalette.java index 370e4783a..8572aff60 100644 --- a/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor/palette/DesignerPalette.java +++ b/org.eclipse.wb.core.java/src/org/eclipse/wb/internal/core/editor/palette/DesignerPalette.java @@ -129,6 +129,7 @@ public void setInput(IEditPartViewer editPartViewer, final JavaInfo rootJavaInfo, String toolkitId) { m_editPartViewer = editPartViewer; + m_editPartViewer.getEditDomain().setPaletteViewer(m_paletteComposite.getPaletteViewer()); m_rootJavaInfo = rootJavaInfo; // if (m_rootJavaInfo != null) { @@ -425,6 +426,7 @@ public void moveEntry(IEntry _entry, ICategory _targetCategory, IEntry _nextEntr } } m_paletteComposite.setPalette(palette); + m_editPartViewer.getEditDomain().setPaletteRoot(palette); configure_EditDomain_DefaultTool(); } diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DefaultPalettePreferences.java b/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DefaultPalettePreferences.java index 0836bf1ca..1e454364d 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DefaultPalettePreferences.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DefaultPalettePreferences.java @@ -18,7 +18,9 @@ * * @author scheglov_ke * @coverage core.control.palette + * @deprecated Use {@link DesignerPaletteViewerPreferences} instead. */ +@Deprecated(forRemoval = true) public final class DefaultPalettePreferences implements IPalettePreferences { @Override public FontDescriptor getCategoryFontDescriptor() { diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DesignerPaletteViewerPreferences.java b/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DesignerPaletteViewerPreferences.java new file mode 100644 index 000000000..8504cdbed --- /dev/null +++ b/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/DesignerPaletteViewerPreferences.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2024 Patrick Ziegler and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Patrick Ziegler - initial API and implementation + *******************************************************************************/ +package org.eclipse.wb.core.controls.palette; + +import org.eclipse.gef.ui.palette.DefaultPaletteViewerPreferences; + +public final class DesignerPaletteViewerPreferences extends DefaultPaletteViewerPreferences { + public DesignerPaletteViewerPreferences() { + setAutoCollapseSetting(COLLAPSE_NEVER); + } +} diff --git a/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/PaletteComposite.java b/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/PaletteComposite.java index d108c3618..c32717294 100644 --- a/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/PaletteComposite.java +++ b/org.eclipse.wb.core/src/org/eclipse/wb/core/controls/palette/PaletteComposite.java @@ -18,10 +18,9 @@ import org.eclipse.wb.internal.core.utils.GenericsUtils; import org.eclipse.wb.internal.core.utils.reflect.ReflectionUtils; import org.eclipse.wb.internal.core.utils.ui.DrawUtils; -import org.eclipse.wb.internal.draw2d.FigureCanvas; -import org.eclipse.wb.internal.draw2d.TargetFigureFindVisitor; import org.eclipse.draw2d.ColorConstants; +import org.eclipse.draw2d.FigureCanvas; import org.eclipse.draw2d.FigureUtilities; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; @@ -31,7 +30,11 @@ import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; +import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.commands.Command; +import org.eclipse.gef.palette.PaletteRoot; +import org.eclipse.gef.palette.ToolEntry; +import org.eclipse.gef.ui.palette.PaletteViewer; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; @@ -47,10 +50,8 @@ import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; /** * The palette control. @@ -111,13 +112,13 @@ private static Image loadImage(String path) { private final FigureCanvas m_figureCanvas; private final PaletteFigure m_paletteFigure; private final Layer m_feedbackLayer; - private final Map m_categoryFigures = new HashMap<>(); private final ResourceManager m_resourceManager = new LocalResourceManager(JFaceResources.getResources()); private MenuManager m_menuManager; private IPalette m_palette; private IEntry m_selectedEntry; private Object m_forcedTargetObject; private int m_layoutType; + private final PaletteViewer m_paletteViewer; //////////////////////////////////////////////////////////////////////////// // @@ -131,13 +132,21 @@ public PaletteComposite(Composite parent, int style) { setLayout(new FillLayout()); // prepare draw2d FigureCanvas { - m_figureCanvas = new FigureCanvas(this, SWT.V_SCROLL); - m_figureCanvas.getRootFigure().setBackgroundColor(COLOR_PALETTE_BACKGROUND); - m_figureCanvas.getRootFigure().setForegroundColor(COLOR_TEXT_ENABLED); + m_paletteViewer = new PaletteViewer(); + m_paletteViewer.addPaletteListener((palette, tool) -> { + // TODO Keep entry selected when CTRL key is pressed + selectEntry((IEntry) tool, false); + }); + m_paletteViewer.enableVerticalScrollbar(true); + m_paletteViewer.setPaletteViewerPreferences(new DesignerPaletteViewerPreferences()); + m_figureCanvas = (FigureCanvas) m_paletteViewer.createControl(this); + m_figureCanvas.setHorizontalScrollBarVisibility(FigureCanvas.NEVER); + m_figureCanvas.setScrollbarsMode(SWT.NONE); + m_figureCanvas.getLightweightSystem().getRootFigure().setBackgroundColor(COLOR_PALETTE_BACKGROUND); + m_figureCanvas.getLightweightSystem().getRootFigure().setForegroundColor(COLOR_TEXT_ENABLED); } // add palette figure (layer) m_paletteFigure = new PaletteFigure(); - m_figureCanvas.getRootFigure().add(m_paletteFigure); // set menu { m_menuManager = new MenuManager(); @@ -148,7 +157,7 @@ public PaletteComposite(Composite parent, int style) { // add feedback layer { m_feedbackLayer = new Layer("feedback"); - m_figureCanvas.getRootFigure().add(m_feedbackLayer); + m_figureCanvas.getLightweightSystem().getRootFigure().add(m_feedbackLayer); } m_layoutType = m_preferences.getLayoutType(); } @@ -162,10 +171,8 @@ private void addPopupActions(IMenuManager menuManager) { { org.eclipse.swt.graphics.Point cursorLocation = getDisplay().getCursorLocation(); cursorLocation = m_figureCanvas.toControl(cursorLocation); - TargetFigureFindVisitor visitor = - new TargetFigureFindVisitor(m_figureCanvas, cursorLocation.x, cursorLocation.y); - m_figureCanvas.getRootFigure().accept(visitor, false); - targetFigure = visitor.getTargetFigure(); + targetFigure = (Figure) ((GraphicalEditPart) m_paletteViewer.findObjectAt(new Point(cursorLocation))) + .getFigure(); } // prepare target object Object targetObject = null; @@ -205,6 +212,7 @@ public void dispose() { @SuppressWarnings("removal") public void setPalette(IPalette palette) { m_palette = palette; + m_paletteViewer.setPaletteRoot((PaletteRoot) palette); refreshPalette(); } @@ -233,6 +241,9 @@ public void setPreferences(IPalettePreferences preferences) { */ @SuppressWarnings("removal") public void selectEntry(IEntry selectedEntry, boolean reload) { + if (m_selectedEntry == selectedEntry) { + return; + } // activate new entry m_selectedEntry = selectedEntry; if (m_selectedEntry != null) { @@ -242,6 +253,7 @@ public void selectEntry(IEntry selectedEntry, boolean reload) { m_palette.selectDefault(); } } + m_paletteViewer.setActiveTool((ToolEntry) selectedEntry); // display updated state m_paletteFigure.repaint(); } @@ -251,7 +263,7 @@ public void selectEntry(IEntry selectedEntry, boolean reload) { */ @SuppressWarnings("removal") public Figure getCategoryFigure(ICategory category) { - return m_categoryFigures.get(category); + return ((CategoryEditPart) m_paletteViewer.getEditPartForModel(category)).getFigure(); } /** @@ -259,8 +271,7 @@ public Figure getCategoryFigure(ICategory category) { */ @SuppressWarnings("removal") public Figure getEntryFigure(ICategory category, IEntry entry) { - CategoryFigure categoryFigure = m_categoryFigures.get(category); - return categoryFigure.m_entryFigures.get(entry); + return ((EntryEditPart) m_paletteViewer.getEditPartForModel(entry)).getFigure(); } /** @@ -277,6 +288,13 @@ public PaletteFigure getPaletteFigure() { return m_paletteFigure; } + /** + * @noreference This method is not intended to be referenced by clients. + */ + public PaletteViewer getPaletteViewer() { + return m_paletteViewer; + } + //////////////////////////////////////////////////////////////////////////// // // PaletteFigure @@ -305,12 +323,10 @@ public PaletteFigure() { // //////////////////////////////////////////////////////////////////////////// public void refresh() { - m_categoryFigures.clear(); removeAll(); // add new CategoryFigure's for (ICategory category : m_palette.getCategories()) { CategoryFigure categoryFigure = new CategoryFigure(category); - m_categoryFigures.put(category, categoryFigure); add(categoryFigure); } // do initial layout @@ -371,7 +387,6 @@ protected void layout() { // //////////////////////////////////////////////////////////////////////////// private final ICategory m_category; - private final Map m_entryFigures = new HashMap<>(); private int m_columns; private int m_titleHeight; @@ -390,7 +405,6 @@ public CategoryFigure(ICategory category) { IEntry entry = (IEntry) element; // add figure EntryFigure entryFigure = new EntryFigure(entry); - m_entryFigures.put(entry, entryFigure); add(entryFigure); } } @@ -997,7 +1011,7 @@ protected void paintClientArea(Graphics graphics) { Rectangle r = getClientArea().getCopy().shrink(1, 1); // draw background graphics.pushState(); - boolean isSelected = m_entry == m_selectedEntry; + boolean isSelected = m_entry == m_paletteViewer.getActiveTool(); if (isSelected || m_mouseDown) { if (isSelected) { graphics.setBackgroundColor(COLOR_ENTRY_SELECTED); @@ -1187,10 +1201,7 @@ private Figure getTargetFigure(Figure source, Point p) { Point absoluteLocation = p.getCopy(); FigureUtils.translateFigureToCanvas(source, absoluteLocation); // do search - TargetFigureFindVisitor visitor = - new TargetFigureFindVisitor(m_figureCanvas, absoluteLocation.x, absoluteLocation.y); - m_figureCanvas.getRootFigure().accept(visitor, false); - return visitor.getTargetFigure(); + return (Figure) ((GraphicalEditPart) m_paletteViewer.findObjectAt(new Point(absoluteLocation))).getFigure(); } /**