diff --git a/widgets/splitbutton/org.eclipse.nebula.widgets.splitbutton/src/org/eclipse/nebula/widgets/splitbutton/SplitButton.java b/widgets/splitbutton/org.eclipse.nebula.widgets.splitbutton/src/org/eclipse/nebula/widgets/splitbutton/SplitButton.java index bc56fbe64..de620ecc2 100644 --- a/widgets/splitbutton/org.eclipse.nebula.widgets.splitbutton/src/org/eclipse/nebula/widgets/splitbutton/SplitButton.java +++ b/widgets/splitbutton/org.eclipse.nebula.widgets.splitbutton/src/org/eclipse/nebula/widgets/splitbutton/SplitButton.java @@ -15,9 +15,9 @@ *******************************************************************************/ package org.eclipse.nebula.widgets.splitbutton; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.function.Supplier; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; @@ -33,7 +33,6 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.TypedListener; import org.eclipse.swt.widgets.Widget; /** @@ -57,7 +56,8 @@ public class SplitButton extends Button { private static final int EXTRA_WIDTH = 60; - private final List listeners = new LinkedList<>(); + private final List selectionListeners = new LinkedList<>(); + private final List typedSelectionListeners = new LinkedList<>(); private int splitButtonAreaLeft = -1; private int splitButtonAreaTop = -1; @@ -179,30 +179,26 @@ private void drawTriangle() { } private void addMouseDownListener() { - super.addListener(SWT.MouseDown, new Listener() { - - @Override - public void handleEvent(final Event event) { - if (shouldShowMenu(event.x, event.y)) { - final Button button = (Button) event.widget; - final Rectangle rect = button.getBounds(); - final Point p = button.toDisplay(rect.x, rect.y + rect.height); - getMenu().setLocation(p.x - rect.x, p.y - rect.y); - getMenu().setVisible(true); - - } else { - for (final Listener listener : listeners) { - final Event evt = new Event(); - evt.widget = SplitButton.this; - evt.display = getDisplay(); - evt.type = SWT.Selection; - listener.handleEvent(evt); - } + super.addListener(SWT.MouseDown, event -> { + boolean shouldShowMenu = event.x >= splitButtonAreaLeft && event.y >= splitButtonAreaTop + && event.x <= splitButtonAreaRight && event.y <= splitButtonAreaBottom; + if (shouldShowMenu) { + final Button button = (Button) event.widget; + final Rectangle rect = button.getBounds(); + final Point p = button.toDisplay(rect.x, rect.y + rect.height); + getMenu().setLocation(p.x - rect.x, p.y - rect.y); + getMenu().setVisible(true); + } else { + Event evt = new Event(); + evt.widget = SplitButton.this; + evt.display = getDisplay(); + evt.type = SWT.Selection; + for (Listener listener : selectionListeners) { + listener.handleEvent(evt); + } + for (SelectionListener listener : typedSelectionListeners) { + listener.widgetSelected(new SelectionEvent(evt)); } - } - - private boolean shouldShowMenu(final int x, final int y) { - return x >= splitButtonAreaLeft && y >= splitButtonAreaTop && x <= splitButtonAreaRight && y <= splitButtonAreaBottom; } }); } @@ -240,8 +236,7 @@ public void addSelectionListener(SelectionListener listener) { if (listener == null) { SWT.error(SWT.ERROR_NULL_ARGUMENT); } - final TypedListener typedListener = new TypedListener(listener); - listeners.add(typedListener); + typedSelectionListeners.add(listener); } /** @@ -271,17 +266,7 @@ public void removeSelectionListener(SelectionListener listener) { if (listener == null) { SWT.error(SWT.ERROR_NULL_ARGUMENT); } - - final Iterator it = listeners.iterator(); - while (it.hasNext()) { - final Listener current = it.next(); - if (current instanceof TypedListener) { - final TypedListener tl = (TypedListener) current; - if (tl.getEventListener() != null && tl.getEventListener().equals(listener)) { - it.remove(); - } - } - } + typedSelectionListeners.removeIf(listener::equals); } /** @@ -317,7 +302,7 @@ public void addListener(int eventType, Listener listener) { SWT.error(SWT.ERROR_NULL_ARGUMENT); } if (eventType == SWT.Selection) { - listeners.add(listener); + selectionListeners.add(listener); return; } super.addListener(eventType, listener); @@ -354,7 +339,7 @@ public void removeListener(int eventType, Listener listener) { SWT.error(SWT.ERROR_NULL_ARGUMENT); } if (eventType == SWT.Selection) { - listeners.add(listener); + selectionListeners.remove(listener); return; } super.removeListener(eventType, listener);