Bug 573305: [SourceEditor] Add correction of selection in linked rename
quick fixes

Change-Id: I12b2bcfc4f837ed04a7e3741a742e179ed083f27
diff --git a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java
index 639e408..03839d9 100644
--- a/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java
+++ b/ltk/org.eclipse.statet.ltk.ui/src/org/eclipse/statet/ltk/ui/sourceediting/assist/LinkedNamesAssistProposal.java
@@ -127,7 +127,14 @@
 	@Override
 	public void apply(final ITextViewer viewer, final char trigger, final int stateMask, final int offset) {
 		try {
-			Point seletion= viewer.getSelectedRange();
+			// by default full word is selected by linked model ui
+			// instead we want to keep the original selection by default
+			int selectionStartOffset;
+			int selectionEndOffset;
+			{	final Point selection= viewer.getSelectedRange();
+				selectionStartOffset= selection.x;
+				selectionEndOffset= selection.x + selection.y;
+			}
 			final IDocument document= viewer.getDocument();
 			if (document == null) {
 				return;
@@ -156,16 +163,34 @@
 			ui.enter();
 			
 			final String valueSuggestion= this.valueSuggestion;
+			final Position position0= group.getPositions()[0];
 			if (valueSuggestion != null) {
-				final Position position= group.getPositions()[0];
-				document.replace(position.getOffset(), position.getLength(), valueSuggestion);
-				seletion= new Point(position.getOffset(), valueSuggestion.length());
+				document.replace(position0.getOffset(), position0.getLength(), valueSuggestion);
+				selectionStartOffset= position0.getOffset();
+				selectionEndOffset= selectionStartOffset + valueSuggestion.length();
+			}
+			else {
+				// correct selection if larger/outside of the initial position
+				final int positionEndOffset= position0.getOffset() + position0.getLength();
+				if (selectionStartOffset < position0.getOffset()) {
+					selectionStartOffset= position0.getOffset();
+				}
+				else if (selectionStartOffset > positionEndOffset) {
+					selectionStartOffset= positionEndOffset;
+				}
+				if (selectionEndOffset < selectionStartOffset) {
+					selectionEndOffset= selectionStartOffset;
+				}
+				else if (selectionEndOffset > positionEndOffset) {
+					selectionEndOffset= positionEndOffset;
+				}
 			}
 			
-			viewer.setSelectedRange(seletion.x, seletion.y); // by default full word is selected, restore original selection
+			viewer.setSelectedRange(selectionStartOffset, selectionStartOffset + selectionEndOffset);
 		}
 		catch (final BadLocationException e) {
-			StatusManager.getManager().handle(new Status(IStatus.ERROR, LTKUIPlugin.BUNDLE_ID, -1, "Error initializing linked rename.", e)); //$NON-NLS-1$
+			StatusManager.getManager().handle(new Status(IStatus.ERROR, LTKUIPlugin.BUNDLE_ID, -1,
+					"Error initializing linked rename.", e )); //$NON-NLS-1$
 		}
 	}