From ed22f40342f0c0740792154d411d46240f685d03 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Wed, 16 Sep 2015 15:24:52 +0300 Subject: [PATCH] IDEA-142875 Antialiasing setting --- .../com/intellij/ide/ui/AntialiasingType.java | 91 ++++++++++++++++++ .../intellij/ide/ui/LCDRenderingScope.java | 86 ++--------------- .../src/com/intellij/ide/ui/UISettings.java | 10 +- .../ide/ui/AppearanceConfigurable.java | 63 ++++++++----- .../com/intellij/ide/ui/AppearancePanel.form | 94 +++++++++++-------- .../openapi/editor/ex/util/EditorUIUtil.java | 4 +- .../impl/ComplementaryFontsRegistry.java | 7 +- .../openapi/wm/impl/content/BaseLabel.java | 4 +- .../src/messages/IdeBundle.properties | 5 + 9 files changed, 211 insertions(+), 153 deletions(-) create mode 100644 platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java b/platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java new file mode 100644 index 000000000000..4cc37b39ea59 --- /dev/null +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java @@ -0,0 +1,91 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ide.ui; + +import sun.swing.SwingUtilities2; + +import java.awt.*; + +public enum AntialiasingType { + SUBPIXEL, + GREYSCALE, + OFF; + + private static final SwingUtilities2.AATextInfo aaEnabled = + new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_ON, 140); + + private static final SwingUtilities2.AATextInfo lcdEnabled = + new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, 140); + + private static final SwingUtilities2.AATextInfo aaDisabled = null; + + public static Object getAAHintForSwingComponent() { + UISettings uiSettings = UISettings.getInstance(); + + if (uiSettings == null) return aaEnabled; + + switch (uiSettings.IDE_AA_TYPE) { + case SUBPIXEL: + return lcdEnabled; + case GREYSCALE: + return aaEnabled; + case OFF: + return aaDisabled; + } + + return aaEnabled; + } + + public Object getRenderingHintValue () { + Object value = RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB; + switch (this) { + case SUBPIXEL: + break; + case GREYSCALE: + value = RenderingHints.VALUE_TEXT_ANTIALIAS_ON; + break; + case OFF: + value = RenderingHints.VALUE_TEXT_ANTIALIAS_OFF; + break; + } + return value; + } + + public static Object getKeyForCurrentScope(boolean inEditor) { + UISettings uiSettings = UISettings.getInstance(); + if (uiSettings == null) return RenderingHints.VALUE_TEXT_ANTIALIAS_ON; + return inEditor ? uiSettings.EDITOR_AA_TYPE.getRenderingHintValue() : uiSettings.IDE_AA_TYPE.getRenderingHintValue(); + } + + @Override + public String toString() { + String description ; + switch (this) { + case SUBPIXEL: + description = "Subpixel"; + break; + case GREYSCALE: + description = "Greyscale"; + break; + case OFF: + description = "No antialiasing"; + break; + default: + description = "Subpixel"; + } + return description; + } + } diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/LCDRenderingScope.java b/platform/editor-ui-api/src/com/intellij/ide/ui/LCDRenderingScope.java index 6334371ee879..8b6ac71a8f66 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/ui/LCDRenderingScope.java +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/LCDRenderingScope.java @@ -15,87 +15,13 @@ */ package com.intellij.ide.ui; -import sun.swing.SwingUtilities2; -import java.awt.*; - +// Use AntialiasingType instead +@Deprecated public enum LCDRenderingScope { + @Deprecated IDE, + @Deprecated EXCLUDING_EDITOR, - OFF; - - public static LCDRenderingScope getWithLongestName() { - return IDE; - } - - private static final SwingUtilities2.AATextInfo aaEnabled = - new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_ON, 140); - - private static final SwingUtilities2.AATextInfo lcdEnabled = - new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, 140); - - private static final SwingUtilities2.AATextInfo aaDisabled = null; - - public static Object getAAHintForSwingComponent() { - UISettings uiSettings = UISettings.getInstance(); - if (uiSettings.ANTIALIASING_IN_IDE) { - if (uiSettings.LCD_RENDERING_SCOPE == OFF) { - return aaEnabled; - } - return lcdEnabled; - } - return aaDisabled; - } - - - public static Object getKeyForCurrentScope(boolean inEditor) { - Object renderingHint = RenderingHints.VALUE_TEXT_ANTIALIAS_OFF; - - UISettings uiSettings = UISettings.getInstance(); - - if (uiSettings != null && uiSettings.ANTIALIASING_IN_IDE) { - switch (uiSettings.LCD_RENDERING_SCOPE) { - case IDE: - renderingHint = RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB; - break; - case EXCLUDING_EDITOR: - if (!inEditor) { - renderingHint = RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB; - break; - } - case OFF: - renderingHint = RenderingHints.VALUE_TEXT_ANTIALIAS_ON; - break; - } - } - return renderingHint; - } - - @Override - public String toString() { - String description ; - switch (this) { - case IDE: - description = "LCD Rendering in IDE and Editor"; - break; - case EXCLUDING_EDITOR: - description = "LCD Rendering in IDE"; - break; - case OFF: - description = "Without LCD rendering"; - break; - default: - description = "LCD Rendering in IDE"; - } - return description; - } - - public static boolean shouldRenderEditor(LCDRenderingScope scope) { - if (!UISettings.getInstance().ANTIALIASING_IN_IDE) return false; - switch (scope) { - case IDE: - return true; - default: - return false; - } - } + @Deprecated + OFF } diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java index 92bc57ae9bfe..0617189a53c8 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java @@ -97,10 +97,8 @@ public class UISettings extends SimpleModificationTracker implements PersistentS public boolean CLOSE_NON_MODIFIED_FILES_FIRST = false; public boolean ACTIVATE_MRU_EDITOR_ON_CLOSE = false; public boolean ACTIVATE_RIGHT_EDITOR_ON_CLOSE = false; - @Deprecated - public boolean ANTIALIASING_IN_EDITOR = true; - public boolean ANTIALIASING_IN_IDE = ANTIALIASING_IN_EDITOR; - public LCDRenderingScope LCD_RENDERING_SCOPE = UIUtil.isRetina() ? LCDRenderingScope.OFF : LCDRenderingScope.IDE; + public AntialiasingType IDE_AA_TYPE = AntialiasingType.SUBPIXEL; + public AntialiasingType EDITOR_AA_TYPE = AntialiasingType.SUBPIXEL; public ColorBlindness COLOR_BLINDNESS; public boolean USE_LCD_RENDERING_IN_EDITOR = true; public boolean MOVE_MOUSE_ON_DEFAULT_BUTTON = false; @@ -286,10 +284,8 @@ public class UISettings extends SimpleModificationTracker implements PersistentS Graphics2D g2d = (Graphics2D)g; UISettings uiSettings = getInstance(); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - if (uiSettings != null) { - g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, LCDRenderingScope.getKeyForCurrentScope(false)); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AntialiasingType.getKeyForCurrentScope(false)); } else { g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java index fe7b23f3b927..39e42a8e70de 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java @@ -32,6 +32,7 @@ import com.intellij.ui.components.JBCheckBox; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.intellij.openapi.diagnostic.Logger; import javax.swing.*; import javax.swing.event.ChangeEvent; @@ -45,6 +46,9 @@ import java.util.Hashtable; * @author Eugene Belyaev */ public class AppearanceConfigurable extends BaseConfigurable implements SearchableConfigurable { + + private static final Logger LOG = Logger.getInstance("#com.intellij.ide.ui.AppearanceConfigurable"); + private MyComponent myComponent; public String getDisplayName() { @@ -63,6 +67,9 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab } public JComponent createComponent() { + + UISettings settings = UISettings.getInstance(); + initComponent(); DefaultComboBoxModel aModel = new DefaultComboBoxModel(UIUtil.getValidFontNames(Registry.is("ide.settings.appearance.font.family.only"))); myComponent.myFontCombo.setModel(aModel); @@ -74,18 +81,11 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab myComponent.myLafComboBox.setModel(new DefaultComboBoxModel(LafManager.getInstance().getInstalledLookAndFeels())); myComponent.myLafComboBox.setRenderer(new LafComboBoxRenderer()); - myComponent.myAntialiasingCheckBox.setSelected(UISettings.getInstance().ANTIALIASING_IN_IDE); - myComponent.myLCDRenderingScopeCombo.setEnabled(UISettings.getInstance().ANTIALIASING_IN_IDE); + myComponent.myAntialiasingInIDE.setModel(new DefaultComboBoxModel(AntialiasingType.values())); + myComponent.myAntialiasingInEditor.setModel(new DefaultComboBoxModel(AntialiasingType.values())); - myComponent.myAntialiasingCheckBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - myComponent.myLCDRenderingScopeCombo.setEnabled(myComponent.myAntialiasingCheckBox.isSelected()); - } - }); - - myComponent.myLCDRenderingScopeCombo.setModel(new DefaultComboBoxModel(LCDRenderingScope.values())); - myComponent.myLCDRenderingScopeCombo.setSelectedItem(UISettings.getInstance().LCD_RENDERING_SCOPE); + myComponent.myAntialiasingInIDE.setSelectedItem(settings.IDE_AA_TYPE); + myComponent.myAntialiasingInEditor.setSelectedItem(settings.EDITOR_AA_TYPE); Dictionary delayDictionary = new Hashtable(); delayDictionary.put(new Integer(0), new JLabel("0")); @@ -152,13 +152,13 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab shouldUpdateUI = true; } - if (myComponent.myAntialiasingCheckBox.isSelected() != settings.ANTIALIASING_IN_IDE) { - settings.ANTIALIASING_IN_IDE = myComponent.myAntialiasingCheckBox.isSelected(); + if (!myComponent.myAntialiasingInIDE.getSelectedItem().equals(settings.IDE_AA_TYPE)) { + settings.IDE_AA_TYPE = (AntialiasingType)myComponent.myAntialiasingInIDE.getSelectedItem(); shouldUpdateUI = true; } - if (!myComponent.myLCDRenderingScopeCombo.getSelectedItem().equals(settings.LCD_RENDERING_SCOPE)) { - settings.LCD_RENDERING_SCOPE = (LCDRenderingScope)myComponent.myLCDRenderingScopeCombo.getSelectedItem(); + if (!myComponent.myAntialiasingInEditor.getSelectedItem().equals(settings.EDITOR_AA_TYPE)) { + settings.EDITOR_AA_TYPE = (AntialiasingType)myComponent.myAntialiasingInEditor.getSelectedItem(); shouldUpdateUI = true; } @@ -298,8 +298,14 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab UISettings settings = UISettings.getInstance(); myComponent.myFontCombo.setSelectedItem(settings.FONT_FACE); - myComponent.myAntialiasingCheckBox.setSelected(settings.ANTIALIASING_IN_IDE); - myComponent.myLCDRenderingScopeCombo.setSelectedItem(settings.LCD_RENDERING_SCOPE); + + // todo migrate + //myComponent.myAntialiasingCheckBox.setSelected(settings.ANTIALIASING_IN_IDE); + //myComponent.myLCDRenderingScopeCombo.setSelectedItem(settings.LCD_RENDERING_SCOPE); + + myComponent.myAntialiasingInIDE.setSelectedItem(settings.IDE_AA_TYPE); + myComponent.myAntialiasingInEditor.setSelectedItem(settings.EDITOR_AA_TYPE); + myComponent.myFontSizeCombo.setSelectedItem(Integer.toString(settings.FONT_SIZE)); myComponent.myPresentationModeFontSize.setSelectedItem(Integer.toString(settings.PRESENTATION_MODE_FONT_SIZE)); myComponent.myAnimateWindowsCheckBox.setSelected(settings.ANIMATE_WINDOWS); @@ -344,6 +350,19 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab myComponent.updateCombo(); } + public static String antialiasingTypeInEditorAsString (boolean antialiased, LCDRenderingScope scope) { + if (!antialiased) return "No antialiasing"; + switch (scope) { + case IDE: + return "Subpixel"; + case OFF: + case EXCLUDING_EDITOR: + return "Greyscale"; + } + LOG.info("Wrong antialiasing state"); + return "No antialiasing"; + } + public boolean isModified() { initComponent(); UISettings settings = UISettings.getInstance(); @@ -351,8 +370,10 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab boolean isModified = false; isModified |= !Comparing.equal(myComponent.myFontCombo.getSelectedItem(), settings.FONT_FACE); isModified |= !Comparing.equal(myComponent.myFontSizeCombo.getEditor().getItem(), Integer.toString(settings.FONT_SIZE)); - isModified |= myComponent.myAntialiasingCheckBox.isSelected() != settings.ANTIALIASING_IN_IDE; - isModified |= !myComponent.myLCDRenderingScopeCombo.getSelectedItem().equals(settings.LCD_RENDERING_SCOPE); + + isModified |= !myComponent.myAntialiasingInIDE.getSelectedItem().equals(settings.IDE_AA_TYPE); + isModified |= !myComponent.myAntialiasingInEditor.getSelectedItem().equals(settings.EDITOR_AA_TYPE); + isModified |= myComponent.myAnimateWindowsCheckBox.isSelected() != settings.ANIMATE_WINDOWS; isModified |= myComponent.myWindowShortcutsCheckBox.isSelected() != settings.SHOW_TOOL_WINDOW_NUMBERS; isModified |= myComponent.myShowToolStripesCheckBox.isSelected() == settings.HIDE_TOOL_STRIPES; @@ -420,8 +441,6 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab private JCheckBox myShowMemoryIndicatorCheckBox; private JComboBox myLafComboBox; private JCheckBox myCycleScrollingCheckBox; - private JBCheckBox myAntialiasingCheckBox; - private ComboBox myLCDRenderingScopeCombo; private JCheckBox myMoveMouseOnDefaultButtonCheckBox; private JCheckBox myEnableAlphaModeCheckBox; @@ -447,6 +466,8 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab private ComboBox myPresentationModeFontSize; private JCheckBox myNavigateToPreviewCheckBox; private ColorBlindnessPanel myColorBlindnessPanel; + private JComboBox myAntialiasingInIDE; + private JComboBox myAntialiasingInEditor; public MyComponent() { myOverrideLAFFonts.addActionListener( new ActionListener() { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form b/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form index 9432042bd455..b6e44b754af3 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form +++ b/platform/platform-impl/src/com/intellij/ide/ui/AppearancePanel.form @@ -8,7 +8,7 @@ - + @@ -16,7 +16,7 @@ - + @@ -29,7 +29,7 @@ - + @@ -38,7 +38,7 @@ - + @@ -77,7 +77,7 @@ - + @@ -129,7 +129,7 @@ - + @@ -147,7 +147,7 @@ - + @@ -156,7 +156,7 @@ - + @@ -168,7 +168,7 @@ - + @@ -194,38 +194,12 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -293,7 +267,7 @@ - + @@ -431,7 +405,7 @@ - + @@ -465,6 +439,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUIUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUIUtil.java index f14f86aac1dd..4d7dff257b09 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUIUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUIUtil.java @@ -15,7 +15,7 @@ */ package com.intellij.openapi.editor.ex.util; -import com.intellij.ide.ui.LCDRenderingScope; +import com.intellij.ide.ui.AntialiasingType; import com.intellij.ide.ui.UISettings; import java.awt.*; @@ -32,7 +32,7 @@ public class EditorUIUtil { Graphics2D g2d = (Graphics2D)g; - g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, LCDRenderingScope.getKeyForCurrentScope(true)); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, AntialiasingType.getKeyForCurrentScope(true)); UISettings.setupFractionalMetrics(g2d); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java index 5317a3bc1d87..b295643c0cd9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ComplementaryFontsRegistry.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.editor.impl; +import com.intellij.ide.ui.AntialiasingType; import com.intellij.ide.ui.UISettings; import com.intellij.ide.ui.UISettingsListener; import com.intellij.openapi.application.ApplicationManager; @@ -52,15 +53,15 @@ public class ComplementaryFontsRegistry { static { final UISettings settings = UISettings.getInstance(); - ourOldUseAntialiasing = settings.ANTIALIASING_IN_EDITOR; + ourOldUseAntialiasing = !AntialiasingType.OFF.equals(settings.EDITOR_AA_TYPE); // Reset font info on 'use antialiasing' setting change. // Assuming that the listener is notified from the EDT only. settings.addUISettingsListener(new UISettingsListener() { @Override public void uiSettingsChanged(UISettings source) { - if (ourOldUseAntialiasing ^ source.ANTIALIASING_IN_EDITOR) { - ourOldUseAntialiasing = source.ANTIALIASING_IN_EDITOR; + if (ourOldUseAntialiasing ^ !AntialiasingType.OFF.equals(settings.EDITOR_AA_TYPE)) { + ourOldUseAntialiasing = !AntialiasingType.OFF.equals(settings.EDITOR_AA_TYPE); for (FontInfo fontInfo : ourUsedFonts.values()) { fontInfo.reset(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/BaseLabel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/BaseLabel.java index 204ccaa670dc..dd32521c0f7c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/BaseLabel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/BaseLabel.java @@ -15,7 +15,7 @@ */ package com.intellij.openapi.wm.impl.content; -import com.intellij.ide.ui.LCDRenderingScope; +import com.intellij.ide.ui.AntialiasingType; import com.intellij.openapi.wm.ToolWindow; import com.intellij.ui.EngravedTextGraphics; import com.intellij.ui.Gray; @@ -75,7 +75,7 @@ public class BaseLabel extends JLabel { protected void paintComponent(final Graphics g) { final Color fore = myUi.myWindow.isActive() ? myActiveFg : myPassiveFg; setForeground(fore); - putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, LCDRenderingScope.getAAHintForSwingComponent()); + putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AntialiasingType.getAAHintForSwingComponent()); super.paintComponent(_getGraphics((Graphics2D)g)); } diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index 5c8a341838eb..bd2c03c176f6 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -1163,6 +1163,11 @@ goto.custom.region.message.dumb.mode=Custom folding navigation is not available goto.custom.region.message.unavailable=There are no custom foldings in the current file. alphabetical.mode.is.on.warning=Alphabetical order for tabs is ON. Switch it OFF? +group.antialiasing.mode=Antialiasing +label.text.antialiasing.scope.ide=IDE: +label.text.antialiasing.scope.editor=Editor: + + file.changed.externally.message=File was changed on disk. file.changed.externally.reload=Reload group.presentation.mode=Presentation Mode