diff --git a/CHANGELOG.md b/CHANGELOG.md index 543a1ad6d..793081650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # GEF Classic 3.22.0 +## GEF + - _Linux Only_ The overlay scrolling of the palette can be configured via the _PaletteViewerPreferences.PREFERENCE_SCROLLBARS_MODE_ preference. Supported values are _SWT.NONE_ and _SWT.SCROLLBAR_OVERLAY_. + ## Zest - Integration of Zest 2.0 development branch. See the [wiki](https://github.com/eclipse/gef-classic/wiki/Zest#zest-2x) for more details. In case only default layout algorithms are used, the initial migration should be seamless. Otherwise the algorithms can be adapted to run in legacy mode by extending `AbstractLayoutAlgorithm.Zest1` or have to be re-implemented using the new API by extending `AbstractLayoutAlgorithm`. Note that this legacy mode will be removed in a future release. The following list contains the most significant, deprecated features: - `ContinuousLayoutAlgorithm` and `Stoppable`, with no replacement. diff --git a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotEditorTests.java b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotEditorTests.java new file mode 100644 index 000000000..a202f3d94 --- /dev/null +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotEditorTests.java @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (c) 2024 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Patrick Ziegler - initial API and implementation + *******************************************************************************/ + +package org.eclipse.gef.test.swtbot; + +import org.eclipse.swt.widgets.Display; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Platform; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWizard; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.dialogs.WizardNewFileCreationPage; +import org.eclipse.ui.intro.IIntroManager; +import org.eclipse.ui.intro.IIntroPart; +import org.eclipse.ui.wizards.IWizardDescriptor; +import org.eclipse.ui.wizards.IWizardRegistry; + +import org.junit.After; +import org.junit.Before; +import org.osgi.framework.Bundle; + +@SuppressWarnings("nls") +public abstract class AbstractSWTBotEditorTests extends AbstractSWTBotTests { + private static final String PROJECT_NAME = "TestProject"; + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + // This bundle disables the examples via an activityPatternBinding + Bundle bundle = Platform.getBundle("org.eclipse.gef.examples.ui.capabilities"); + if (bundle != null) { + bundle.uninstall(); + } + IWorkbench wb = PlatformUI.getWorkbench(); + Display display = wb.getDisplay(); + // Close "Welcome" page + IIntroManager im = wb.getIntroManager(); + IIntroPart intro = wb.getIntroManager().getIntro(); + if (intro != null) { + display.syncExec(() -> im.closeIntro(intro)); + } + // Switch to the "Resource" perspective + display.syncCall(() -> { + IWorkbenchWindow ww = wb.getActiveWorkbenchWindow(); + return wb.showPerspective("org.eclipse.ui.resourcePerspective", ww); + }); + // Create & open new test project + IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME); + display.syncCall(() -> { + if (!project.exists()) { + project.create(null); + } + project.open(null); + return null; + }); + // Create new example file + IWizardRegistry wr = wb.getNewWizardRegistry(); + IWizardDescriptor wd = wr.findWizard(getWizardId()); + display.syncCall(() -> { + IWorkbenchWizard wizard = wd.createWizard(); + wizard.init(wb, new StructuredSelection(project)); + WizardDialog wizardDialog = new WizardDialog(display.getActiveShell(), wizard); + wizardDialog.setBlockOnOpen(false); + wizardDialog.open(); + WizardNewFileCreationPage wizardPage = (WizardNewFileCreationPage) wizardDialog.getCurrentPage(); + wizardPage.setFileName(getFileName()); + wizard.performFinish(); + wizardDialog.close(); + return null; + }); + } + + @After + @Override + public void tearDown() throws Exception { + IWorkbench wb = PlatformUI.getWorkbench(); + Display display = wb.getDisplay(); + // Close all open editors + display.syncCall(() -> { + IWorkbenchWindow ww = wb.getActiveWorkbenchWindow(); + IWorkbenchPage page = ww.getActivePage(); + return page.closeAllEditors(false); + }); + // Delete test project + IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME); + display.syncCall(() -> { + project.delete(true, null); + return null; + }); + super.tearDown(); + } + + /** + * @return The id of the wizard with which the test resources is created. + */ + protected abstract String getWizardId(); + + /** + * @return The file name (with extension) of the test resource. + */ + protected abstract String getFileName(); + +} diff --git a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotTests.java b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotTests.java index 9873d7184..07d44bcf4 100644 --- a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotTests.java +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotTests.java @@ -21,25 +21,11 @@ import org.eclipse.swt.widgets.Display; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.ILogListener; import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swtbot.eclipse.gef.finder.SWTGefBot; import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditPart; import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefViewer; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.IWorkbenchWizard; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.dialogs.WizardNewFileCreationPage; -import org.eclipse.ui.intro.IIntroManager; -import org.eclipse.ui.intro.IIntroPart; -import org.eclipse.ui.wizards.IWizardDescriptor; -import org.eclipse.ui.wizards.IWizardRegistry; import org.eclipse.draw2d.FigureCanvas; @@ -47,7 +33,6 @@ import org.junit.After; import org.junit.Before; -import org.osgi.framework.Bundle; /** * To be able to execute these tests in the Eclipse IDE, the tests must @@ -55,7 +40,6 @@ */ @SuppressWarnings("nls") public abstract class AbstractSWTBotTests { - private static final String PROJECT_NAME = "TestProject"; private ILogListener problemListener; private List problems; protected SWTGefBot bot; @@ -68,48 +52,6 @@ public void setUp() throws Exception { Make sure that "Run in UI thread" is unchecked in your launch configuration or that useUIThread is set to false in the pom.xml """); } - // This bundle disables the examples via an activityPatternBinding - Bundle bundle = Platform.getBundle("org.eclipse.gef.examples.ui.capabilities"); - if (bundle != null) { - bundle.uninstall(); - } - IWorkbench wb = PlatformUI.getWorkbench(); - Display display = wb.getDisplay(); - // Close "Welcome" page - IIntroManager im = wb.getIntroManager(); - IIntroPart intro = wb.getIntroManager().getIntro(); - if (intro != null) { - display.syncExec(() -> im.closeIntro(intro)); - } - // Switch to the "Resource" perspective - display.syncCall(() -> { - IWorkbenchWindow ww = wb.getActiveWorkbenchWindow(); - return wb.showPerspective("org.eclipse.ui.resourcePerspective", ww); - }); - // Create & open new test project - IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME); - display.syncCall(() -> { - if (!project.exists()) { - project.create(null); - } - project.open(null); - return null; - }); - // Create new example file - IWizardRegistry wr = wb.getNewWizardRegistry(); - IWizardDescriptor wd = wr.findWizard(getWizardId()); - display.syncCall(() -> { - IWorkbenchWizard wizard = wd.createWizard(); - wizard.init(wb, new StructuredSelection(project)); - WizardDialog wizardDialog = new WizardDialog(display.getActiveShell(), wizard); - wizardDialog.setBlockOnOpen(false); - wizardDialog.open(); - WizardNewFileCreationPage wizardPage = (WizardNewFileCreationPage) wizardDialog.getCurrentPage(); - wizardPage.setFileName(getFileName()); - wizard.performFinish(); - wizardDialog.close(); - return null; - }); // Keep track of all unchecked exceptions problems = new ArrayList<>(); problemListener = (status, plugin) -> { @@ -144,36 +86,12 @@ private static final boolean isRelevant(Throwable throwable) { @After public void tearDown() throws Exception { - IWorkbench wb = PlatformUI.getWorkbench(); - Display display = wb.getDisplay(); - // Close all open editors - display.syncCall(() -> { - IWorkbenchWindow ww = wb.getActiveWorkbenchWindow(); - IWorkbenchPage page = ww.getActivePage(); - return page.closeAllEditors(false); - }); - // Delete test project - IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME); - display.syncCall(() -> { - project.delete(true, null); - return null; - }); // Cleanup problem listener and check for exceptions Platform.removeLogListener(problemListener); problems.forEach(Throwable::printStackTrace); assertTrue("Test threw an unchecked exception. Check logs for details", problems.isEmpty()); } - /** - * @return The id of the wizard with which the test resources is created. - */ - protected abstract String getWizardId(); - - /** - * @return The file name (with extension) of the test resource. - */ - protected abstract String getFileName(); - /** * Convenience method that forces an update of the GEF viewer. This is necessary * when e.g. moving a figure, as the new position of the edit part is calculated diff --git a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/FlowDiagramTests.java b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/FlowDiagramTests.java index f2e96a0b7..c1d997a9b 100644 --- a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/FlowDiagramTests.java +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/FlowDiagramTests.java @@ -27,7 +27,7 @@ import org.junit.Test; @SuppressWarnings("nls") -public class FlowDiagramTests extends AbstractSWTBotTests { +public class FlowDiagramTests extends AbstractSWTBotEditorTests { /** * Tests whether new palette items can be added to the viewer. diff --git a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/LogicDiagramTests.java b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/LogicDiagramTests.java index 2288dc113..0dd30ec37 100644 --- a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/LogicDiagramTests.java +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/LogicDiagramTests.java @@ -41,7 +41,7 @@ import org.junit.Test; @SuppressWarnings("nls") -public class LogicDiagramTests extends AbstractSWTBotTests { +public class LogicDiagramTests extends AbstractSWTBotEditorTests { /** * Tests that when the ruler is enabled, moving the ruler also moves all diff --git a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/PaletteSettingsDialogTests.java b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/PaletteSettingsDialogTests.java new file mode 100644 index 000000000..f56976723 --- /dev/null +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/PaletteSettingsDialogTests.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2024 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Patrick Ziegler - initial API and implementation + *******************************************************************************/ + +package org.eclipse.gef.test.swtbot; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Shell; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; +import org.eclipse.ui.PlatformUI; + +import org.eclipse.gef.internal.ui.palette.InternalPaletteSettingsDialog; +import org.eclipse.gef.ui.palette.DefaultPaletteViewerPreferences; +import org.eclipse.gef.ui.palette.PaletteViewerPreferences; +import org.eclipse.gef.ui.palette.customize.PaletteSettingsDialog; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class PaletteSettingsDialogTests extends AbstractSWTBotTests { + private SWTBotShell settingsDialog; + private PaletteViewerPreferences preferences; + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + preferences = new DefaultPaletteViewerPreferences(); + settingsDialog = UIThreadRunnable.syncExec(() -> { + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); + PaletteSettingsDialog settings = new InternalPaletteSettingsDialog(shell, preferences); + settings.setBlockOnOpen(false); + settings.open(); + return bot.shell("Palette Settings"); //$NON-NLS-1$ + }); + } + + @Override + @After + public void tearDown() throws Exception { + settingsDialog.close(); + super.tearDown(); + } + + @Test + public void testOverlayScrollingPreferences() { + assumeTrue(Platform.OS_LINUX.equals(Platform.getOS())); + + SWTBotCheckBox checkbox = settingsDialog.bot().checkBox("Enable Overlay Scrolling"); //$NON-NLS-1$ + assertEquals(preferences.getScrollbarsMode(), SWT.SCROLLBAR_OVERLAY); + assertTrue(checkbox.isChecked()); + + checkbox.click(); + assertEquals(preferences.getScrollbarsMode(), SWT.NONE); + assertFalse(checkbox.isChecked()); + } +} diff --git a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/SWTBotTestSuite.java b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/SWTBotTestSuite.java index 986208e97..ea33cbcc8 100644 --- a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/SWTBotTestSuite.java +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/SWTBotTestSuite.java @@ -24,7 +24,8 @@ @Suite.SuiteClasses({ FlowDiagramTests.class, LogicDiagramTests.class, - ShapesDiagramTests.class + ShapesDiagramTests.class, + PaletteSettingsDialogTests.class }) public class SWTBotTestSuite { } diff --git a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/ShapesDiagramTests.java b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/ShapesDiagramTests.java index 425964fbf..fe29d7de3 100644 --- a/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/ShapesDiagramTests.java +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/ShapesDiagramTests.java @@ -31,7 +31,7 @@ import org.junit.Test; @SuppressWarnings("nls") -public class ShapesDiagramTests extends AbstractSWTBotTests { +public class ShapesDiagramTests extends AbstractSWTBotEditorTests { /** * Tests whether edit parts can be properly resized. diff --git a/org.eclipse.gef/.settings/.api_filters b/org.eclipse.gef/.settings/.api_filters index dac7f0def..f711a2d0d 100644 --- a/org.eclipse.gef/.settings/.api_filters +++ b/org.eclipse.gef/.settings/.api_filters @@ -126,6 +126,14 @@ + + + + + + + + diff --git a/org.eclipse.gef/META-INF/MANIFEST.MF b/org.eclipse.gef/META-INF/MANIFEST.MF index b407a5889..15bcc8b52 100644 --- a/org.eclipse.gef/META-INF/MANIFEST.MF +++ b/org.eclipse.gef/META-INF/MANIFEST.MF @@ -14,7 +14,7 @@ Export-Package: org.eclipse.gef, org.eclipse.gef.handles, org.eclipse.gef.internal;x-friends:="org.eclipse.gef.examples.text,org.eclipse.gef.examples.logic", org.eclipse.gef.internal.icons;x-internal:=true, - org.eclipse.gef.internal.ui.palette;x-internal:=true, + org.eclipse.gef.internal.ui.palette;x-friends:="org.eclipse.gef.tests", org.eclipse.gef.internal.ui.palette.editparts;x-internal:=true, org.eclipse.gef.internal.ui.rulers;x-friends:="org.eclipse.gef.tests", org.eclipse.gef.palette, diff --git a/org.eclipse.gef/src/org/eclipse/gef/internal/GEFMessages.java b/org.eclipse.gef/src/org/eclipse/gef/internal/GEFMessages.java index 6d749c2c9..7b5accfa5 100644 --- a/org.eclipse.gef/src/org/eclipse/gef/internal/GEFMessages.java +++ b/org.eclipse.gef/src/org/eclipse/gef/internal/GEFMessages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation 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 @@ -111,6 +111,14 @@ public class GEFMessages extends NLS { public static String Guide_Desc; public static String Create_Guide_Label; public static String Create_Guide_Tooltip; + /** + * The String "Enable Overlay Scrolling" + */ + public static String Settings_OverlayScrolling; + /** + * The String "Overlay Scrolling:" + */ + public static String Settings_OverlayScrolling_Group; static { NLS.initializeMessages("org.eclipse.gef.internal.messages", GEFMessages.class); //$NON-NLS-1$ diff --git a/org.eclipse.gef/src/org/eclipse/gef/internal/messages.properties b/org.eclipse.gef/src/org/eclipse/gef/internal/messages.properties index 7e45f0194..c83d7dc56 100644 --- a/org.eclipse.gef/src/org/eclipse/gef/internal/messages.properties +++ b/org.eclipse.gef/src/org/eclipse/gef/internal/messages.properties @@ -159,3 +159,9 @@ Create_Guide_Tooltip=Create Guide ############################################## RenameAction_Tooltip=Rename RenameAction_Label=Rena&me + +############################################## +# Palette Settings +############################################## +Settings_OverlayScrolling=Enable Overlay Scrolling +Settings_OverlayScrolling_Group=Overlay Scrolling: \ No newline at end of file diff --git a/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/InternalPaletteSettingsDialog.java b/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/InternalPaletteSettingsDialog.java new file mode 100644 index 000000000..a076001bd --- /dev/null +++ b/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/InternalPaletteSettingsDialog.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2024 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Patrick Ziegler - initial API and implementation + *******************************************************************************/ + +package org.eclipse.gef.internal.ui.palette; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.jface.dialogs.IDialogConstants; + +import org.eclipse.gef.internal.GEFMessages; +import org.eclipse.gef.ui.palette.PaletteViewerPreferences; +import org.eclipse.gef.ui.palette.customize.PaletteSettingsDialog; + +/** + * Internal implementation of the {@link PaletteSettingsDialog} that contains + * additional fields compared to the public dialog. + */ +public class InternalPaletteSettingsDialog extends PaletteSettingsDialog { + protected static final String CACHE_SCROLLBARS_MODE = "scrollbars mode"; //$NON-NLS-1$ + protected static final int SCROLLBARS_MODE_ID = IDialogConstants.CLIENT_ID + 15; + private final PaletteViewerPreferences prefs; + + public InternalPaletteSettingsDialog(Shell parentShell, PaletteViewerPreferences prefs) { + super(parentShell, prefs); + this.prefs = prefs; + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite) super.createDialogArea(parent); + + if (Platform.getOS().equals(Platform.OS_LINUX)) { + Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); + separator.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); + Control child = createScrollbarsSettings(composite); + child.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); + } + + return composite; + } + + @Override + protected void buttonPressed(int buttonId) { + if (SCROLLBARS_MODE_ID == buttonId) { + Button b = getButton(buttonId); + handleScrollbarsModeChanged(b.getSelection()); + } else { + super.buttonPressed(buttonId); + } + } + + @Override + protected void cacheSettings() { + super.cacheSettings(); + settings.put(CACHE_SCROLLBARS_MODE, prefs.getScrollbarsMode()); + } + + @Override + protected void restoreSettings() { + super.restoreSettings(); + prefs.setScrollbarsMode((int) settings.get(CACHE_SCROLLBARS_MODE)); + } + + /** + * Creates and initializes the part of the dialog that displays the options for + * overlay scrolling. This method should only be called on Linux. * + * + * @param parent the parent composite + * @return the newly created control + */ + protected Control createScrollbarsSettings(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + composite.setLayout(new GridLayout()); + Label label = new Label(composite, SWT.NONE); + label.setText(GEFMessages.Settings_OverlayScrolling_Group); + Button button = createButton(composite, SCROLLBARS_MODE_ID, GEFMessages.Settings_OverlayScrolling, SWT.CHECK, + null); + button.setSelection(prefs.getScrollbarsMode() == SWT.SCROLLBAR_OVERLAY); + return composite; + } + + /** + * This method is called whenever the "Enable Overlay Scrolling" checkbox is + * selected/deselected. The method argument is the new state of the button. + * + * @param checked If {@code true}, overlay scrolling will be enabled. + */ + protected void handleScrollbarsModeChanged(boolean checked) { + prefs.setScrollbarsMode(checked ? SWT.SCROLLBAR_OVERLAY : SWT.NONE); + } +} diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/DefaultPaletteViewerPreferences.java b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/DefaultPaletteViewerPreferences.java index 2a4dc4d58..e8b34dc83 100644 --- a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/DefaultPaletteViewerPreferences.java +++ b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/DefaultPaletteViewerPreferences.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation 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,6 +15,7 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; +import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontData; import org.eclipse.jface.preference.IPreferenceStore; @@ -76,6 +77,7 @@ public DefaultPaletteViewerPreferences(final IPreferenceStore store) { store.setDefault(PREFERENCE_LAYOUT, LAYOUT_LIST); store.setDefault(PREFERENCE_AUTO_COLLAPSE, COLLAPSE_AS_NEEDED); store.setDefault(PREFERENCE_FONT, DEFAULT_FONT); + store.setDefault(PREFERENCE_SCROLLBARS_MODE, SWT.SCROLLBAR_OVERLAY); listener = new PreferenceStoreListener(); store.addPropertyChangeListener(listener); @@ -231,6 +233,8 @@ protected void handlePreferenceStorePropertyChanged(String property) { firePropertyChanged(property, Integer.valueOf(getAutoCollapseSetting())); } else if (property.equals(PREFERENCE_FONT)) { firePropertyChanged(property, getFontData()); + } else if (property.equals(PREFERENCE_SCROLLBARS_MODE)) { + firePropertyChanged(property, getScrollbarsMode()); } else { firePropertyChanged(property, Boolean.valueOf(useLargeIcons(convertPreferenceNameToLayout(property)))); } @@ -356,4 +360,18 @@ public void propertyChange(PropertyChangeEvent evt) { } } + @Override + public void setScrollbarsMode(int mode) { + if (mode != SWT.SCROLLBAR_OVERLAY && mode != SWT.NONE) { + throw new IllegalArgumentException( + "Scrollbar mode must be either SWT.SCROLLBAR_OVERLAY or SWT.NONE, but %d was given!" //$NON-NLS-1$ + .formatted(mode)); + } + getPreferenceStore().setValue(PREFERENCE_SCROLLBARS_MODE, mode); + } + + @Override + public int getScrollbarsMode() { + return getPreferenceStore().getInt(PREFERENCE_SCROLLBARS_MODE); + } } diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java index a6b985ecc..ec5bf6327 100644 --- a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java +++ b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation 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 @@ -71,6 +71,11 @@ public void propertyChange(PropertyChangeEvent evt) { || property.equals(DefaultPaletteViewerPreferences .convertLayoutToPreferenceName(getPaletteViewerPreferences().getLayoutSetting()))) { refreshAllEditParts(root); + } else if (property.equals(PaletteViewerPreferences.PREFERENCE_SCROLLBARS_MODE)) { + FigureCanvas canvas = getFigureCanvas(); + if (canvas != null) { + canvas.setScrollbarsMode((int) evt.getNewValue()); + } } } @@ -271,6 +276,7 @@ protected void hookControl() { canvas.setHorizontalScrollBarVisibility(FigureCanvas.NEVER); canvas.setVerticalScrollBarVisibility(globalScrollbar ? FigureCanvas.ALWAYS : FigureCanvas.AUTOMATIC); if (prefs != null) { + canvas.setScrollbarsMode(prefs.getScrollbarsMode()); prefs.addPropertyChangeListener(prefListener); } updateFont(); diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewerPreferences.java b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewerPreferences.java index af739ad54..538478097 100644 --- a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewerPreferences.java +++ b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewerPreferences.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation 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 java.beans.PropertyChangeListener; +import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontData; /** @@ -26,6 +27,7 @@ * future. * * @author Pratik Shah + * @noimplement This interface is not intended to be implemented by clients. */ public interface PaletteViewerPreferences { @@ -129,6 +131,14 @@ public interface PaletteViewerPreferences { */ String PREFERENCE_FONT = "Palette Font"; //$NON-NLS-1$ + /** + * Linux Only Property name for enabling or disabling the scrollbars + * overlay. + * + * @since 3.20 + */ + String PREFERENCE_SCROLLBARS_MODE = "Scrollbars Mode"; //$NON-NLS-1$ + /** * @param listener the PropertyChangeListener to be notified of changes * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(java.beans.PropertyChangeListener) @@ -298,4 +308,25 @@ public interface PaletteViewerPreferences { */ boolean useLargeIcons(); + /** + * Enables or disables overlay scrolling for the palette viewer. Supported + * values are: + *
    + *
  • {@link SWT#NONE}
  • + *
  • {@link SWT#SCROLLBAR_OVERLAY}
  • + *
+ * Overlay scrollbars are only supported on {@code Linux}. + * + * @since 3.20 + */ + void setScrollbarsMode(int mode); + + /** + * Returns whether overlay scrolling is enabled for the palette viewer . Overlay + * scrollbars are only supported on {@code Linux}. + * + * @return One of {@link SWT#SCROLLBAR_OVERLAY} or {@link SWT#NONE}. + * @since 3.20 + */ + int getScrollbarsMode(); } diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/SettingsAction.java b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/SettingsAction.java index fda0dad08..1094a1205 100644 --- a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/SettingsAction.java +++ b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/SettingsAction.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2010 IBM Corporation and others. + * Copyright (c) 2000, 2024 IBM Corporation 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,7 +15,7 @@ import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.gef.ui.palette.customize.PaletteSettingsDialog; +import org.eclipse.gef.internal.ui.palette.InternalPaletteSettingsDialog; /** * An action to launch the Settings dialog for the given palette. @@ -44,7 +44,7 @@ public SettingsAction(PaletteViewer palette) { */ @Override public void run() { - Dialog settings = new PaletteSettingsDialog(paletteViewer.getControl().getShell(), + Dialog settings = new InternalPaletteSettingsDialog(paletteViewer.getControl().getShell(), paletteViewer.getPaletteViewerPreferences()); settings.open(); }