diff options
author | John Taylor | 2020-06-08 20:11:33 +0000 |
---|---|---|
committer | Mickael Istria | 2020-06-09 17:26:36 +0000 |
commit | 0b1d19dc35efaae8fb304ca256ee291281c321c0 (patch) | |
tree | f569276ddf1476315e90e99191718106ca80d15d /org.eclipse.ui.workbench.texteditor | |
parent | 6a5d94500d117db68ed2641c88b016b33b145182 (diff) | |
download | eclipse.platform.text-0b1d19dc35efaae8fb304ca256ee291281c321c0.tar.gz eclipse.platform.text-0b1d19dc35efaae8fb304ca256ee291281c321c0.tar.xz eclipse.platform.text-0b1d19dc35efaae8fb304ca256ee291281c321c0.zip |
Bug 564099 - Improve font handling while zooming
Adjusts the zooming behavior to always zoom all "related" fonts at once,
rather than making exceptions for user overridden settings.
Change-Id: I92aed1bc4d5fa2a032c3a35ebe7aebb319f20974
Signed-off-by: John Taylor <johnpaultaylorii@gmail.com>
Diffstat (limited to 'org.eclipse.ui.workbench.texteditor')
-rw-r--r-- | org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextZoomHandler.java | 66 |
1 files changed, 36 insertions, 30 deletions
diff --git a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextZoomHandler.java b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextZoomHandler.java index 9113504beda..d159f716a61 100644 --- a/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextZoomHandler.java +++ b/org.eclipse.ui.workbench.texteditor/src/org/eclipse/ui/texteditor/AbstractTextZoomHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 Red Hat Inc. + * Copyright (c) 2020 Red Hat Inc. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -10,14 +10,19 @@ * * Contributors: * Mickael Istria (Red Hat Inc.) - 469918 Zoom In/Out + * John Taylor <johnpaultaylorii@gmail.com> - Bug 564099 *******************************************************************************/ package org.eclipse.ui.texteditor; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.Queue; import java.util.Set; import org.eclipse.swt.graphics.FontData; @@ -75,17 +80,19 @@ abstract class AbstractTextZoomHandler extends AbstractHandler { if (fontProperty == null) { fontProperty= JFaceResources.TEXT_FONT; } - Set<String> fontsToSet= getAffectedFontNames(fontProperty, fontRegistry); - FontData[] initialFontData= null; - String currentFontName= fontProperty; - while (currentFontName != null && (initialFontData= fontRegistry.getFontData(currentFontName)) == null) { - currentFontName= fgFontToDefault.get(currentFontName); + List<String> fontsToSet = getAffectedFontNames(fontProperty, fontRegistry); + for (String fontName : fontsToSet) { + FontData[] currentFontData = null; + String currentFontName = fontName; + while (currentFontName != null && (currentFontData = fontRegistry.getFontData(currentFontName)) == null) { + currentFontName = fgFontToDefault.get(currentFontName); + } + FontData[] newFontData = createFontDescriptor(currentFontData).getFontData(); + if (newFontData != null) { + fontRegistry.put(fontName, newFontData); + } } - FontData[] newFontData= createFontDescriptor(initialFontData).getFontData(); - if (newFontData != null) { - fontsToSet.stream().forEach(fontName -> fontRegistry.put(fontName, newFontData)); - } return Status.OK_STATUS; } @@ -133,7 +140,7 @@ abstract class AbstractTextZoomHandler extends AbstractHandler { * are set to default or inherit from reference font or a common parent that is affected * too. */ - private Set<String> getAffectedFontNames(String referenceFontName, FontRegistry fontRegistry) { + private List<String> getAffectedFontNames(String referenceFontName, FontRegistry fontRegistry) { synchronized (AbstractTextZoomHandler.class) { if (fgFontToDefault == null) { // TODO: This should rely on ThemeRegistry and IThemeElementDefinition, @@ -158,43 +165,42 @@ abstract class AbstractTextZoomHandler extends AbstractHandler { } } } - Set<String> res= new HashSet<>(); - FontData[] referenceFontData= fontRegistry.getFontData(referenceFontName); - if (fontRegistry.hasValueFor(referenceFontName)) { - res.add(referenceFontName); - } + String currentFontName= referenceFontName; - String rootFontName= referenceFontName; + // identify "root" font to change + String rootFontName = currentFontName; do { currentFontName= fgFontToDefault.get(currentFontName); - if (currentFontName != null && Arrays.equals(referenceFontData, fontRegistry.getFontData(currentFontName))) { + if (currentFontName != null) { rootFontName= currentFontName; } } while (currentFontName != null); - LinkedList<String> fontsToProcess= new LinkedList<>(); + + // propagate to "children" fonts + Set<String> fontNames = new LinkedHashSet<>(); + Set<String> alreadyProcessed = new HashSet<>(); + Queue<String> fontsToProcess = new LinkedList<>(); fontsToProcess.add(rootFontName); - // propage to "children" fonts - Set<String> alreadyProcessed= new HashSet<>(); while (!fontsToProcess.isEmpty()) { - currentFontName= fontsToProcess.get(0); - fontsToProcess.remove(0); - // with recent Java, use currentFOntName = fontsToProcess.poll instead of the 2 lines above + currentFontName = fontsToProcess.poll(); if (!alreadyProcessed.contains(currentFontName)) { // avoid infinite loop alreadyProcessed.add(currentFontName); - FontData[] currentFontData= fontRegistry.getFontData(currentFontName); - if (currentFontData == null || Arrays.equals(referenceFontData, currentFontData)) { if (fontRegistry.hasValueFor(currentFontName)) { - res.add(currentFontName); + fontNames.add(currentFontName); } Set<String> children= fgDefaultToFonts.get(currentFontName); if (children != null) { fontsToProcess.addAll(children); } } - } } - return res; + + // Order matters. Child fonts must be set before parent fonts to avoid + // double impacts. + List<String> result = new ArrayList<>(fontNames); + Collections.reverse(result); + return result; } } |