package org.eclipse.ui.views.pdf; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.commands.IHandlerListener; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.ScrollBar; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.views.file.FileView; import org.eclipse.ui.views.file.IFileViewType; public class PdfViewScrollHandler implements IHandler{ public static void fixNegativeOriginMouseScrollBug(PdfViewPage page){ exchangeScrollListener(page, true); exchangeScrollListener(page, false); } private static void exchangeScrollListener(final PdfViewPage page, final boolean horizontalScrollBar){ ScrollBar scrollBar=horizontalScrollBar?page.getHorizontalBar():page.getVerticalBar(); Listener[] listeners = scrollBar.getListeners(SWT.Selection); if(listeners.length==1){ final Listener originalListener=listeners[0]; scrollBar.removeListener(SWT.Selection, originalListener); scrollBar.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { //ScrolledComposit does not expect negative origin values //so mouse scroll event sets origin to minimal selection (hscroll/vscroll) //this has to be prevented Point origin = page.getOrigin(); int originValueToCheck=horizontalScrollBar?origin.x:origin.y; if(originValueToCheck>=0){ originalListener.handleEvent(event); } } }); } } private PdfViewPage getPage(){ //handler activation ensures active part is FileView FileView view=(FileView)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart(); IFileViewType<?> type = view.getType(); if(type instanceof PdfViewType){ return ((PdfViewType) type).getPage(); }else{ return null; } } @Override public Object execute(ExecutionEvent event) throws ExecutionException { PdfViewPage page = getPage(); if(page!=null && (event.getTrigger()) instanceof Event){ int key=((Event)event.getTrigger()).keyCode; switch(key){ case SWT.ARROW_UP:scroll(page.getVerticalBar(),true);break; case SWT.ARROW_DOWN:scroll(page.getVerticalBar(),false);break; case SWT.ARROW_LEFT:scroll(page.getHorizontalBar(),true);break; case SWT.ARROW_RIGHT:scroll(page.getHorizontalBar(),false);break; default:return null; } } return null; } private void scroll(ScrollBar bar, boolean up){ int inc = up?-bar.getIncrement():bar.getIncrement(); bar.setSelection(bar.getSelection()+inc); Listener[] listeners = bar.getListeners(SWT.Selection); for (Listener listener : listeners) { listener.handleEvent(new Event()); } } @Override public boolean isEnabled() { return true; } @Override public boolean isHandled() { return getPage()!=null; } @Override public void removeHandlerListener(IHandlerListener handlerListener) {} @Override public void addHandlerListener(IHandlerListener handlerListener) {} @Override public void dispose() {} }