Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SWT remove all listener from StyledText

Tags:

java

listener

swt

How do I remove all listener from a SWT StyledText if I'm missing the instances? I tried to use the StyledText.getListeners(int) method to get all the instances, being able to remove them afterwards. But it's exhausting to find all the required int values. Is this the most straightforward way? Thank you!

Here is my temporary solution:

public void removeAllListener(StyledText st) {
    int[] eventTypes = { 3007, 3011, SWT.Resize, SWT.Move, SWT.Dispose,
            SWT.DragDetect, 3000, SWT.FocusIn, SWT.FocusOut, SWT.Gesture,
            SWT.Help, SWT.KeyUp, SWT.KeyDown, 3001, 3002, SWT.MenuDetect,
            SWT.Modify, SWT.MouseDown, SWT.MouseUp, SWT.MouseDoubleClick,
            SWT.MouseMove, SWT.MouseEnter, SWT.MouseExit, SWT.MouseHover,
            SWT.MouseWheel, SWT.Paint, 3008, SWT.Selection, SWT.Touch,
            SWT.Traverse, 3005, SWT.Verify, 3009, 3010 };

    for (int eventType : eventTypes) {
        Listener[] listeners = st.getListeners(eventType);
        for (Listener listener : listeners) {
            st.removeListener(eventType, listener);
        }
    }
}

I had to copy some of the values since they are part of StyledText class declared with the default modifier. So I cannot access them.

I hope, I didn't miss any int values ;)

like image 569
kon Avatar asked Oct 06 '22 18:10

kon


1 Answers

In general, there is no mechanism to do this. However, I managed to get it working by subclassing StyledText. The new class is called StyledTextWithListeners. You can just rename it if you want ;) . However, you will have to use

styledText.addListenerByUser(int eventType, Listener listener);

to add you Listeners rather than

styledText.addListener(int eventTyle, Listener listener);

This is necessary to discriminate between Listeners added by you and those added by SWT upon creation.

To remove all listeners added by the user (you) just call

styledText.removeAllListeners();

Here is the code:

import java.util.HashMap;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class MiniExample {

    public static void main(String[] args) {
        Display display = Display.getDefault();
        final Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));

        StyledTextWithListeners text = new StyledTextWithListeners(shell, SWT.BORDER);

        text.setText("TEXT");

        text.addListenerByUser(SWT.Verify, new Listener() {

            @Override
            public void handleEvent(Event arg0) {

            }
        });

        text.removeAllListeners();

        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }

    public static class StyledTextWithListeners extends StyledText
    {
        HashMap<Integer, Listener> listeners;
        public StyledTextWithListeners(Composite parent, int style) {
            super(parent, style);
        }

        public void addListenerByUser(int eventType, Listener listener)
        {
            addListener(eventType, listener);
            System.out.println("Adding: " + listener.getClass().toString());

            if(listeners == null)
                listeners = new HashMap<Integer, Listener>();

            listeners.put(eventType, listener);
        }

        public void removeAllListeners()
        {
            for(Integer type : listeners.keySet())
            {
                System.out.println("Removing: " + listeners.get(type).getClass().toString());
                removeListener(type.intValue(), listeners.get(type));
            }
            listeners = new HashMap<Integer, Listener>();
        }
    }
}

It basically saves all the Listeners you add in a HashMap and removes them when you call removeAllListeners.

Keep in mind that I didn't take care of the case where you add a second Listener with the same eventType to the StyledText as done before. In this case, the old Listener will be replaced in the HashMap, but not removed from the StyledText. If this case can occur in your scenario, just add some code yourself.

like image 81
Baz Avatar answered Oct 10 '22 04:10

Baz