From 377d3eb5a2f9528b91a8e118ac53b2e53c93557d Mon Sep 17 00:00:00 2001 From: Shahzaib Ibrahim Date: Tue, 5 Nov 2024 16:47:10 +0100 Subject: [PATCH] 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 | 68 ++++++++++--------- 1 file changed, 37 insertions(+), 31 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..4b98353244d 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 @@ -43,6 +43,7 @@ public class ExpandItem extends Item { boolean expanded, hover; int x, y, width, height; int imageHeight, imageWidth; + private static final int IMAGE_MARGIN = 8; static final int TEXT_INSET = 6; static final int BORDER = 1; static final int CHEVRON_SIZE = 24; @@ -183,9 +184,13 @@ 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); 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 imageHeightInPixels = DPIUtil.scaleUp(imageHeight, getZoom()); + int imageHeaderDiff = headerHeightInPixels - imageHeightInPixels; + if (imageHeaderDiff < IMAGE_MARGIN) { + headerHeightInPixels = imageHeightInPixels + IMAGE_MARGIN; + } + return headerHeightInPixels; } /** @@ -372,17 +378,20 @@ boolean isHover (int x, int y) { void redraw (boolean all) { long parentHandle = parent.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 (); - int left = all ? x : x + width - headerHeight; - OS.SetRect (rect, left, y, x + width, y + headerHeight); + int left = all ? x : x + width - headerHeightInPixels; + OS.SetRect (rect, left, y, x + width, y + headerHeightInPixels); OS.InvalidateRect (parentHandle, rect, true); - if (imageHeight > headerHeight) { - OS.SetRect (rect, x + ExpandItem.TEXT_INSET, y + headerHeight - imageHeight, x + ExpandItem.TEXT_INSET + imageWidth, y); + if (imageHeightInPixels > headerHeightInPixels) { + OS.SetRect (rect, x + ExpandItem.TEXT_INSET, y + headerHeightInPixels - imageHeightInPixels, x + ExpandItem.TEXT_INSET + imageWidthInPixels, y); OS.InvalidateRect (parentHandle, rect, true); } if (!parent.isAppThemed ()) { - OS.SetRect (rect, x, y + headerHeight, x + width, y + headerHeight + height + 1); + OS.SetRect (rect, x, y + headerHeightInPixels, x + width, y + headerHeightInPixels + height + 1); OS.InvalidateRect (parentHandle, rect, true); } } @@ -401,11 +410,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 +427,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 +510,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 {