+package org.simantics.document.ui;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.jface.text.BadLocationException;\r
+import org.eclipse.jface.text.DefaultInformationControl;\r
+import org.eclipse.jface.text.DocumentEvent;\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.IInformationControl;\r
+import org.eclipse.jface.text.IInformationControlCreator;\r
+import org.eclipse.jface.text.ITextViewer;\r
+import org.eclipse.jface.text.contentassist.ICompletionProposal;\r
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension;\r
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;\r
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3;\r
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension4;\r
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension5;\r
+import org.eclipse.jface.text.contentassist.IContextInformation;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
+\r
+public class CSSCompletionProposal implements ICompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, ICompletionProposalExtension3, ICompletionProposalExtension4, ICompletionProposalExtension5 {\r
+ \r
+ private static final Image PRIVATE = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/private_co.gif").createImage();\r
+ private static final Image PUBLIC = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/public_co.gif").createImage();\r
+ private static final Image CONST = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/container_obj.gif").createImage();\r
+ private static final Image TYPE = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/typedef_obj.gif").createImage();\r
+ \r
+ private final String content;\r
+ private final String name;\r
+ private final String module;\r
+ private final String documentation;\r
+ private int replacementOffset;\r
+ private String prefix;\r
+ private final CSSCompletionType completionType;\r
+ \r
+ public CSSCompletionProposal(SCLValue value, int replacementOffset, String prefix) {\r
+ this.name = value.getName().name;\r
+ this.module = value.getName().module;\r
+ this.documentation = value.getDocumentation();\r
+ this.content = name + " :: " + value.getType() + " (" + module + ")";\r
+ this.replacementOffset = replacementOffset;\r
+ this.prefix = prefix;\r
+// System.out.println(prefix);\r
+ if (value.isPrivate())\r
+ this.completionType = CSSCompletionType.PRIVATE;\r
+ else\r
+ this.completionType = CSSCompletionType.PUBLIC;\r
+ }\r
+\r
+ public CSSCompletionProposal(String name, String module, CSSCompletionType completionType, int replacementOffset, String prefix) {\r
+ this.name = name;\r
+ this.module = module;\r
+ this.content = name + " (" + module + ")";\r
+ this.documentation = null;\r
+ this.replacementOffset = replacementOffset;\r
+ this.prefix = prefix;\r
+ this.completionType = completionType;\r
+ }\r
+\r
+ @Override\r
+ public void apply(IDocument document) {\r
+\r
+ }\r
+\r
+ @Override\r
+ public Point getSelection(IDocument document) {\r
+ return new Point(replacementOffset + getName().length(), 0);\r
+ }\r
+\r
+ @Override\r
+ public String getAdditionalProposalInfo() {\r
+ return documentation;\r
+ }\r
+\r
+ @Override\r
+ public String getDisplayString() {\r
+ return content;\r
+ }\r
+\r
+ @Override\r
+ public Image getImage() {\r
+ switch (completionType) {\r
+ case PRIVATE:\r
+ return PRIVATE;\r
+ case PUBLIC:\r
+ return PUBLIC;\r
+ case CONST:\r
+ return CONST;\r
+ case TYPE:\r
+ return TYPE;\r
+ default:\r
+ return null;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public IContextInformation getContextInformation() {\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public void apply(IDocument document, char trigger, int offset) {\r
+ }\r
+\r
+ @Override\r
+ public boolean isValidFor(IDocument document, int offset) {\r
+ return validate(document, offset, null);\r
+ }\r
+\r
+ @Override\r
+ public char[] getTriggerCharacters() {\r
+ return null;\r
+ }\r
+\r
+ @Override\r
+ public int getContextInformationPosition() {\r
+ return 0;\r
+ }\r
+\r
+ @Override\r
+ public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {\r
+ try {\r
+// String replacement = getName().substring(offset - replacementOffset);\r
+ IDocument doc = viewer.getDocument();\r
+ Point p = viewer.getSelectedRange();\r
+// System.out.println("selectedRange : " + p);\r
+// System.out.println("prefix : " + prefix);\r
+// int start = offset - prefix.length();\r
+// int end = prefix.length();\r
+// System.out.println("start : " + start + ", end : " + end);\r
+// String sadd = doc.get(start, end);\r
+// System.out.println("toReplace : " + sadd);\r
+ if (p.y > 0) {\r
+ doc.replace(p.x, p.y, "");\r
+ doc.replace(offset, 0, getName());\r
+ } else {\r
+ String currentText = doc.get(offset - prefix.length(), prefix.length());\r
+ if (currentText.equals(getName()))\r
+ return;\r
+ doc.replace(offset - prefix.length(), prefix.length(), "");\r
+ doc.replace(offset - prefix.length(), 0, getName());\r
+ }\r
+ } catch (BadLocationException x) {\r
+ x.printStackTrace();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void selected(ITextViewer viewer, boolean smartToggle) {\r
+ }\r
+\r
+ @Override\r
+ public void unselected(ITextViewer viewer) {\r
+ }\r
+\r
+ @Override\r
+ public boolean validate(IDocument document, int offset, DocumentEvent event) {\r
+ try {\r
+// System.out.println("replacementOffset : " + replacementOffset);\r
+// System.out.println("offset : " + offset);\r
+ boolean a = offset >= replacementOffset;\r
+ boolean b = offset < replacementOffset + getName().length();\r
+ String s = document.get(replacementOffset, offset - replacementOffset);\r
+ prefix = s;\r
+ String d = getName();//.substring(0, offset - prefixStart);\r
+ boolean c = d.toLowerCase().startsWith(s.toLowerCase());\r
+ return a && b && c;\r
+ } catch (BadLocationException x) {\r
+ //x.printStackTrace();\r
+ return false;\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public IInformationControlCreator getInformationControlCreator() {\r
+ return CREATOR;\r
+ }\r
+ \r
+ private static final IInformationControlCreator CREATOR = new IInformationControlCreator() {\r
+ \r
+ @Override\r
+ public IInformationControl createInformationControl(Shell parent) {\r
+ return new DefaultInformationControl(parent);\r
+ }\r
+ };\r
+\r
+ @Override\r
+ public CharSequence getPrefixCompletionText(IDocument document, int completionOffset) {\r
+ return getName();\r
+ }\r
+\r
+ @Override\r
+ public int getPrefixCompletionStart(IDocument document, int completionOffset) {\r
+ return replacementOffset - prefix.length();\r
+ }\r
+\r
+ @Override\r
+ public boolean isAutoInsertable() {\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public Object getAdditionalProposalInfo(IProgressMonitor monitor) {\r
+ return documentation;\r
+ }\r
+\r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ public boolean isPrivate() {\r
+ return CSSCompletionType.PRIVATE == completionType;\r
+ }\r
+\r
+ public String getModule() {\r
+ return module;\r
+ }\r
+}\r