java - How to detect ctrl-f in my SWT application -


i have written swt ui has primary function of displaying text in styledtext control. want add handler ctrl+f when shortcut pressed focus set search box. have tried using following code detect keypress.

swindow = new shell(); ... swindow.getdisplay().addfilter(swt.keydown, new listener() {   @override   public void handleevent(event e)   {     system.out.println("filter-ctrl: " + swt.ctrl);     system.out.println("filter-mask: " + e.statemask);     system.out.println("filter-char: " + e.character);   } }); 

i expecting when pressed ctrl+f see following output:

filter-ctrl: 262144 filter-mask: 262144 filter-char: f 

however, in practice see following.

filter-ctrl: 262144 filter-mask: 262144 filter-char: <unprintable char - displayed box in eclipse console> 

i have 2 questions:

  • is display.addfilter(...) best way add global shortcut? tried display.addlistener(...) didn't receive events @ all.
  • why don't pressed character when i'm holding down ctrl? when hold down alt or shift expected mask , pressed character.

is display.addfilter(...) best way add glbal shortcut? tried display.addlistener(...) didn't receive events @ all.

yes, display.addfilter(...) best way add glbal shortcut because have higher preference on event listeners. see below comment display.addfilter(...) javadoc.

because event filters run before other listeners, event filters can both block other listeners , set arbitrary fields within event. reason, event filters both powerful , dangerous. should avoided performance, debugging , code maintenance reasons.


for second question:

why don't pressed character when i'm holding down ctrl? when hold down alt or shift expected mask , pressed character.

the problem looking @ wrong place. instead of querying e.character should using e.keycode. per javadoc of e.character won't character f:

depending on event, character represented key typed. final character results after modifiers have been applied. example, when user types ctrl+a, character value 0x01 (ascii soh).

so when press ctrl+f converts in 0x06 (ascii ack). not case when alt+f or shift+f.

on other hand javadoc of e.keycode says:

depending on event, key code of key typed, defined key code constants in class swt. when character field of event ambiguous, field contains unaffected value of original character. example, typing ctrl+m or enter both result in character '\r' keycode field contain '\r' when enter typed , 'm' when ctrl+m typed.

check below code more details. demo have tried put listener on display , test.

import org.eclipse.swt.swt; import org.eclipse.swt.events.keyevent; import org.eclipse.swt.events.keylistener; import org.eclipse.swt.graphics.color; 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 controlf  {     public static void main(string[] args)      {          display display = new display ();          final shell shell = new shell (display);         final color green = display.getsystemcolor (swt.color_green);         final color orig = shell.getbackground();          display.addfilter(swt.keydown, new listener() {              public void handleevent(event e) {                 if(((e.statemask & swt.ctrl) == swt.ctrl) && (e.keycode == 'f'))                 {                     system.out.println("from display key down !!" + e.keycode);                 }             }         });          shell.addkeylistener(new keylistener() {             public void keyreleased(keyevent e) {                 if(((e.statemask & swt.ctrl) == swt.ctrl) && (e.keycode == 'f'))                 {                     shell.setbackground(orig);                     system.out.println("key !!");                 }             }             public void keypressed(keyevent e) {                 if(((e.statemask & swt.ctrl) == swt.ctrl) && (e.keycode == 'f'))                 {                     shell.setbackground(green);                     system.out.println("key down !!");                 }             }         });          shell.setsize (200, 200);         shell.open ();         while (!shell.isdisposed()) {             if (!display.readanddispatch ()) display.sleep ();         }         display.dispose ();      } } 

Comments

Popular posts from this blog

objective c - Change font of selected text in UITextView -

php - Accessing POST data in Facebook cavas app -

c# - Getting control value when switching a view as part of a multiview -