ui: remove JComponent.getGraphics usages

GitOrigin-RevId: efb2bccfcaf7fc67611db9464b53d79099631eb2
This commit is contained in:
Aleksey Pivovarov
2025-04-07 15:04:00 +00:00
committed by intellij-monorepo-bot
parent 9b69db9b2a
commit 7483bb64e7
17 changed files with 131 additions and 50 deletions
@@ -2,8 +2,6 @@
package com.intellij.collaboration.ui
import com.intellij.ide.ui.laf.darcula.DarculaUIUtil
import com.intellij.ui.scale.JBUIScale
import com.intellij.util.ui.UIUtil
import java.awt.Component
import java.awt.Graphics
import java.awt.Graphics2D
@@ -18,10 +16,8 @@ internal class SimpleFocusBorder : Border {
}
override fun getBorderInsets(c: Component): Insets {
val bw = if (UIUtil.isUnderDefaultMacTheme()) JBUIScale.scale(3).toFloat() else DarculaUIUtil.BW.float
val g = c.graphics
val f = if (g is Graphics2D && UIUtil.isRetina(g)) 0.5f else 1.0f
val lw = if (UIUtil.isUnderDefaultMacTheme()) JBUIScale.scale(f) else DarculaUIUtil.LW.float
val bw = DarculaUIUtil.BW.float
val lw = DarculaUIUtil.LW.float
val insets = (bw + lw).toInt()
return Insets(insets, insets, insets, insets)
}
@@ -16,13 +16,33 @@ import com.intellij.ui.components.JBLayeredPane
import com.intellij.ui.components.panels.NonOpaquePanel
import com.intellij.ui.components.panels.VerticalLayout
import com.intellij.util.animation.FloatConsumer
import com.intellij.util.ui.*
import kotlinx.coroutines.*
import com.intellij.util.ui.AnimatedIcon
import com.intellij.util.ui.Animator
import com.intellij.util.ui.AsyncProcessIcon
import com.intellij.util.ui.GraphicsUtil
import com.intellij.util.ui.ImageUtil
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.StartupUiUtil
import com.intellij.util.ui.UIUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jetbrains.annotations.ApiStatus.Internal
import org.jetbrains.annotations.Nls
import java.awt.*
import java.awt.AlphaComposite
import java.awt.Color
import java.awt.Dimension
import java.awt.Graphics
import java.awt.Graphics2D
import java.awt.GridBagLayout
import java.awt.image.BufferedImage
import javax.swing.*
import javax.swing.JComponent
import javax.swing.JLabel
import javax.swing.JLayeredPane
import javax.swing.JPanel
import javax.swing.SwingConstants
open class LoadingDecorator @JvmOverloads constructor(
content: JComponent?,
@@ -193,7 +213,7 @@ open class LoadingDecorator @JvmOverloads constructor(
isVisible = true
currentAlpha = -1f
if (takeSnapshot && width > 0 && height > 0) {
snapshot = ImageUtil.createImage(graphics, width, height, BufferedImage.TYPE_INT_RGB)
snapshot = ImageUtil.createImage(GraphicsUtil.safelyGetGraphics(this), width, height, BufferedImage.TYPE_INT_RGB)
val g = snapshot!!.createGraphics()
pane.paint(g)
val opaque = UIUtil.findNearestOpaque(this)
@@ -2,12 +2,19 @@
package com.intellij.ui.components;
import com.intellij.ui.ComponentUtil;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.ImageUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import javax.swing.JComponent;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
public class ZoomingDelegate {
@@ -96,7 +103,7 @@ public class ZoomingDelegate {
if (bounds.width <= 0 || bounds.height <= 0) return;
BufferedImage image =
ImageUtil.createImage(myViewportComponent.getGraphics(), bounds.width, bounds.height, BufferedImage.TYPE_INT_RGB);
ImageUtil.createImage(GraphicsUtil.safelyGetGraphics(myViewportComponent), bounds.width, bounds.height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
graphics.setClip(0, 0, bounds.width, bounds.height);
@@ -14,6 +14,7 @@ import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.wm.IdeFrame;
import com.intellij.ui.JBColor;
import com.intellij.ui.scale.JBUIScale;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
@@ -131,7 +132,7 @@ final class FocusDebuggerAction extends AnAction implements DumbAware {
private void paintFocusBorders(boolean clean) {
if (myCurrent != null) {
Graphics graphics = myCurrent.getGraphics();
Graphics graphics = GraphicsUtil.safelyGetGraphics(myCurrent);
Graphics2D currentFocusGraphics = (Graphics2D)(graphics != null ? graphics.create() : null);
try {
if (currentFocusGraphics != null) {
@@ -150,7 +151,8 @@ final class FocusDebuggerAction extends AnAction implements DumbAware {
if (currentFocusGraphics != null) currentFocusGraphics.dispose();
}
if (myPrevious != null) {
Graphics2D previousFocusGraphics = (Graphics2D)(myPrevious.getGraphics() != null ? myPrevious.getGraphics().create() : null);
Graphics prior = GraphicsUtil.safelyGetGraphics(myPrevious);
Graphics2D previousFocusGraphics = (Graphics2D)(prior != null ? prior.create() : null);
try {
if (previousFocusGraphics != null) {
if (clean) {
@@ -15,6 +15,7 @@ import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.scale.JBUIScale;
import com.intellij.ui.table.JBTable;
import com.intellij.util.ExceptionUtil;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
@@ -23,7 +24,10 @@ import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.text.SimpleDateFormat;
@@ -173,7 +177,7 @@ public final class FocusTracesDialog extends DialogWrapper {
}
prev = info.component.get();
if (prev != null && prev.isDisplayable()) {
final Graphics g = prev.getGraphics();
final Graphics g = GraphicsUtil.safelyGetGraphics(prev);
g.setColor(JBColor.RED);
final Dimension sz = prev.getSize();
UIUtil.drawDottedRectangle(g, 1, 1, sz.width - 2, sz.height - 2);
@@ -1,8 +1,13 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.focus;
import javax.swing.*;
import java.awt.*;
import com.intellij.util.ui.GraphicsUtil;
import javax.swing.JFrame;
import javax.swing.RootPaneContainer;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Arrays;
import java.util.function.Consumer;
@@ -17,7 +22,7 @@ public final class Util {
filter(f -> f.getGlassPane() != null).
filter(window -> window.getRootPane() != null).
map(window -> (window).getGlassPane()).
map(jGlassPane -> jGlassPane.getGraphics()).
map(jGlassPane -> GraphicsUtil.safelyGetGraphics(jGlassPane)).
filter(g -> g != null).
forEach(graphics -> {
Graphics glassPaneGraphics = graphics.create();
@@ -20,13 +20,19 @@ import com.intellij.openapi.wm.ex.ToolWindowManagerEx
import com.intellij.openapi.wm.impl.ToolWindowManagerImpl
import com.intellij.problems.WolfTheProblemSolver
import com.intellij.toolWindow.ToolWindowEventSource
import com.intellij.ui.*
import com.intellij.ui.BackgroundSupplier
import com.intellij.ui.CellRendererPanel
import com.intellij.ui.ExperimentalUI
import com.intellij.ui.JBColor
import com.intellij.ui.SimpleColoredComponent
import com.intellij.ui.SimpleTextAttributes
import com.intellij.ui.paint.PaintUtil
import com.intellij.ui.render.RenderingUtil
import com.intellij.ui.speedSearch.SpeedSearchUtil.applySpeedSearchHighlighting
import com.intellij.util.IconUtil
import com.intellij.util.ui.EmptyIcon
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.UIUtil
import org.jetbrains.annotations.ApiStatus.Internal
import org.jetbrains.annotations.Nls
import java.awt.BorderLayout
@@ -165,9 +171,8 @@ class SwitcherVirtualFile(
}
component.append(mainText, SimpleTextAttributes(style, foreground, effectColor))
component.font?.let {
val fontMetrics = component.getFontMetrics(it)
val mainTextWidth = PaintUtil.getStringWidth(mainText, component.graphics, fontMetrics)
val shortcutTextWidth = shortcutText?.let { PaintUtil.getStringWidth(it, component.graphics, fontMetrics) } ?: 0
val mainTextWidth = UIUtil.computeStringWidth(component, mainText)
val shortcutTextWidth = shortcutText?.let { UIUtil.computeStringWidth(component, it) } ?: 0
val width = component.width - mainTextWidth - shortcutTextWidth - component.iconTextGap - component.icon.iconWidth -
component.insets.left - component.insets.right
if (width <= 0) return@let null
@@ -20,8 +20,14 @@ import com.intellij.ui.MouseDragHelper
import com.intellij.ui.PopupBorder
import com.intellij.ui.WindowRoundedCornersManager
import com.intellij.ui.components.JBCheckBox
import com.intellij.ui.dsl.builder.*
import com.intellij.ui.dsl.builder.AlignX
import com.intellij.ui.dsl.builder.AlignY
import com.intellij.ui.dsl.builder.Cell
import com.intellij.ui.dsl.builder.bindSelected
import com.intellij.ui.dsl.builder.panel
import com.intellij.ui.dsl.builder.plus
import com.intellij.ui.util.width
import com.intellij.util.ui.GraphicsUtil
import com.intellij.util.ui.JBFont
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.UIUtil
@@ -30,7 +36,13 @@ import java.awt.event.ActionEvent
import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent
import java.nio.file.Path
import javax.swing.*
import javax.swing.AbstractAction
import javax.swing.Action
import javax.swing.JButton
import javax.swing.JComponent
import javax.swing.JPanel
import javax.swing.JRootPane
import javax.swing.SwingUtilities
import javax.swing.border.Border
import javax.swing.text.View
import kotlin.io.path.name
@@ -191,7 +203,7 @@ internal class TrustedProjectsStartupDialog(
val text = htmlDocument?.getText(0, htmlDocument.length)?.replace("\n", "") ?: textWithMarkedElements
val fontMetrics = checkBox.getFontMetrics(checkBox.font)
val bounds = fontMetrics.getStringBounds(text, checkBox.graphics)
val bounds = fontMetrics.getStringBounds(text, GraphicsUtil.safelyGetGraphics(checkBox))
val x = checkBox.width - bounds.width - checkBox.insets.width
bounds.setRect(x + bounds.x, bounds.y, bounds.width, bounds.height)
val mousePosition = position.x - x
@@ -8,11 +8,17 @@ import com.intellij.openapi.wm.impl.AbstractToolbarCombo
import com.intellij.openapi.wm.impl.ToolbarComboButton
import com.intellij.ui.ClickListener
import com.intellij.ui.hover.HoverListener
import com.intellij.ui.paint.PaintUtil
import com.intellij.util.ui.GraphicsUtil
import com.intellij.util.ui.JBInsets
import com.intellij.util.ui.JBUI
import java.awt.*
import com.intellij.util.ui.UIUtil
import java.awt.Color
import java.awt.Component
import java.awt.Dimension
import java.awt.Graphics
import java.awt.Graphics2D
import java.awt.Rectangle
import java.awt.RenderingHints
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.awt.event.MouseEvent
@@ -119,7 +125,7 @@ internal class ToolbarComboButtonUI: AbstractToolbarComboUI() {
}
val metrics = c.getFontMetrics(c.getFont())
val text = getText(combo)
result.width += PaintUtil.getStringWidth(text, c.graphics, metrics)
result.width += UIUtil.computeStringWidth(c, metrics, text)
result.height = max(result.height, metrics.height)
}
@@ -10,7 +10,6 @@ import com.intellij.openapi.wm.impl.TextCutStrategy;
import com.intellij.openapi.wm.impl.ToolbarComboWidget;
import com.intellij.ui.ClickListener;
import com.intellij.ui.JBColor;
import com.intellij.ui.paint.PaintUtil;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.JBEmptyBorder;
import com.intellij.util.ui.JBUI;
@@ -310,7 +309,7 @@ public final class ToolbarComboWidgetUI extends ComponentUI implements PropertyC
if (!StringUtil.isEmpty(combo.getText())) {
FontMetrics metrics = c.getFontMetrics(c.getFont());
String text = getText(combo);
res.width += PaintUtil.getStringWidth(text, c.getGraphics(), metrics);
res.width += UIUtil.computeStringWidth(c, metrics, text);
res.height = Math.max(res.height, metrics.getHeight());
skipNextGap = false;
}
@@ -24,8 +24,13 @@ import org.jetbrains.annotations.ApiStatus.Obsolete;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import java.awt.Component;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
@@ -144,7 +149,7 @@ public final class PotemkinOverlayProgress extends AbstractProgressIndicatorBase
String text = KeymapUtil.getShortcutText(CANCEL_SHORTCUT) + " to cancel, " +
KeymapUtil.getShortcutText(DUMP_SHORTCUT) + " to dump threads (" +
NlsMessages.formatDurationApproximateNarrow(roundedDuration) + ")";
Graphics graphics = rootPane.getGraphics();
Graphics graphics = GraphicsUtil.safelyGetGraphics(rootPane);
GraphicsUtil.setupAAPainting(graphics);
Rectangle viewR = rootPane.getBounds(), iconR = new Rectangle(), textR = new Rectangle();
FontMetrics fm = graphics.getFontMetrics();
@@ -19,6 +19,7 @@ import com.intellij.ui.paint.LinePainter2D;
import com.intellij.util.Alarm;
import com.intellij.util.MathUtil;
import com.intellij.util.SingleEdtTaskScheduler;
import com.intellij.util.ui.GraphicsUtil;
import com.intellij.util.ui.JBInsets;
import kotlin.Unit;
import org.jetbrains.annotations.ApiStatus;
@@ -156,7 +157,8 @@ public final class FloatingDecorator extends JDialog implements FloatingDecorato
}
// this prevents annoying flick
paint(getGraphics());
// todo: do we really need this?
paint(GraphicsUtil.safelyGetGraphics(this));
ApplicationManager.getApplication().getMessageBus().connect(disposable).subscribe(UISettingsListener.TOPIC, uiSettingsListener);
}
@@ -36,11 +36,16 @@ package com.intellij.ui.layout.migLayout.patched
import com.intellij.ide.ui.laf.VisualPaddingsProvider
import com.intellij.openapi.ui.ComponentWithBrowseButton
import com.intellij.util.ThreeState
import com.intellij.util.ui.GraphicsUtil
import net.miginfocom.layout.ComponentWrapper
import net.miginfocom.layout.ContainerWrapper
import net.miginfocom.layout.LayoutUtil
import net.miginfocom.layout.PlatformDefaults
import java.awt.*
import java.awt.BasicStroke
import java.awt.Color
import java.awt.Graphics2D
import java.awt.HeadlessException
import java.awt.Point
import javax.swing.JComponent
import javax.swing.JEditorPane
import javax.swing.JTextArea
@@ -233,7 +238,7 @@ internal open class SwingComponentWrapper(private val c: JComponent) : Component
return
}
val g = c.graphics as? Graphics2D ?: return
val g = GraphicsUtil.safelyGetGraphics(c) as? Graphics2D ?: return
g.paint = DB_COMP_OUTLINE
g.stroke = BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, floatArrayOf(2f, 4f), 0f)
@@ -35,6 +35,7 @@ package com.intellij.ui.layout.migLayout.patched
* Date: 2006-sep-08
*/
import com.intellij.util.ui.GraphicsUtil
import net.miginfocom.layout.ComponentWrapper
import net.miginfocom.layout.ContainerWrapper
import java.awt.BasicStroke
@@ -68,7 +69,7 @@ internal class SwingContainerWrapper(c: JComponent) : SwingComponentWrapper(c),
return
}
val g = c.graphics as? Graphics2D ?: return
val g = GraphicsUtil.safelyGetGraphics(c) as? Graphics2D ?: return
g.stroke = BasicStroke(1f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 10f, floatArrayOf(2f, 3f), 0f)
g.paint = DB_CELL_OUTLINE
@@ -17,13 +17,19 @@ import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.wm.ToolWindow
import com.intellij.platform.recentFiles.shared.SwitcherRpcDto
import com.intellij.ui.*
import com.intellij.ui.BackgroundSupplier
import com.intellij.ui.CellRendererPanel
import com.intellij.ui.ExperimentalUI
import com.intellij.ui.JBColor
import com.intellij.ui.SimpleColoredComponent
import com.intellij.ui.SimpleTextAttributes
import com.intellij.ui.paint.PaintUtil
import com.intellij.ui.render.RenderingUtil
import com.intellij.ui.speedSearch.SpeedSearchUtil.applySpeedSearchHighlighting
import com.intellij.util.IconUtil
import com.intellij.util.ui.EmptyIcon
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.UIUtil
import org.jetbrains.annotations.ApiStatus.Internal
import java.awt.BorderLayout
import java.awt.Color
@@ -174,8 +180,8 @@ class SwitcherVirtualFile : SwitcherListItem, BackgroundSupplier {
component.append(mainText, SimpleTextAttributes(style, foreground, effectColor))
component.font?.let {
val fontMetrics = component.getFontMetrics(it)
val mainTextWidth = PaintUtil.getStringWidth(mainText, component.graphics, fontMetrics)
val shortcutTextWidth = shortcutText?.let { shortcut -> PaintUtil.getStringWidth(shortcut, component.graphics, fontMetrics) } ?: 0
val mainTextWidth = UIUtil.computeStringWidth(component, fontMetrics, mainText)
val shortcutTextWidth = shortcutText?.let { shortcut -> UIUtil.computeStringWidth(component, fontMetrics, shortcut) } ?: 0
val iconWidth = component.icon?.iconWidth ?: AllIcons.FileTypes.Text.iconWidth
val width = component.width - mainTextWidth - shortcutTextWidth - component.iconTextGap - iconWidth -
component.insets.left - component.insets.right
@@ -13,7 +13,8 @@ import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.JComponent;
import javax.swing.JRootPane;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
@@ -424,11 +425,14 @@ public final class PaintUtil {
* @param g The Graphics context used for rendering the text.
* @param metrics The FontMetrics object associated with the font used for rendering the text.
* @return The width of the text string in pixels when drawn using the specified Graphics context and FontMetrics.
* @deprecated Prefer using {@link UIUtil#computeStringWidth(JComponent, String)} instead
*/
@Deprecated(forRemoval = true)
public static int getStringWidth(String text, Graphics g, FontMetrics metrics) {
return metrics.getStringBounds(text, g).getBounds().width;
}
@ApiStatus.Internal
@Contract("!null, _, _ -> !null")
public static @Nullable String cutContainerText(@Nullable String text, int maxWidth, @NotNull JComponent component) {
@@ -42,7 +42,10 @@ import org.jetbrains.idea.svn.info.Info;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Date;
@@ -750,16 +753,15 @@ public class SvnHistoryProvider implements VcsHistoryProvider, VcsCacheableHisto
private @Nls @NotNull String cutString(@Nls @NotNull String text, double maxWidth) {
FontMetrics m = getFontMetrics(getFont());
Graphics g = getGraphics();
String suffix = ELLIPSIS;
if (m.getStringBounds(text, g).getWidth() < maxWidth) return text;
if (UIUtil.computeStringWidth(this, m, text) < maxWidth) return text;
double suffixWidth = m.getStringBounds(suffix, g).getWidth();
double suffixWidth = UIUtil.computeStringWidth(this, m, suffix);
if (suffixWidth >= maxWidth) return suffix;
for (int i = 1; i < text.length(); i++) {
if ((m.getStringBounds(text, 0, i, g).getWidth() + suffixWidth) >= maxWidth) {
if ((UIUtil.computeStringWidth(this, m, text) + suffixWidth) >= maxWidth) {
return text.substring(0, i - 1) + suffix;
}
}