/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.red.jface.assist; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Text; import org.robotframework.red.jface.assist.RedContentProposal.ModificationStrategy; public class RedTextContentAdapter implements RedControlContentAdapter { @Override public String getControlContents(final Control control) { return ((Text) control).getText(); } @Override public void setControlContents(final Control control, final RedContentProposal proposal) { final String content = proposal.getContent(); final int cursorPosition = proposal.getCursorPosition(); ((Text) control).setText(content); ((Text) control).setSelection(cursorPosition, cursorPosition); } @Override public void insertControlContents(final Control control, final RedContentProposal proposal) { proposal.getModificationStrategy().insert((Text) control, proposal); } @Override public int getCursorPosition(final Control control) { return ((Text) control).getCaretPosition(); } @Override public Rectangle getInsertionBounds(final Control control) { final Text text = (Text) control; final Point caretOrigin = text.getCaretLocation(); // We fudge the y pixels due to problems with getCaretLocation // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=52520 return new Rectangle(caretOrigin.x + text.getClientArea().x, caretOrigin.y + text.getClientArea().y + 3, 1, text.getLineHeight()); } @Override public void setCursorPosition(final Control control, final int position) { ((Text) control).setSelection(new Point(position, position)); } @Override public Point getSelection(final Control control) { return ((Text) control).getSelection(); } @Override public void setSelection(final Control control, final Point range) { ((Text) control).setSelection(range); } public static class SubstituteTextModificationStrategy implements ModificationStrategy { @Override public void insert(final Text text, final IContentProposal proposal) { final String content = proposal.getContent(); final int cursorPosition = proposal.getCursorPosition(); final Point selection = text.getSelection(); text.setText(content); text.setSelection(cursorPosition); // Insert will leave the cursor at the end of the inserted text. If this // is not what we wanted, reset the selection. if (cursorPosition < content.length()) { text.setSelection(selection.x + cursorPosition, selection.x + cursorPosition); } } @Override public void insert(final Combo combo, final IContentProposal proposal) { final String content = proposal.getContent(); final int cursorPosition = proposal.getCursorPosition(); final Point selection = combo.getSelection(); combo.setText(content); combo.setSelection(new Point(cursorPosition, cursorPosition)); // Insert will leave the cursor at the end of the inserted text. If this // is not what we wanted, reset the selection. if (cursorPosition < content.length()) { combo.setSelection(new Point(selection.x + cursorPosition, selection.x + cursorPosition)); } } } }