### Eclipse Workspace Patch 1.0 #P org.eclipse.ui.workbench Index: Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java,v retrieving revision 1.106 diff -u -r1.106 WorkbenchMessages.java --- Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java 14 May 2008 17:11:06 -0000 1.106 +++ Eclipse UI/org/eclipse/ui/internal/WorkbenchMessages.java 8 Dec 2008 16:28:33 -0000 @@ -443,6 +443,9 @@ public static String FileExtension_extensionEmptyMessage; public static String FileExtension_fileNameInvalidMessage; + public static String FilteredPreferenceDialog_Key_Scrolling; + + public static String FilteredPreferenceDialog_PreferenceSaveFailed; public static String FilteredPreferenceDialog_Resize; Index: Eclipse UI/org/eclipse/ui/internal/messages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/messages.properties,v retrieving revision 1.383 diff -u -r1.383 messages.properties --- Eclipse UI/org/eclipse/ui/internal/messages.properties 30 May 2008 17:10:15 -0000 1.383 +++ Eclipse UI/org/eclipse/ui/internal/messages.properties 8 Dec 2008 16:28:33 -0000 @@ -407,6 +407,7 @@ FileExtension_extensionEmptyMessage = The file extension cannot be empty FileExtension_fileNameInvalidMessage = The file name cannot include the wild card character (*) in the current location +FilteredPreferenceDialog_Key_Scrolling=Key &Scrolling FilteredPreferenceDialog_PreferenceSaveFailed=Preferences save failed. FilteredPreferenceDialog_Resize = &Resize tree Index: Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java,v retrieving revision 1.88 diff -u -r1.88 FilteredPreferenceDialog.java --- Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java 9 May 2008 14:13:11 -0000 1.88 +++ Eclipse UI/org/eclipse/ui/internal/dialogs/FilteredPreferenceDialog.java 8 Dec 2008 16:28:33 -0000 @@ -37,6 +37,9 @@ import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.graphics.Font; @@ -46,6 +49,9 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Sash; import org.eclipse.swt.widgets.Shell; @@ -78,6 +84,16 @@ public abstract class FilteredPreferenceDialog extends PreferenceDialog implements IWorkbenchPreferenceContainer { + /** + * + */ + private static final int PAGE_MULTIPLIER = 9; + + /** + * + */ + private static final int INCREMENT = 10; + protected class PreferenceFilteredTree extends FilteredTree { /** * An (optional) additional filter on the TreeViewer. @@ -539,6 +555,25 @@ return WorkbenchMessages.FilteredPreferenceDialog_Resize; } }); + manager.add(new Action() { + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + public void run() { + activeKeyScrolling(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#getText() + */ + public String getText() { + return WorkbenchMessages.FilteredPreferenceDialog_Key_Scrolling; + } + }); Menu menu = manager.createContextMenu(getShell()); Rectangle bounds = historyManager.getControl().getBounds(); Point topLeft = new Point(bounds.x + bounds.width, bounds.y + bounds.height); @@ -560,6 +595,81 @@ return historyManager.getControl(); } + + private boolean keyScrollingEnabled = false; + private Listener keyScrollingFilter = null; + + void activeKeyScrolling() { + if (keyScrollingFilter == null) { + Composite pageParent = getPageContainer().getParent(); + if (!(pageParent instanceof ScrolledComposite)) { + return; + } + final ScrolledComposite sc = (ScrolledComposite) pageParent; + keyScrollingFilter = new Listener() { + public void handleEvent(Event event) { + if (!keyScrollingEnabled) { + return; + } + switch (event.keyCode) { + case SWT.ARROW_DOWN: + sc.setOrigin(sc.getOrigin().x, sc.getOrigin().y + + INCREMENT); + break; + case SWT.ARROW_UP: + sc.setOrigin(sc.getOrigin().x, sc.getOrigin().y + - INCREMENT); + break; + case SWT.ARROW_LEFT: + sc.setOrigin(sc.getOrigin().x - INCREMENT, sc + .getOrigin().y); + break; + case SWT.ARROW_RIGHT: + sc.setOrigin(sc.getOrigin().x + INCREMENT, sc + .getOrigin().y); + break; + case SWT.PAGE_DOWN: + sc.setOrigin(sc.getOrigin().x, sc.getOrigin().y + + PAGE_MULTIPLIER * INCREMENT); + break; + case SWT.PAGE_UP: + sc.setOrigin(sc.getOrigin().x, sc.getOrigin().y + - PAGE_MULTIPLIER * INCREMENT); + break; + case SWT.HOME: + sc.setOrigin(0, 0); + break; + case SWT.END: + sc.setOrigin(0, sc.getSize().y); + break; + default: + keyScrollingEnabled = false; + } + event.type = SWT.None; + event.doit = false; + } + }; + Display display = PlatformUI.getWorkbench().getDisplay(); + display.addFilter(SWT.KeyDown, keyScrollingFilter); + display.addFilter(SWT.Traverse, keyScrollingFilter); + sc.addDisposeListener(new DisposeListener() { + + public void widgetDisposed(DisposeEvent e) { + removeKeyScrolling(); + } }); + } + keyScrollingEnabled = true; + } + + void removeKeyScrolling() { + if (keyScrollingFilter != null) { + keyScrollingEnabled = false; + Display display = PlatformUI.getWorkbench().getDisplay(); + display.removeFilter(SWT.KeyDown, keyScrollingFilter); + display.removeFilter(SWT.Traverse, keyScrollingFilter); + keyScrollingFilter = null; + } + } /* * (non-Javadoc) @@ -588,6 +698,7 @@ showViewHandler.getHandler().dispose(); showViewHandler = null; } + removeKeyScrolling(); history.dispose(); return super.close(); }