Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CTabFolder should allow to listen on tab count changes #621

Merged
merged 1 commit into from Apr 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions bundles/org.eclipse.swt/.settings/.api_filters
Expand Up @@ -153,6 +153,12 @@
</filter>
</resource>
<resource path="Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/CTabFolder2Listener.java" type="org.eclipse.swt.custom.CTabFolder2Listener">
<filter id="404000815">
<message_arguments>
<message_argument value="org.eclipse.swt.custom.CTabFolder2Listener"/>
<message_argument value="itemsCount(CTabFolderEvent)"/>
</message_arguments>
</filter>
<filter id="576720909">
<message_arguments>
<message_argument value="SWTEventListener"/>
Expand Down
Expand Up @@ -744,6 +744,14 @@ 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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could init the event lazy in the loop, so if there are no listeners you don't create a uselsess object that is instantly garbage collected.
Alternatively, if folderListeners.isEmpty() one might early exit this method.

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 +777,7 @@ void createItem (CTabItem item, int index) {
} else {
updateFolder(REDRAW_TABS);
}
notifyItemCountChange();
}
void destroyItem (CTabItem item) {
if (inDispose) return;
iloveeclipse marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -789,6 +798,7 @@ void destroyItem (CTabItem item) {
updateButtons();
setButtonBounds();
redraw();
notifyItemCountChange();
return;
}

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

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

/**
Expand Down Expand Up @@ -1631,7 +1642,6 @@ void onKeyDown (Event event) {
Rectangle chevronRect = chevronItem.getBounds();
chevronRect = event.display.map(chevronTb, this, chevronRect);
CTabFolderEvent e = new CTabFolderEvent(this);
e.widget = this;
e.time = event.time;
e.x = chevronRect.x;
e.y = chevronRect.y;
Expand Down Expand Up @@ -1953,7 +1963,6 @@ public void run() {
redraw(item.closeRect.x, item.closeRect.y, item.closeRect.width, item.closeRect.height, false);
if (!selected) return;
CTabFolderEvent e = new CTabFolderEvent(this);
e.widget = this;
e.time = event.time;
e.item = item;
e.doit = true;
Expand Down Expand Up @@ -2016,7 +2025,6 @@ void onPageTraversal(Event event) {
Rectangle chevronRect = chevronItem.getBounds();
chevronRect = event.display.map(chevronTb, this, chevronRect);
CTabFolderEvent e = new CTabFolderEvent(this);
e.widget = this;
e.time = event.time;
e.x = chevronRect.x;
e.y = chevronRect.y;
Expand Down Expand Up @@ -2151,7 +2159,6 @@ void onSelection(Event event) {
}
if (event.widget == maxItem) {
CTabFolderEvent e = new CTabFolderEvent(this);
e.widget = CTabFolder.this;
e.time = event.time;
for (CTabFolder2Listener folderListener : folderListeners) {
if (maximized) {
Expand All @@ -2162,7 +2169,6 @@ void onSelection(Event event) {
}
} else if (event.widget == minItem) {
CTabFolderEvent e = new CTabFolderEvent(this);
e.widget = CTabFolder.this;
e.time = event.time;
for (CTabFolder2Listener folderListener : folderListeners) {
if (minimized) {
Expand All @@ -2175,7 +2181,6 @@ void onSelection(Event event) {
Rectangle chevronRect = chevronItem.getBounds();
chevronRect = event.display.map(chevronTb, this, chevronRect);
CTabFolderEvent e = new CTabFolderEvent(this);
e.widget = this;
e.time = event.time;
e.x = chevronRect.x;
e.y = chevronRect.y;
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) {
iloveeclipse marked this conversation as resolved.
Show resolved Hide resolved
// 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
Expand Up @@ -73,6 +73,7 @@ public class CTabFolderEvent extends TypedEvent {
*/
CTabFolderEvent(Widget w) {
super(w);
this.widget = w;
}

/**
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_ItemCountListeners() {
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