1 package org.vaadin.aceeditor;
2
3 import java.util.LinkedList;
4 import java.util.List;
5
6 import org.vaadin.aceeditor.client.AceDoc;
7 import org.vaadin.aceeditor.client.AceRange;
8 import org.vaadin.aceeditor.client.SuggesterClientRpc;
9 import org.vaadin.aceeditor.client.SuggesterServerRpc;
10 import org.vaadin.aceeditor.client.SuggesterState;
11 import org.vaadin.aceeditor.client.TransportDoc.TransportRange;
12 import org.vaadin.aceeditor.client.TransportSuggestion;
13
14 import com.vaadin.annotations.StyleSheet;
15 import com.vaadin.server.AbstractExtension;
16
17
18
19
20
21
22
23
24
25 @StyleSheet("suggestionpopup.css")
26 @SuppressWarnings("serial")
27 public class SuggestionExtension extends AbstractExtension {
28
29 protected Suggester suggester;
30
31 protected String suggStartText;
32 protected int suggStartCursor;
33 protected List<Suggestion> suggestions;
34 protected AceRange suggRange;
35
36 public SuggestionExtension(Suggester suggester) {
37 this.suggester = suggester;
38 }
39
40 protected SuggesterServerRpc serverRpc = new SuggesterServerRpc() {
41
42 @Override
43 public void suggest(String text, TransportRange sel) {
44 suggStartText = text;
45 suggRange = AceRange.fromTransport(sel);
46 suggStartCursor = new TextRange(text, suggRange).getEnd();
47 suggestions = suggester.getSuggestions(text, suggStartCursor);
48 getRpcProxy(SuggesterClientRpc.class).showSuggestions(
49 asTransport(suggestions));
50 }
51
52 @Override
53 public void suggestionSelected(int index) {
54
55 Suggestion sugg = suggestions.get(index);
56 String text2 = suggester.applySuggestion(sugg, suggStartText,
57 suggStartCursor);
58
59 AceDoc doc1 = new AceDoc(suggStartText);
60 AceDoc doc2 = new AceDoc(text2);
61 ServerSideDocDiff diff = ServerSideDocDiff.diff(doc1, doc2);
62 getRpcProxy(SuggesterClientRpc.class).applySuggestionDiff(
63 diff.asTransport());
64 }
65 };
66
67 @Override
68 public SuggesterState getState() {
69 return (SuggesterState) super.getState();
70 }
71
72 @Override
73 protected SuggesterState getState(boolean markAsDirty) {
74 return (SuggesterState) super.getState(markAsDirty);
75 }
76
77 protected List<TransportSuggestion> asTransport(List<Suggestion> suggs) {
78 LinkedList<TransportSuggestion> tl = new LinkedList<TransportSuggestion>();
79 int i = 0;
80 for (Suggestion s : suggs) {
81 tl.add(s.asTransport(i++));
82 }
83 return tl;
84 }
85
86 public void setSuggestOnDot(boolean on) {
87 getState().suggestOnDot = on;
88 }
89
90 public void extend(AceEditor editor) {
91 super.extend(editor);
92 registerRpc(serverRpc);
93 }
94
95 public void setShowDescriptions(boolean showDescriptions) {
96 getState().showDescriptions = showDescriptions;
97 }
98
99 public boolean isShowDescriptions() {
100 return getState(false).showDescriptions;
101 }
102 }