import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Listener; /** * This class allows vertical mouse wheel scrolling without manual focus * It works with ScrolledComposite and sets focus to first control in child Composite * of ScrolledComposite with MouseEnter event (only if any of Composite controls not focused yet) */ public class EasyScroll { /** * @param scrolledComposite Target ScrolledComposite * @param setVerticalIncrementValue Allows setting vertical bar increment value * */ public static final void addEasyMouseWheelScroll( final ScrolledComposite scrolledComposite, boolean setVerticalIncrementValue) { if (setVerticalIncrementValue) scrolledComposite.getVerticalBar().setIncrement(5); final ScrollControl scrollControl = new ScrollControl(); // Getting child composite of ScrolledComposite Composite childComposite = null; if (scrolledComposite.getChildren()[0] instanceof Composite) childComposite = (Composite) scrolledComposite.getChildren()[0]; childComposite.addListener(SWT.MouseEnter, new Listener() { public void handleEvent(Event e) { if (!scrollControl.isAnotherControlInFocus) scrolledComposite.setFocus(); } }); scrollControl.checkControlsOnScroll(childComposite); } } /** * Need to control scrolling */ class ScrollControl { boolean isAnotherControlInFocus = false; /** * Correcting some bug with wrong focusing * @param composite */ public void checkControlsOnScroll(Composite composite) { for (final Control control : composite.getChildren()) { if (control instanceof Composite || control instanceof Group) { checkControlsOnScroll((Composite) control); } else { control.addListener(SWT.MouseDown, new Listener() { public void handleEvent(Event e) { control.addListener(SWT.MouseExit, new Listener() { public void handleEvent(Event e) { control.setFocus(); isAnotherControlInFocus = true; control.removeListener(SWT.MouseExit, this); } }); control.addListener(SWT.FocusOut, new Listener() { public void handleEvent(Event e) { isAnotherControlInFocus = false; } }); } }); } } } }