001package org.vishia.gral.swt; 002 003import org.eclipse.swt.SWT; 004import org.eclipse.swt.events.TraverseEvent; 005import org.eclipse.swt.events.TraverseListener; 006import org.eclipse.swt.widgets.Composite; 007import org.eclipse.swt.widgets.Control; 008 009/**This is a commonly use-able tranverse listener for all widgets in SWT. 010 * Note that the system's (Windows-, Linux-) traverse mechanism is executed without this listener 011 * with that operation systems standards. 012 * @author Hartmut Schorrig 013 * 014 */ 015public class SwtTraverseListener implements TraverseListener 016{ 017 018 @Override public void keyTraversed(TraverseEvent e) 019 { 020 int key = e.keyCode; 021 int traverse = e.detail; 022 if(traverse == SWT.TRAVERSE_RETURN) return; 023 Control widgs = (Control)e.widget; 024 Composite panel = widgs.getParent(); 025 Control[] allwidg = panel.getChildren(); 026 for(int ix = 0; ix < allwidg.length; ++ix){ 027 if(allwidg[ix] == widgs){ 028 if(traverse == SWT.TRAVERSE_TAB_NEXT || traverse == SWT.TRAVERSE_ARROW_NEXT) { 029 ix+=1; if(ix >= allwidg.length){ ix = 0; } 030 } else if(traverse == SWT.TRAVERSE_TAB_PREVIOUS || traverse == SWT.TRAVERSE_ARROW_PREVIOUS) { 031 ix-=1; if(ix <0){ ix = allwidg.length-1; } 032 } 033 else return; //other keys: do nothing. 034 Control nextwidg = allwidg[ix]; 035 nextwidg.setFocus(); 036 break; 037 } 038 } 039 040 } 041 042} 043 044