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<>();