001package org.vishia.gral.swt;
002
003import org.eclipse.swt.events.KeyEvent;
004import org.eclipse.swt.events.KeyListener;
005import org.eclipse.swt.widgets.Control;
006import org.vishia.gral.base.GralKeyListener;
007import org.vishia.gral.base.GralKeySpecial_ifc;
008import org.vishia.gral.base.GralTextField;
009import org.vishia.gral.base.GralWidget;
010import org.vishia.gral.ifc.GralUserAction;
011import org.vishia.gral.ifc.GralWidget_ifc;
012
013/**A common key listener implementation for SWT. It is applied to all widgets.
014 * Derived forms exists for special SWT-widgets.
015 * This class is instanciated one time in the {@link SwtMng}.
016 * A Widget can be completed with this key listener. On all keys 
017   * the {@link GralUserAction} given in the {@link GralWidget#getActionChange()} is called
018   * <ul>
019   * </ul> 
020   * If the method returns false, the central key action given in {@link GralMng#getRegisteredUserAction(String)}
021   * for "keyAction" is tried to get and then invoked with cmd = "key" and the key code in params[0].
022   * This central keyAction may be used for application centralized keys without association to the table itself.
023 * @see GralKeyListener
024 * 
025 * @author Hartmut Schorrig
026 *
027 */
028public class SwtKeyListener implements GralKeySpecial_ifc, KeyListener// extends GralKeyListener
029{
030  
031  /**Version and history
032   * <ul>
033   * <li>2011-12-03 Hartmut created. Any widget may have the same key listener.
034   * </ul>
035   * 
036   */
037  //@SuppressWarnings("hiding")
038  public final static int version = 20120630;
039  
040  //final SwtMng swtMng;
041  
042  private final GralKeyListener keyAction;
043  //final KeyListener swtListener;
044  
045  public SwtKeyListener(GralKeyListener keyAction)
046  {
047    this.keyAction = keyAction;
048  }
049
050  @Override
051  public void keyPressed(KeyEvent keyEv)
052  {
053    final GralWidget_ifc widgetDescr;
054    //System.out.println("" + keyEv.character + Integer.toHexString(keyEv.keyCode));
055    
056    final Object source = keyEv.getSource();
057    final Control swtControl;
058    if(source instanceof Control){
059      swtControl = ((Control)source);
060      Object oData = swtControl.getData();
061      if(oData instanceof GralTextField.GraphicImplAccess){
062        GralTextField.GraphicImplAccess widgi = (GralTextField.GraphicImplAccess) oData;
063        widgetDescr = widgi.widgg;
064      } else if(oData instanceof GralWidget_ifc){
065        widgetDescr = (GralWidget_ifc)oData;
066      } else { widgetDescr = null;  }
067    } else { 
068      widgetDescr = null; 
069      swtControl = null;
070    }
071    if((keyEv.keyCode & 0xffff) !=0){
072      final int keyCode = SwtGralKey.convertFromSwt(keyEv.keyCode, keyEv.stateMask, keyEv.character);
073      if(! specialKeysOfWidgetType(keyCode, widgetDescr, swtControl)){
074        keyAction.keyPressed(keyCode, widgetDescr, swtControl);
075      }
076    }
077    if(swtControl !=null){
078      Control parent = swtControl.getParent();
079      if(parent !=null){
080        //KeyListener parentListener = parent.getListener(SWT.KEY_MASK);
081        //parent.
082      }
083    }
084  }
085
086  @Override
087  public void keyReleased(KeyEvent arg0)
088  {
089    //basicListener.keyReleased(arg0);
090    
091  }
092  
093  @Override public boolean specialKeysOfWidgetType(int key, GralWidget_ifc widgg, Object widgImpl){ return false; }
094
095
096}