View Javadoc
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   * Extends {@link AceEditor} with suggestion possibility.
19   * 
20   * By default Ctrl+Space and dot (".") triggers a suggester.
21   * 
22   * A {@link Suggester} is queried for {@link Suggestion}s.
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.html#SuggesterServerRpc">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  			// XXX too much work
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 }