Skip to content

Commit

Permalink
CTabFolder should allow to listen on tab count changes
Browse files Browse the repository at this point in the history
- added CTabFolder2Listener.itemsCount(CTabFolderEvent) API
- added CTabFolder2Listener.itemsCountAdapter(Consumer<CTabFolderEvent>)
API
- updated CTabFolder to notify CTabFolder2Listener on creating/removing
items
- added unit test
- bumped minor version segment for new API added

Fixes #620
  • Loading branch information
iloveeclipse committed Apr 8, 2023
1 parent 7ab96c2 commit d0f05bd
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 2 deletions.
Expand Up @@ -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;
Expand All @@ -769,6 +778,7 @@ void createItem (CTabItem item, int index) {
} else {
updateFolder(REDRAW_TABS);
}
notifyItemCountChange();
}
void destroyItem (CTabItem item) {
if (inDispose) return;
Expand All @@ -789,6 +799,7 @@ void destroyItem (CTabItem item) {
updateButtons();
setButtonBounds();
redraw();
notifyItemCountChange();
return;
}

Expand Down Expand Up @@ -820,6 +831,7 @@ void destroyItem (CTabItem item) {

requestLayout();
updateFolder(UPDATE_TAB_HEIGHT | REDRAW_TABS);
notifyItemCountChange();
}

/**
Expand Down
Expand Up @@ -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 <code>CTabFolder2Listener</code> 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<CTabFolderEvent> c) {
return new CTabFolder2Adapter() {
@Override
public void itemsCount(CTabFolderEvent e) {
c.accept(e);
}
};
}

/**
* Static helper method to create a <code>CTabFolder2Listener</code> for the
* {@link #close(CTabFolderEvent e)}) method, given a lambda expression or a method reference.
Expand Down
2 changes: 1 addition & 1 deletion bundles/org.eclipse.swt/META-INF/MANIFEST.MF
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion bundles/org.eclipse.swt/pom.xml
Expand Up @@ -21,7 +21,7 @@
</parent>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt</artifactId>
<version>3.123.100-SNAPSHOT</version>
<version>3.124.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>

<properties>
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -143,6 +147,48 @@ private void createTabFolder(List<String> 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<CTabFolderEvent> 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<String> events = new ArrayList<>();
Expand Down

0 comments on commit d0f05bd

Please sign in to comment.