diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java index f5b249a3ca7..5ed652c0b7c 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder.java @@ -744,6 +744,15 @@ Image createButtonImage(Display display, int button) { image = new Image(display, new AutoScaleImageDataProvider(display, imageData, DPIUtil.getDeviceZoom())); return image; } + +private void notifyItemCountChange() { + CTabFolderEvent e = new CTabFolderEvent(this); + e.widget = CTabFolder.this; + for (CTabFolder2Listener listener : folderListeners) { + listener.itemsCount(e); + } +} + void createItem (CTabItem item, int index) { if (0 > index || index > getItemCount ())SWT.error (SWT.ERROR_INVALID_RANGE); item.parent = this; @@ -769,6 +778,7 @@ void createItem (CTabItem item, int index) { } else { updateFolder(REDRAW_TABS); } + notifyItemCountChange(); } void destroyItem (CTabItem item) { if (inDispose) return; @@ -789,6 +799,7 @@ void destroyItem (CTabItem item) { updateButtons(); setButtonBounds(); redraw(); + notifyItemCountChange(); return; } @@ -820,6 +831,7 @@ void destroyItem (CTabItem item) { requestLayout(); updateFolder(UPDATE_TAB_HEIGHT | REDRAW_TABS); + notifyItemCountChange(); } /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java index 084e479e100..25e00abeec3 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java @@ -115,6 +115,34 @@ public interface CTabFolder2Listener extends SWTEventListener { */ public void showList(CTabFolderEvent event); +/** + * Sent when the tab items count changes + * + * @param event from observed tab folder + * @since 3.124 + */ +public default void itemsCount(CTabFolderEvent event) { + // do nothing by default +} + +/** + * Static helper method to create a CTabFolder2Listener for the + * {@link #itemsCount(CTabFolderEvent e)}) method, given a lambda expression or + * a method reference. + * + * @param c the consumer of the event + * @return CTabFolder2Listener + * @since 3.124 + */ +public static CTabFolder2Listener itemsCountAdapter(Consumer c) { + return new CTabFolder2Adapter() { + @Override + public void itemsCount(CTabFolderEvent e) { + c.accept(e); + } + }; +} + /** * Static helper method to create a CTabFolder2Listener for the * {@link #close(CTabFolderEvent e)}) method, given a lambda expression or a method reference. diff --git a/bundles/org.eclipse.swt/META-INF/MANIFEST.MF b/bundles/org.eclipse.swt/META-INF/MANIFEST.MF index 6d95a72decc..e01fee330ca 100644 --- a/bundles/org.eclipse.swt/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.swt/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-SymbolicName: org.eclipse.swt; singleton:=true -Bundle-Version: 3.123.100.qualifier +Bundle-Version: 3.124.0.qualifier Bundle-ManifestVersion: 2 Bundle-Localization: plugin DynamicImport-Package: org.eclipse.swt.accessibility2 diff --git a/bundles/org.eclipse.swt/pom.xml b/bundles/org.eclipse.swt/pom.xml index b7c9e01bf30..a0b546d557d 100644 --- a/bundles/org.eclipse.swt/pom.xml +++ b/bundles/org.eclipse.swt/pom.xml @@ -21,7 +21,7 @@ org.eclipse.swt org.eclipse.swt - 3.123.100-SNAPSHOT + 3.124.0-SNAPSHOT eclipse-plugin diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java index a6503e66723..95c4dd31f70 100644 --- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java +++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_CTabFolder.java @@ -25,10 +25,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.BiConsumer; +import java.util.function.Consumer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.custom.CTabFolder2Listener; +import org.eclipse.swt.custom.CTabFolderEvent; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.graphics.Color; @@ -143,6 +147,48 @@ private void createTabFolder(List events, int numItems) { ctabFolder.setSelection(ctabFolder.getItem(0)); } +@Test +public void test_ItemCountListsners() { + int expectedTabsCount = 1; + int expectedEventsCount = 0; + createTabFolder(null, expectedTabsCount); + AtomicLong itemCount = new AtomicLong(); + AtomicLong callCount = new AtomicLong(); + Consumer tabCountUpdate = e -> { + itemCount.set(ctabFolder.getItemCount()); + callCount.incrementAndGet(); + }; + ctabFolder.addCTabFolder2Listener(CTabFolder2Listener.itemsCountAdapter(tabCountUpdate)); + + CTabItem item1 = new CTabItem(ctabFolder, SWT.NONE); + expectedTabsCount ++; + expectedEventsCount++; + assertEquals(expectedTabsCount, ctabFolder.getItemCount()); + assertEquals(ctabFolder.getItemCount(), itemCount.get()); + assertEquals(expectedEventsCount, callCount.get()); + + CTabItem item2 = new CTabItem(ctabFolder, SWT.NONE); + expectedEventsCount++; + expectedTabsCount ++; + assertEquals(expectedTabsCount, ctabFolder.getItemCount()); + assertEquals(ctabFolder.getItemCount(), itemCount.get()); + assertEquals(expectedEventsCount, callCount.get()); + + item1.dispose(); + expectedEventsCount++; + expectedTabsCount --; + assertEquals(expectedTabsCount, ctabFolder.getItemCount()); + assertEquals(ctabFolder.getItemCount(), itemCount.get()); + assertEquals(expectedEventsCount, callCount.get()); + + item2.dispose(); + expectedEventsCount++; + expectedTabsCount --; + assertEquals(expectedTabsCount, ctabFolder.getItemCount()); + assertEquals(ctabFolder.getItemCount(), itemCount.get()); + assertEquals(expectedEventsCount, callCount.get()); +} + @Test public void test_consistency_KeySelection() { List events = new ArrayList<>();