--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2008 Mateusz Matela and others.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Mateusz Matela <mateusz.matela@gmail.com> - Make StyledText work with ContentAssistCommandAdapter - https://bugs.eclipse.org/bugs/show_bug.cgi?id=246388\r
+ *******************************************************************************/\r
+package org.simantics.scl.ui.assist;\r
+\r
+import org.eclipse.jface.fieldassist.IControlContentAdapter;\r
+import org.eclipse.jface.fieldassist.IControlContentAdapter2;\r
+import org.eclipse.swt.custom.StyledText;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.widgets.Control;\r
+\r
+/**\r
+ * An {@link IControlContentAdapter} for {@link org.eclipse.swt.custom.StyledText}. This is\r
+ * a convenience class for easily creating a {@link ContentProposalAdapter} for text fields.\r
+ * \r
+ * @since 3.5\r
+ */\r
+public class StyledTextContentAdapter implements IControlContentAdapter, IControlContentAdapter2 {\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter#getControlContents(org.eclipse\r
+ * .swt.widgets.Control)\r
+ */\r
+ public String getControlContents(Control control) {\r
+ return ((StyledText)control).getText();\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter#getCursorPosition(org.eclipse\r
+ * .swt.widgets.Control)\r
+ */\r
+ public int getCursorPosition(Control control) {\r
+ return ((StyledText)control).getCaretOffset();\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter#getInsertionBounds(org.eclipse\r
+ * .swt.widgets.Control)\r
+ */\r
+ public Rectangle getInsertionBounds(Control control) {\r
+ StyledText text= (StyledText)control;\r
+ Point caretOrigin= text.getLocationAtOffset(text.getCaretOffset());\r
+ return new Rectangle(caretOrigin.x + text.getClientArea().x, caretOrigin.y + text.getClientArea().y + 3, 1, text.getLineHeight());\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter#insertControlContents(org.eclipse\r
+ * .swt.widgets.Control, java.lang.String, int)\r
+ */\r
+ public void insertControlContents(Control control, String contents, int cursorPosition) {\r
+ StyledText text = ((StyledText)control);\r
+ cursorPosition = Math.min(cursorPosition, contents.length());\r
+ int caretEndRange = text.getCaretOffset();\r
+ String currentText = text.getText();\r
+ \r
+ int offset = caretEndRange;\r
+ int length = currentText.length();\r
+ while (--offset >= 0 && (Character.isJavaIdentifierPart(currentText.charAt(offset)) && !Character.isWhitespace(currentText.charAt(offset))))\r
+ length--;\r
+ \r
+ int nameSpaceBeginRange = currentText.lastIndexOf(".", caretEndRange - 1);\r
+ if (nameSpaceBeginRange > length)\r
+ length = nameSpaceBeginRange;\r
+ int endRange = currentText.length();\r
+ if (caretEndRange < endRange)\r
+ endRange = caretEndRange;\r
+ text.setSelection(length, endRange);\r
+ text.insert(contents);\r
+ // calculate the initial count of letters that was typed when the proposal was accepted to insert the caret\r
+ // at the right position\r
+ int proposalFirstLettersCount = endRange - (length);\r
+ text.setCaretOffset(caretEndRange + cursorPosition - proposalFirstLettersCount);\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter#setControlContents(org.eclipse\r
+ * .swt.widgets.Control, java.lang.String, int)\r
+ */\r
+ public void setControlContents(Control control, String contents, int cursorPosition) {\r
+ ((StyledText)control).setText(contents);\r
+ ((StyledText)control).setCaretOffset(cursorPosition);\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter#setCursorPosition(org.eclipse\r
+ * .swt.widgets.Control, int)\r
+ */\r
+ public void setCursorPosition(Control control, int index) {\r
+ ((StyledText)control).setCaretOffset(index);\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter2#getSelection(org.eclipse.swt\r
+ * .widgets.Control)\r
+ */\r
+ public Point getSelection(Control control) {\r
+ return ((StyledText)control).getSelection();\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.jface.fieldassist.IControlContentAdapter2#setSelection(org.eclipse.swt\r
+ * .widgets.Control, org.eclipse.swt.graphics.Point)\r
+ */\r
+ public void setSelection(Control control, Point range) {\r
+ ((StyledText)control).setSelection(range);\r
+ }\r
+\r
+}\r