[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Newsgroup Home]
[news.eclipse.platform.swt] Key-events on Carbon and on GTK

In one of our applications we have a situation where the user works in a dialog. On some action a second modal dialog is displayed. When the user dismisses this dialog in the foreground with the escape key she gets back to the first dialog. The strange thing is that under OS-X and under Linux the first dialog gets closed too. It's like the user pressed the escape key twice.

Below is a snippet that demonstrates the issue. Open the sub dialog and press the escape key. Both dialogs are then closed.

- This happens on 3.3 and on 3.4
- One dialog has a Text control and adds traverse and key listeners. If one omits these listeners, the code works as expected. But, of course, these listeneres are there for a reason which is no longer apparent in this smaller example.
- The snippet uses some JFace code, but this is only to simplify the example, I believe.
- If I add a breakpoint to the close method of the sub-dialog and wait a fews seconds before I continue, everything works as expected.


Thanks for any input
Peter


package org.eclipse.jface.snippets;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class TestEscape {
    private static final class MyDialog extends Dialog {
        private MyDialog(Shell parentShell) {
            super(parentShell);
        }

@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
Text text = new Text(composite, SWT.NONE);
text.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_ESCAPE) {
e.doit = false;
}
}
});
text.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.character == '\u001b') { // Escape
close();
}
}
});
Button b = new Button(composite, SWT.PUSH);
b.setText("Open sub dialog");
b.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Dialog subDlg = new Dialog(getShell()) {
};
subDlg.open();
}
});
return composite;
}
}


    public static void main(String[] args) {
        Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        Button b = new Button(shell, SWT.PUSH);
        b.setText("Open dialog");
        b.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                final Dialog dialog = new MyDialog(shell);
                dialog.open();
            }
        });
        shell.pack();
        shell.open();

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

        display.dispose();
    }

}