[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();
}
}