From 5c876236e2f70a69f7463693bc32a15143bcb7c0 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 9 Feb 2026 07:04:02 +0200 Subject: [PATCH 1/7] Refine sheet hit tests and expand screenshot --- CodenameOne/src/com/codename1/ui/Sheet.java | 125 ++++++++++++++++++ .../impl/android/CodenameOneView.java | 44 +++--- .../codename1/impl/ios/IOSImplementation.java | 6 +- .../tests/Cn1ssDeviceRunner.java | 1 + .../tests/SheetScreenshotTest.java | 46 +++++++ 5 files changed, 202 insertions(+), 20 deletions(-) create mode 100644 scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/SheetScreenshotTest.java diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index 69cc9b045f..8c0361e46e 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -113,6 +113,8 @@ /// /// 7.0 public class Sheet extends Container { + private static final Object SHEET_BOUNDS_LOCK = new Object(); + private static volatile SheetBounds[] sheetBounds = new SheetBounds[0]; private static final int N = 0; private static final int S = 1; private static final int E = 2; @@ -175,6 +177,100 @@ public void actionPerformed(ActionEvent evt) { /// These are set the first time the sheet is shown and used as the base for safe area calculations. private int[] originalPadding = null; private Form form; + private boolean trackSheetBounds; + + private static final class SheetBounds { + private final Sheet sheet; + private final int x; + private final int y; + private final int width; + private final int height; + + private SheetBounds(Sheet sheet, int x, int y, int width, int height) { + this.sheet = sheet; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + private boolean contains(int px, int py) { + return px >= x && py >= y && px < x + width && py < y + height; + } + } + + public static boolean isSheetVisibleAt(int x, int y) { + SheetBounds[] boundsSnapshot = sheetBounds; + for (SheetBounds bounds : boundsSnapshot) { + if (bounds.contains(x, y)) { + return true; + } + } + return false; + } + + private static void updateSheetBounds(Sheet sheet, int x, int y, int width, int height) { + synchronized (SHEET_BOUNDS_LOCK) { + SheetBounds[] current = sheetBounds; + SheetBounds[] updated = new SheetBounds[current.length]; + boolean replaced = false; + int index = 0; + for (SheetBounds bounds : current) { + if (bounds.sheet == sheet) { + updated[index++] = new SheetBounds(sheet, x, y, width, height); + replaced = true; + } else { + updated[index++] = bounds; + } + } + if (!replaced) { + updated = new SheetBounds[current.length + 1]; + System.arraycopy(current, 0, updated, 0, current.length); + updated[current.length] = new SheetBounds(sheet, x, y, width, height); + } + sheetBounds = updated; + } + } + + private static void removeSheetBounds(Sheet sheet) { + synchronized (SHEET_BOUNDS_LOCK) { + SheetBounds[] current = sheetBounds; + int matches = 0; + for (SheetBounds bounds : current) { + if (bounds.sheet == sheet) { + matches++; + } + } + if (matches == 0) { + return; + } + SheetBounds[] updated = new SheetBounds[current.length - matches]; + int index = 0; + for (SheetBounds bounds : current) { + if (bounds.sheet != sheet) { + updated[index++] = bounds; + } + } + sheetBounds = updated; + } + } + + private void updateTrackedBounds() { + if (!trackSheetBounds) { + return; + } + updateSheetBounds(this, getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight()); + } + + private void startTrackingBounds() { + trackSheetBounds = true; + updateTrackedBounds(); + } + + private void stopTrackingBounds() { + trackSheetBounds = false; + removeSheetBounds(this); + } /// Creates a new sheet with the specified parent and title. /// @@ -466,6 +562,7 @@ public void run() { cnt.revalidate(); } + startTrackingBounds(); if (cnt.getComponentCount() > 0) { $(".Sheet", cnt).each(new ComponentClosure() { @Override @@ -503,6 +600,9 @@ public void call(Component c) { }); Component existing = cnt.getComponentAt(0); + if (existing instanceof Sheet) { + ((Sheet) existing).stopTrackingBounds(); + } cnt.replace(existing, this, null); cnt.animateLayout(duration); } else { @@ -799,6 +899,7 @@ public void run() { cnt.remove(); parent.getComponentForm().revalidateLater(); fireCloseEvent(true); + stopTrackingBounds(); } @@ -808,6 +909,30 @@ public void run() { } + @Override + public void setX(int x) { + super.setX(x); + updateTrackedBounds(); + } + + @Override + public void setY(int y) { + super.setY(y); + updateTrackedBounds(); + } + + @Override + public void setWidth(int width) { + super.setWidth(width); + updateTrackedBounds(); + } + + @Override + public void setHeight(int height) { + super.setHeight(height); + updateTrackedBounds(); + } + /// Gets the parent sheet or null if there is none. /// /// #### Returns diff --git a/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java b/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java index 83180c26a0..8e89e7b479 100644 --- a/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java +++ b/Ports/Android/src/com/codename1/impl/android/CodenameOneView.java @@ -31,11 +31,12 @@ import android.view.*; import android.view.inputmethod.EditorInfo; import android.os.Build; -import com.codename1.ui.Component; -import com.codename1.ui.Display; -import com.codename1.ui.Form; -import com.codename1.ui.PeerComponent; -import com.codename1.ui.TextArea; +import com.codename1.ui.Component; +import com.codename1.ui.Display; +import com.codename1.ui.Form; +import com.codename1.ui.PeerComponent; +import com.codename1.ui.Sheet; +import com.codename1.ui.TextArea; import com.codename1.ui.events.ActionEvent; import com.codename1.ui.events.ActionListener; import java.lang.reflect.Method; @@ -561,20 +562,25 @@ public boolean onTouchEvent(MotionEvent event) { //if (nativePeerGrabbedPointer) { // return false; //} - Component componentAt; - try { - if (x == null) { - componentAt = this.implementation.getCurrentForm().getComponentAt((int)event.getX(), (int)event.getY()); - } else { - componentAt = this.implementation.getCurrentForm().getComponentAt((int)x[0], (int)y[0]); - } - } catch (Throwable t) { - // Since this is is an EDT violation, we may get an exception - // Just consume it - componentAt = null; - } - boolean isPeer = (componentAt instanceof PeerComponent); - boolean consumeEvent = !isPeer || cn1GrabbedPointer; + Component componentAt; + try { + if (x == null) { + componentAt = this.implementation.getCurrentForm().getComponentAt((int)event.getX(), (int)event.getY()); + } else { + componentAt = this.implementation.getCurrentForm().getComponentAt((int)x[0], (int)y[0]); + } + } catch (Throwable t) { + // Since this is is an EDT violation, we may get an exception + // Just consume it + componentAt = null; + } + boolean isPeer = (componentAt instanceof PeerComponent); + if (isPeer) { + int primaryX = x == null ? (int) event.getX() : x[0]; + int primaryY = y == null ? (int) event.getY() : y[0]; + isPeer = !Sheet.isSheetVisibleAt(primaryX, primaryY); + } + boolean consumeEvent = !isPeer || cn1GrabbedPointer; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: diff --git a/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java b/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java index aa29b3195c..41bfe398e6 100644 --- a/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java +++ b/Ports/iOSPort/src/com/codename1/impl/ios/IOSImplementation.java @@ -36,6 +36,7 @@ import com.codename1.ui.Font; import com.codename1.ui.Image; import com.codename1.ui.PeerComponent; +import com.codename1.ui.Sheet; import com.codename1.ui.TextArea; import com.codename1.ui.TextField; import com.codename1.ui.geom.Dimension; @@ -1157,7 +1158,10 @@ static boolean hitTest(int x, int y) { Form f = Display.getInstance().getCurrent(); if (f != null) { Component cmp = f.getResponderAt(x, y); - return cmp == null || !(cmp instanceof PeerComponent); + if (cmp == null || !(cmp instanceof PeerComponent)) { + return true; + } + return Sheet.isSheetVisibleAt(x, y); } return true; } diff --git a/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/Cn1ssDeviceRunner.java b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/Cn1ssDeviceRunner.java index 30e80f34a9..fd10adeaea 100644 --- a/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/Cn1ssDeviceRunner.java +++ b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/Cn1ssDeviceRunner.java @@ -69,6 +69,7 @@ public final class Cn1ssDeviceRunner extends DeviceRunner { new BrowserComponentScreenshotTest(), new MediaPlaybackScreenshotTest(), new OrientationLockScreenshotTest(), + new SheetScreenshotTest(), new InPlaceEditViewTest(), new BytecodeTranslatorRegressionTest(), new BackgroundThreadUiAccessTest(), diff --git a/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/SheetScreenshotTest.java b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/SheetScreenshotTest.java new file mode 100644 index 0000000000..f8f1506488 --- /dev/null +++ b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/SheetScreenshotTest.java @@ -0,0 +1,46 @@ +package com.codenameone.examples.hellocodenameone.tests; + +import com.codename1.ui.Button; +import com.codename1.ui.Container; +import com.codename1.ui.Form; +import com.codename1.ui.Label; +import com.codename1.ui.Sheet; +import com.codename1.ui.layouts.BorderLayout; +import com.codename1.ui.layouts.BoxLayout; +import com.codename1.ui.util.UITimer; + +public class SheetScreenshotTest extends BaseTest { + private Form form; + private Sheet sheet; + private Sheet childSheet; + + @Override + public boolean runTest() { + form = createForm("Sheet Test", new BorderLayout(), "Sheet"); + form.add(BorderLayout.CENTER, new Label("Tap sheet to dismiss")); + sheet = createSheet(null, "Sheet"); + form.show(); + return true; + } + + @Override + protected void registerReadyCallback(Form parent, Runnable run) { + sheet.show(); + UITimer.timer(500, false, parent, () -> { + childSheet = createSheet(sheet, "Details"); + childSheet.show(); + UITimer.timer(600, false, parent, run); + }); + } + + private Sheet createSheet(Sheet parent, String title) { + Sheet newSheet = new Sheet(parent, title); + Container content = newSheet.getContentPane(); + content.setLayout(BoxLayout.y()); + content.add(new Label("Sheet content")); + content.add(new Button("Primary Action")); + content.add(new Label("Secondary details")); + newSheet.getCommandsContainer().add(new Button("Edit")); + return newSheet; + } +} From 56bbf3e75fdb4ddd32b5badd752ea03cf09e0cd4 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 9 Feb 2026 07:41:42 +0200 Subject: [PATCH 2/7] Suppress PMD volatile warning for Sheet bounds --- CodenameOne/src/com/codename1/ui/Sheet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index 8c0361e46e..dec078e7cf 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -114,6 +114,7 @@ /// 7.0 public class Sheet extends Container { private static final Object SHEET_BOUNDS_LOCK = new Object(); + @SuppressWarnings("PMD.AvoidUsingVolatile") private static volatile SheetBounds[] sheetBounds = new SheetBounds[0]; private static final int N = 0; private static final int S = 1; From e895ea6f28130446a4cbaf91cfdc05bcefc18965 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 9 Feb 2026 18:44:35 +0200 Subject: [PATCH 3/7] Use per-sheet bounds rectangles for hit testing --- CodenameOne/src/com/codename1/ui/Sheet.java | 80 +++++++++------------ 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index dec078e7cf..98a9646168 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -114,8 +114,7 @@ /// 7.0 public class Sheet extends Container { private static final Object SHEET_BOUNDS_LOCK = new Object(); - @SuppressWarnings("PMD.AvoidUsingVolatile") - private static volatile SheetBounds[] sheetBounds = new SheetBounds[0]; + private static SheetEntry[] sheetEntries = new SheetEntry[0]; private static final int N = 0; private static final int S = 1; private static final int E = 2; @@ -178,31 +177,24 @@ public void actionPerformed(ActionEvent evt) { /// These are set the first time the sheet is shown and used as the base for safe area calculations. private int[] originalPadding = null; private Form form; + private final Rectangle sheetBounds = new Rectangle(); private boolean trackSheetBounds; + private SheetEntry sheetEntry; - private static final class SheetBounds { + private static final class SheetEntry { private final Sheet sheet; - private final int x; - private final int y; - private final int width; - private final int height; + private final Rectangle bounds; - private SheetBounds(Sheet sheet, int x, int y, int width, int height) { + private SheetEntry(Sheet sheet, Rectangle bounds) { this.sheet = sheet; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - - private boolean contains(int px, int py) { - return px >= x && py >= y && px < x + width && py < y + height; + this.bounds = bounds; } } public static boolean isSheetVisibleAt(int x, int y) { - SheetBounds[] boundsSnapshot = sheetBounds; - for (SheetBounds bounds : boundsSnapshot) { + SheetEntry[] entriesSnapshot = sheetEntries; + for (SheetEntry entry : entriesSnapshot) { + Rectangle bounds = entry.bounds; if (bounds.contains(x, y)) { return true; } @@ -210,49 +202,36 @@ public static boolean isSheetVisibleAt(int x, int y) { return false; } - private static void updateSheetBounds(Sheet sheet, int x, int y, int width, int height) { + private static void addSheetEntry(SheetEntry entry) { synchronized (SHEET_BOUNDS_LOCK) { - SheetBounds[] current = sheetBounds; - SheetBounds[] updated = new SheetBounds[current.length]; - boolean replaced = false; - int index = 0; - for (SheetBounds bounds : current) { - if (bounds.sheet == sheet) { - updated[index++] = new SheetBounds(sheet, x, y, width, height); - replaced = true; - } else { - updated[index++] = bounds; - } - } - if (!replaced) { - updated = new SheetBounds[current.length + 1]; - System.arraycopy(current, 0, updated, 0, current.length); - updated[current.length] = new SheetBounds(sheet, x, y, width, height); - } - sheetBounds = updated; + SheetEntry[] current = sheetEntries; + SheetEntry[] updated = new SheetEntry[current.length + 1]; + System.arraycopy(current, 0, updated, 0, current.length); + updated[current.length] = entry; + sheetEntries = updated; } } - private static void removeSheetBounds(Sheet sheet) { + private static void removeSheetEntry(SheetEntry entry) { synchronized (SHEET_BOUNDS_LOCK) { - SheetBounds[] current = sheetBounds; + SheetEntry[] current = sheetEntries; int matches = 0; - for (SheetBounds bounds : current) { - if (bounds.sheet == sheet) { + for (SheetEntry existing : current) { + if (existing == entry) { matches++; } } if (matches == 0) { return; } - SheetBounds[] updated = new SheetBounds[current.length - matches]; + SheetEntry[] updated = new SheetEntry[current.length - matches]; int index = 0; - for (SheetBounds bounds : current) { - if (bounds.sheet != sheet) { - updated[index++] = bounds; + for (SheetEntry existing : current) { + if (existing != entry) { + updated[index++] = existing; } } - sheetBounds = updated; + sheetEntries = updated; } } @@ -260,17 +239,22 @@ private void updateTrackedBounds() { if (!trackSheetBounds) { return; } - updateSheetBounds(this, getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight()); + sheetBounds.setBounds(getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight()); } private void startTrackingBounds() { trackSheetBounds = true; + sheetEntry = new SheetEntry(this, sheetBounds); + addSheetEntry(sheetEntry); updateTrackedBounds(); } private void stopTrackingBounds() { trackSheetBounds = false; - removeSheetBounds(this); + if (sheetEntry != null) { + removeSheetEntry(sheetEntry); + sheetEntry = null; + } } /// Creates a new sheet with the specified parent and title. From 0813f02ea83554752d935a0de332113b43215168 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 9 Feb 2026 18:44:41 +0200 Subject: [PATCH 4/7] Simplify sheet bounds tracking list --- CodenameOne/src/com/codename1/ui/Sheet.java | 47 ++++++++------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index 98a9646168..7b5d69bc01 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -114,7 +114,7 @@ /// 7.0 public class Sheet extends Container { private static final Object SHEET_BOUNDS_LOCK = new Object(); - private static SheetEntry[] sheetEntries = new SheetEntry[0]; + private static Rectangle[] sheetBoundsList = new Rectangle[0]; private static final int N = 0; private static final int S = 1; private static final int E = 2; @@ -179,22 +179,11 @@ public void actionPerformed(ActionEvent evt) { private Form form; private final Rectangle sheetBounds = new Rectangle(); private boolean trackSheetBounds; - private SheetEntry sheetEntry; - - private static final class SheetEntry { - private final Sheet sheet; - private final Rectangle bounds; - - private SheetEntry(Sheet sheet, Rectangle bounds) { - this.sheet = sheet; - this.bounds = bounds; - } - } + private Rectangle sheetEntry; public static boolean isSheetVisibleAt(int x, int y) { - SheetEntry[] entriesSnapshot = sheetEntries; - for (SheetEntry entry : entriesSnapshot) { - Rectangle bounds = entry.bounds; + Rectangle[] boundsSnapshot = sheetBoundsList; + for (Rectangle bounds : boundsSnapshot) { if (bounds.contains(x, y)) { return true; } @@ -202,36 +191,36 @@ public static boolean isSheetVisibleAt(int x, int y) { return false; } - private static void addSheetEntry(SheetEntry entry) { + private static void addSheetEntry(Rectangle bounds) { synchronized (SHEET_BOUNDS_LOCK) { - SheetEntry[] current = sheetEntries; - SheetEntry[] updated = new SheetEntry[current.length + 1]; + Rectangle[] current = sheetBoundsList; + Rectangle[] updated = new Rectangle[current.length + 1]; System.arraycopy(current, 0, updated, 0, current.length); - updated[current.length] = entry; - sheetEntries = updated; + updated[current.length] = bounds; + sheetBoundsList = updated; } } - private static void removeSheetEntry(SheetEntry entry) { + private static void removeSheetEntry(Rectangle bounds) { synchronized (SHEET_BOUNDS_LOCK) { - SheetEntry[] current = sheetEntries; + Rectangle[] current = sheetBoundsList; int matches = 0; - for (SheetEntry existing : current) { - if (existing == entry) { + for (Rectangle existing : current) { + if (existing == bounds) { matches++; } } if (matches == 0) { return; } - SheetEntry[] updated = new SheetEntry[current.length - matches]; + Rectangle[] updated = new Rectangle[current.length - matches]; int index = 0; - for (SheetEntry existing : current) { - if (existing != entry) { + for (Rectangle existing : current) { + if (existing != bounds) { updated[index++] = existing; } } - sheetEntries = updated; + sheetBoundsList = updated; } } @@ -244,7 +233,7 @@ private void updateTrackedBounds() { private void startTrackingBounds() { trackSheetBounds = true; - sheetEntry = new SheetEntry(this, sheetBounds); + sheetEntry = sheetBounds; addSheetEntry(sheetEntry); updateTrackedBounds(); } From 376d9a10f2805163e2d08fc58a95da36abea4fc2 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 9 Feb 2026 21:45:03 +0200 Subject: [PATCH 5/7] Added new android screenshot --- scripts/android/screenshots/Sheet.png | Bin 0 -> 13779 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 scripts/android/screenshots/Sheet.png diff --git a/scripts/android/screenshots/Sheet.png b/scripts/android/screenshots/Sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..5878c2eb4e05cb5542ee6bcb2c892dd79901bebc GIT binary patch literal 13779 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 X^Hg&ShR6a|1BHGn_ax`>^EdwuICNEZ literal 0 HcmV?d00001 From 2c753d910a842d133a21d13b39828767b9d5eda9 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 9 Feb 2026 21:46:08 +0200 Subject: [PATCH 6/7] Added new iOS screenshot --- scripts/ios/screenshots/Sheet.png | Bin 0 -> 80831 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 scripts/ios/screenshots/Sheet.png diff --git a/scripts/ios/screenshots/Sheet.png b/scripts/ios/screenshots/Sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad0e74a26e1ae3c356b46d9d4895de0f6a42320 GIT binary patch literal 80831 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�Ei^?gIN>@=SAJj8+g;}M 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 literal 0 HcmV?d00001 From bad3596e42e177cace752c834ee8af58cc0968a5 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 10 Feb 2026 03:37:01 +0200 Subject: [PATCH 7/7] Fixed PMD silly warnings and removed redundant lock since mutation is always on the EDT --- CodenameOne/src/com/codename1/ui/Sheet.java | 45 +++++++++------------ 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index 7b5d69bc01..93b7697014 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -113,7 +113,6 @@ /// /// 7.0 public class Sheet extends Container { - private static final Object SHEET_BOUNDS_LOCK = new Object(); private static Rectangle[] sheetBoundsList = new Rectangle[0]; private static final int N = 0; private static final int S = 1; @@ -192,36 +191,32 @@ public static boolean isSheetVisibleAt(int x, int y) { } private static void addSheetEntry(Rectangle bounds) { - synchronized (SHEET_BOUNDS_LOCK) { - Rectangle[] current = sheetBoundsList; - Rectangle[] updated = new Rectangle[current.length + 1]; - System.arraycopy(current, 0, updated, 0, current.length); - updated[current.length] = bounds; - sheetBoundsList = updated; - } + Rectangle[] current = sheetBoundsList; + Rectangle[] updated = new Rectangle[current.length + 1]; + System.arraycopy(current, 0, updated, 0, current.length); + updated[current.length] = bounds; + sheetBoundsList = updated; } private static void removeSheetEntry(Rectangle bounds) { - synchronized (SHEET_BOUNDS_LOCK) { - Rectangle[] current = sheetBoundsList; - int matches = 0; - for (Rectangle existing : current) { - if (existing == bounds) { - matches++; - } - } - if (matches == 0) { - return; + Rectangle[] current = sheetBoundsList; + int matches = 0; + for (Rectangle existing : current) { + if (existing == bounds) { // NOPMD CompareObjectsWithEquals + matches++; } - Rectangle[] updated = new Rectangle[current.length - matches]; - int index = 0; - for (Rectangle existing : current) { - if (existing != bounds) { - updated[index++] = existing; - } + } + if (matches == 0) { + return; + } + Rectangle[] updated = new Rectangle[current.length - matches]; + int index = 0; + for (Rectangle existing : current) { + if (existing != bounds) { // NOPMD CompareObjectsWithEquals + updated[index++] = existing; } - sheetBoundsList = updated; } + sheetBoundsList = updated; } private void updateTrackedBounds() {