From 1b48004aae89bb2acb668f866d619883956ff8ab Mon Sep 17 00:00:00 2001 From: Shahzaib Ibrahim Date: Thu, 10 Oct 2024 16:22:01 +0200 Subject: [PATCH 1/2] Images not aligned properly in Expand Bar When adding image larger than the header size in expand bar, it was drawn outside of the bar on the top. This was due to wrong calculation and mixing of points and pixels --- .../org/eclipse/swt/widgets/ExpandItem.java | 53 ++++++++++--------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java index f0d3f7dbf0f..cb394b7111a 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java @@ -183,9 +183,14 @@ private void drawChevron (long hDC, RECT rect) { void drawItem (GC gc, long hTheme, RECT clipRect, boolean drawFocus) { long hDC = gc.handle; - int headerHeight = parent.getBandHeight (); + int headerHeightinPixels = getHeaderHeightInPixels(); + int zoom = getZoom(); + int imageHeightInPixels = DPIUtil.scaleUp(imageHeight, zoom); + int imageWidthInPixels = DPIUtil.scaleUp(imageWidth, zoom); + RECT rect = new RECT (); - OS.SetRect (rect, x, y, x + width, y + headerHeight); + OS.SetRect (rect, x, y, x + width, y + headerHeightinPixels); + //System.out.println("y = " + y + " Height = " + headerHeightinPixels + " Total = " + (y + headerHeightinPixels)); if (hTheme != 0) { OS.DrawThemeBackground (hTheme, hDC, OS.EBP_NORMALGROUPHEAD, 0, rect, clipRect); } else { @@ -194,14 +199,10 @@ void drawItem (GC gc, long hTheme, RECT clipRect, boolean drawFocus) { OS.SelectObject (hDC, oldBrush); } if (image != null) { - int zoom = getZoom(); rect.left += ExpandItem.TEXT_INSET; - if (imageHeight > headerHeight) { - gc.drawImage (image, DPIUtil.scaleDown(rect.left, zoom), DPIUtil.scaleDown(rect.top + headerHeight - imageHeight, zoom)); - } else { - gc.drawImage (image, DPIUtil.scaleDown(rect.left, zoom), DPIUtil.scaleDown(rect.top + (headerHeight - imageHeight) / 2, zoom)); - } - rect.left += imageWidth; + int yInPoints = DPIUtil.scaleDown(rect.top + ((headerHeightinPixels - imageHeightInPixels) / 2), zoom); + gc.drawImage (image, DPIUtil.scaleDown(rect.left, zoom), yInPoints); + rect.left += imageWidthInPixels; } if (text.length () > 0) { rect.left += ExpandItem.TEXT_INSET; @@ -213,8 +214,7 @@ void drawItem (GC gc, long hTheme, RECT clipRect, boolean drawFocus) { } else { buffer = (RLE + text).toCharArray (); } - } - else { + } else { buffer = text.toCharArray (); } if (hTheme != 0) { @@ -227,7 +227,7 @@ void drawItem (GC gc, long hTheme, RECT clipRect, boolean drawFocus) { } int chevronSize = ExpandItem.CHEVRON_SIZE; rect.left = rect.right - chevronSize; - rect.top = y + (headerHeight - chevronSize) / 2; + rect.top = y; rect.bottom = rect.top + chevronSize; if (hTheme != 0) { int partID = expanded ? OS.EBP_NORMALGROUPCOLLAPSE : OS.EBP_NORMALGROUPEXPAND; @@ -237,7 +237,7 @@ void drawItem (GC gc, long hTheme, RECT clipRect, boolean drawFocus) { drawChevron (hDC, rect); } if (drawFocus) { - OS.SetRect (rect, x + 1, y + 1, x + width - 2, y + headerHeight - 2); + OS.SetRect (rect, x + 1, y + 1, x + width - 2, y + headerHeightinPixels - 2); OS.DrawFocusRect (hDC, rect); } if (expanded) { @@ -245,10 +245,10 @@ void drawItem (GC gc, long hTheme, RECT clipRect, boolean drawFocus) { long pen = OS.CreatePen (OS.PS_SOLID, 1, OS.GetSysColor (OS.COLOR_BTNFACE)); long oldPen = OS.SelectObject (hDC, pen); int [] points = { - x, y + headerHeight, - x, y + headerHeight + height, - x + width - 1, y + headerHeight + height, - x + width - 1, y + headerHeight - 1}; + x, y + headerHeightinPixels, + x, y + headerHeightinPixels + height, + x + width - 1, y + headerHeightinPixels + height, + x + width - 1, y + headerHeightinPixels - 1}; OS.Polyline (hDC, points, points.length / 2); OS.SelectObject (hDC, oldPen); OS.DeleteObject (pen); @@ -310,7 +310,13 @@ public int getHeaderHeight () { } int getHeaderHeightInPixels () { - return Math.max (parent.getBandHeight (), imageHeight); + int headerHeightInPixels = parent.getBandHeight (); + int zoom = getZoom(); + int imageHeightInPixels = DPIUtil.scaleUp(imageHeight, zoom); + if(imageHeightInPixels > headerHeightInPixels) { + headerHeightInPixels = imageHeightInPixels + headerHeightInPixels; + } + return headerHeightInPixels; } /** @@ -401,11 +407,8 @@ void releaseWidget () { void setBoundsInPixels (int x, int y, int width, int height, boolean move, boolean size) { redraw (true); - int headerHeight = parent.getBandHeight (); + int headerHeightInPixels = getHeaderHeightInPixels(); if (move) { - if (imageHeight > headerHeight) { - y += (imageHeight - headerHeight); - } this.x = x; this.y = y; redraw (true); @@ -421,8 +424,8 @@ void setBoundsInPixels (int x, int y, int width, int height, boolean move, boole width = Math.max (0, width - BORDER * 2); height = Math.max (0, height - BORDER); } - if (move && size) control.setBoundsInPixels (x, y + headerHeight, width, height); - if (move && !size) control.setLocationInPixels (x, y + headerHeight); + if (move && size) control.setBoundsInPixels (x, y + headerHeightInPixels, width, height); + if (move && !size) control.setLocationInPixels (x, y + headerHeightInPixels); if (!move && size) control.setSizeInPixels (width, height); } } @@ -504,7 +507,7 @@ public void setImage (Image image) { super.setImage (image); int oldImageHeight = imageHeight; if (image != null) { - Rectangle bounds = image.getBoundsInPixels (); + Rectangle bounds = image.getBounds(); imageHeight = bounds.height; imageWidth = bounds.width; } else { From c9910b8b0633ce133f1bde22e77cdc0ab81b27d0 Mon Sep 17 00:00:00 2001 From: Shahzaib Ibrahim Date: Thu, 10 Oct 2024 16:37:36 +0200 Subject: [PATCH 2/2] Expand Bar is not scaled during DPI change When moving from one zoom level monitor to another zoom level (no matter what %), The images, expanded items and texts are not drawn at correct coordinates. --- .../Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java index cb394b7111a..5cc5c3723f3 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandItem.java @@ -536,7 +536,8 @@ private static void handleDPIChange(Widget widget, int newZoom, float scalingFac if (item.height != 0 || item.width != 0) { int newWidth = Math.round(item.width * scalingFactor); int newHeight = Math.round(item.height * scalingFactor); - item.setBoundsInPixels(item.x, item.y, newWidth, newHeight, false, true); + item.setBoundsInPixels(item.x, item.y, newWidth, newHeight, true, true); + item.parent.layoutItems(0, true); } } }