Fixed bug 67500 (try 2): [projection] Unfolding code eats first keystroke
diff --git a/org.eclipse.jface.text/projection/org/eclipse/jface/text/source/projection/ProjectionViewer.java b/org.eclipse.jface.text/projection/org/eclipse/jface/text/source/projection/ProjectionViewer.java
index 1dde1e6..01a2266 100644
--- a/org.eclipse.jface.text/projection/org/eclipse/jface/text/source/projection/ProjectionViewer.java
+++ b/org.eclipse.jface.text/projection/org/eclipse/jface/text/source/projection/ProjectionViewer.java
@@ -1282,15 +1282,18 @@
 	 * @see org.eclipse.jface.text.TextViewer#handleVerifyEvent(org.eclipse.swt.events.VerifyEvent)
 	 */
 	protected void handleVerifyEvent(VerifyEvent e) {
+		Point selection= getSelectedRange();
 		IRegion modelRange= event2ModelRange(e);
 		if (exposeModelRange(modelRange)) {
 			e.doit= false;
-			IRegion widgetRange= modelRange2WidgetRange(modelRange);
 			try {
-				int insertOffset= widgetRange.getOffset();
-				getDocument().replace(insertOffset, widgetRange.getLength(), e.text);
-				int caretOffset= insertOffset + e.text.length();
-				getTextWidget().setSelection(caretOffset, caretOffset);
+				if (selection.y == 0 && e.text.length() <= 1 && modelRange.getLength() == 1) {
+					selection.y= 1;
+					if (selection.x - 1 == modelRange.getOffset())
+						selection.x--;
+				}
+				getDocument().replace(selection.x, selection.y, e.text);
+				setSelectedRange(selection.x + e.text.length(), 0);
 			} catch (BadLocationException e1) {
 				// ignore as nothing bad happens (no log at this level)
 			}