/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.editor.actions; import java.util.Collection; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.VerifyKeyListener; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.texteditor.ITextEditor; import org.python.pydev.shared_ui.bindings.KeyBindingHelper; /** * @author Fabio Zadrozny */ public class FirstCharAction extends PyAction { protected SourceViewer viewer; /** * Run to the first char (other than whitespaces) or to the real first char. */ @Override public void run(IAction action) { try { ITextEditor textEditor = getTextEditor(); IDocument doc = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()); ITextSelection selection = (ITextSelection) textEditor.getSelectionProvider().getSelection(); perform(doc, selection); } catch (Exception e) { beep(e); } } private void perform(IDocument doc, ITextSelection selection) { boolean isAtFirstChar = isAtFirstVisibleChar(doc, selection.getOffset()); if (!isAtFirstChar) { gotoFirstVisibleChar(doc, selection.getOffset()); } else { gotoFirstChar(doc, selection.getOffset()); } } @Override protected void setCaretPosition(int pos) throws BadLocationException { viewer.setSelectedRange(pos, 0); } /** * Creates a handler that will properly treat home considering python code (if it's still not defined * by the platform -- otherwise, just go with what the platform provides). */ public static VerifyKeyListener createVerifyKeyListener(final SourceViewer viewer, final IWorkbenchPartSite site, boolean forceCreation) { // This only needs to be done for eclipse 3.2 (where line start is not // defined). // Eclipse 3.3 onwards already defines the home key in the text editor. final boolean isDefined; if (site != null) { ICommandService commandService = (ICommandService) site.getService(ICommandService.class); Collection definedCommandIds = commandService.getDefinedCommandIds(); isDefined = definedCommandIds.contains("org.eclipse.ui.edit.text.goto.lineStart"); } else { isDefined = false; } if (forceCreation || !isDefined) { return new VerifyKeyListener() { @Override public void verifyKey(VerifyEvent event) { if (event.doit) { boolean isHome; if (isDefined) { isHome = KeyBindingHelper.matchesKeybinding(event.keyCode, event.stateMask, "org.eclipse.ui.edit.text.goto.lineStart"); } else { isHome = event.keyCode == SWT.HOME && event.stateMask == 0; } if (isHome) { ISelection selection = viewer.getSelection(); if (selection instanceof ITextSelection) { FirstCharAction firstCharAction = new FirstCharAction(); firstCharAction.viewer = viewer; firstCharAction.perform(viewer.getDocument(), (ITextSelection) selection); event.doit = false; } } } } }; } return null; } }