]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.ui/src/org/simantics/document/ui/CSSCompletionProposal.java
Several Wiki documentation view improvements.
[simantics/platform.git] / bundles / org.simantics.document.ui / src / org / simantics / document / ui / CSSCompletionProposal.java
1 package org.simantics.document.ui;\r
2 \r
3 import org.eclipse.core.runtime.IProgressMonitor;\r
4 import org.eclipse.jface.text.BadLocationException;\r
5 import org.eclipse.jface.text.DefaultInformationControl;\r
6 import org.eclipse.jface.text.DocumentEvent;\r
7 import org.eclipse.jface.text.IDocument;\r
8 import org.eclipse.jface.text.IInformationControl;\r
9 import org.eclipse.jface.text.IInformationControlCreator;\r
10 import org.eclipse.jface.text.ITextViewer;\r
11 import org.eclipse.jface.text.contentassist.ICompletionProposal;\r
12 import org.eclipse.jface.text.contentassist.ICompletionProposalExtension;\r
13 import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2;\r
14 import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3;\r
15 import org.eclipse.jface.text.contentassist.ICompletionProposalExtension4;\r
16 import org.eclipse.jface.text.contentassist.ICompletionProposalExtension5;\r
17 import org.eclipse.jface.text.contentassist.IContextInformation;\r
18 import org.eclipse.swt.graphics.Image;\r
19 import org.eclipse.swt.graphics.Point;\r
20 import org.eclipse.swt.widgets.Shell;\r
21 import org.simantics.scl.compiler.elaboration.modules.SCLValue;\r
22 \r
23 public class CSSCompletionProposal implements ICompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, ICompletionProposalExtension3, ICompletionProposalExtension4, ICompletionProposalExtension5 {\r
24     \r
25     private static final Image PRIVATE = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/private_co.gif").createImage();\r
26     private static final Image PUBLIC = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/public_co.gif").createImage();\r
27     private static final Image CONST = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/container_obj.gif").createImage();\r
28     private static final Image TYPE = Activator.imageDescriptorFromPlugin("org.simantics.scl.ui", "icons/typedef_obj.gif").createImage();\r
29     \r
30     private final String content;\r
31     private final String name;\r
32     private final String module;\r
33     private final String documentation;\r
34     private int replacementOffset;\r
35     private String prefix;\r
36     private final CSSCompletionType completionType;\r
37     \r
38     public CSSCompletionProposal(SCLValue value, int replacementOffset, String prefix) {\r
39         this.name = value.getName().name;\r
40         this.module = value.getName().module;\r
41         this.documentation = value.getDocumentation();\r
42         this.content = name + " :: " + value.getType() + "  (" + module + ")";\r
43         this.replacementOffset = replacementOffset;\r
44         this.prefix = prefix;\r
45 //        System.out.println(prefix);\r
46         if (value.isPrivate())\r
47             this.completionType = CSSCompletionType.PRIVATE;\r
48         else\r
49             this.completionType = CSSCompletionType.PUBLIC;\r
50     }\r
51 \r
52     public CSSCompletionProposal(String name, String module, CSSCompletionType completionType, int replacementOffset, String prefix) {\r
53         this.name = name;\r
54         this.module = module;\r
55         this.content = name + " (" + module + ")";\r
56         this.documentation = null;\r
57         this.replacementOffset = replacementOffset;\r
58         this.prefix = prefix;\r
59         this.completionType = completionType;\r
60     }\r
61 \r
62     @Override\r
63     public void apply(IDocument document) {\r
64 \r
65     }\r
66 \r
67     @Override\r
68     public Point getSelection(IDocument document) {\r
69         return new Point(replacementOffset + getName().length(), 0);\r
70     }\r
71 \r
72     @Override\r
73     public String getAdditionalProposalInfo() {\r
74         return documentation;\r
75     }\r
76 \r
77     @Override\r
78     public String getDisplayString() {\r
79         return content;\r
80     }\r
81 \r
82     @Override\r
83     public Image getImage() {\r
84         switch (completionType) {\r
85         case PRIVATE:\r
86             return PRIVATE;\r
87         case PUBLIC:\r
88             return PUBLIC;\r
89         case CONST:\r
90             return CONST;\r
91         case TYPE:\r
92             return TYPE;\r
93         default:\r
94             return null;\r
95         }\r
96     }\r
97 \r
98     @Override\r
99     public IContextInformation getContextInformation() {\r
100         return null;\r
101     }\r
102 \r
103     @Override\r
104     public void apply(IDocument document, char trigger, int offset) {\r
105     }\r
106 \r
107     @Override\r
108     public boolean isValidFor(IDocument document, int offset) {\r
109         return validate(document, offset, null);\r
110     }\r
111 \r
112     @Override\r
113     public char[] getTriggerCharacters() {\r
114         return null;\r
115     }\r
116 \r
117     @Override\r
118     public int getContextInformationPosition() {\r
119         return 0;\r
120     }\r
121 \r
122     @Override\r
123     public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) {\r
124         try {\r
125 //            String replacement = getName().substring(offset - replacementOffset);\r
126             IDocument doc = viewer.getDocument();\r
127             Point p = viewer.getSelectedRange();\r
128 //            System.out.println("selectedRange : " + p);\r
129 //            System.out.println("prefix : " + prefix);\r
130 //            int start = offset - prefix.length();\r
131 //            int end = prefix.length();\r
132 //            System.out.println("start : " + start + ", end : " + end);\r
133 //            String sadd = doc.get(start, end);\r
134 //            System.out.println("toReplace : " + sadd);\r
135             if (p.y > 0) {\r
136                 doc.replace(p.x, p.y, "");\r
137                 doc.replace(offset, 0, getName());\r
138             } else {\r
139                 String currentText = doc.get(offset - prefix.length(), prefix.length());\r
140                 if (currentText.equals(getName()))\r
141                     return;\r
142                 doc.replace(offset - prefix.length(), prefix.length(), "");\r
143                 doc.replace(offset - prefix.length(), 0, getName());\r
144             }\r
145         } catch (BadLocationException x) {\r
146             x.printStackTrace();\r
147         }\r
148     }\r
149 \r
150     @Override\r
151     public void selected(ITextViewer viewer, boolean smartToggle) {\r
152     }\r
153 \r
154     @Override\r
155     public void unselected(ITextViewer viewer) {\r
156     }\r
157 \r
158     @Override\r
159     public boolean validate(IDocument document, int offset, DocumentEvent event) {\r
160         try {\r
161 //            System.out.println("replacementOffset : " + replacementOffset);\r
162 //            System.out.println("offset : " + offset);\r
163             boolean a = offset >= replacementOffset;\r
164             boolean b = offset < replacementOffset + getName().length();\r
165             String s = document.get(replacementOffset, offset - replacementOffset);\r
166             prefix = s;\r
167             String d = getName();//.substring(0, offset - prefixStart);\r
168             boolean c = d.toLowerCase().startsWith(s.toLowerCase());\r
169             return a && b && c;\r
170         } catch (BadLocationException x) {\r
171             //x.printStackTrace();\r
172             return false;\r
173         }\r
174     }\r
175 \r
176     @Override\r
177     public IInformationControlCreator getInformationControlCreator() {\r
178         return CREATOR;\r
179     }\r
180     \r
181     private static final IInformationControlCreator CREATOR = new IInformationControlCreator() {\r
182         \r
183         @Override\r
184         public IInformationControl createInformationControl(Shell parent) {\r
185             return new DefaultInformationControl(parent);\r
186         }\r
187     };\r
188 \r
189     @Override\r
190     public CharSequence getPrefixCompletionText(IDocument document, int completionOffset) {\r
191         return getName();\r
192     }\r
193 \r
194     @Override\r
195     public int getPrefixCompletionStart(IDocument document, int completionOffset) {\r
196         return replacementOffset - prefix.length();\r
197     }\r
198 \r
199     @Override\r
200     public boolean isAutoInsertable() {\r
201         return true;\r
202     }\r
203 \r
204     @Override\r
205     public Object getAdditionalProposalInfo(IProgressMonitor monitor) {\r
206         return documentation;\r
207     }\r
208 \r
209     public String getName() {\r
210         return name;\r
211     }\r
212     \r
213     public boolean isPrivate() {\r
214         return CSSCompletionType.PRIVATE == completionType;\r
215     }\r
216 \r
217     public String getModule() {\r
218         return module;\r
219     }\r
220 }\r