From 1107a9ec53f3aafe046e0810027d243e9fe5a331 Mon Sep 17 00:00:00 2001 From: Patrick Ziegler Date: Tue, 15 Oct 2024 21:44:18 +0200 Subject: [PATCH] Make overlay scrolling configurable via the palette settings This adds a new checkbox to the settings dialog that allows the user to replace the overlay scrollbar with the native scrollbar. Linux only, as the overlay is not available on any other platforms. Resolves https://github.com/eclipse/gef-classic/issues/569 --- CHANGELOG.md | 3 + .../swtbot/AbstractSWTBotEditorTests.java | 120 ++++++++++++++++++ .../gef/test/swtbot/AbstractSWTBotTests.java | 82 ------------ .../gef/test/swtbot/FlowDiagramTests.java | 2 +- .../gef/test/swtbot/LogicDiagramTests.java | 2 +- .../swtbot/PaletteSettingsDialogTests.java | 76 +++++++++++ .../gef/test/swtbot/SWTBotTestSuite.java | 3 +- .../gef/test/swtbot/ShapesDiagramTests.java | 2 +- org.eclipse.gef/.settings/.api_filters | 8 ++ org.eclipse.gef/META-INF/MANIFEST.MF | 2 +- .../org/eclipse/gef/internal/GEFMessages.java | 10 +- .../eclipse/gef/internal/messages.properties | 6 + .../InternalPaletteSettingsDialog.java | 108 ++++++++++++++++ .../DefaultPaletteViewerPreferences.java | 20 ++- .../eclipse/gef/ui/palette/PaletteViewer.java | 8 +- .../ui/palette/PaletteViewerPreferences.java | 33 ++++- .../gef/ui/palette/SettingsAction.java | 6 +- 17 files changed, 397 insertions(+), 94 deletions(-) create mode 100644 org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotEditorTests.java create mode 100644 org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/PaletteSettingsDialogTests.java create mode 100644 org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/InternalPaletteSettingsDialog.java 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..a6c884ca3 --- /dev/null +++ b/org.eclipse.gef.tests/src/org/eclipse/gef/test/swtbot/AbstractSWTBotEditorTests.java @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (c) 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * IBM Corporation - 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..d3e89da09 --- /dev/null +++ b/org.eclipse.gef/src/org/eclipse/gef/internal/ui/palette/InternalPaletteSettingsDialog.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * 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: + * IBM Corporation - 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)) { + new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); + 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(); }